Set up an HFSS simulation#

This page shows how to set up an HFSS simulation.

from pyedb import Edb
from pyedb.generic.general_methods import generate_unique_folder_name
import pyedb.misc.downloads as downloads

# Ansys release version
ansys_version = "2024.1"

# download and copy the layout file from examples
temp_folder = generate_unique_folder_name()
targetfile = downloads.download_file("edb/ANSYS-HSD_V1.aedb", destination=temp_folder)

# load EDB
edbapp = Edb(edbpath=targetfile, edbversion="2024.1")

# create HFSS simulation setup
setup1 = edbapp.create_hfss_setup("setup1")

# set solution as single frequenvcy
setup1.set_solution_single_frequency()

# set multi-frequencies solution
setup1.set_solution_multi_frequencies()

# set broadband solution
setup1.set_solution_broadband(low_frequency="1GHz", high_frequency="10GHz")

# enable low-frequency accuracy
setup1.hfss_solver_settings.enhanced_low_freq_accuracy = True

# set solution basis order
setup1.hfss_solver_settings.order_basis = "first"

# set relative residual
setup1.hfss_solver_settings.relative_residual = 0.0002

# enable shell elements usage
setup1.hfss_solver_settings.use_shell_elements = True

# retrieve HFSS solver settings
hfss_solver_settings = edbapp.setups["setup1"].hfss_solver_settings

# add adaptive settings
setup1.adaptive_settings.add_adaptive_frequency_data("5GHz", 8, "0.01")

# add broadband adaptive settings
setup1.adaptive_settings.adapt_type = "kBroadband"

# specify maximum number of adaptive passes
setup1.adaptive_settings.max_refine_per_pass = 20

# specify minimum number of adaptive passes
setup1.adaptive_settings.min_passes = 2

# enable save fields
setup1.adaptive_settings.save_fields = True

# enable save radiate fields only
setup1.adaptive_settings.save_rad_field_only = True

# enable defeature based on absolute length
setup1.defeature_settings.defeature_abs_length = "1um"

# enable defeature based on aspect ratio
setup1.defeature_settings.defeature_ratio = 1e-5

# set healing options
setup1.defeature_settings.healing_option = 0

# set model type
setup1.defeature_settings.model_type = 1

# enable removal of floating geometries
setup1.defeature_settings.remove_floating_geometry = True

# void defeaturing criteria
setup1.defeature_settings.small_void_area = 0.1

# enable polygon union
setup1.defeature_settings.union_polygons = False

#  enable defeaturing
setup1.defeature_settings.use_defeature = False

# enable absolute length defeaturing
setup1.defeature_settings.use_defeature_abs_length = True

via_settings = setup1.via_settings
via_settings.via_density = 1
via_settings.via_material = "pec"
via_settings.via_num_sides = 8
via_settings.via_style = "kNum25DViaStyle"

# specify advanced mesh settings
advanced_mesh_settings = setup1.advanced_mesh_settings
advanced_mesh_settings.layer_snap_tol = "1e-6"
advanced_mesh_settings.mesh_display_attributes = "#0000001"
advanced_mesh_settings.replace_3d_triangles = False

# specify curve approximation settings
curve_approx_settings = setup1.curve_approx_settings
curve_approx_settings.arc_angle = "15deg"
curve_approx_settings.arc_to_chord_error = "0.1"
curve_approx_settings.max_arc_points = 12
curve_approx_settings.start_azimuth = "1"
curve_approx_settings.use_arc_to_chord_error = True

# specify DC settings
dcr_settings = setup1.dcr_settings
dcr_settings.conduction_max_passes = 11
dcr_settings.conduction_min_converged_passes = 2
dcr_settings.conduction_min_passes = 2
dcr_settings.conduction_per_error = 2.0
dcr_settings.conduction_per_refine = 33.0

# specify port settings
hfss_port_settings = setup1.hfss_port_settings
hfss_port_settings.max_delta_z0 = 0.5
hfss_port_settings.max_triangles_wave_port = 1000
hfss_port_settings.min_triangles_wave_port = 200
hfss_port_settings.set_triangles_wave_port = True

# add frequency sweep
setup1.add_frequency_sweep(
    "sweep1",
    frequency_sweep=[
        ["linear count", "0", "1kHz", 1],
        ["log scale", "1kHz", "0.1GHz", 10],
        ["linear scale", "0.1GHz", "10GHz", "0.1GHz"],
    ],
)
sweep1 = setup1.frequency_sweeps["sweep1"]
sweep1.adaptive_sampling = True

# change setup name
edbapp.setups["setup1"].name = "setup1a"

# add length-based mesh operation
mop = edbapp.setups["setup1a"].add_length_mesh_operation(
    {"GND": ["1_Top", "16_Bottom"]}, "m1"
)
mop.name = "m2"
mop.max_elements = 2000
mop.restrict_max_elements = False
mop.restrict_length = False
mop.max_length = "2mm"

# add skin-depth mesh operation
mop = edbapp.setups["setup1a"].add_skin_depth_mesh_operation(
    {"GND": ["1_Top", "16_Bottom"]}
)
mop.skin_depth = "5um"
mop.surface_triangle_length = "2mm"
mop.number_of_layer_elements = "3"
edbapp.save()
edbapp.close()
Define HFSS setup