APEC 2026 S10: Python For Power Electronics: From Zero To AI . Flyback Magnetic Ansys Automation
| import shutil | |
| import os | |
| import sys | |
| import time | |
| import pyaedt | |
| from pyaedt.modeler.cad.object3d import Object3d | |
| number_segments_arcs = 12 | |
| gap_length = 500e-6 | |
| resudial_gap_length = 0.000005 | |
| bobbin_thickness = 0.001 | |
| dim = {"A": 0.02850, "B": 0.01400, "C": 0.01140, "D": 0.00960, "E": 0.02170, "F": 0.00990} | |
| primary_wire_diameter = 0.0005 | |
| primary_wire_coating = 34e-6 | |
| secondary_wire_diameter = 0.00147 | |
| primary_number_turns = 30 | |
| secondary_number_turns = 10 | |
| secondary_strand_diameter = 50e-6 | |
| secondary_number_strands = 400 | |
| frequency = 120000 | |
| current_primary = 0.7 | |
| current_secondary = 2.1 | |
| voltage_secondary = 12 | |
| material = { | |
| "name": "95", | |
| "initial_permeability": 2980, | |
| "resistivity": 2, | |
| "steinmetz_k": 6.941832847, | |
| "steinmetz_alpha": 1.433728921, | |
| "steinmetz_beta": 2.494912103, | |
| } | |
| color_ferrite = [89, 94, 107] | |
| color_copper = [242, 140, 102] | |
| color_litz = [0xd3, 0xe1, 0xf5] | |
| color_teflon = [0x53, 0x97, 0x96] | |
| color_bobbin = [52, 52, 52] | |
| color_tape = [0xed, 0xbe, 0x1c] | |
| output_dir = "C:/Users/alfonso/Magnetics training/outputs" | |
| os.makedirs(output_dir, exist_ok=True) | |
| project = pyaedt.Maxwell3d( | |
| project=f"{output_dir}/Lesson_27_{time.time()}", | |
| solution_type="EddyCurrent", | |
| non_graphical=False, | |
| new_desktop=False, | |
| close_on_exit=False | |
| ) | |
| project.modeler.model_units = "meter" | |
| aedt_material = project.materials.add_material(material["name"]) | |
| aedt_material.permeability = material["initial_permeability"] | |
| conductivity = 1.0 / material["resistivity"] | |
| aedt_material.conductivity = conductivity | |
| aedt_material.set_power_ferrite_coreloss( | |
| cm=material["steinmetz_k"], | |
| x=material["steinmetz_alpha"], | |
| y=material["steinmetz_beta"] | |
| ) | |
| core = project.modeler.create_box( | |
| origin=[-dim["C"] / 2, -dim["A"] / 2, -2 * dim["B"] / 2], | |
| sizes=[dim["C"], dim["A"], 2 * dim["B"]], | |
| name="core", | |
| material=material["name"] | |
| ) | |
| core.color = color_ferrite | |
| core.transparency = 0 | |
| project.modeler.fit_all() | |
| central_column = project.modeler.create_cylinder( | |
| orientation=pyaedt.constants.AXIS.Z, | |
| origin=[0, 0, -dim["D"]], | |
| radius=dim["F"] / 2, | |
| height=dim["D"] * 2, | |
| num_sides=number_segments_arcs, | |
| name="central_column", | |
| material="air" | |
| ) | |
| winding_window = project.modeler.create_cylinder( | |
| orientation=pyaedt.constants.AXIS.Z, | |
| origin=[0, 0, -dim["D"]], | |
| radius=dim["E"] / 2, | |
| height=dim["D"] * 2, | |
| num_sides=number_segments_arcs, | |
| name="winding_window", | |
| material="air" | |
| ) | |
| winding_window.subtract(central_column, True) | |
| core.subtract(winding_window, False) | |
| gap = project.modeler.create_box( | |
| origin=[-dim["F"] / 2, -dim["F"] / 2, -0], | |
| sizes=[dim["F"], dim["F"], gap_length], | |
| name="gap", | |
| material="air" | |
| ) | |
| core.subtract(gap, False) | |
| resudial_gap = project.modeler.create_box( | |
| origin=[-dim["A"] / 2, -dim["A"] / 2, -0], | |
| sizes=[dim["A"], dim["A"], resudial_gap_length], | |
| name="resudial_gap", | |
| material="air" | |
| ) | |
| core.subtract(resudial_gap, False) | |
| project.set_core_losses( | |
| assignment=[core.name], | |
| core_loss_on_field=True | |
| ) | |
| bobbin = project.modeler.create_cylinder( | |
| orientation=pyaedt.constants.AXIS.Z, | |
| origin=[0, 0, -dim["D"]], | |
| radius=dim["E"] / 2, | |
| height=dim["D"] * 2, | |
| num_sides=number_segments_arcs, | |
| name="bobbin", | |
| material="PVC plastic" | |
| ) | |
| bobbin.color = color_bobbin | |
| bobbin.transparency = 0 | |
| bobbin_winding_window = project.modeler.create_cylinder( | |
| orientation=pyaedt.constants.AXIS.Z, | |
| origin=[0, 0, -dim["D"] + bobbin_thickness], | |
| radius=dim["E"] / 2, | |
| height=dim["D"] * 2 - bobbin_thickness * 2, | |
| num_sides=number_segments_arcs, | |
| name="bobbin", | |
| material="air" | |
| ) | |
| bobbin_winding_window_hole = project.modeler.create_cylinder( | |
| orientation=pyaedt.constants.AXIS.Z, | |
| origin=[0, 0, -dim["D"]], | |
| radius=dim["F"] / 2 + bobbin_thickness, | |
| height=dim["D"] * 2, | |
| num_sides=number_segments_arcs, | |
| name="central_column", | |
| material="air" | |
| ) | |
| bobbin_winding_window.subtract(bobbin_winding_window_hole, False) | |
| bobbin.subtract(central_column, False) | |
| bobbin.subtract(bobbin_winding_window, False) | |
| primary_terminals = [] | |
| current_turn_height = (primary_number_turns - 1) * (primary_wire_diameter + 2 * primary_wire_coating) / 2 | |
| for index in range(0, primary_number_turns): | |
| turn_section = project.modeler.create_circle( | |
| orientation=pyaedt.constants.PLANE.YZ, | |
| origin=[0, dim["F"] / 2 + bobbin_thickness + primary_wire_coating + primary_wire_diameter / 2, current_turn_height], | |
| radius=primary_wire_diameter / 2, | |
| num_sides=number_segments_arcs, | |
| is_covered=True, | |
| name=f"Primary_turn_{index}", | |
| material="copper", | |
| non_model=False | |
| ) | |
| turn_object = project.modeler.sweep_around_axis( | |
| assignment=turn_section, | |
| axis=pyaedt.constants.AXIS.Z, | |
| sweep_angle=360, | |
| draft_angle=0, | |
| number_of_segments=number_segments_arcs | |
| ) | |
| turn_object.section( | |
| plane=pyaedt.constants.PLANE.YZ, | |
| create_new=True | |
| ) | |
| turn_object.transparency = 0 | |
| conducting_section_names = project.modeler.get_objects_w_string(f"{turn_object.name}_Section") | |
| assert len(conducting_section_names) == 1 | |
| conducting_section = project.modeler.get_object_from_name(conducting_section_names[0]) | |
| sections = project.modeler.separate_bodies(conducting_section) | |
| assert len(sections) == 2 | |
| conducting_section = sections[0] | |
| project.modeler.delete(sections[1]) | |
| terminal = project.assign_coil( | |
| assignment=conducting_section, | |
| conductors_number=1, | |
| polarity="Positive", | |
| name=f"{turn_object.name}_terminal" | |
| ) | |
| primary_terminals.append(terminal.name) | |
| current_turn_height -= primary_wire_diameter + 2 * primary_wire_coating | |
| secondary_terminals = [] | |
| litz_wire_material = project.materials.duplicate_material( | |
| material="copper", | |
| name=f"Litz {secondary_number_strands}x{secondary_strand_diameter * 1000}" | |
| ) | |
| litz_wire_material.stacking_type = "Litz Wire" | |
| litz_wire_material.wire_type = "Round" | |
| litz_wire_material.strand_number = secondary_number_strands | |
| litz_wire_material.wire_diameter = f"{secondary_wire_diameter}meter" | |
| current_turn_height = (secondary_number_turns - 1) * (secondary_wire_diameter) / 2 | |
| for index in range(0, secondary_number_turns): | |
| turn_section = project.modeler.create_circle( | |
| orientation=pyaedt.constants.PLANE.YZ, | |
| origin=[0, dim["F"] / 2 + bobbin_thickness + primary_wire_diameter + 2 * primary_wire_coating + secondary_wire_diameter / 2, current_turn_height], | |
| radius=secondary_wire_diameter / 2, | |
| num_sides=number_segments_arcs, | |
| is_covered=True, | |
| name=f"Secondary_turn_{index}", | |
| material=litz_wire_material.name, | |
| non_model=False | |
| ) | |
| turn_object = project.modeler.sweep_around_axis( | |
| assignment=turn_section, | |
| axis=pyaedt.constants.AXIS.Z, | |
| sweep_angle=360, | |
| draft_angle=0, | |
| number_of_segments=number_segments_arcs | |
| ) | |
| turn_object.section( | |
| plane=pyaedt.constants.PLANE.YZ, | |
| create_new=True | |
| ) | |
| turn_object.color = color_litz | |
| turn_object.transparency = 0 | |
| conducting_section_names = project.modeler.get_objects_w_string(f"{turn_object.name}_Section") | |
| assert len(conducting_section_names) == 1 | |
| conducting_section = project.modeler.get_object_from_name(conducting_section_names[0]) | |
| sections = project.modeler.separate_bodies(conducting_section) | |
| assert len(sections) == 2 | |
| conducting_section = sections[0] | |
| project.modeler.delete(sections[1]) | |
| terminal = project.assign_coil( | |
| assignment=conducting_section, | |
| conductors_number=1, | |
| polarity="Negative", | |
| name=f"{turn_object.name}_terminal" | |
| ) | |
| secondary_terminals.append(terminal.name) | |
| current_turn_height -= secondary_wire_diameter | |
| primary = project.assign_winding( | |
| winding_type="Current", | |
| is_solid=True, | |
| current=current_primary, | |
| resistance=0, | |
| inductance=0, | |
| voltage=0, | |
| parallel_branches=1, | |
| phase=0, | |
| name="primary", | |
| ) | |
| secondary = project.assign_winding( | |
| winding_type="Voltage", | |
| is_solid=False, | |
| current=0, | |
| resistance=voltage_secondary / current_secondary, | |
| inductance=0, | |
| voltage=voltage_secondary, | |
| parallel_branches=1, | |
| phase=0, | |
| name="secondary", | |
| ) | |
| project.add_winding_coils( | |
| assignment=primary.name, | |
| coils=[x for i, x in enumerate(primary_terminals)] | |
| ) | |
| project.add_winding_coils( | |
| assignment=secondary.name, | |
| coils=[x for i, x in enumerate(secondary_terminals)] | |
| ) | |
| matrix = project.assign_matrix(assignment=[primary.name, secondary.name], matrix_name="solution_matrix") | |
| padding = { | |
| "x_pos": 50, | |
| "y_pos": 50, | |
| "z_pos": 50, | |
| "x_neg": 50, | |
| "y_neg": 50, | |
| "z_neg": 50, | |
| } | |
| region = project.modeler.create_region( | |
| pad_percent=[padding["x_pos"], padding["x_neg"], padding["y_pos"], padding["y_neg"], padding["z_pos"], padding["z_neg"]], | |
| is_percentage=True | |
| ) | |
| setup = project.create_setup("Setup") | |
| setup.props["Frequency"] = f"{frequency * 3}" | |
| setup.props["PercentRefinement"] = 10 | |
| setup.props["MaximumPasses"] = 40 | |
| setup.props["PercentError"] = 5 | |
| setup.props["HasSweepSetup"] = True | |
| setup.add_eddy_current_sweep( | |
| range_type="LinearStep", | |
| start=0.1, | |
| end=frequency * 3, | |
| count=frequency, | |
| units="Hz", | |
| clear=True, | |
| save_all_fields=True | |
| ) | |
| project.modeler.fit_all() | |
| project.analyze() | |
| project.release_desktop(close_projects=False, close_desktop=False) |
评论
?
参与讨论