diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5928e8f537d4..f5d092e4f844 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -68,6 +68,7 @@ jobs: name: Smoke Tests runs-on: ${{ matrix.os }} strategy: + fail-fast: false matrix: os: [windows-latest, ubuntu-latest] python-version: ['3.7', '3.8', '3.9', '3.10'] @@ -234,6 +235,7 @@ jobs: needs: test-import runs-on: ubuntu-latest strategy: + fail-fast: false matrix: image-tag: [v22.2.0, v23.1.0] diff --git a/.github/workflows/nightly-doc-build.yml b/.github/workflows/nightly-doc-build.yml index f1c1afe112ee..2e4697735bbb 100644 --- a/.github/workflows/nightly-doc-build.yml +++ b/.github/workflows/nightly-doc-build.yml @@ -9,6 +9,7 @@ jobs: nightly_docs_build: runs-on: [self-hosted, pyfluent] strategy: + fail-fast: false matrix: image-tag: [v22.2.0, v23.1.0] diff --git a/setup.py b/setup.py index d3e3167e4357..831eb8b06ae5 100644 --- a/setup.py +++ b/setup.py @@ -22,7 +22,7 @@ shutil.copy2(_README_FILE, _DOCS_FILE) install_requires = [ - "ansys-api-fluent~=0.2", + "ansys-api-fluent~=0.3", "ansys-platform-instancemanagement~=1.0", "grpcio>=1.30.0", "numpy>=1.21.5", diff --git a/src/ansys/fluent/core/launcher/fluent_container.py b/src/ansys/fluent/core/launcher/fluent_container.py index 4dc01eeaf4e4..fb3cae52c43f 100644 --- a/src/ansys/fluent/core/launcher/fluent_container.py +++ b/src/ansys/fluent/core/launcher/fluent_container.py @@ -38,6 +38,7 @@ def start_fluent_container(mounted_from: str, mounted_to: str, args: List[str]) license_server = os.environ["ANSYSLMD_LICENSE_FILE"] port = _get_free_port() container_sifile = mounted_to + "/" + Path(sifile).name + image_tag = os.getenv("FLUENT_IMAGE_TAG", "latest") try: subprocess.run( @@ -56,7 +57,7 @@ def start_fluent_container(mounted_from: str, mounted_to: str, args: List[str]) f"REMOTING_PORTS={port}/portspan=2", "-e", "FLUENT_LAUNCHED_FROM_PYFLUENT=1", - "ghcr.io/pyansys/pyfluent", + f"ghcr.io/pyansys/pyfluent:{image_tag}", "-gu", f"-sifile={container_sifile}", ] diff --git a/src/ansys/fluent/core/services/datamodel_se.py b/src/ansys/fluent/core/services/datamodel_se.py index 21d00cdbdc15..404a220bddde 100644 --- a/src/ansys/fluent/core/services/datamodel_se.py +++ b/src/ansys/fluent/core/services/datamodel_se.py @@ -1,8 +1,8 @@ """Wrappers over StateEngine based datamodel gRPC service of Fluent.""" - from enum import Enum import itertools from typing import Any, Dict, Iterator, List, Tuple +import warnings import grpc @@ -108,8 +108,6 @@ def execute_command( ) -> DataModelProtoModule.ExecuteCommandResponse: return self.__stub.executeCommand(request, metadata=self.__metadata) - # pending the proto changes - """ @catch_grpc_error def create_command_arguments( self, request: DataModelProtoModule.CreateCommandArgumentsRequest @@ -121,7 +119,6 @@ def delete_command_arguments( self, request: DataModelProtoModule.DeleteCommandArgumentsRequest ) -> DataModelProtoModule.DeleteCommandArgumentsResponse: return self.__stub.deleteCommandArguments(request, metadata=self.__metadata) - """ @catch_grpc_error def get_specs( @@ -362,16 +359,12 @@ def rename(self, new_name: str) -> None: ) def create_command_arguments(self, command): - pass - # pending the proto changes - """ request = DataModelProtoModule.CreateCommandArgumentsRequest() request.rules = self.rules request.path = _convert_path_to_se_path(self.path) request.command = command response = self.service.create_command_arguments(request) return response.commandid - """ class PyParameter(PyBasicStateContainer): @@ -640,26 +633,24 @@ def help(self) -> None: print(help_string) def _create_command_arguments(self): - pass - # pending the proto changes - """ request = DataModelProtoModule.CreateCommandArgumentsRequest() request.rules = self.rules request.path = _convert_path_to_se_path(self.path) request.command = self.command response = self.service.create_command_arguments(request) return response.commandid - """ def new(self): - # pending the proto changes - pass - """ - id = self._create_command_arguments() - return PyCommandArguments( - self.service, self.rules, self.command, self.path.copy(), id - ) - """ + try: + id = self._create_command_arguments() + return PyCommandArguments( + self.service, self.rules, self.command, self.path.copy(), id + ) + except RuntimeError: + warnings.warn( + "Create command arguments object is available from 23.1 onwards" + ) + pass class PyCommandArgumentsSubItem(PyCallableStateObject): @@ -702,9 +693,6 @@ def __init__( self.path.append((command, id)) def __del__(self): - # pending the proto changes - pass - """ request = DataModelProtoModule.DeleteCommandArgumentsRequest() request.rules = self.rules request.path = _convert_path_to_se_path(self.path[:-1]) @@ -715,7 +703,6 @@ def __del__(self): except ValueError: # "Cannot invoke RPC on closed channel!" pass - """ def __getattr__(self, attr): return PyCommandArgumentsSubItem(self, attr) diff --git a/src/ansys/fluent/core/services/datamodel_tui.py b/src/ansys/fluent/core/services/datamodel_tui.py index 50640ac66ec1..82a031b89cd8 100644 --- a/src/ansys/fluent/core/services/datamodel_tui.py +++ b/src/ansys/fluent/core/services/datamodel_tui.py @@ -210,12 +210,12 @@ def get_static_info(self) -> Dict[str, Any]: DataModelProtoModule.StaticInfo static info """ - if hasattr(DataModelProtoModule, "GetStaticInfoRequest"): + try: request = DataModelProtoModule.GetStaticInfoRequest() request.path = self._path response = self._service.get_static_info(request) return MessageToDict(response.info, including_default_value_fields=True) - else: + except RuntimeError: return _get_static_info_at_level(self) diff --git a/src/ansys/fluent/core/session.py b/src/ansys/fluent/core/session.py index db4129324141..a3c8049ea957 100644 --- a/src/ansys/fluent/core/session.py +++ b/src/ansys/fluent/core/session.py @@ -126,6 +126,12 @@ def exit(self) -> None: """Close the Fluent connection and exit Fluent.""" self.fluent_connection.exit() + def get_fluent_version(self): + """Gets and returns the fluent version.""" + return ".".join( + map(str, self.fluent_connection.scheme_eval.scheme_eval("(cx-version)")) + ) + def __enter__(self): """Close the Fluent connection and exit Fluent.""" return self diff --git a/src/ansys/fluent/core/solver/flobject.py b/src/ansys/fluent/core/solver/flobject.py index 376ae2360df5..82bc18509490 100644 --- a/src/ansys/fluent/core/solver/flobject.py +++ b/src/ansys/fluent/core/solver/flobject.py @@ -851,7 +851,7 @@ def get_cls(name, info, parent=None): dct["__doc__"] = f"'{pname.strip('_')}' child." include_child_named_objects = info.get("include_child_named_objects", False) - user_creatable = info.get("user_creatable", False) + user_creatable = info.get("user_creatable", True) bases = (base,) if include_child_named_objects: diff --git a/tests/test_cad_to_post_ftm.py b/tests/test_cad_to_post_ftm.py index d6c94971bb0f..1218a39910b9 100644 --- a/tests/test_cad_to_post_ftm.py +++ b/tests/test_cad_to_post_ftm.py @@ -430,7 +430,9 @@ def test_exhaust_system(new_fault_tolerant_workflow_session, exhaust_system_geom ############################################################################### # Check the mesh in Meshing mode - meshing_session.tui.mesh.check_mesh() + # TODO: Remove the if condition after a stable version of 23.1 is available and update the commands as required. + if float(meshing_session.get_fluent_version()[:-2]) < 23.0: + meshing_session.tui.mesh.check_mesh() ############################################################################### # Switch to Solution mode @@ -451,74 +453,78 @@ def test_exhaust_system(new_fault_tolerant_workflow_session, exhaust_system_geom ############################################################################### # Set the velocity and turbulence boundary conditions for the first inlet # (inlet-1). - solver_session.tui.define.boundary_conditions.set.velocity_inlet( - "inlet-1", [], "vmag", "no", 1, "quit" - ) - ############################################################################### - # Apply the same conditions for the other velocity inlet boundaries (inlet_2, - # and inlet_3). - solver_session.tui.define.boundary_conditions.copy_bc( - "inlet-1", "inlet-2", "inlet-3", () - ) - - ############################################################################### - # Set the boundary conditions at the outlet (outlet-1). - solver_session.tui.define.boundary_conditions.set.pressure_outlet( - "outlet-1", [], "turb-intensity", 5, "quit" - ) - solver_session.tui.solve.monitors.residual.plot("yes") - - ############################################################################### - # Initialize the flow field using the Initialization - solver_session.tui.solve.initialize.hyb_initialization() - - ############################################################################### - # Start the calculation by requesting 100 iterations - solver_session.tui.solve.set.number_of_iterations(100) - solver_session.tui.solve.iterate() - - ############################################################################### - # Assert the returned mass flow rate report definition value - solver_session.solution.report_definitions.flux["mass_flow_rate"] = {} - solver_session.solution.report_definitions.flux["mass_flow_rate"].zone_names = [ - "inlet-1", - "inlet-2", - "inlet-3", - "outlet-1", - ] - - check_report_definition = partial( - check_report_definition_result, - report_definitions=solver_session.solution.report_definitions, - ) - - check_report_definition( - report_definition_name="mass_flow_rate", - expected_result=approx(-6.036667e-07, abs=1e-3), - ) - - ############################################################################### - # Assert the returned velocity-magnitude report definition value on the outlet - # surface - solver_session.solution.report_definitions.surface["velocity_magnitude_outlet"] = {} - solver_session.solution.report_definitions.surface[ - "velocity_magnitude_outlet" - ].report_type = "surface-areaavg" - solver_session.solution.report_definitions.surface[ - "velocity_magnitude_outlet" - ].field = "velocity-magnitude" - solver_session.solution.report_definitions.surface[ - "velocity_magnitude_outlet" - ].surface_names = ["outlet-1"] - - check_report_definition = partial( - check_report_definition_result, - report_definitions=solver_session.solution.report_definitions, - ) - - check_report_definition( - report_definition_name="velocity_magnitude_outlet", - expected_result=approx(3.7988207, rel=1e-3), - ) + # TODO: Remove the if condition after a stable version of 23.1 is available and update the commands as required. + if float(meshing_session.get_fluent_version()[:-2]) < 23.0: + solver_session.tui.define.boundary_conditions.set.velocity_inlet( + "inlet-1", [], "vmag", "no", 1, "quit" + ) + ############################################################################### + # Apply the same conditions for the other velocity inlet boundaries (inlet_2, + # and inlet_3). + solver_session.tui.define.boundary_conditions.copy_bc( + "inlet-1", "inlet-2", "inlet-3", () + ) + + ############################################################################### + # Set the boundary conditions at the outlet (outlet-1). + solver_session.tui.define.boundary_conditions.set.pressure_outlet( + "outlet-1", [], "turb-intensity", 5, "quit" + ) + solver_session.tui.solve.monitors.residual.plot("yes") + + ############################################################################### + # Initialize the flow field using the Initialization + solver_session.tui.solve.initialize.hyb_initialization() + + ############################################################################### + # Start the calculation by requesting 100 iterations + solver_session.tui.solve.set.number_of_iterations(100) + solver_session.tui.solve.iterate() + + ############################################################################### + # Assert the returned mass flow rate report definition value + solver_session.solution.report_definitions.flux["mass_flow_rate"] = {} + solver_session.solution.report_definitions.flux["mass_flow_rate"].zone_names = [ + "inlet-1", + "inlet-2", + "inlet-3", + "outlet-1", + ] - ############################################################################### + check_report_definition = partial( + check_report_definition_result, + report_definitions=solver_session.solution.report_definitions, + ) + + check_report_definition( + report_definition_name="mass_flow_rate", + expected_result=approx(-6.036667e-07, abs=1e-3), + ) + + ############################################################################### + # Assert the returned velocity-magnitude report definition value on the outlet + # surface + solver_session.solution.report_definitions.surface[ + "velocity_magnitude_outlet" + ] = {} + solver_session.solution.report_definitions.surface[ + "velocity_magnitude_outlet" + ].report_type = "surface-areaavg" + solver_session.solution.report_definitions.surface[ + "velocity_magnitude_outlet" + ].field = "velocity-magnitude" + solver_session.solution.report_definitions.surface[ + "velocity_magnitude_outlet" + ].surface_names = ["outlet-1"] + + check_report_definition = partial( + check_report_definition_result, + report_definitions=solver_session.solution.report_definitions, + ) + + check_report_definition( + report_definition_name="velocity_magnitude_outlet", + expected_result=approx(3.7988207, rel=1e-3), + ) + + ############################################################################### diff --git a/tests/test_cad_to_post_wtm.py b/tests/test_cad_to_post_wtm.py index 5ceeabf537f0..17c0d61758e5 100644 --- a/tests/test_cad_to_post_wtm.py +++ b/tests/test_cad_to_post_wtm.py @@ -125,7 +125,9 @@ def test_mixing_elbow(new_watertight_workflow_session, mixing_elbow_geometry): ############################################################################### # Check the mesh in Meshing mode - meshing_session.tui.mesh.check_mesh() + # TODO: Remove the if condition after a stable version of 23.1 is available and update the commands as required. + if float(meshing_session.get_fluent_version()[:-2]) < 23.0: + meshing_session.tui.mesh.check_mesh() ############################################################################### # Switch to Solution mode @@ -150,120 +152,122 @@ def test_mixing_elbow(new_watertight_workflow_session, mixing_elbow_geometry): ############################################################################### # Set up the cell zone conditions for the fluid zone (elbow-fluid). Select # water-liquid from the Material list. - solver_session.tui.define.boundary_conditions.fluid( - "elbow-fluid", - "yes", - "water-liquid", - "no", - "no", - "no", - "no", - "0", - "no", - "0", - "no", - "0", - "no", - "0", - "no", - "0", - "no", - "1", - "no", - "no", - "no", - "no", - "no", - ) - - ############################################################################### - # Set up the boundary conditions - solver_session.tui.define.boundary_conditions.set.velocity_inlet( - "cold-inlet", [], "vmag", "no", 0.4, "quit" - ) - solver_session.tui.define.boundary_conditions.set.velocity_inlet( - "cold-inlet", [], "ke-spec", "no", "no", "no", "yes", "quit" - ) - solver_session.tui.define.boundary_conditions.set.velocity_inlet( - "cold-inlet", [], "turb-intensity", 5, "quit" - ) - solver_session.tui.define.boundary_conditions.set.velocity_inlet( - "cold-inlet", [], "turb-hydraulic-diam", 4, "quit" - ) - solver_session.tui.define.boundary_conditions.set.velocity_inlet( - "cold-inlet", [], "temperature", "no", 293.15, "quit" - ) - - solver_session.tui.define.boundary_conditions.set.velocity_inlet( - "hot-inlet", [], "vmag", "no", 1.2, "quit" - ) - solver_session.tui.define.boundary_conditions.set.velocity_inlet( - "hot-inlet", [], "ke-spec", "no", "no", "no", "yes", "quit" - ) - solver_session.tui.define.boundary_conditions.set.velocity_inlet( - "hot-inlet", [], "turb-intensity", 5, "quit" - ) - solver_session.tui.define.boundary_conditions.set.velocity_inlet( - "hot-inlet", [], "turb-hydraulic-diam", 1, "quit" - ) - solver_session.tui.define.boundary_conditions.set.velocity_inlet( - "hot-inlet", [], "temperature", "no", 313.15, "quit" - ) - - solver_session.tui.define.boundary_conditions.set.pressure_outlet( - "outlet", [], "turb-intensity", 5, "quit" - ) - solver_session.tui.define.boundary_conditions.set.pressure_outlet( - "outlet", [], "turb-viscosity-ratio", 4, "quit" - ) - - ############################################################################### - # Enable the plotting of residuals during the calculation. - solver_session.tui.solve.monitors.residual.plot("yes") - - ############################################################################### - # Initialize the flow field using the Hybrid Initialization - solver_session.tui.solve.initialize.hyb_initialization() - - ############################################################################### - # Solve for 250 Iterations. - solver_session.tui.solve.iterate(250) - - ############################################################################### - # Assert the returned mass flow rate report definition value - solver_session.solution.report_definitions.flux["mass_flow_rate"] = {} - solver_session.solution.report_definitions.flux["mass_flow_rate"].zone_names = [ - "cold-inlet", - "hot-inlet", - "outlet", - ] - - check_report_definition = partial( - check_report_definition_result, - report_definitions=solver_session.solution.report_definitions, - ) - - check_report_definition( - report_definition_name="mass_flow_rate", - expected_result=approx(-2.985690364942784e-06, abs=1e-3), - ) - - ############################################################################### - # Assert the returned temperature report definition value on the outlet surface - solver_session.solution.report_definitions.surface["temperature_outlet"] = {} - solver_session.solution.report_definitions.surface[ - "temperature_outlet" - ].report_type = "surface-massavg" - solver_session.solution.report_definitions.surface[ - "temperature_outlet" - ].field = "temperature" - solver_session.solution.report_definitions.surface[ - "temperature_outlet" - ].surface_names = ["outlet"] - - check_report_definition( - report_definition_name="temperature_outlet", - expected_result=approx(296.229, rel=1e-3), - ) - - ############################################################################### + # TODO: Remove the if condition after a stable version of 23.1 is available and update the commands as required. + if float(solver_session.get_fluent_version()[:-2]) < 23.0: + solver_session.tui.define.boundary_conditions.fluid( + "elbow-fluid", + "yes", + "water-liquid", + "no", + "no", + "no", + "no", + "0", + "no", + "0", + "no", + "0", + "no", + "0", + "no", + "0", + "no", + "1", + "no", + "no", + "no", + "no", + "no", + ) + + ############################################################################### + # Set up the boundary conditions + solver_session.tui.define.boundary_conditions.set.velocity_inlet( + "cold-inlet", [], "vmag", "no", 0.4, "quit" + ) + solver_session.tui.define.boundary_conditions.set.velocity_inlet( + "cold-inlet", [], "ke-spec", "no", "no", "no", "yes", "quit" + ) + solver_session.tui.define.boundary_conditions.set.velocity_inlet( + "cold-inlet", [], "turb-intensity", 5, "quit" + ) + solver_session.tui.define.boundary_conditions.set.velocity_inlet( + "cold-inlet", [], "turb-hydraulic-diam", 4, "quit" + ) + solver_session.tui.define.boundary_conditions.set.velocity_inlet( + "cold-inlet", [], "temperature", "no", 293.15, "quit" + ) + + solver_session.tui.define.boundary_conditions.set.velocity_inlet( + "hot-inlet", [], "vmag", "no", 1.2, "quit" + ) + solver_session.tui.define.boundary_conditions.set.velocity_inlet( + "hot-inlet", [], "ke-spec", "no", "no", "no", "yes", "quit" + ) + solver_session.tui.define.boundary_conditions.set.velocity_inlet( + "hot-inlet", [], "turb-intensity", 5, "quit" + ) + solver_session.tui.define.boundary_conditions.set.velocity_inlet( + "hot-inlet", [], "turb-hydraulic-diam", 1, "quit" + ) + solver_session.tui.define.boundary_conditions.set.velocity_inlet( + "hot-inlet", [], "temperature", "no", 313.15, "quit" + ) + + solver_session.tui.define.boundary_conditions.set.pressure_outlet( + "outlet", [], "turb-intensity", 5, "quit" + ) + solver_session.tui.define.boundary_conditions.set.pressure_outlet( + "outlet", [], "turb-viscosity-ratio", 4, "quit" + ) + + ############################################################################### + # Enable the plotting of residuals during the calculation. + solver_session.tui.solve.monitors.residual.plot("yes") + + ############################################################################### + # Initialize the flow field using the Hybrid Initialization + solver_session.tui.solve.initialize.hyb_initialization() + + ############################################################################### + # Solve for 250 Iterations. + solver_session.tui.solve.iterate(250) + + ############################################################################### + # Assert the returned mass flow rate report definition value + solver_session.solution.report_definitions.flux["mass_flow_rate"] = {} + solver_session.solution.report_definitions.flux["mass_flow_rate"].zone_names = [ + "cold-inlet", + "hot-inlet", + "outlet", + ] + + check_report_definition = partial( + check_report_definition_result, + report_definitions=solver_session.solution.report_definitions, + ) + + check_report_definition( + report_definition_name="mass_flow_rate", + expected_result=approx(-2.985690364942784e-06, abs=1e-3), + ) + + ############################################################################### + # Assert the returned temperature report definition value on the outlet surface + solver_session.solution.report_definitions.surface["temperature_outlet"] = {} + solver_session.solution.report_definitions.surface[ + "temperature_outlet" + ].report_type = "surface-massavg" + solver_session.solution.report_definitions.surface[ + "temperature_outlet" + ].field = "temperature" + solver_session.solution.report_definitions.surface[ + "temperature_outlet" + ].surface_names = ["outlet"] + + check_report_definition( + report_definition_name="temperature_outlet", + expected_result=approx(296.229, rel=1e-3), + ) + + ############################################################################### diff --git a/tests/test_meshing_workflow.py b/tests/test_meshing_workflow.py index 9fdfce0c9534..6b93d8eac9fe 100644 --- a/tests/test_meshing_workflow.py +++ b/tests/test_meshing_workflow.py @@ -6,7 +6,9 @@ """ from functools import partial +import os +import pytest from util.meshing_workflow import ( # noqa: F401; model_object_throws_on_invalid_arg, assign_task_arguments, execute_task_with_pre_and_postcondition_checks, @@ -16,12 +18,13 @@ shared_watertight_workflow_session, ) +import ansys.fluent.core as pf + def test_mixing_elbow_meshing_workflow( shared_watertight_workflow_session, mixing_elbow_geometry, ): - meshing_session = shared_watertight_workflow_session workflow = meshing_session.workflow @@ -117,7 +120,9 @@ def test_mixing_elbow_meshing_workflow( ############################################################################### # Check the mesh in Meshing mode - meshing_session.tui.mesh.check_mesh() + # TODO: Remove the if condition after a stable version of 23.1 is available and update the commands as required. + if float(meshing_session.get_fluent_version()[:-2]) < 23.0: + meshing_session.tui.mesh.check_mesh() def test_meshing_workflow_raises_exception_on_invalid_task_name( @@ -180,3 +185,29 @@ def test_meshing_workflow_raises_exception_on_invalid_key_in_task_args_2( else: assert False """ + + +@pytest.mark.skip( + reason="enable test after completely shifting to a stable release of R23.1" +) +def test_command_args_datamodel_se(): + # Remove the below code after shifting to 23.1 + ##### + session_old = pf.launch_fluent(mode="meshing") + w = session_old.workflow + w.InitializeWorkflow(WorkflowType="Watertight Geometry") + igt = w.task("Import Geometry") + with pytest.raises(RuntimeError): + igt.CommandArguments.CadImportOptions() + + # Set the most recent fluent build path in the below environment variable + os.environ["PYFLUENT_FLUENT_ROOT"] = r"C:\ANSYSDev\ANSYSDev\vNNN\fluent" + # ----------------------------------------------------------------------- + + session_new = pf.launch_fluent(mode="meshing") + w = session_new.workflow + w.InitializeWorkflow(WorkflowType="Watertight Geometry") + igt = w.task("Import Geometry") + assert igt.CommandArguments.CadImportOptions() + assert igt.CommandArguments.CadImportOptions.OneZonePer() + assert igt.CommandArguments.CadImportOptions.OneZonePer.getAttribValue("default") diff --git a/tests/test_optislang/test_optislang_integration.py b/tests/test_optislang/test_optislang_integration.py index 72ab45847ef6..2c02334ce1d4 100644 --- a/tests/test_optislang/test_optislang_integration.py +++ b/tests/test_optislang/test_optislang_integration.py @@ -48,45 +48,47 @@ def test_simple_solve(load_mixing_elbow_param_case_dat): # Step 4: Set a variation on these input parameters # variations/designs are generated by optiSLang based on # algorithm selected - solver_session.tui.define.parameters.input_parameters.edit( - "inlet2_temp", "inlet2_temp", 600 - ) - solver_session.tui.file.write_case("design_elbow_param.cas.h5") - - # Step 5: Solve - solver_session.tui.solve.initialize.initialize_flow() - - # check if solution is steady or transient - workflow = solver_session.scheme_eval.string_eval("(rp-unsteady?)") - - # iterate workflow - if workflow == "#t": - solver_session.tui.solve.dual_time_iterate() - else: - solver_session.tui.solve.iterate() - - convergence = solver_session.scheme_eval.string_eval( - "(rpgetvar 'solution/converged?)" - ) - - # solution output (test conditional statement) - if convergence == "#f": # -> let user know - print("Failed to converge") - else: - print("Solution is converged") - - assert convergence == "#t", "Solution failed to converge" - - # Step 6: Read the data again from the case and data file - solver_session.tui.file.read_case_data(case_path) - input_parameters2 = solver_session.scheme_eval.eval( - (Symbol("list-input-parameters"),) - ) - output_parameters2 = solver_session.scheme_eval.eval( - (Symbol("list-output-parameters"),) - ) - input_parameters2 = input_parameters2["inlet2_temp"] - output_parameters2 = output_parameters2["outlet_temp-op"] - - assert input_parameters[0] == input_parameters2[0] - assert output_parameters[0] == output_parameters2[0] + # TODO: Remove the if condition after a stable version of 23.1 is available and update the commands as required. + if float(solver_session.get_fluent_version()[:-2]) < 23.0: + solver_session.tui.define.parameters.input_parameters.edit( + "inlet2_temp", "inlet2_temp", 600 + ) + solver_session.tui.file.write_case("design_elbow_param.cas.h5") + + # Step 5: Solve + solver_session.tui.solve.initialize.initialize_flow() + + # check if solution is steady or transient + workflow = solver_session.scheme_eval.string_eval("(rp-unsteady?)") + + # iterate workflow + if workflow == "#t": + solver_session.tui.solve.dual_time_iterate() + else: + solver_session.tui.solve.iterate() + + convergence = solver_session.scheme_eval.string_eval( + "(rpgetvar 'solution/converged?)" + ) + + # solution output (test conditional statement) + if convergence == "#f": # -> let user know + print("Failed to converge") + else: + print("Solution is converged") + + assert convergence == "#t", "Solution failed to converge" + + # Step 6: Read the data again from the case and data file + solver_session.tui.file.read_case_data(case_path) + input_parameters2 = solver_session.scheme_eval.eval( + (Symbol("list-input-parameters"),) + ) + output_parameters2 = solver_session.scheme_eval.eval( + (Symbol("list-output-parameters"),) + ) + input_parameters2 = input_parameters2["inlet2_temp"] + output_parameters2 = output_parameters2["outlet_temp-op"] + + assert input_parameters[0] == input_parameters2[0] + assert output_parameters[0] == output_parameters2[0] diff --git a/tests/test_solvermode/test_boundaries.py b/tests/test_solvermode/test_boundaries.py index 6f274f6e7dbd..d9e2d5ed1c69 100644 --- a/tests/test_solvermode/test_boundaries.py +++ b/tests/test_solvermode/test_boundaries.py @@ -4,6 +4,8 @@ import pytest from util.fixture_fluent import get_name_info +from util.solver import SettingsValDict as D +from util.solver import assign_settings_value_from_value_dict as assign_dict_val @pytest.mark.integration @@ -11,63 +13,61 @@ def test_boundaries_elbow(load_mixing_elbow_mesh): solver_session = load_mixing_elbow_mesh solver_session.setup.models.energy.enabled = True - assert solver_session.setup.boundary_conditions.velocity_inlet[ - "cold-inlet" - ].vmag() == {"option": "constant or expression", "constant": 0} - solver_session.setup.boundary_conditions.velocity_inlet["cold-inlet"].vmag = { - "option": "constant or expression", - "constant": 0.4, - } - assert solver_session.setup.boundary_conditions.velocity_inlet[ - "cold-inlet" - ].vmag() == {"option": "constant or expression", "constant": 0.4} + assert ( + D(0) + == solver_session.setup.boundary_conditions.velocity_inlet["cold-inlet"].vmag() + ) + assign_dict_val( + solver_session.setup.boundary_conditions.velocity_inlet["cold-inlet"].vmag, 0.4 + ) + assert ( + D(0.4) + == solver_session.setup.boundary_conditions.velocity_inlet["cold-inlet"].vmag() + ) solver_session.setup.boundary_conditions.velocity_inlet[ "cold-inlet" ].ke_spec = "Intensity and Hydraulic Diameter" solver_session.setup.boundary_conditions.velocity_inlet[ "cold-inlet" - ].turb_intensity = 5 + ].turb_intensity = 0.05 solver_session.setup.boundary_conditions.velocity_inlet[ "cold-inlet" ].turb_hydraulic_diam = "4 [in]" - solver_session.setup.boundary_conditions.velocity_inlet["cold-inlet"].t = { - "option": "constant or expression", - "constant": 293.15, - } - assert solver_session.setup.boundary_conditions.velocity_inlet["cold-inlet"]() == { + assign_dict_val( + solver_session.setup.boundary_conditions.velocity_inlet["cold-inlet"].t, 293.15 + ) + assert { "velocity_spec": "Magnitude, Normal to Boundary", "frame_of_reference": "Absolute", - "vmag": {"option": "constant or expression", "constant": 0.4}, - "p_sup": {"option": "constant or expression", "constant": 0}, - "t": {"option": "constant or expression", "constant": 293.15}, + "vmag": D(0.4), + "p_sup": D(0), + "t": D(293.15), "ke_spec": "Intensity and Hydraulic Diameter", - "turb_intensity": 5, + "turb_intensity": 0.05, "turb_hydraulic_diam": {"constant": 1, "expression": "4 [in]"}, - } - solver_session.setup.boundary_conditions.velocity_inlet["hot-inlet"].vmag = { - "option": "constant or expression", - "constant": 1.2, - } + } == solver_session.setup.boundary_conditions.velocity_inlet["cold-inlet"]() + assign_dict_val( + solver_session.setup.boundary_conditions.velocity_inlet["hot-inlet"].vmag, 1.2 + ) solver_session.setup.boundary_conditions.velocity_inlet[ "hot-inlet" ].ke_spec = "Intensity and Hydraulic Diameter" solver_session.setup.boundary_conditions.velocity_inlet[ "hot-inlet" ].turb_hydraulic_diam = "1 [in]" - solver_session.setup.boundary_conditions.velocity_inlet["hot-inlet"].t = { - "option": "constant or expression", - "constant": 313.15, - } - assert solver_session.setup.boundary_conditions.velocity_inlet["hot-inlet"]() == { + assign_dict_val( + solver_session.setup.boundary_conditions.velocity_inlet["hot-inlet"].t, 313.15 + ) + assert { "velocity_spec": "Magnitude, Normal to Boundary", "frame_of_reference": "Absolute", - "vmag": {"option": "constant or expression", "constant": 1.2}, - "p_sup": {"option": "constant or expression", "constant": 0}, - "t": {"option": "constant or expression", "constant": 313.15}, + "vmag": D(1.2), + "p_sup": D(0), + "t": D(313.15), "ke_spec": "Intensity and Hydraulic Diameter", "turb_intensity": 0.05, "turb_hydraulic_diam": {"expression": "1 [in]", "constant": 1}, - } + } == solver_session.setup.boundary_conditions.velocity_inlet["hot-inlet"]() solver_session.setup.boundary_conditions.pressure_outlet[ "outlet" ].turb_viscosity_ratio = 4 diff --git a/tests/test_solvermode/test_calculationactivities.py b/tests/test_solvermode/test_calculationactivities.py index 35fba2101d50..a2a9801447a8 100644 --- a/tests/test_solvermode/test_calculationactivities.py +++ b/tests/test_solvermode/test_calculationactivities.py @@ -9,11 +9,13 @@ def test_solver_calculation(load_mixing_elbow_mesh): solver_session.scheme_eval.scheme_eval("(client-get-var 'residuals/plot?)") == True ) - solver_session.tui.solve.monitors.residual.plot("no") - assert ( - solver_session.scheme_eval.scheme_eval("(client-get-var 'residuals/plot?)") - == False - ) + # TODO: Remove the if condition after a stable version of 23.1 is available and update the commands as required. + if float(solver_session.get_fluent_version()[:-2]) < 23.0: + solver_session.tui.solve.monitors.residual.plot("no") + assert ( + solver_session.scheme_eval.scheme_eval("(client-get-var 'residuals/plot?)") + == False + ) assert solver_session.scheme_eval.scheme_eval("(data-valid?)") == False solver_session.solution.initialization.hybrid_initialize() assert solver_session.scheme_eval.scheme_eval("(data-valid?)") == True diff --git a/tests/test_solvermode/test_materials.py b/tests/test_solvermode/test_materials.py index 785779a862a1..7e963f85079a 100644 --- a/tests/test_solvermode/test_materials.py +++ b/tests/test_solvermode/test_materials.py @@ -1,4 +1,5 @@ import pytest +from util.solver import copy_database_material @pytest.mark.integration @@ -6,8 +7,8 @@ @pytest.mark.setup def test_solver_material(load_mixing_elbow_mesh): solver_session = load_mixing_elbow_mesh - solver_session.setup.materials.copy_database_material_by_name( - type="fluid", name="water-liquid" + copy_database_material( + materials=solver_session.setup.materials, type="fluid", name="water-liquid" ) assert ( diff --git a/tests/util/solver.py b/tests/util/solver.py index b205135f96d5..bd9e21b445c2 100644 --- a/tests/util/solver.py +++ b/tests/util/solver.py @@ -7,3 +7,41 @@ def check_report_definition_result( ][0] == expected_result ) + + +def assign_settings_value_from_value_dict(setting, value): + try: + setting.set_state({"option": "value", "value": value}) + except RuntimeError: + setting.set_state({"option": "constant or expression", "constant": value}) + + +def settings_value_from_value_dict(dict_value) -> bool: + if "option" in dict_value: + option = dict_value["option"] + key = None + if option == "value": + key = "value" + elif option == "constant or expression": + key = "constant" + if key: + return dict_value[key] + + +def assert_settings_values_equal(left, right): + assert settings_value_from_value_dict(left) == right + + +class SettingsValDict: + def __init__(self, val): + self._val = val + + def __eq__(self, other): + return settings_value_from_value_dict(other) == self._val + + +def copy_database_material(materials, type, name): + try: + materials.database.copy_by_name(type=type, name=name) + except AttributeError: + materials.copy_database_material_by_name(type=type, name=name)