Skip to content

Commit

Permalink
Fix/dynamic link (#841)
Browse files Browse the repository at this point in the history
* fixed example

* fixed example

* fixed example

* fixed example

* fixed example

* fixed example

* fixed example

* fixed example

* fixed example

* fixed example

* fixed UT
  • Loading branch information
maxcapodi78 authored Feb 9, 2022
1 parent aabbba3 commit 97f8b40
Show file tree
Hide file tree
Showing 5 changed files with 143 additions and 85 deletions.
7 changes: 4 additions & 3 deletions _unittest/test_00_EDB.py
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ def test_01B_get_vias_from_nets(self):
assert self.edbapp.core_padstack.get_via_instance_from_net("GND")
assert not self.edbapp.core_padstack.get_via_instance_from_net(["GND2"])

def tesCt_01_flip_layer_stackup(self):
def test_01_flip_layer_stackup(self):
assert self.edbapp.core_stackup.place_in_layout()

def test_02_get_properties(self):
Expand All @@ -68,6 +68,7 @@ def test_02_get_properties(self):
assert len(self.edbapp.core_components.ICs) > 0
assert len(self.edbapp.core_components.IOs) > 0
assert len(self.edbapp.core_components.Others) > 0
assert len(self.edbapp.get_bounding_box()) == 2

def test_03_get_primitives(self):
assert len(self.edbapp.core_primitives.polygons) > 0
Expand Down Expand Up @@ -190,8 +191,8 @@ def test_17_components(self):
assert "R1" in list(self.edbapp.core_components.components.keys())
assert self.edbapp.core_components.components["R1"].res_value
assert self.edbapp.core_components.components["R1"].placement_layer
assert self.edbapp.core_components.components["R1"].lower_elevation
assert self.edbapp.core_components.components["R1"].upper_elevation
assert isinstance(self.edbapp.core_components.components["R1"].lower_elevation, float)
assert isinstance(self.edbapp.core_components.components["R1"].upper_elevation, float)
assert self.edbapp.core_components.components["R1"].top_bottom_association == 0
assert self.edbapp.core_components.components["R1"].pinlist
pinname = self.edbapp.core_components.components["R1"].pinlist[0].GetName()
Expand Down
28 changes: 16 additions & 12 deletions _unittest/test_22_Circuit_DynamicLink.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
import os
from _unittest.conftest import local_path, scratch_path, config, desktop_version

from pyaedt import Circuit
from pyaedt import Circuit, Q2d, Q3d, Hfss
from pyaedt.generic.filesystem import Scratch
import gc

Expand Down Expand Up @@ -30,7 +30,7 @@ def setup_class(self):
source_project = os.path.join(local_path, "example_models", src_project_name + ".aedt")
linked_project = os.path.join(local_path, "example_models", linked_project_name + ".aedt")

self.q3d = os.path.join(local_path, "example_models", "q2d_q3d.aedt")
self.q3d = self.local_scratch.copyfile(os.path.join(local_path, "example_models", "q2d_q3d.aedt"))
self.test_project = self.local_scratch.copyfile(example_project)
self.test_src_project = self.local_scratch.copyfile(source_project)
self.test_lkd_project = self.local_scratch.copyfile(linked_project)
Expand Down Expand Up @@ -190,15 +190,19 @@ def test_09_setup(self):

def test_10_q3d_link(self):
self.aedtapp.insert_design("test_link")
q2d = Q2d(self.q3d)
proj_path = self.q3d
proj_name = q2d.project_name
assert self.aedtapp.modeler.schematic.add_subcircuit_dynamic_link(q2d, extrusion_length=25)
if proj_name in self.aedtapp.project_list:
proj_path = proj_name
q3d = Q3d(proj_path)

assert self.aedtapp.modeler.schematic.add_subcircuit_dynamic_link(q3d, solution_name="Setup1 : LastAdaptive")
hfss = Hfss(proj_path)

assert self.aedtapp.modeler.schematic.add_subcircuit_dynamic_link(hfss, solution_name="Setup1 : Sweep")
hfss = Hfss(proj_path)
assert self.aedtapp.modeler.schematic.add_subcircuit_dynamic_link(
"2DExtractorDesign1", self.q3d, solution_name="Setup1 : Sweep", extrusion_length=25
)
assert self.aedtapp.modeler.schematic.add_subcircuit_dynamic_link(
"Q3DDesign1", self.q3d, solution_name="Setup1 : LastAdaptive"
)
assert self.aedtapp.modeler.schematic.add_subcircuit_dynamic_link(
"Terminal", self.q3d, solution_name="Setup1 : Sweep"
)
assert self.aedtapp.modeler.schematic.add_subcircuit_dynamic_link(
"Terminal", self.q3d, solution_name="Setup2 : Sweep", tline_port="1"
hfss, solution_name="Setup2 : Sweep", tline_port="1"
)
7 changes: 3 additions & 4 deletions examples/06-Multiphysics/Hfss_Mechanical.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,11 @@
# Starts HFSS
# ~~~~~~~~~~~
# Starts Hfss and initialize the Pyaedt object.

non_graphical = True
version = "2021.2"
hfss = Hfss(project_temp_name, specified_version=version)
hfss = Hfss(project_temp_name, specified_version=version, non_graphical=non_graphical)
pin_names = hfss.modeler.get_excitations_name()


###############################################################################
# Starts Circuit
# ~~~~~~~~~~~~~~
Expand All @@ -54,7 +53,7 @@
# argument of set_sim_option_on_hfss_subcircuit can be the component name, the component id or
# the component object.

circuit.modeler.schematic.refresh_dynamic_link("MyHfss")
circuit.modeler.schematic.refresh_dynamic_link(hfss_comp.composed_name)
circuit.modeler.schematic.set_sim_option_on_hfss_subcircuit(hfss_comp)
hfss_setup_name = hfss.setups[0].name + " : " + hfss.setups[0].sweeps[0].name
circuit.modeler.schematic.set_sim_solution_on_hfss_subcircuit(hfss_comp.composed_name, hfss_setup_name)
Expand Down
86 changes: 41 additions & 45 deletions pyaedt/hfss.py
Original file line number Diff line number Diff line change
Expand Up @@ -3270,8 +3270,8 @@ def assign_perfecte_to_sheets(self, sheet_list, sourcename=None, is_infinite_gnd
Create a sheet and use it to create a Perfect E.
>>> sheet = hfss.modeler.primitives.create_rectangle(hfss.PLANE.XY, [0, 0, -90],
... [10, 2], name="PerfectESheet", matname="Copper")
>>> sheet = hfss.modeler.create_rectangle(hfss.PLANE.XY, [0, 0, -90],
... [10, 2], name="PerfectESheet", matname="Copper")
>>> perfect_e_from_sheet = hfss.assign_perfecte_to_sheets(sheet.name, "PerfectEFromSheet")
>>> type(perfect_e_from_sheet)
<class 'pyaedt.modules.Boundary.BoundaryObject'>
Expand Down Expand Up @@ -3312,8 +3312,8 @@ def assign_perfecth_to_sheets(self, sheet_list, sourcename=None):
Create a sheet and use it to create a Perfect H.
>>> sheet = hfss.modeler.primitives.create_rectangle(hfss.PLANE.XY, [0, 0, -90],
... [10, 2], name="PerfectHSheet", matname="Copper")
>>> sheet = hfss.modeler.create_rectangle(hfss.PLANE.XY, [0, 0, -90],
... [10, 2], name="PerfectHSheet", matname="Copper")
>>> perfect_h_from_sheet = hfss.assign_perfecth_to_sheets(sheet.name, "PerfectHFromSheet")
>>> type(perfect_h_from_sheet)
<class 'pyaedt.modules.Boundary.BoundaryObject'>
Expand Down Expand Up @@ -3372,9 +3372,9 @@ def assign_lumped_rlc_to_sheet(
Create a sheet and use it to create a lumped RLC.
>>> sheet = hfss.modeler.primitives.create_rectangle(hfss.PLANE.XY,
... [0, 0, -90], [10, 2], name="RLCSheet",
... matname="Copper")
>>> sheet = hfss.modeler.create_rectangle(hfss.PLANE.XY,
... [0, 0, -90], [10, 2], name="RLCSheet",
... matname="Copper")
>>> lumped_rlc_to_sheet = hfss.assign_lumped_rlc_to_sheet(sheet.name, hfss.AxisDir.XPos,
... Rvalue=50, Lvalue=1e-9,
... Cvalue=1e-6)
Expand All @@ -3384,14 +3384,14 @@ def assign_lumped_rlc_to_sheet(
"""

if self.solution_type in ["Modal", "Terminal", "Transient Network", "SBR+"] and (Rvalue or Lvalue or Cvalue):
point0, point1 = self.modeler.primitives.get_mid_points_on_dir(sheet_name, axisdir)
point0, point1 = self.modeler.get_mid_points_on_dir(sheet_name, axisdir)

if not sourcename:
sourcename = generate_unique_name("Lump")
elif sourcename in self.modeler.get_boundaries_name():
sourcename = generate_unique_name(sourcename)
start = [str(i) + self.modeler.primitives.model_units for i in point0]
stop = [str(i) + self.modeler.primitives.model_units for i in point1]
start = [str(i) + self.modeler.model_units for i in point0]
stop = [str(i) + self.modeler.model_units for i in point1]
props = OrderedDict()
props["Objects"] = [sheet_name]
props["CurrentLine"] = OrderedDict({"Start": start, "End": stop})
Expand Down Expand Up @@ -3442,9 +3442,9 @@ def assign_impedance_to_sheet(self, sheet_name, sourcename=None, resistance=50,
Create a sheet and use it to create an impedance.
>>> sheet = hfss.modeler.primitives.create_rectangle(hfss.PLANE.XY,
... [0, 0, -90], [10, 2], name="ImpedanceSheet",
... matname="Copper")
>>> sheet = hfss.modeler.create_rectangle(hfss.PLANE.XY,
... [0, 0, -90], [10, 2], name="ImpedanceSheet",
... matname="Copper")
>>> impedance_to_sheet = hfss.assign_impedance_to_sheet(sheet.name, "ImpedanceFromSheet", 100, 50)
>>> type(impedance_to_sheet)
<class 'pyaedt.modules.Boundary.BoundaryObject'>
Expand Down Expand Up @@ -3521,13 +3521,13 @@ def create_circuit_port_from_edges(
toward the first edge of the second rectangle.
>>> plane = hfss.PLANE.XY
>>> rectangle1 = hfss.modeler.primitives.create_rectangle(plane, [10, 10, 10], [10, 10],
... name="rectangle1_for_port")
>>> edges1 = hfss.modeler.primitives.get_object_edges(rectangle1.id)
>>> rectangle1 = hfss.modeler.create_rectangle(plane, [10, 10, 10], [10, 10],
... name="rectangle1_for_port")
>>> edges1 = hfss.modeler.get_object_edges(rectangle1.id)
>>> first_edge = edges1[0]
>>> rectangle2 = hfss.modeler.primitives.create_rectangle(plane, [30, 10, 10], [10, 10],
... name="rectangle2_for_port")
>>> edges2 = hfss.modeler.primitives.get_object_edges(rectangle2.id)
>>> rectangle2 = hfss.modeler.create_rectangle(plane, [30, 10, 10], [10, 10],
... name="rectangle2_for_port")
>>> edges2 = hfss.modeler.get_object_edges(rectangle2.id)
>>> second_edge = edges2[0]
>>> hfss.solution_type = "Modal"
>>> hfss.create_circuit_port_from_edges(first_edge, second_edge, port_name="PortExample",
Expand Down Expand Up @@ -3576,9 +3576,9 @@ def edit_source(self, portandmode, powerin, phase="0deg"):
Create a circle sheet and use it to create a wave port.
Set up the thermal power for the port created above.
>>> sheet = hfss.modeler.primitives.create_circle(hfss.PLANE.YZ,
... [-20, 0, 0], 10,
... name="sheet_for_source")
>>> sheet = hfss.modeler.create_circle(hfss.PLANE.YZ,
... [-20, 0, 0], 10,
... name="sheet_for_source")
>>> hfss.solution_type = "Modal"
>>> wave_port = hfss.create_wave_port_from_sheet(sheet, 5, hfss.AxisDir.XNeg, 40,
... 2, "SheetWavePort", True)
Expand Down Expand Up @@ -3635,9 +3635,9 @@ def thicken_port_sheets(self, inputlist, value, internalExtr=True, internalvalue
Create a circle sheet and use it to create a wave port.
Set the thickness of this circle sheet to ``"2 mm"``.
>>> sheet_for_thickness = hfss.modeler.primitives.create_circle(hfss.PLANE.YZ,
... [60, 60, 60], 10,
... name="SheetForThickness")
>>> sheet_for_thickness = hfss.modeler.create_circle(hfss.PLANE.YZ,
... [60, 60, 60], 10,
... name="SheetForThickness")
>>> port_for_thickness = hfss.create_wave_port_from_sheet(sheet_for_thickness, 5, hfss.AxisDir.XNeg,
... 40, 2, "WavePortForThickness", True)
>>> hfss.thicken_port_sheets(["SheetForThickness"], 2)
Expand All @@ -3648,7 +3648,7 @@ def thicken_port_sheets(self, inputlist, value, internalExtr=True, internalvalue

tol = 1e-6
ports_ID = {}
aedt_bounding_box = self.modeler.primitives.get_model_bounding_box()
aedt_bounding_box = self.modeler.get_model_bounding_box()
directions = {}
for el in inputlist:
objID = self.modeler.oeditor.GetFaceIDs(el)
Expand All @@ -3661,7 +3661,7 @@ def thicken_port_sheets(self, inputlist, value, internalExtr=True, internalvalue
["NAME:SheetThickenParameters", "Thickness:=", str(l) + "mm", "BothSides:=", False],
)
# aedt_bounding_box2 = self._oeditor.GetModelBoundingBox()
aedt_bounding_box2 = self.modeler.primitives.get_model_bounding_box()
aedt_bounding_box2 = self.modeler.get_model_bounding_box()
self._odesign.Undo()
if aedt_bounding_box != aedt_bounding_box2:
directions[el] = "External"
Expand All @@ -3684,7 +3684,7 @@ def thicken_port_sheets(self, inputlist, value, internalExtr=True, internalvalue
objID = self.modeler.oeditor.GetFaceIDs(el)
maxarea = 0
for f in objID:
faceArea = self.modeler.primitives.get_face_area(int(f))
faceArea = self.modeler.get_face_area(int(f))
if faceArea > maxarea:
maxarea = faceArea
faceCenter = self.modeler.oeditor.GetFaceCenter(int(f))
Expand All @@ -3704,7 +3704,7 @@ def thicken_port_sheets(self, inputlist, value, internalExtr=True, internalvalue
try:
fc2 = self.modeler.oeditor.GetFaceCenter(f)
fc2 = [float(i) for i in fc2]
fa2 = self.modeler.primitives.get_face_area(int(f))
fa2 = self.modeler.get_face_area(int(f))
faceoriginal = [float(i) for i in faceCenter]
# dist = mat.sqrt(sum([(a*a-b*b) for a,b in zip(faceCenter, fc2)]))
if abs(fa2 - maxarea) < tol ** 2 and (
Expand Down Expand Up @@ -4154,8 +4154,8 @@ def assign_radiation_boundary_to_objects(self, obj_names, boundary_name=""):
Create a box and assign a radiation boundary to it.
>>> radiation_box = hfss.modeler.primitives.create_box([0, -200, -200], [200, 200, 200],
... name="Radiation_box")
>>> radiation_box = hfss.modeler.create_box([0, -200, -200], [200, 200, 200],
... name="Radiation_box")
>>> radiation = hfss.assign_radiation_boundary_to_objects("Radiation_box")
>>> type(radiation)
<class 'pyaedt.modules.Boundary.BoundaryObject'>
Expand Down Expand Up @@ -4196,9 +4196,9 @@ def assign_radiation_boundary_to_faces(self, faces_id, boundary_name=""):
Create a box. Select the faces of this box and assign a radiation
boundary to them.
>>> radiation_box = hfss.modeler.primitives.create_box([0 , -100, 0], [200, 200, 200],
... name="RadiationForFaces")
>>> ids = [i.id for i in hfss.modeler.primitives["RadiationForFaces"].faces]
>>> radiation_box = hfss.modeler.create_box([0 , -100, 0], [200, 200, 200],
... name="RadiationForFaces")
>>> ids = [i.id for i in hfss.modeler["RadiationForFaces"].faces]
>>> radiation = hfss.assign_radiation_boundary_to_faces(ids)
>>> type(radiation)
<class 'pyaedt.modules.Boundary.BoundaryObject'>
Expand Down Expand Up @@ -4242,21 +4242,17 @@ def _create_sbr_doppler_setup(
else:
setup1.props["SbrRangeDopplerWaveformType"] = setup_type
setup1.props["SbrRangeDopplerTimeVariable"] = time_var
setup1.props["SbrRangeDopplerCenterFreq"] = self.modeler.primitives._arg_with_dim(center_freq, "GHz")
setup1.props["SbrRangeDopplerRangeResolution"] = self.modeler.primitives._arg_with_dim(resolution, "meter")
setup1.props["SbrRangeDopplerRangePeriod"] = self.modeler.primitives._arg_with_dim(period, "meter")
setup1.props["SbrRangeDopplerVelocityResolution"] = self.modeler.primitives._arg_with_dim(
velocity_resolution, "m_per_sec"
)
setup1.props["SbrRangeDopplerVelocityMin"] = self.modeler.primitives._arg_with_dim(min_velocity, "m_per_sec")
setup1.props["SbrRangeDopplerVelocityMax"] = self.modeler.primitives._arg_with_dim(max_velocity, "m_per_sec")
setup1.props["SbrRangeDopplerCenterFreq"] = self.modeler._arg_with_dim(center_freq, "GHz")
setup1.props["SbrRangeDopplerRangeResolution"] = self.modeler._arg_with_dim(resolution, "meter")
setup1.props["SbrRangeDopplerRangePeriod"] = self.modeler._arg_with_dim(period, "meter")
setup1.props["SbrRangeDopplerVelocityResolution"] = self.modeler._arg_with_dim(velocity_resolution, "m_per_sec")
setup1.props["SbrRangeDopplerVelocityMin"] = self.modeler._arg_with_dim(min_velocity, "m_per_sec")
setup1.props["SbrRangeDopplerVelocityMax"] = self.modeler._arg_with_dim(max_velocity, "m_per_sec")
setup1.props["DopplerRayDensityPerWavelength"] = ray_density_per_wavelenght
setup1.props["MaxNumberOfBounces"] = max_bounces
if setup_type != "PulseDoppler":
setup1.props["IncludeRangeVelocityCouplingEffect"] = include_coupling_effects
setup1.props["SbrRangeDopplerA/DSamplingRate"] = self.modeler.primitives._arg_with_dim(
doppler_ad_sampling_rate, "MHz"
)
setup1.props["SbrRangeDopplerA/DSamplingRate"] = self.modeler._arg_with_dim(doppler_ad_sampling_rate, "MHz")
setup1.update()
return setup1

Expand Down
Loading

0 comments on commit 97f8b40

Please sign in to comment.