diff --git a/src/ansys/aedt/core/application/analysis.py b/src/ansys/aedt/core/application/analysis.py index 4e3edb55a2d..581370766be 100644 --- a/src/ansys/aedt/core/application/analysis.py +++ b/src/ansys/aedt/core/application/analysis.py @@ -57,7 +57,6 @@ from ansys.aedt.core.generic.settings import settings from ansys.aedt.core.modules.boundary.layout_boundary import NativeComponentObject from ansys.aedt.core.modules.boundary.layout_boundary import NativeComponentPCB -from ansys.aedt.core.modules.boundary.maxwell_boundary import MaxwellParameters from ansys.aedt.core.modules.design_xploration import OptimizationSetups from ansys.aedt.core.modules.design_xploration import ParametricSetups from ansys.aedt.core.modules.solve_setup import Setup @@ -2315,113 +2314,6 @@ def value_with_units( return _dim_arg(value, units) - @pyaedt_function_handler(file_path="output_file", setup_name="setup") - def export_rl_matrix( - self, - matrix_name, - output_file, - is_format_default=True, - width=8, - precision=2, - is_exponential=False, - setup=None, - default_adaptive=None, - is_post_processed=False, - ): - """Export R/L matrix after solving. - - Parameters - ---------- - matrix_name : str - Matrix name to be exported. - output_file : str - Output file path to export R/L matrix file to. - is_format_default : bool, optional - Whether the exported format is default or not. - If False the custom format is set (no exponential). - width : int, optional - Column width in exported .txt file. - precision : int, optional - Decimal precision number in exported \\*.txt file. - is_exponential : bool, optional - Whether the format number is exponential or not. - setup : str, optional - Name of the setup. - default_adaptive : str, optional - Adaptive type. - is_post_processed : bool, optional - Boolean to check if it is post processed. Default value is ``False``. - - Returns - ------- - bool - ``True`` when successful, ``False`` when failed. - """ - if not self.solution_type == "EddyCurrent": - self.logger.error("RL Matrix can only be exported if solution type is Eddy Current.") - return False - matrix_list = [bound for bound in self.boundaries if isinstance(bound, MaxwellParameters)] - if matrix_name is None: - self.logger.error("Matrix name to be exported must be provided.") - return False - if matrix_list: - if not [ - matrix - for matrix in matrix_list - if matrix.name == matrix_name or [x for x in matrix.available_properties if matrix_name in x] - ]: - self.logger.error("Matrix name doesn't exist, provide and existing matrix name.") - return False - else: - self.logger.error("Matrix list parameters is empty, can't export a valid matrix.") - return False - - if output_file is None: - self.logger.error("File path to export R/L matrix must be provided.") - return False - elif os.path.splitext(output_file)[1] != ".txt": - self.logger.error("File extension must be .txt") - return False - - if setup is None: - setup = self.active_setup - if default_adaptive is None: - default_adaptive = self.design_solutions.default_adaptive - analysis_setup = setup + " : " + default_adaptive - - if not self.available_variations.nominal_w_values_dict: - variations = "" - else: - variations = " ".join( - f"{key}=\\'{value}\\'" for key, value in self.available_variations.nominal_w_values_dict.items() - ) - - if not is_format_default: - try: - self.oanalysis.ExportSolnData( - analysis_setup, - matrix_name, - is_post_processed, - variations, - output_file, - -1, - is_format_default, - width, - precision, - is_exponential, - ) - except Exception: - self.logger.error("Solutions are empty. Solve before exporting.") - return False - else: - try: - self.oanalysis.ExportSolnData(analysis_setup, matrix_name, is_post_processed, variations, output_file) - except Exception: - self.logger.error("Solutions are empty. Solve before exporting.") - return False - - return True - @pyaedt_function_handler() def change_property(self, aedt_object, tab_name, property_object, property_name, property_value): """Change a property. diff --git a/src/ansys/aedt/core/desktop.py b/src/ansys/aedt/core/desktop.py index 926db7d5f61..12013a6288d 100644 --- a/src/ansys/aedt/core/desktop.py +++ b/src/ansys/aedt/core/desktop.py @@ -1572,7 +1572,7 @@ def release_desktop(self, close_projects=True, close_on_exit=True): Examples -------- >>> import ansys.aedt.core - >>> desktop = ansys.aedt.core.Desktop("2021.2") + >>> desktop = ansys.aedt.core.Desktop("2025.1") PyAEDT INFO: pyaedt v... PyAEDT INFO: Python version ... >>> desktop.release_desktop(close_projects=False, close_on_exit=False) # doctest: +SKIP @@ -1631,7 +1631,7 @@ def close_desktop(self): Examples -------- >>> import ansys.aedt.core - >>> desktop = ansys.aedt.core.Desktop("2021.2") + >>> desktop = ansys.aedt.core.Desktop("2025.1") PyAEDT INFO: pyaedt v... PyAEDT INFO: Python version ... >>> desktop.close_desktop() # doctest: +SKIP @@ -1648,7 +1648,7 @@ def enable_autosave(self): Examples -------- >>> import ansys.aedt.core - >>> desktop = ansys.aedt.core.Desktop("2021.2") + >>> desktop = ansys.aedt.core.Desktop("2025.1") PyAEDT INFO: pyaedt v... PyAEDT INFO: Python version ... >>> desktop.enable_autosave() @@ -1662,7 +1662,7 @@ def disable_autosave(self): Examples -------- >>> import ansys.aedt.core - >>> desktop = ansys.aedt.core.Desktop("2021.2") + >>> desktop = ansys.aedt.core.Desktop("2025.1") PyAEDT INFO: pyaedt v... PyAEDT INFO: Python version ... >>> desktop.disable_autosave() diff --git a/src/ansys/aedt/core/generic/aedt_versions.py b/src/ansys/aedt/core/generic/aedt_versions.py index 6311bb69f8e..95353fb3e7f 100644 --- a/src/ansys/aedt/core/generic/aedt_versions.py +++ b/src/ansys/aedt/core/generic/aedt_versions.py @@ -170,7 +170,7 @@ def get_version_env_variable(version_id): Examples -------- >>> from ansys.aedt.core import desktop - >>> desktop.get_version_env_variable("2021.2") + >>> desktop.get_version_env_variable("2025.1") 'ANSYSEM_ROOT212' """ diff --git a/src/ansys/aedt/core/generic/design_types.py b/src/ansys/aedt/core/generic/design_types.py index 58bbb87e3aa..31fce42dbaa 100644 --- a/src/ansys/aedt/core/generic/design_types.py +++ b/src/ansys/aedt/core/generic/design_types.py @@ -132,19 +132,19 @@ def launch_desktop( Examples -------- - Launch AEDT 2021 R1 in non-graphical mode and initialize HFSS. + Launch AEDT 2025 R1 in non-graphical mode and initialize HFSS. >>> import ansys.aedt.core - >>> desktop = ansys.aedt.core.launch_desktop("2022.2", non_graphical=True) + >>> desktop = ansys.aedt.core.launch_desktop("2025.1", non_graphical=True) PyAEDT INFO: pyaedt v... PyAEDT INFO: Python version ... >>> hfss = ansys.aedt.core.Hfss(design="HFSSDesign1") PyAEDT INFO: Project... PyAEDT INFO: Added design 'HFSSDesign1' of type HFSS. - Launch AEDT 2021 R1 in graphical mode and initialize HFSS. + Launch AEDT 2025 R1 in graphical mode and initialize HFSS. - >>> desktop = Desktop("2021.2") + >>> desktop = Desktop("2025.1") PyAEDT INFO: pyaedt v... PyAEDT INFO: Python version ... >>> hfss = ansys.aedt.core.Hfss(design="HFSSDesign1") diff --git a/src/ansys/aedt/core/generic/general_methods.py b/src/ansys/aedt/core/generic/general_methods.py index 70f72516ee4..57d2a5ac389 100644 --- a/src/ansys/aedt/core/generic/general_methods.py +++ b/src/ansys/aedt/core/generic/general_methods.py @@ -601,8 +601,8 @@ def env_path(input_version): Examples -------- - >>> env_path_student("2021.2") - "C:/Program Files/ANSYSEM/ANSYSEM2021.2/Win64" + >>> env_path_student("2025.1") + "C:/Program Files/ANSYSEM/ANSYSEM2025.1/Win64" """ return os.getenv( f"ANSYSEM_ROOT{get_version_and_release(input_version)[0]}{get_version_and_release(input_version)[1]}", "" @@ -625,8 +625,8 @@ def env_value(input_version): Examples -------- - >>> env_value("2021.2") - "ANSYSEM_ROOT212" + >>> env_value(2025.1) + "ANSYSEM_ROOT251" """ return f"ANSYSEM_ROOT{get_version_and_release(input_version)[0]}{get_version_and_release(input_version)[1]}" @@ -647,8 +647,8 @@ def env_path_student(input_version): Examples -------- - >>> env_path_student("2021.2") - "C:/Program Files/ANSYSEM/ANSYSEM2021.2/Win64" + >>> env_path_student(2025.1) + "C:/Program Files/ANSYSEM/ANSYSEM2025.1/Win64" """ return os.getenv( f"ANSYSEMSV_ROOT{get_version_and_release(input_version)[0]}{get_version_and_release(input_version)[1]}", @@ -672,8 +672,8 @@ def env_value_student(input_version): Examples -------- - >>> env_value_student("2021.2") - "ANSYSEMSV_ROOT212" + >>> env_value_student(2025.1) + "ANSYSEMSV_ROOT251" """ return f"ANSYSEMSV_ROOT{get_version_and_release(input_version)[0]}{get_version_and_release(input_version)[1]}" diff --git a/src/ansys/aedt/core/maxwell.py b/src/ansys/aedt/core/maxwell.py index d39ce0fa92f..55177b7cfb1 100644 --- a/src/ansys/aedt/core/maxwell.py +++ b/src/ansys/aedt/core/maxwell.py @@ -299,7 +299,7 @@ def assign_matrix( Set matrix in a Maxwell magnetostatic analysis. >>> from ansys.aedt.core import Maxwell2d - >>> m2d = Maxwell2d(solution_type="MagnetostaticXY",version="2022.1",close_on_exit=True) + >>> m2d = Maxwell2d(solution_type="MagnetostaticXY",version="2025.1",close_on_exit=True) >>> coil1 = m2d.modeler.create_rectangle([0, 1.5, 0], [8, 3], is_covered=True, name="Coil_1") >>> coil2 = m2d.modeler.create_rectangle([8.5, 1.5, 0], [8, 3], is_covered=True, name="Coil_2") >>> coil3 = m2d.modeler.create_rectangle([16, 1.5, 0], [8, 3], is_covered=True, name="Coil_3") @@ -2135,6 +2135,167 @@ def create_setup(self, name="MySetupAuto", setup_type=None, **kwargs): setup.update() return setup + @pyaedt_function_handler(file_path="output_file", setup_name="setup") + def export_rl_matrix( + self, + matrix_name, + output_file, + is_format_default=True, + width=8, + precision=2, + is_exponential=False, + setup=None, + default_adaptive="LastAdaptive", + is_post_processed=False, + ): + """Export R/L matrix after solving. + + Parameters + ---------- + matrix_name : str + Matrix name to be exported. + output_file : str + Output file path to export R/L matrix file to. + Extension must be ``.txt``. + is_format_default : bool, optional + Whether the exported format is default or not. + If False the custom format is set (no exponential). + width : int, optional + Column width in exported .txt file. + precision : int, optional + Decimal precision number in exported \\*.txt file. + is_exponential : bool, optional + Whether the format number is exponential or not. + setup : str, optional + Name of the setup. + If not provided, the active setup is used. + default_adaptive : str, optional + Adaptive type. + The default is ``"LastAdaptive"``. + is_post_processed : bool, optional + Boolean to check if it is post processed. Default value is ``False``. + + Returns + ------- + bool + ``True`` when successful, ``False`` when failed. + """ + if self.solution_type not in [ + SOLUTIONS.Maxwell2d.EddyCurrentXY, + SOLUTIONS.Maxwell2d.EddyCurrentZ, + SOLUTIONS.Maxwell3d.EddyCurrent, + ]: + raise AEDTRuntimeError("RL Matrix can only be exported if solution type is Eddy Current.") + + matrix_names_list = [matrix.name for matrix in self.boundaries if isinstance(matrix, MaxwellParameters)] + if not matrix_names_list: + raise AEDTRuntimeError("Matrix list is empty, can't export a valid matrix.") + elif matrix_name not in matrix_names_list: + raise AEDTRuntimeError("Matrix name doesn't exist, provide and existing matrix name.") + + if os.path.splitext(output_file)[1] != ".txt": + raise AEDTRuntimeError("File extension must be .txt") + + if setup is None: + setup = self.active_setup + + analysis_setup = setup + " : " + default_adaptive + + if not self.available_variations.nominal_w_values_dict: + variations = "" + else: + variations = " ".join( + f"{key}=\\'{value}\\'" for key, value in self.available_variations.nominal_w_values_dict.items() + ) + + if not is_format_default: + try: + self.oanalysis.ExportSolnData( + analysis_setup, + matrix_name, + is_post_processed, + variations, + output_file, + -1, + is_format_default, + width, + precision, + is_exponential, + ) + except Exception as e: + raise AEDTRuntimeError("Solutions are empty. Solve before exporting.") from e + else: + try: + self.oanalysis.ExportSolnData(analysis_setup, matrix_name, is_post_processed, variations, output_file) + except Exception as e: + raise AEDTRuntimeError("Solutions are empty. Solve before exporting.") from e + + return True + + @pyaedt_function_handler() + def export_c_matrix( + self, + matrix_name, + output_file, + setup=None, + default_adaptive="LastAdaptive", + is_post_processed=False, + ): + """Export Capacitance matrix after solving. + + Parameters + ---------- + matrix_name : str + Matrix name to be exported. + output_file : str + Output file path to export R/L matrix file to. + Extension must be ``.txt``. + setup : str, optional + Name of the setup. + If not provided, the active setup is used. + default_adaptive : str, optional + Adaptive type. + The default is ``"LastAdaptive"``. + is_post_processed : bool, optional + Boolean to check if it is post processed. Default value is ``False``. + + Returns + ------- + bool + ``True`` when successful, ``False`` when failed. + """ + if self.solution_type not in [ + SOLUTIONS.Maxwell2d.ElectroStaticXY, + SOLUTIONS.Maxwell2d.ElectroStaticZ, + SOLUTIONS.Maxwell3d.ElectroStatic, + ]: + raise AEDTRuntimeError("C Matrix can only be exported if solution type is Electrostatic.") + + matrix_names_list = [matrix.name for matrix in self.boundaries if isinstance(matrix, MaxwellParameters)] + if not matrix_names_list: + raise AEDTRuntimeError("Matrix list is empty, can't export a valid matrix.") + elif matrix_name not in matrix_names_list: + raise AEDTRuntimeError("Matrix name doesn't exist, provide and existing matrix name.") + + if os.path.splitext(output_file)[1] != ".txt": + raise AEDTRuntimeError("File extension must be .txt") + + if setup is None: + setup = self.active_setup + + analysis_setup = setup + " : " + default_adaptive + + if not self.available_variations.nominal_w_values_dict: + variations = "" + else: + variations = " ".join( + f"{key}=\\'{value}\\'" for key, value in self.available_variations.nominal_w_values_dict.items() + ) + + self.oanalysis.ExportSolnData(analysis_setup, matrix_name, is_post_processed, variations, output_file) + + return True + @pyaedt_function_handler # NOTE: Extend Mixin behaviour to handle Maxwell parameters def _create_boundary(self, name, props, boundary_type): diff --git a/src/ansys/aedt/core/modeler/circuits/primitives_nexxim.py b/src/ansys/aedt/core/modeler/circuits/primitives_nexxim.py index 284a623e6e7..4f267eae31a 100644 --- a/src/ansys/aedt/core/modeler/circuits/primitives_nexxim.py +++ b/src/ansys/aedt/core/modeler/circuits/primitives_nexxim.py @@ -2050,7 +2050,7 @@ def create_component_from_spicemodel( -------- >>> from pathlib import Path >>> from ansys.aedt.core import Circuit - >>> cir = Circuit(version="2023.2") + >>> cir = Circuit(version="2025.1") >>> model = Path("Your path") / "test.lib" >>> cir.modeler.schematic.create_component_from_spicemodel(input_file=model,model="GRM1234",symbol="nexx_cap") >>> cir.release_desktop(False, False) diff --git a/src/ansys/aedt/core/modules/material.py b/src/ansys/aedt/core/modules/material.py index 31123721af7..b90267c4e74 100644 --- a/src/ansys/aedt/core/modules/material.py +++ b/src/ansys/aedt/core/modules/material.py @@ -949,7 +949,7 @@ def _set_non_linear(self, x_unit=None, y_unit=None): Examples -------- >>> from ansys.aedt.core import Hfss - >>> hfss = Hfss(version="2023.2") + >>> hfss = Hfss(version="2025.1") >>> B_value = [0.0, 0.1, 0.3, 0.4, 0.48, 0.55, 0.6, 0.61, 0.65] >>> H_value = [0.0, 500.0, 1000.0, 1500.0, 2000.0, 2500.0, 3500.0, 5000.0, 10000.0] >>> mat = hfss.materials.add_material("newMat") diff --git a/src/ansys/aedt/core/modules/solve_setup.py b/src/ansys/aedt/core/modules/solve_setup.py index 506e5251455..5b5e94bd410 100644 --- a/src/ansys/aedt/core/modules/solve_setup.py +++ b/src/ansys/aedt/core/modules/solve_setup.py @@ -39,6 +39,7 @@ from ansys.aedt.core.generic.constants import AEDT_UNITS from ansys.aedt.core.generic.data_handlers import _dict2arg +from ansys.aedt.core.generic.errors import AEDTRuntimeError from ansys.aedt.core.generic.general_methods import PropsManager from ansys.aedt.core.generic.general_methods import generate_unique_name from ansys.aedt.core.generic.general_methods import pyaedt_function_handler @@ -3868,6 +3869,80 @@ def set_save_fields( self.update() return True + @pyaedt_function_handler() + def export_matrix( + self, + matrix_type, + matrix_name, + output_file, + is_format_default=True, + width=8, + precision=2, + is_exponential=False, + setup=None, + default_adaptive="LastAdaptive", + is_post_processed=False, + ): + """Export R/L or Capacitance matrix after solving. + + Parameters + ---------- + matrix_type : str + Matrix type to be exported. + The options are ``"RL"`` or ``"C"``. + matrix_name : str + Matrix name to be exported. + output_file : str + Output file path to export R/L matrix file to. + Extension must be ``.txt``. + is_format_default : bool, optional + Whether the exported format is default or not. + If False the custom format is set (no exponential). + width : int, optional + Column width in exported .txt file. + precision : int, optional + Decimal precision number in exported \\*.txt file. + is_exponential : bool, optional + Whether the format number is exponential or not. + setup : str, optional + Name of the setup. + If not provided, the active setup is used. + default_adaptive : str, optional + Adaptive type. + The default is ``"LastAdaptive"``. + is_post_processed : bool, optional + Boolean to check if it is post processed. Default value is ``False``. + + Returns + ------- + bool + ``True`` when successful, ``False`` when failed. + """ + if matrix_type == "RL": + if self.p_app.export_rl_matrix( + matrix_name=matrix_name, + output_file=output_file, + is_format_default=is_format_default, + width=width, + precision=precision, + is_exponential=is_exponential, + setup=setup, + default_adaptive=default_adaptive, + is_post_processed=is_post_processed, + ): + return True + elif matrix_type == "C": + if self.p_app.export_c_matrix( + matrix_name=matrix_name, + output_file=output_file, + setup=setup, + default_adaptive=default_adaptive, + is_post_processed=is_post_processed, + ): + return True + else: + raise AEDTRuntimeError("Invalid matrix type. It has to be either 'RL' or 'C'.") + class SetupQ3D(Setup, object): """Initializes, creates, and updates an Q3D setup. diff --git a/src/ansys/aedt/core/visualization/advanced/farfield_visualization.py b/src/ansys/aedt/core/visualization/advanced/farfield_visualization.py index 99ea6bfa7d9..172d88cb379 100644 --- a/src/ansys/aedt/core/visualization/advanced/farfield_visualization.py +++ b/src/ansys/aedt/core/visualization/advanced/farfield_visualization.py @@ -94,7 +94,7 @@ class FfdSolutionData(object): -------- >>> from ansys.aedt.core import Hfss >>> from ansys.aedt.core.visualization.advanced.farfield_visualization import FfdSolutionData - >>> app = ansys.aedt.core.Hfss(version="2023.2", design="Antenna") + >>> app = ansys.aedt.core.Hfss(version="2025.1", design="Antenna") >>> data = app.get_antenna_data() >>> metadata_file = data.metadata_file >>> app.release_desktop() @@ -945,7 +945,7 @@ def plot_cut( Examples -------- >>> from ansys.aedt.core - >>> app = ansys.aedt.core.Hfss(version="2023.2", design="Antenna") + >>> app = ansys.aedt.core.Hfss(version="2025.1", design="Antenna") >>> setup_name = "Setup1 : LastAdaptive" >>> frequencies = [77e9] >>> sphere = "3D" @@ -1051,7 +1051,7 @@ def plot_3d_chart( Examples -------- >>> from ansys.aedt.core - >>> app = ansys.aedt.core.Hfss(version="2023.2", design="Antenna") + >>> app = ansys.aedt.core.Hfss(version="2025.1", design="Antenna") >>> setup_name = "Setup1 : LastAdaptive" >>> frequencies = [77e9] >>> sphere = "3D" @@ -1146,7 +1146,7 @@ def plot_3d( Examples -------- >>> from ansys.aedt.core - >>> app = ansys.aedt.core.Hfss(version="2023.2", design="Antenna") + >>> app = ansys.aedt.core.Hfss(version="2025.1", design="Antenna") >>> setup_name = "Setup1 : LastAdaptive" >>> frequencies = [77e9] >>> sphere = "3D" diff --git a/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py b/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py index 892b9391a77..10351ae25fe 100644 --- a/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py +++ b/src/ansys/aedt/core/visualization/advanced/rcs_visualization.py @@ -97,7 +97,7 @@ class MonostaticRCSData(object): -------- >>> from ansys.aedt.core import Hfss >>> from ansys.aedt.core.visualization.advanced.rcs_visualization import MonostaticRCSData - >>> app = Hfss(version="2023.2", design="Antenna") + >>> app = Hfss(version="2025.1", design="Antenna") >>> data = app.get_rcs_data() >>> metadata_file = data.metadata_file >>> app.release_desktop() @@ -629,7 +629,7 @@ class MonostaticRCSPlotter(object): >>> from ansys.aedt.core import Hfss >>> from ansys.aedt.core.visualization.advanced.rcs_visualization import MonostaticRCSData >>> from ansys.aedt.core.visualization.advanced.rcs_visualization import MonostaticRCSPlotter - >>> app = Hfss(version="2023.2", design="Antenna") + >>> app = Hfss(version="2025.1", design="Antenna") >>> data = app.get_rcs_data() >>> metadata_file = data.metadata_file >>> app.release_desktop() diff --git a/src/ansys/aedt/core/visualization/post/farfield_exporter.py b/src/ansys/aedt/core/visualization/post/farfield_exporter.py index f0cd54a8805..a29d0fd665b 100644 --- a/src/ansys/aedt/core/visualization/post/farfield_exporter.py +++ b/src/ansys/aedt/core/visualization/post/farfield_exporter.py @@ -75,7 +75,7 @@ class FfdSolutionDataExporter: Examples -------- >>> from ansys.aedt.core - >>> app = ansys.aedt.core.Hfss(version="2023.2", design="Antenna") + >>> app = ansys.aedt.core.Hfss(version="2025.1", design="Antenna") >>> setup_name = "Setup1 : LastAdaptive" >>> frequencies = [77e9] >>> sphere = "3D" @@ -153,7 +153,7 @@ def export_farfield(self): # 2024.1 file_path_xml = os.path.join(export_path, self.__app.design_name + ".xml") - # 2023.2 + # 2025.1 file_path_txt = os.path.join(export_path, exported_name_map) input_file = file_path_xml diff --git a/src/ansys/aedt/core/visualization/post/rcs_exporter.py b/src/ansys/aedt/core/visualization/post/rcs_exporter.py index cb1e844970f..196144e709e 100644 --- a/src/ansys/aedt/core/visualization/post/rcs_exporter.py +++ b/src/ansys/aedt/core/visualization/post/rcs_exporter.py @@ -68,7 +68,7 @@ class MonostaticRCSExporter: Examples -------- >>> import ansys.aedt.core - >>> app = ansys.aedt.core.Hfss(version="2023.2", design="Antenna") + >>> app = ansys.aedt.core.Hfss(version="2025.1", design="Antenna") >>> setup_name = "Setup1 : LastAdaptive" >>> frequencies = [77e9] >>> sphere = "3D" diff --git a/tests/system/general/example_models/TMaxwell/export_matrix.aedtz b/tests/system/general/example_models/TMaxwell/export_matrix.aedtz new file mode 100644 index 00000000000..7fa2e24e9c3 Binary files /dev/null and b/tests/system/general/example_models/TMaxwell/export_matrix.aedtz differ diff --git a/tests/system/general/test_27_Maxwell2D.py b/tests/system/general/test_27_Maxwell2D.py index 418c1f8fd66..91968e82cb9 100644 --- a/tests/system/general/test_27_Maxwell2D.py +++ b/tests/system/general/test_27_Maxwell2D.py @@ -48,6 +48,8 @@ m2d_transient_ec = "Setup_Transient_EC" +export_rl_c_matrix = "export_matrix" + @pytest.fixture() def aedtapp(add_app): @@ -82,6 +84,13 @@ def m2d_ctrl_prg(add_app): app.close_project(app.project_name) +@pytest.fixture() +def m2d_export_matrix(add_app): + app = add_app(application=ansys.aedt.core.Maxwell2d, project_name=export_rl_c_matrix, subfolder=test_subfolder) + yield app + app.close_project(app.project_name) + + @pytest.fixture() def m2d_app(add_app): app = add_app(application=ansys.aedt.core.Maxwell2d) @@ -297,19 +306,6 @@ def test_assign_symmetry(self, aedtapp): assert bound.type == "Symmetry" assert not bound.props["IsOdd"] - def test_export_rl_matrix(self, local_scratch, sinusoidal): - export_path_1 = os.path.join(local_scratch.path, "export_rl_matrix_Test1.txt") - assert sinusoidal.export_rl_matrix("Test1", export_path_1) - assert not sinusoidal.export_rl_matrix("abcabc", export_path_1) - assert os.path.exists(export_path_1) - export_path_2 = os.path.join(local_scratch.path, "export_rl_matrix_Test2.txt") - assert sinusoidal.export_rl_matrix("Test2", export_path_2, False, 10, 3, True) - assert os.path.exists(export_path_2) - sinusoidal.setups[0].delete() - setup_name = "new_setup" - sinusoidal.create_setup(name=setup_name) - assert not sinusoidal.export_rl_matrix("Test1", export_path_1) - def test_assign_current_density(self, sinusoidal): sinusoidal.set_active_design("Sinusoidal") bound = sinusoidal.assign_current_density("Coil", "CurrentDensity_1") @@ -761,3 +757,81 @@ def test_eddy_current_sweep(self, m2d_setup): assert setup.enable() assert not sweep.is_solved assert isinstance(sweep.frequencies, list) + + def test_export_c_matrix(self, local_scratch, m2d_export_matrix): + output_file = os.path.join(local_scratch.path, "c_matrix.txt") + # invalid solution type + m2d_export_matrix.set_active_design("export_rl_magneto") + with pytest.raises(AEDTRuntimeError): + m2d_export_matrix.export_rl_matrix("Matrix1", output_file) + # no matrix + m2d_export_matrix.set_active_design("export_c_electrostatic_no_matrix") + with pytest.raises(AEDTRuntimeError): + m2d_export_matrix.export_c_matrix(matrix_name="Matrix1", output_file=output_file) + + m2d_export_matrix.set_active_design("export_c_electrostatic") + assert m2d_export_matrix.export_c_matrix(matrix_name="Matrix1", output_file=output_file) + assert os.path.exists(output_file) + + assert m2d_export_matrix.setups[0].export_matrix( + matrix_type="C", matrix_name="Matrix1", output_file=output_file + ) + assert os.path.exists(output_file) + + with pytest.raises(AEDTRuntimeError): + m2d_export_matrix.export_c_matrix(matrix_name="invalid", output_file=output_file) + + m2d_export_matrix.set_active_design("export_c_electrostatic_param") + + assert m2d_export_matrix.export_c_matrix(matrix_name="Matrix1", output_file=output_file) + assert os.path.exists(output_file) + + assert m2d_export_matrix.setups[0].export_matrix( + matrix_type="C", matrix_name="Matrix1", output_file=output_file + ) + assert os.path.exists(output_file) + + with pytest.raises(AEDTRuntimeError): + m2d_export_matrix.setups[0].export_matrix( + matrix_type="invalid", matrix_name="Matrix1", output_file=output_file + ) + + output_file = os.path.join(local_scratch.path, "c_matrix.csv") + with pytest.raises(AEDTRuntimeError): + m2d_export_matrix.export_c_matrix(matrix_name="Matrix1", output_file=output_file) + + def test_export_rl_matrix(self, local_scratch, m2d_export_matrix): + # invalid path + export_path = os.path.join(local_scratch.path, "export_rl_matrix.csv") + with pytest.raises(AEDTRuntimeError): + m2d_export_matrix.export_rl_matrix("Matrix1", export_path) + + export_path = os.path.join(local_scratch.path, "export_rl_matrix.txt") + # invalid solution type + m2d_export_matrix.set_active_design("export_rl_magneto") + with pytest.raises(AEDTRuntimeError): + m2d_export_matrix.export_rl_matrix("Matrix1", export_path) + # no matrix + m2d_export_matrix.set_active_design("export_rl_eddycurrent_no_matrix") + with pytest.raises(AEDTRuntimeError): + m2d_export_matrix.export_rl_matrix("Matrix1", export_path) + # no setup + m2d_export_matrix.set_active_design("export_rl_eddycurrent_unsolved") + with pytest.raises(AEDTRuntimeError): + m2d_export_matrix.export_rl_matrix("Matrix1", export_path, False, 10, 3, True) + # EC + m2d_export_matrix.set_active_design("export_rl_eddycurrent") + assert m2d_export_matrix.export_rl_matrix("Matrix1", export_path) + assert os.path.exists(export_path) + with pytest.raises(AEDTRuntimeError): + m2d_export_matrix.export_rl_matrix("invalid", export_path) + # EC param + m2d_export_matrix.set_active_design("export_rl_eddycurrent_param") + export_path_1 = os.path.join(local_scratch.path, "export_rl_matrix_1.txt") + assert m2d_export_matrix.export_rl_matrix("Matrix1", export_path_1, False, 10, 3, True) + assert os.path.exists(export_path_1) + export_path_2 = os.path.join(local_scratch.path, "export_rl_matrix_2.txt") + assert m2d_export_matrix.setups[0].export_matrix( + matrix_type="RL", matrix_name="Matrix1", output_file=export_path_2 + ) + assert os.path.exists(export_path_2) diff --git a/tests/system/general/test_28_Maxwell3D.py b/tests/system/general/test_28_Maxwell3D.py index 0270834ec0a..b92e10cff19 100644 --- a/tests/system/general/test_28_Maxwell3D.py +++ b/tests/system/general/test_28_Maxwell3D.py @@ -513,39 +513,6 @@ def test_reduced_matrix(self, m3d_app): out = matrix.join_parallel(["Cur5"]) assert not out[0] - def test_export_rl_matrix(self, local_scratch, m3d_app): - m3d_app.solution_type = SOLUTIONS.Maxwell3d.EddyCurrent - - m3d_app.modeler.create_box([0, 1.5, 0], [1, 2.5, 5], name="Coil_1", material="aluminum") - m3d_app.modeler.create_box([8.5, 1.5, 0], [1, 2.5, 5], name="Coil_2", material="aluminum") - m3d_app.modeler.create_box([16, 1.5, 0], [1, 2.5, 5], name="Coil_3", material="aluminum") - m3d_app.modeler.create_box([32, 1.5, 0], [1, 2.5, 5], name="Coil_4", material="aluminum") - - rectangle1 = m3d_app.modeler.create_rectangle(0, [0.5, 1.5, 0], [2.5, 5], name="Sheet1") - rectangle2 = m3d_app.modeler.create_rectangle(0, [9, 1.5, 0], [2.5, 5], name="Sheet2") - rectangle3 = m3d_app.modeler.create_rectangle(0, [16.5, 1.5, 0], [2.5, 5], name="Sheet3") - - m3d_app.assign_current(rectangle1.faces[0], amplitude=1, name="Cur1") - m3d_app.assign_current(rectangle2.faces[0], amplitude=1, name="Cur2") - m3d_app.assign_current(rectangle3.faces[0], amplitude=1, name="Cur3") - - matrix = m3d_app.assign_matrix(assignment=["Cur1", "Cur2", "Cur3"], matrix_name="matrix_export_test") - matrix.join_series(["Cur1", "Cur2"], matrix_name="reduced_matrix_export_test") - setup_name = "setupTestMatrixRL" - setup = m3d_app.create_setup(name=setup_name) - setup.props["MaximumPasses"] = 2 - export_path_1 = os.path.join(local_scratch.path, "export_rl_matrix_Test1.txt") - assert not m3d_app.export_rl_matrix("matrix_export_test", export_path_1) - assert not m3d_app.export_rl_matrix("matrix_export_test", export_path_1, False, 10, 3, True) - m3d_app.validate_simple() - m3d_app.analyze_setup(setup_name, cores=1) - assert m3d_app.export_rl_matrix("matrix_export_test", export_path_1) - assert not m3d_app.export_rl_matrix("abcabc", export_path_1) - assert os.path.exists(export_path_1) - export_path_2 = os.path.join(local_scratch.path, "export_rl_matrix_Test2.txt") - assert m3d_app.export_rl_matrix("matrix_export_test", export_path_2, False, 10, 3, True) - assert os.path.exists(export_path_2) - @pytest.mark.skipif(is_linux, reason="Failing in Ubuntu 22.") def test_get_solution_data(self, m3d_app): m3d_app.solution_type = SOLUTIONS.Maxwell3d.EddyCurrent