# APEC 2026 S10: Python For Power Electronics: From Zero To AI . Flyback Magnetic Ansys  Automation

> Source: <https://gist.github.com/ThinkPad88/c9569a42e1cb3e7e74476bf8622093a4>
> Published: 2026-10-18 06:01:11+00:00

|  | 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) |
