APEC 2026 S10: Python For Power Electronics: From Zero To AI . Flyback Magnetic Ansys Automation A developer published a Python script that automates the construction of a flyback transformer model in Ansys Maxwell 3D using the PyAEDT library, covering core geometry, gapping, bobbin, and winding parameters. The script defines ferrite material properties with Steinmetz core-loss coefficients, builds the core and winding window via boolean subtraction, and configures an eddy-current solution for a 120 kHz design with 30 primary and 10 secondary turns. It is presented as a training lesson on scripting power-electronics magnetics simulation. | | 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 |