From 409ed8f8792f613f9d04bf22b154da6f54eca3fb Mon Sep 17 00:00:00 2001 From: Polina Date: Thu, 15 Oct 2026 12:15:06 +0200 Subject: [PATCH 01/11] added run_mag --- scripts/3f_torque_optimization/run_mag.py | 92 +++++++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 scripts/3f_torque_optimization/run_mag.py diff --git a/scripts/3f_torque_optimization/run_mag.py b/scripts/3f_torque_optimization/run_mag.py new file mode 100644 index 0000000..02078a2 --- /dev/null +++ b/scripts/3f_torque_optimization/run_mag.py @@ -0,0 +1,92 @@ +# export ANSYSEM_ROOT241=/data/AnsysEM/v241/Linux64 + +import os + +import numpy as np +import pandas as pd + +from machine_design.config import load_config +from machine_design.designs import load_design +from machine_design.optimization import ( + HacklGenerator_3BrokenLines, + HacklGenerator_OneLambda, + HacklGenerator_SixLambdas, + MagnetGenerator, + analyze_results, + plot_barriers, + save_params, +) +from motors.synrm_3f_36s import Computation, Geometry + +config = load_config() +aedt_version = config["aedt_version"] +num_cores = config["num_cores"] +n_designs = 50 +r_stator_end = 0.7 +offset = 0.7 / 2 +current_setpoint = (1.5, 1.5) +plot_design = True + +project_name = "SynRM_test" +design_name = "Design01" +path_data = os.path.join(os.getcwd(), "data") +path_results = "results" +for path in [path_data, path_results]: + os.makedirs(path, exist_ok=True) +file_name_aedt = f"{path_data}/{project_name}.aedt" + +geometry = Geometry() +computation = Computation(geometry) +design = load_design(file_name_aedt, project_name, design_name, aedt_version, geometry, computation) +generators = [MagnetGenerator(design, r_stator_end, offset=offset)] + +metadata = pd.DataFrame() +for i in range(0, n_designs): + for generator in generators: + # Generate a feasible design + while True: + params = generator.random_parameters() + generator.set_parameters(params) + barriers = generator.generate_barriers() + barriers = generator.split_barriers(barriers) + if generator.name == "MagnetGenerator": + magnets = generator.generate_magnets(barriers) + feasible = generator.feasible_barriers(barriers) + if feasible: + break + + # Generate the geometry + design.add_rotor() + for j, barrier in enumerate(barriers): + design.add_rotor_barrier(barrier) + if generator.name == "MagnetGenerator": + design.add_rotor_magnet(magnets[j]) + + # Compute the torque + Tor = design.compute(*current_setpoint, NUM_CORES=num_cores) + # Tor = design.compute(num_cores) + if Tor is None: + TorAvg, TorRippleRms = np.nan, np.nan + else: + TorAvg, _, TorRippleRms = analyze_results(Tor) + + # Delete the rotor + design.delete_rotor() + + # Potentially save the design + if plot_design: + title = f"Torque mean value: {np.round(TorAvg, 2)} Nm, ripple relative value: {np.round(TorRippleRms, 2)} %" + file_name = f"{path_results}/design_{generator.name}_{i}" + plot_barriers(barriers, design, title=title, file_name=f"{file_name}.png") + save_params(params, f"{file_name}.pkl") + + metadata_new = { + "method": generator.name, + "design": i, + "T": TorAvg, + "ripple": TorRippleRms, + } + metadata = pd.concat((metadata, pd.DataFrame([metadata_new])), ignore_index=True) + metadata.to_csv(f"{path_results}/metadata.csv", index=False) + +design.close_project() From 5b57858ec54c35bb4fa46d6316a112d06d3ba6b2 Mon Sep 17 00:00:00 2001 From: Polina Date: Thu, 15 Oct 2026 13:10:11 +0200 Subject: [PATCH 02/11] added motion_setup --- machine_design/designs/design.py | 9 +++++++++ machine_design/designs/geometry.py | 8 ++++++++ motors/synrm_3f_36s_mag.py | 4 ++++ scripts/3f_torque_optimization/run_mag.py | 6 ++++-- 4 files changed, 25 insertions(+), 2 deletions(-) diff --git a/machine_design/designs/design.py b/machine_design/designs/design.py index 8bdb757..c904236 100644 --- a/machine_design/designs/design.py +++ b/machine_design/designs/design.py @@ -43,10 +43,19 @@ def add_rotor_barrier(self, barrier_points, segment_type=None) -> None: def add_rotor_magnet(self, magnet_points, segment_type=None) -> None: self.geometry.add_rotor_magnet(self.m2d, magnet_points, segment_type=segment_type) + def reassign_motion_setup(self) -> None: + motions = [b.name for b in self.m2d.boundaries if b.type == "Band"] + if motions: + self.m2d.omodelsetup.DeleteMotionSetup(motions) + self.geometry._assign_rotor_motion(self.m2d) + def delete_rotor(self) -> None: self.computation.delete_rotor_mesh() self.geometry.delete_rotor(self.m2d) + def delete_magnets(self) -> None: + self.geometry.delete_magnets(self.m2d) + def compute(self, *args, NUM_CORES: int = 1): return self.computation.compute(self.m2d, self.geometry.rotor_id, *args, NUM_CORES=NUM_CORES) diff --git a/machine_design/designs/geometry.py b/machine_design/designs/geometry.py index 82f8dbb..b4f6580 100644 --- a/machine_design/designs/geometry.py +++ b/machine_design/designs/geometry.py @@ -236,6 +236,9 @@ def add_rotor_magnet(self, m2d: Maxwell2d, mag: np.ndarray, fill_height=0.9, fil modeler.set_working_coordinate_system("Global") def _create_magnet_cs(self, m2d: Maxwell2d, name: str, angle_deg: float) -> None: + for cs in m2d.modeler.coordinate_systems: + if cs.name == name: + cs.delete() m2d.modeler.create_coordinate_system( origin=[0, 0, 0], name=name, @@ -271,3 +274,8 @@ def _create_material( mat.set_magnetic_coercivity(value=coercivity, x=coercivity_dir[0], y=coercivity_dir[1], z=coercivity_dir[2]) return mat + + def delete_magnets(self, m2d: Maxwell2d) -> None: + magnets = m2d.modeler.get_objects_w_string("Magnet", case_sensitive=True) + if magnets: + m2d.modeler.delete(magnets) \ No newline at end of file diff --git a/motors/synrm_3f_36s_mag.py b/motors/synrm_3f_36s_mag.py index 808ece2..ed19a2d 100644 --- a/motors/synrm_3f_36s_mag.py +++ b/motors/synrm_3f_36s_mag.py @@ -9,6 +9,10 @@ class Geometry(Geometry3f36s): + def __init__(self) -> None: + self.set_magnets() + super().__init__() + def build_stator(self, m2d: Maxwell2d) -> None: super().build_stator(m2d) self.set_magnets() diff --git a/scripts/3f_torque_optimization/run_mag.py b/scripts/3f_torque_optimization/run_mag.py index 02078a2..0f89418 100644 --- a/scripts/3f_torque_optimization/run_mag.py +++ b/scripts/3f_torque_optimization/run_mag.py @@ -16,12 +16,12 @@ plot_barriers, save_params, ) -from motors.synrm_3f_36s import Computation, Geometry +from motors.synrm_3f_36s_mag import Computation, Geometry config = load_config() aedt_version = config["aedt_version"] num_cores = config["num_cores"] -n_designs = 50 +n_designs = 1 r_stator_end = 0.7 offset = 0.7 / 2 current_setpoint = (1.5, 1.5) @@ -62,6 +62,8 @@ if generator.name == "MagnetGenerator": design.add_rotor_magnet(magnets[j]) + design.reassign_motion_setup() + # Compute the torque Tor = design.compute(*current_setpoint, NUM_CORES=num_cores) # Tor = design.compute(num_cores) From 0898c472db04b357bd177f308a99a970cbfb24f9 Mon Sep 17 00:00:00 2001 From: Polina Date: Thu, 15 Oct 2026 13:25:48 +0200 Subject: [PATCH 03/11] ruff changes --- machine_design/designs/geometry.py | 2 +- scripts/3f_torque_optimization/run_mag.py | 3 --- 2 files changed, 1 insertion(+), 4 deletions(-) diff --git a/machine_design/designs/geometry.py b/machine_design/designs/geometry.py index b4f6580..7144654 100644 --- a/machine_design/designs/geometry.py +++ b/machine_design/designs/geometry.py @@ -278,4 +278,4 @@ def _create_material( def delete_magnets(self, m2d: Maxwell2d) -> None: magnets = m2d.modeler.get_objects_w_string("Magnet", case_sensitive=True) if magnets: - m2d.modeler.delete(magnets) \ No newline at end of file + m2d.modeler.delete(magnets) diff --git a/scripts/3f_torque_optimization/run_mag.py b/scripts/3f_torque_optimization/run_mag.py index 0f89418..0765378 100644 --- a/scripts/3f_torque_optimization/run_mag.py +++ b/scripts/3f_torque_optimization/run_mag.py @@ -8,9 +8,6 @@ from machine_design.config import load_config from machine_design.designs import load_design from machine_design.optimization import ( - HacklGenerator_3BrokenLines, - HacklGenerator_OneLambda, - HacklGenerator_SixLambdas, MagnetGenerator, analyze_results, plot_barriers, From c3054093cd6dd74aba12dfc95e44dd1b4d20c00b Mon Sep 17 00:00:00 2001 From: Polina Date: Tue, 20 Oct 2026 12:49:13 +0200 Subject: [PATCH 04/11] changed deleting and plotting of magnets --- machine_design/designs/design.py | 3 --- machine_design/designs/geometry.py | 9 ++++----- machine_design/optimization/generators.py | 2 +- machine_design/optimization/geometry.py | 6 +++++- motors/synrm_3f_36s_mag.py | 1 - scripts/3f_torque_optimization/run_mag.py | 2 +- 6 files changed, 11 insertions(+), 12 deletions(-) diff --git a/machine_design/designs/design.py b/machine_design/designs/design.py index c904236..df165fe 100644 --- a/machine_design/designs/design.py +++ b/machine_design/designs/design.py @@ -53,9 +53,6 @@ def delete_rotor(self) -> None: self.computation.delete_rotor_mesh() self.geometry.delete_rotor(self.m2d) - def delete_magnets(self) -> None: - self.geometry.delete_magnets(self.m2d) - def compute(self, *args, NUM_CORES: int = 1): return self.computation.compute(self.m2d, self.geometry.rotor_id, *args, NUM_CORES=NUM_CORES) diff --git a/machine_design/designs/geometry.py b/machine_design/designs/geometry.py index 7144654..b0f7a6b 100644 --- a/machine_design/designs/geometry.py +++ b/machine_design/designs/geometry.py @@ -95,6 +95,10 @@ def delete_rotor(self, m2d: Maxwell2d) -> None: assert isinstance(m2d.modeler, Modeler2D) m2d.modeler.delete(self.rotor_id) + magnets = m2d.modeler.get_objects_w_string("Magnet", case_sensitive=True) + if magnets: + m2d.modeler.delete(magnets) + def _push_stator_variables(self, m2d: Maxwell2d) -> None: modeler = m2d.modeler assert isinstance(modeler, Modeler2D) @@ -274,8 +278,3 @@ def _create_material( mat.set_magnetic_coercivity(value=coercivity, x=coercivity_dir[0], y=coercivity_dir[1], z=coercivity_dir[2]) return mat - - def delete_magnets(self, m2d: Maxwell2d) -> None: - magnets = m2d.modeler.get_objects_w_string("Magnet", case_sensitive=True) - if magnets: - m2d.modeler.delete(magnets) diff --git a/machine_design/optimization/generators.py b/machine_design/optimization/generators.py index 08e8e37..677d4ba 100644 --- a/machine_design/optimization/generators.py +++ b/machine_design/optimization/generators.py @@ -586,7 +586,7 @@ def generate_barriers(self) -> list[np.ndarray]: def generate_magnets(self, barriers: list[np.ndarray]) -> list[np.ndarray]: magnets = [] - margin = 0.0 + margin = 0.3 for barrier in barriers: x, y = barrier[:, 0], barrier[:, 1] diff --git a/machine_design/optimization/geometry.py b/machine_design/optimization/geometry.py index e628a16..6196ebb 100644 --- a/machine_design/optimization/geometry.py +++ b/machine_design/optimization/geometry.py @@ -14,13 +14,17 @@ def rotate(x, y, alpha, **kwargs): return xy_rot[0], xy_rot[1] -def plot_barriers(barriers, design, title=None, file_name=None): +def plot_barriers(barriers, design,title=None, file_name=None, magnets=None): plt.figure() alphas = np.linspace(0 * np.pi, 2 * np.pi / 4, 100) for r in [design.geometry.rotor_r_min, design.geometry.rotor_r_max]: plt.plot(r * np.cos(alphas), r * np.sin(alphas)) for barrier in barriers: plt.plot(barrier[:, 0], barrier[:, 1]) + if magnets is not None: + for magnet in magnets: + magnet = np.concatenate([np.asarray(m) for m in magnet]) if isinstance(magnet, (list, tuple)) else magnet + plt.plot(magnet[:, 0], magnet[:, 1]) plt.axis("equal") if title is not None: plt.title(title) diff --git a/motors/synrm_3f_36s_mag.py b/motors/synrm_3f_36s_mag.py index ed19a2d..5bb4063 100644 --- a/motors/synrm_3f_36s_mag.py +++ b/motors/synrm_3f_36s_mag.py @@ -15,7 +15,6 @@ def __init__(self) -> None: def build_stator(self, m2d: Maxwell2d) -> None: super().build_stator(m2d) - self.set_magnets() self._create_material(m2d, self.magnet, **self.magnet_props) def set_magnets(self): diff --git a/scripts/3f_torque_optimization/run_mag.py b/scripts/3f_torque_optimization/run_mag.py index 0765378..7e1c18b 100644 --- a/scripts/3f_torque_optimization/run_mag.py +++ b/scripts/3f_torque_optimization/run_mag.py @@ -76,7 +76,7 @@ if plot_design: title = f"Torque mean value: {np.round(TorAvg, 2)} Nm, ripple relative value: {np.round(TorRippleRms, 2)} %" file_name = f"{path_results}/design_{generator.name}_{i}" - plot_barriers(barriers, design, title=title, file_name=f"{file_name}.png") + plot_barriers(barriers, design, title=title, file_name=f"{file_name}.png", magnets=magnets) save_params(params, f"{file_name}.pkl") metadata_new = { From cc61d3a77deac3eff7a35a7d0107da897631a6b4 Mon Sep 17 00:00:00 2001 From: Polina Date: Mon, 26 Oct 2026 09:34:53 +0100 Subject: [PATCH 05/11] ruff format --- machine_design/optimization/geometry.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/machine_design/optimization/geometry.py b/machine_design/optimization/geometry.py index 6196ebb..159c304 100644 --- a/machine_design/optimization/geometry.py +++ b/machine_design/optimization/geometry.py @@ -14,7 +14,7 @@ def rotate(x, y, alpha, **kwargs): return xy_rot[0], xy_rot[1] -def plot_barriers(barriers, design,title=None, file_name=None, magnets=None): +def plot_barriers(barriers, design, title=None, file_name=None, magnets=None): plt.figure() alphas = np.linspace(0 * np.pi, 2 * np.pi / 4, 100) for r in [design.geometry.rotor_r_min, design.geometry.rotor_r_max]: From 88d8f6d29a721b95d41a95720959b5623d007608 Mon Sep 17 00:00:00 2001 From: Polina Date: Thu, 29 Oct 2026 09:09:52 +0100 Subject: [PATCH 06/11] delete magnets and theirs CS --- machine_design/designs/geometry.py | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/machine_design/designs/geometry.py b/machine_design/designs/geometry.py index b0f7a6b..ee13b71 100644 --- a/machine_design/designs/geometry.py +++ b/machine_design/designs/geometry.py @@ -71,6 +71,8 @@ def build_rotor(self, m2d: Maxwell2d) -> None: rotor_id = modeler.create_polyline(points=self.rot_points, segment_type=["Arc", "Line", "Arc"], cover_surface=True, name="Rotor") self.rotor_id = rotor_id rotor_id.material_name = self.Fe + self.magnet_ids = [] + self.magnet_cs_ids = [] def add_rotor_barrier(self, m2d: Maxwell2d, barrier_points, segment_type=None) -> None: modeler = m2d.modeler @@ -95,9 +97,14 @@ def delete_rotor(self, m2d: Maxwell2d) -> None: assert isinstance(m2d.modeler, Modeler2D) m2d.modeler.delete(self.rotor_id) - magnets = m2d.modeler.get_objects_w_string("Magnet", case_sensitive=True) - if magnets: - m2d.modeler.delete(magnets) + if self.magnet_ids: + m2d.modeler.delete(self.magnet_ids) + self.magnet_ids = [] + + # Delete after the magnets, which reference them + for cs in self.magnet_cs_ids: + cs.delete() + self.magnet_cs_ids = [] def _push_stator_variables(self, m2d: Maxwell2d) -> None: modeler = m2d.modeler @@ -229,6 +236,7 @@ def add_rotor_magnet(self, m2d: Maxwell2d, mag: np.ndarray, fill_height=0.9, fil cover_surface=True, name="Magnet", ) + self.magnet_ids.append(mag_id) cs_angle_deg = np.degrees(np.arctan2(radial[1], radial[0])) self.assign_magnet_cs(m2d, mag_id, cs_angle_deg) @@ -240,16 +248,14 @@ def add_rotor_magnet(self, m2d: Maxwell2d, mag: np.ndarray, fill_height=0.9, fil modeler.set_working_coordinate_system("Global") def _create_magnet_cs(self, m2d: Maxwell2d, name: str, angle_deg: float) -> None: - for cs in m2d.modeler.coordinate_systems: - if cs.name == name: - cs.delete() - m2d.modeler.create_coordinate_system( + cs = m2d.modeler.create_coordinate_system( origin=[0, 0, 0], name=name, mode="axis", x_pointing=[float(np.cos(np.radians(angle_deg))), float(np.sin(np.radians(angle_deg))), 0], y_pointing=[float(-np.sin(np.radians(angle_deg))), float(np.cos(np.radians(angle_deg))), 0], ) + self.magnet_cs_ids.append(cs) def assign_magnet_cs(self, m2d: Maxwell2d, magnet_name: str, angle_deg: float) -> None: cs_name = f"CS_{magnet_name}" From 07816374424dc5f76d0b966665c88a6d6e31b903 Mon Sep 17 00:00:00 2001 From: Polina Date: Thu, 29 Oct 2026 11:55:59 +0100 Subject: [PATCH 07/11] changed add_rotor_magnet and generate_magnets --- machine_design/designs/geometry.py | 37 ++++++++--------------- machine_design/optimization/generators.py | 7 +++-- 2 files changed, 17 insertions(+), 27 deletions(-) diff --git a/machine_design/designs/geometry.py b/machine_design/designs/geometry.py index ee13b71..3b15d04 100644 --- a/machine_design/designs/geometry.py +++ b/machine_design/designs/geometry.py @@ -205,39 +205,26 @@ def _assign_boundary_conditions(self, m2d: Maxwell2d) -> None: ) m2d.assign_vector_potential(assignment=id_bc_az, vector_value=0, boundary="A0") - def add_rotor_magnet(self, m2d: Maxwell2d, mag: np.ndarray, fill_height=0.9, fill_width=0.9, segment_type=None): + def add_rotor_magnet(self, m2d: Maxwell2d, magnet_points, segment_type=None) -> None: modeler = m2d.modeler + assert isinstance(modeler, Modeler2D) - if isinstance(mag, (list, tuple)): - mag = np.concatenate([np.asarray(m) for m in mag], axis=0) + if isinstance(magnet_points, (list, tuple)): + magnet_points = np.concatenate([np.asarray(m) for m in magnet_points], axis=0) - pts = np.asarray(mag) - center = pts.mean(axis=0) + magnet_points = np.round(np.asarray(magnet_points), 6) - r = np.linalg.norm(center) - if r < 1e-10: + center = magnet_points[:, :2].mean(axis=0) + if np.linalg.norm(center) < 1e-10: return + cs_angle_deg = np.degrees(np.arctan2(center[1], center[0])) - radial = center / r - long_axis = np.array([-radial[1], radial[0]]) - - pts_centered = pts - center - - proj_long = pts_centered @ long_axis - proj_short = pts_centered @ radial + if magnet_points.shape[1] == 2: + magnet_points = np.hstack((magnet_points, np.zeros((len(magnet_points), 1)))) - pts_scaled = center + (np.outer(proj_long * fill_height, long_axis) + np.outer(proj_short * fill_width, radial)) - - points = [[f"{x}mm", f"{y}mm", "0mm"] for x, y in pts_scaled] - - mag_id = modeler.create_polyline( - points=points, - close_surface=True, - cover_surface=True, - name="Magnet", - ) + points_str = [[str(y) for y in x] for x in magnet_points] + mag_id = modeler.create_polyline(points=points_str, segment_type=segment_type, close_surface=True, cover_surface=True, name="Magnet") self.magnet_ids.append(mag_id) - cs_angle_deg = np.degrees(np.arctan2(radial[1], radial[0])) self.assign_magnet_cs(m2d, mag_id, cs_angle_deg) mag_id.material_name = self.magnet diff --git a/machine_design/optimization/generators.py b/machine_design/optimization/generators.py index 677d4ba..36d7e0c 100644 --- a/machine_design/optimization/generators.py +++ b/machine_design/optimization/generators.py @@ -584,14 +584,17 @@ def generate_barriers(self) -> list[np.ndarray]: barriers.append(xy_all) return barriers - def generate_magnets(self, barriers: list[np.ndarray]) -> list[np.ndarray]: + def generate_magnets(self, barriers: list[np.ndarray], margin: float = 0.0) -> list[np.ndarray]: magnets = [] - margin = 0.3 for barrier in barriers: x, y = barrier[:, 0], barrier[:, 1] mag_pts = np.column_stack((x, y)) + if margin <= 0: + magnets.append([mag_pts]) + continue + angles = np.degrees(np.arctan2(mag_pts[:, 1], mag_pts[:, 0])) center_angle = (angles.max() + angles.min()) / 2 From 5784398e072a701c525fc6387f17b2d942a81936 Mon Sep 17 00:00:00 2001 From: sadda Date: Sat, 31 Oct 2026 13:31:56 +0000 Subject: [PATCH 08/11] Properly extracted torque --- scripts/3f_torque_optimization/run.py | 6 +++--- scripts/3f_torque_optimization/run_mag.py | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/scripts/3f_torque_optimization/run.py b/scripts/3f_torque_optimization/run.py index c4f1232..00a8e5d 100644 --- a/scripts/3f_torque_optimization/run.py +++ b/scripts/3f_torque_optimization/run.py @@ -58,11 +58,11 @@ design.add_rotor_barrier(barrier) # Compute the torque - Tor = design.compute(*current_setpoint, NUM_CORES=num_cores) - # Tor = design.compute(num_cores) - if Tor is None: + outputs = design.compute(*current_setpoint, NUM_CORES=num_cores) + if outputs is None: TorAvg, TorRippleRms = np.nan, np.nan else: + Tor = outputs["Moving1.Torque"] TorAvg, _, TorRippleRms = analyze_results(Tor) # Delete the rotor diff --git a/scripts/3f_torque_optimization/run_mag.py b/scripts/3f_torque_optimization/run_mag.py index 7e1c18b..eed4207 100644 --- a/scripts/3f_torque_optimization/run_mag.py +++ b/scripts/3f_torque_optimization/run_mag.py @@ -62,11 +62,11 @@ design.reassign_motion_setup() # Compute the torque - Tor = design.compute(*current_setpoint, NUM_CORES=num_cores) - # Tor = design.compute(num_cores) - if Tor is None: + outputs = design.compute(*current_setpoint, NUM_CORES=num_cores) + if outputs is None: TorAvg, TorRippleRms = np.nan, np.nan else: + Tor = outputs["Moving1.Torque"] TorAvg, _, TorRippleRms = analyze_results(Tor) # Delete the rotor From 8f6b3b93447818c2dcd9fb9a589cd064fc080587 Mon Sep 17 00:00:00 2001 From: sadda Date: Sat, 31 Oct 2026 13:32:10 +0000 Subject: [PATCH 09/11] Fixed tests --- tests/test_ansys_regression.py | 2 +- tests/test_ansys_regression_synrm_5f_40s.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_ansys_regression.py b/tests/test_ansys_regression.py index 6e4c2b4..a8b5f77 100644 --- a/tests/test_ansys_regression.py +++ b/tests/test_ansys_regression.py @@ -134,5 +134,5 @@ def _legacy_extract_results(solutions): finally: if live_design is not None: live_design.close_project() - elif legacy_design is not None: + if legacy_design is not None: legacy_design.close_project() diff --git a/tests/test_ansys_regression_synrm_5f_40s.py b/tests/test_ansys_regression_synrm_5f_40s.py index cadc0ee..54a8b7b 100644 --- a/tests/test_ansys_regression_synrm_5f_40s.py +++ b/tests/test_ansys_regression_synrm_5f_40s.py @@ -104,5 +104,5 @@ def test_legacy_and_live_design_match_across_rotor_rebuilds(tmp_path): finally: if live_design is not None: live_design.close_project() - elif legacy_design is not None: + if legacy_design is not None: legacy_design.close_project() From 19d4c78d505cdf60b4ef47c93aa03294f07a3041 Mon Sep 17 00:00:00 2001 From: sadda Date: Sat, 31 Oct 2026 13:55:25 +0000 Subject: [PATCH 10/11] Fixed tests --- tests/test_ansys_regression.py | 2 +- tests/test_ansys_regression_synrm_5f_40s.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/test_ansys_regression.py b/tests/test_ansys_regression.py index a8b5f77..03f5863 100644 --- a/tests/test_ansys_regression.py +++ b/tests/test_ansys_regression.py @@ -83,7 +83,7 @@ def _create_design(design_cls, project_name, file_name, extra_args=()): *extra_args, version=AEDT_VERSION, non_graphical=True, - new_desktop=False, + new_desktop=True, close_on_exit=False, ) diff --git a/tests/test_ansys_regression_synrm_5f_40s.py b/tests/test_ansys_regression_synrm_5f_40s.py index 54a8b7b..a1b653a 100644 --- a/tests/test_ansys_regression_synrm_5f_40s.py +++ b/tests/test_ansys_regression_synrm_5f_40s.py @@ -61,7 +61,7 @@ def _create_design(design_cls, project_name, file_name, extra_args=()): *extra_args, version=AEDT_VERSION, non_graphical=True, - new_desktop=False, + new_desktop=True, close_on_exit=False, ) From 090963d81385bc0cd88f21edac58cfdb2b2a2ee1 Mon Sep 17 00:00:00 2001 From: Polina Date: Mon, 2 Nov 2026 10:30:33 +0100 Subject: [PATCH 11/11] issue #74 and deleting reassign_motion_setup --- machine_design/designs/design.py | 6 ------ machine_design/optimization/generators.py | 12 +++++++++++- scripts/3f_torque_optimization/run_mag.py | 2 -- 3 files changed, 11 insertions(+), 9 deletions(-) diff --git a/machine_design/designs/design.py b/machine_design/designs/design.py index df165fe..8bdb757 100644 --- a/machine_design/designs/design.py +++ b/machine_design/designs/design.py @@ -43,12 +43,6 @@ def add_rotor_barrier(self, barrier_points, segment_type=None) -> None: def add_rotor_magnet(self, magnet_points, segment_type=None) -> None: self.geometry.add_rotor_magnet(self.m2d, magnet_points, segment_type=segment_type) - def reassign_motion_setup(self) -> None: - motions = [b.name for b in self.m2d.boundaries if b.type == "Band"] - if motions: - self.m2d.omodelsetup.DeleteMotionSetup(motions) - self.geometry._assign_rotor_motion(self.m2d) - def delete_rotor(self) -> None: self.computation.delete_rotor_mesh() self.geometry.delete_rotor(self.m2d) diff --git a/machine_design/optimization/generators.py b/machine_design/optimization/generators.py index 36d7e0c..2422591 100644 --- a/machine_design/optimization/generators.py +++ b/machine_design/optimization/generators.py @@ -430,14 +430,24 @@ def _get_bezier_curve(self, phi_deg, is_inner, i): class MagnetGenerator(BarrierGenerator): - def __init__(self, design, r_stator_end, der1=1.0, der2=1.0, symmetric=True, **kwargs): + def __init__(self, design, r_stator_end, der1=1.0, der2=1.0, symmetric=True, min_bridge=0.0, **kwargs): self.n_designs = kwargs.get("n_designs", 1) self.der1 = der1 self.der2 = der2 self.symmetric = symmetric self.n_barriers = kwargs.get("n_barriers", 1) + self.sector_angle = np.pi / design.geometry.PolePairs + self.min_bridge = min_bridge super().__init__(design, r_stator_end, **kwargs) + def feasible_barriers(self, barriers: list[np.ndarray], tol: float = 1e-8) -> bool: + for barrier in barriers: + dist_start = barrier[:, 1] + dist_end = barrier[:, 0] * np.sin(self.sector_angle) - barrier[:, 1] * np.cos(self.sector_angle) + if any(dist_start < self.min_bridge - tol) or any(dist_end < self.min_bridge - tol): + return False + return super().feasible_barriers(barriers, tol) + def _create_barrier( self, y_min, diff --git a/scripts/3f_torque_optimization/run_mag.py b/scripts/3f_torque_optimization/run_mag.py index eed4207..594d42a 100644 --- a/scripts/3f_torque_optimization/run_mag.py +++ b/scripts/3f_torque_optimization/run_mag.py @@ -59,8 +59,6 @@ if generator.name == "MagnetGenerator": design.add_rotor_magnet(magnets[j]) - design.reassign_motion_setup() - # Compute the torque outputs = design.compute(*current_setpoint, NUM_CORES=num_cores) if outputs is None: