HFSS: spiral inductor#

This example shows how you can use PyAEDT to create a spiral inductor, solve it, and plot results.

Perform required imports#

Perform required imports.

import os
import pyaedt

project_name = pyaedt.generate_unique_project_name(project_name="spiral")

Set AEDT version#

Set AEDT version.

aedt_version = "2024.1"

Set non-graphical mode#

Set non-graphical mode. You can set non_graphical either to True or False.

non_graphical = False

Launch HFSS#

Launch HFSS 2023 R2 in non-graphical mode and change the units to microns.

hfss = pyaedt.Hfss(specified_version=aedt_version, non_graphical=non_graphical, designname="A1",
                   new_desktop_session=True)
hfss.solution_type = "Modal"
hfss.modeler.model_units = "um"
p = hfss.modeler

Define variables#

Define input variables. You can use the values that follow or edit them.

rin = 10
width = 2
spacing = 1
thickness = 1
Np = 8
Nr = 10
gap = 3
hfss["Tsub"] = "6" + hfss.modeler.model_units

Standardize polyline#

Standardize the polyline using the create_line method to fix the width, thickness, and material.

def create_line(pts):
    p.create_polyline(pts, xsection_type="Rectangle", xsection_width=width, xsection_height=thickness, matname="copper")

Create spiral inductor#

Create the spiral inductor. This spiral inductor is not parametric, but you could parametrize it later.

ind = hfss.modeler.create_spiral(
    internal_radius=rin,
    width=width,
    spacing=spacing,
    turns=Nr,
    faces=Np,
    thickness=thickness,
    material="copper",
    name="Inductor1",
)

Center return path#

Center the return path.

x0, y0, z0 = ind.points[0]
x1, y1, z1 = ind.points[-1]
create_line([(x0 - width / 2, y0, -gap), (abs(x1) + 5, y0, -gap)])
p.create_box([x0 - width / 2, y0 - width / 2, -gap - thickness / 2],
             [width, width, gap + thickness],
             matname="copper")
<pyaedt.modeler.cad.object3d.Object3d object at 0x000002716DDA3E20>

Create port 1#

Create port 1.

p.create_rectangle(csPlane=pyaedt.constants.PLANE.YZ,
                   position=[abs(x1) + 5, y0 - width / 2, -gap - thickness / 2],
                   dimension_list=[width, "Tsub+{}{}".format(gap, hfss.modeler.model_units)],
                   name="port1"
                   )
hfss.lumped_port(assignment="port1", integration_line=pyaedt.constants.AXIS.Z)
<pyaedt.modules.Boundary.BoundaryObject object at 0x000002716DDA1A50>

Create port 2#

Create port 2.

create_line([(x1 + width / 2, y1, 0), (x1 - 5, y1, 0)])
p.create_rectangle(pyaedt.constants.PLANE.YZ, [x1 - 5, y1 - width / 2, -thickness / 2],
                   [width, "-Tsub"],
                   name="port2")
hfss.lumped_port(assignment="port2", integration_line=pyaedt.constants.AXIS.Z)
<pyaedt.modules.Boundary.BoundaryObject object at 0x000002716DDA07F0>

Create silicon substrate and ground plane#

Create the silicon substrate and the ground plane.

p.create_box([x1 - 20, x1 - 20, "-Tsub-{}{}/2".format(thickness, hfss.modeler.model_units)],
             [-2 * x1 + 40, -2 * x1 + 40, "Tsub"],
             matname="silicon")

p.create_box([x1 - 20, x1 - 20, "-Tsub-{}{}/2".format(thickness, hfss.modeler.model_units)],
             [-2 * x1 + 40, -2 * x1 + 40, -0.1],
             matname="PEC")
<pyaedt.modeler.cad.object3d.Object3d object at 0x000002716DDA21D0>

Assign airbox and radiation#

Assign the airbox and the radiation.

box = p.create_box(
    [x1 - 20, x1 - 20, "-Tsub-{}{}/2 - 0.1{}".format(thickness, hfss.modeler.model_units, hfss.modeler.model_units)],
    [-2 * x1 + 40, -2 * x1 + 40, 100],
    name="airbox",
    matname="air"
)

hfss.assign_radiation_boundary_to_objects("airbox")
<pyaedt.modules.Boundary.BoundaryObject object at 0x000002716DDA3490>

Assign material override#

Assign a material override so that the validation check does not fail.

hfss.change_material_override()
True

Plot model#

Plot the model.

hfss.plot(show=False, export_path=os.path.join(hfss.working_directory, "Image.jpg"), plot_air_objects=False)
HFSS Spiral
<pyaedt.generic.plot.ModelPlotter object at 0x00000271697FCD00>

Create setup#

Create the setup and define a frequency sweep to solve the project.

setup1 = hfss.create_setup(name="setup1")
setup1.props["Frequency"] = "10GHz"
hfss.create_linear_count_sweep(setup="setup1", units="GHz", start_frequency=1e-3, stop_frequency=50,
                               num_of_freq_points=451, sweep_type="Interpolating")
hfss.save_project()
hfss.analyze()
True

Get report data#

Get report data and use the following formulas to calculate the inductance and quality factor.

L_formula = "1e9*im(1/Y(1,1))/(2*pi*freq)"
Q_formula = "im(Y(1,1))/re(Y(1,1))"

Create output variable#

Create output variable

hfss.create_output_variable("L", L_formula, solution="setup1 : LastAdaptive")
True

Plot calculated values in Matplotlib#

Plot the calculated values in Matplotlib.

data = hfss.post.get_solution_data([L_formula, Q_formula])
data.plot(curves=[L_formula, Q_formula], formula="re", x_label="Freq", y_label="L and Q")
Simulation Results Plot
No artists with labels found to put in legend.  Note that artists whose label start with an underscore are ignored when legend() is called with no argument.

<Figure size 2000x1000 with 1 Axes>

Export results to csv file#

Export results to csv file

data.export_data_to_csv(os.path.join(hfss.toolkit_directory, "output.csv"))
True

Save project and close AEDT#

Save the project and close AEDT.

hfss.save_project(project_name)
hfss.release_desktop()
True

Total running time of the script: (2 minutes 6.555 seconds)

Gallery generated by Sphinx-Gallery