From 4fca434e7ea606da60c5e31c678bd4da3bd38d7a Mon Sep 17 00:00:00 2001 From: Samuel Lopez <85613111+Samuelopez-ansys@users.noreply.github.com> Date: Fri, 31 Jan 2025 14:46:05 +0100 Subject: [PATCH] FEAT: Shielding effectiveness extension (#5672) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Sébastien Morais <146729917+SMoraisAnsys@users.noreply.github.com> Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- .../pyaedt_extensions_doc/hfss/shielding.rst | 51 ++ .../_static/extensions/shielding_ui.png | Bin 0 -> 18438 bytes src/ansys/aedt/core/hfss.py | 104 ++++ src/ansys/aedt/core/modeler/modeler_3d.py | 5 +- .../aedt/core/modules/boundary/common.py | 4 + .../aedt/core/visualization/report/common.py | 6 +- .../workflows/hfss/images/large/shielding.png | Bin 0 -> 1729 bytes .../workflows/hfss/shielding_effectiveness.py | 516 ++++++++++++++++++ .../core/workflows/hfss/toolkits_catalog.toml | 7 + tests/system/general/test_20_HFSS.py | 21 + tests/system/solvers/test_45_workflows.py | 43 ++ 11 files changed, 755 insertions(+), 2 deletions(-) create mode 100644 doc/source/User_guide/pyaedt_extensions_doc/hfss/shielding.rst create mode 100644 doc/source/_static/extensions/shielding_ui.png create mode 100644 src/ansys/aedt/core/workflows/hfss/images/large/shielding.png create mode 100644 src/ansys/aedt/core/workflows/hfss/shielding_effectiveness.py diff --git a/doc/source/User_guide/pyaedt_extensions_doc/hfss/shielding.rst b/doc/source/User_guide/pyaedt_extensions_doc/hfss/shielding.rst new file mode 100644 index 00000000000..cbe0741877f --- /dev/null +++ b/doc/source/User_guide/pyaedt_extensions_doc/hfss/shielding.rst @@ -0,0 +1,51 @@ +Shielding Effectiveness +======================= + +The **Shielding Effectiveness** extension computes the shielding effectiveness of an enclosure. +It calculates the attenuation of an electromagnetic field inside the enclosure due to the presence of a shield. + +The extension provides a graphical user interface (GUI) for configuration, +or it can be used in batch mode via command line arguments. + +The following image shows the extension GUI: + +.. image:: ../../../_static/extensions/shielding_ui.png + :width: 800 + :alt: Shielding Effectiveness GUI + + +Features +-------- + +- Configure input parameters including source sphere radius, polarization, start and stop frequency and dipole type. +- Automatic HFSS setup. +- Switch between light and dark themes in the GUI. + + +Using the extension +------------------- + +1. Open the **Automation** tab in the HFSS interface. +2. Locate and click the **Shielding Effectiveness** icon under the Extension Manager. +3. In the GUI, users can interact with the following elements: + - **Source sphere radius**: Source sphere radius in meters. It must fit inside the shielding. + - **Polarization**: X, Y, Z polarization component. + - **Frequency**: Start and stop frequency and the number of steps to analyze. + - **Electric dipole**: Activate electric dipole. Electric or magnetic dipole are available. + - **Cores**: Number of cores for the simulation. + - Toggle between light and dark themes. +4. Click on **Launch** to start the automated workflow. + + +Command line +------------ + +The extension can also be used directly via the command line for batch processing. + + +Use the following syntax to run the extension: + +.. toctree:: + :maxdepth: 2 + + ../commandline diff --git a/doc/source/_static/extensions/shielding_ui.png b/doc/source/_static/extensions/shielding_ui.png new file mode 100644 index 0000000000000000000000000000000000000000..fb276c1dea0b666b67612008dcf5dd67c1a98d1c GIT binary patch literal 18438 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 literal 0 HcmV?d00001 diff --git a/src/ansys/aedt/core/hfss.py b/src/ansys/aedt/core/hfss.py index a8e8cc0a262..9ccfc9c65d7 100644 --- a/src/ansys/aedt/core/hfss.py +++ b/src/ansys/aedt/core/hfss.py @@ -6766,6 +6766,110 @@ def plane_wave( return self._create_boundary(name, inc_wave_args, "Plane Incident Wave") + @pyaedt_function_handler() + def hertzian_dipole_wave( + self, + assignment=None, + origin=None, + polarization=None, + is_electric=True, + radius="10mm", + name=None, + ) -> BoundaryObject: + """Create a hertzian dipole wave excitation. + + The excitation is assigned in the assigned sphere. Inside this sphere, the field magnitude + is equal to the field magnitude calculated on the surface of the sphere. + + Parameters + ---------- + assignment : str or list, optional + One or more objects or faces to assign finite conductivity to. The default is ``None``, in which + case the excitation is assigned to anything. + origin : list, optional + Excitation location. The default is ``["0mm", "0mm", "0mm"]``. + polarization : list, optional + Electric field polarization vector. + The default is ``[0, 0, 1]``. + is_electric : bool, optional + Type of dipole. Electric dipole if ``True``, magnetic dipole if ``False``. The default is ``True``. + radius : str or float, optional + Radius of surrounding sphere. The default is "10mm". + name : str, optional + Name of the boundary. + + Returns + ------- + :class:`pyaedt.modules.Boundary.BoundaryObject` + Port object. + + References + ---------- + >>> oModule.AssignHertzianDipoleWave + + Examples + -------- + + Create a hertzian dipole wave excitation. + >>> from ansys.aedt.core import Hfss + >>> hfss = Hfss() + >>> sphere = hfss.modeler.primitives.create_sphere([0, 0, 0], 10) + >>> port1 = hfss.hertzian_dipole_wave(assignment=sphere, radius=10) + """ + userlst = self.modeler.convert_to_selections(assignment, True) + lstobj = [] + lstface = [] + for selection in userlst: + if selection in self.modeler.model_objects: + lstobj.append(selection) + elif isinstance(selection, int) and self.modeler._find_object_from_face_id(selection): + lstface.append(selection) + + props = {"Objects": [], "Faces": []} + + if lstobj: + props["Objects"] = lstobj + if lstface: + props["Faces"] = lstface + + if not origin: + origin = ["0mm", "0mm", "0mm"] + elif not isinstance(origin, list) or len(origin) != 3: + self.logger.error("Invalid value for `origin`.") + return False + + x_origin, y_origin, z_origin = self.modeler._pos_with_arg(origin) + + name = self._get_unique_source_name(name, "IncPWave") + + hetzian_wave_args = {"OriginX": x_origin, "OriginY": y_origin, "OriginZ": z_origin} + + if not polarization: + polarization = [0, 0, 1] + elif not isinstance(polarization, list) or len(polarization) != 3: + self.logger.error("Invalid value for `polarization`.") + return False + + new_hertzian_args = { + "IsCartesian": True, + "EoX": polarization[0], + "EoY": polarization[1], + "EoZ": polarization[2], + "kX": polarization[0], + "kY": polarization[1], + "kZ": polarization[2], + } + + hetzian_wave_args["IsElectricDipole"] = False + if is_electric: + hetzian_wave_args["IsElectricDipole"] = True + + hetzian_wave_args["SphereRadius"] = radius + hetzian_wave_args.update(new_hertzian_args) + hetzian_wave_args.update(props) + + return self._create_boundary(name, hetzian_wave_args, "Hertzian Dipole Wave") + @pyaedt_function_handler() def set_radiated_power_calc_method(self, method="Auto"): """Set the radiated power calculation method in Hfss. diff --git a/src/ansys/aedt/core/modeler/modeler_3d.py b/src/ansys/aedt/core/modeler/modeler_3d.py index 73e8c283898..7726e1182da 100644 --- a/src/ansys/aedt/core/modeler/modeler_3d.py +++ b/src/ansys/aedt/core/modeler/modeler_3d.py @@ -776,6 +776,9 @@ def create_waveguide( } if wgmodel in WG: + original_model_units = self.model_units + self.model_units = "mm" + wgwidth = WG[wgmodel][0] wgheight = WG[wgmodel][1] if not wg_thickness: @@ -840,7 +843,7 @@ def create_waveguide( wgbox = self.create_box(origin, [wg_length, wb, hb], name=name) self.subtract(wgbox, airbox, False) wgbox.material_name = wg_material - + self.model_units = original_model_units return wgbox, p1, p2 else: return None diff --git a/src/ansys/aedt/core/modules/boundary/common.py b/src/ansys/aedt/core/modules/boundary/common.py index 8027747eb4f..caffda84eaa 100644 --- a/src/ansys/aedt/core/modules/boundary/common.py +++ b/src/ansys/aedt/core/modules/boundary/common.py @@ -537,6 +537,8 @@ def create(self): self._app.oboundary.AssignFluxTangential(self._get_args()) elif bound_type == "Plane Incident Wave": self._app.oboundary.AssignPlaneWave(self._get_args()) + elif bound_type == "Hertzian Dipole Wave": + self._app.oboundary.AssignHertzianDipoleWave(self._get_args()) elif bound_type == "ResistiveSheet": self._app.oboundary.AssignResistiveSheet(self._get_args()) else: @@ -681,6 +683,8 @@ def update(self): self._app.oboundary.EditTerminal(self.name, self._get_args()) elif bound_type == "Plane Incident Wave": self._app.oboundary.EditIncidentWave(self.name, self._get_args()) + elif bound_type == "Hertzian Dipole Wave": + self._app.oboundary.EditIncidentWave(self.name, self._get_args()) elif bound_type == "ResistiveSheet": self._app.oboundary.EditResistiveSheet(self.name, self._get_args()) else: diff --git a/src/ansys/aedt/core/visualization/report/common.py b/src/ansys/aedt/core/visualization/report/common.py index e75df8225a6..9939d949989 100644 --- a/src/ansys/aedt/core/visualization/report/common.py +++ b/src/ansys/aedt/core/visualization/report/common.py @@ -1323,7 +1323,11 @@ def create(self, name=None): self.plot_name = generate_unique_name("Plot") else: self.plot_name = name - if self.setup not in self._post._app.existing_analysis_sweeps and "AdaptivePass" not in self.setup: + if ( + self.setup not in self._post._app.existing_analysis_sweeps + and "AdaptivePass" not in self.setup + and " : Table" not in self.setup + ): self._post._app.logger.error("Setup doesn't exist in this design.") return False self._post.oreportsetup.CreateReport( diff --git a/src/ansys/aedt/core/workflows/hfss/images/large/shielding.png b/src/ansys/aedt/core/workflows/hfss/images/large/shielding.png new file mode 100644 index 0000000000000000000000000000000000000000..72360307cb51b8e2d75a7658008e4ed0e26ea288 GIT binary patch literal 1729 zcmV;y20r*6_7)aV-$!-)KbJ-AvQW#t7%h>jZWI?cqF536LmC)Y1&wA ztVZL}M59jAD8tkoMukLC5k&qsH1iR7P7uT#uh%CW`|LC? zEt-!&*cS?i%RO#)sin8~SZYd&gU2B72u`OFKdDEIoyyX@yM4AB#3Rn)K8mZkOBpX}=ilwrI7wo`(?V!-c9USw=?YFFMWU^$v$E zyP?rYZCwLrDyuQ~Scy+cA~|g+216X}t?jfL@6prMNlJ18CC|=eWZnoy=VphM3dQkI zD7-0d;K1udAP|8rHAlT~`@5GtK2J`Y={_}A>QL!)R99VLAs9v~wEb!=)%yrKW*W@8)s z_8(#Craz#~%wodRBbmKyF}E&XL#zV?L9

yR3VAJKh`fu6r)>bkzhT^d}P$nngGxrc> z7>pG36YvMTL?9;uQ4sAmyVK(i$<>v$MtU87thY^Q^s(q;G^|Oe>9*L& z9iGK+UR=PgZLhO>-JeKIPv=OD5fOpXx>lYWKbS6aubBwsL|`^v3mIEXrlA?CbXzdQ z0J(rXE{^z=WF}88VDF()sxQ{C^0&VtF<~$lFW0eb^#*XQGJf7wI`Xm0Ib?3fW0 zjDMPiOIFj|)`?=~96HXQqhHP_3^p^v)H05heYxG**?gM^$moMNtTq%*7&q%?eIu^n zWAU8)7xwYfNt0Z}sFd_ttnA$V5q7JCgGY{`)9bJ}y~Gzzp*9rFfW|tSVv_i|EI$!|%fka?^g%+^9u(!PX5^)d6)g@7u{zr7uOrK!j_YzIm1oX#V9!?4GSbm% zqS>+gL$W4L=88T8sq6saxS8mh8+c(-9=rA(In{ovYCjRk=!4|7I&5Bf`mEw9BLhvh zX}H^h;(8U`H?EPDoJdki5;7q~VqyYkFJ5Ip!VpYGBW(b>f{8Tk6UWX(q347cq)X^ZyC@VeA=UYVo?< z#HgZ}T|AW~(?;WPx!Jw<;0af^<8>)uB@!7AA$crLr(bAw`J{OZN{W~?eiV)Ox@a?X zAxR;0`dDNN1u?Px@pwFV{1OXFX0iBZMRZ$iY zJ$BE8r*bkGk(r7rDvBGo8VMmHQ$*qMdWq3!S+#TldBcWKf2)yKH@xHRG@0i3d+*ir z5HcPmED;O~6(-YteW%6#qv2U;jLFL+e@rfRryGmaK}qo>RxX*xz}OhRDzD^^f8OEl zF?Y@LTU*L`1R0M(@;Y#PrLVfoJ=X7x9n&?MXfY)zo>4g&Bn{FtxnK;fZ6@CR>mL5` zNm+}_VV@PSwVvfM2z*c4!P)tS#33K%<_^y;o>qWLsi5MU^L%-tBJ6ZH4od;=%Rz_9 z!ebKn0hIbQrCO_9VMvHyYqeP7Z5B&qNb+w8xbB}L=;Oae8JnV1=u