diff --git a/doc/source/user_guide/data_transfer.rst b/doc/source/user_guide/data_transfer.rst new file mode 100644 index 000000000000..94105941cda4 --- /dev/null +++ b/doc/source/user_guide/data_transfer.rst @@ -0,0 +1,43 @@ +.. _ref_data_transfer: + +Data transfer +============= + +Data transfer helps in transferring a case or a mesh file between instances of fluent. +We need to specify a source instance and one or multiple destination instances. + +Sample usage +------------ + +You can use the 'transfer_case' to transfer either a mesh or a case file by importing it +and passing the source and destination instances along with the file type. You can either +generate the files in the parent instance or just read it. + +The following example show the usage of 'transfer_case' by reading a mesh file in a +pure meshing session and transferring it to a solver session. + +.. code-block:: python + + >>> import ansys.fluent.core as pyfluent + >>> from ansys.fluent.core.examples import download_file + >>> from ansys.fluent.core.utils.data_transfer import transfer_case + + >>> mesh_filename = download_file("mixing_elbow.msh.h5", "pyfluent/mixing_elbow") + >>> pure_meshing_session = pyfluent.launch_fluent(mode="pure-meshing") + >>> pure_meshing_session.tui.file.read_mesh(import_filename) + + >>> solver_session = pyfluent.launch_fluent(mode="solver") + + >>> transfer_case( + >>> source_instance=meshing, + >>> solvers=[solver], + >>> file_type="mesh", + >>> file_name_stem='', + >>> num_files_to_try=1, + >>> clean_up_temp_file=True, + >>> overwrite_previous=True + >>> ) + + +Similarly, 'transfer_case' can also be used to transfer a case file from one instance of fluent +to another. diff --git a/doc/source/user_guide/index.rst b/doc/source/user_guide/index.rst index 5338231b0fbb..ad043455e360 100644 --- a/doc/source/user_guide/index.rst +++ b/doc/source/user_guide/index.rst @@ -24,6 +24,7 @@ Python code to control and monitor Ansys Fluent. boundary_conditions solution case_reader + data_transfer Overview diff --git a/src/ansys/fluent/core/utils/data_transfer.py b/src/ansys/fluent/core/utils/data_transfer.py index 8cf83d208a79..c211aa7ed299 100644 --- a/src/ansys/fluent/core/utils/data_transfer.py +++ b/src/ansys/fluent/core/utils/data_transfer.py @@ -1,6 +1,8 @@ from functools import partial import os +import tempfile +import ansys.fluent.core as pyfluent from ansys.fluent.core.utils.async_execution import asynchronous from ansys.fluent.core.utils.logging import LOG @@ -56,7 +58,7 @@ def transfer_case( """ for idx in range(num_files_to_try): file_name = (file_name_stem or "temp_case_file_") + "_" + str(idx) - folder = os.getenv("TMP", os.getenv("TMPDIR", ".")) + folder = tempfile.mkdtemp(prefix="temp_store-", dir=pyfluent.EXAMPLES_PATH) file_name = os.path.join(folder, file_name) LOG.info(f"Trying to save mesh from meshing session: {file_name}") if overwrite_previous or not os.path.isfile(file_name): diff --git a/tests/test_pure_mesh_vs_mesh_workflow.py b/tests/test_pure_mesh_vs_mesh_workflow.py index c71ce25c6e42..d738fd4c7688 100644 --- a/tests/test_pure_mesh_vs_mesh_workflow.py +++ b/tests/test_pure_mesh_vs_mesh_workflow.py @@ -1,5 +1,7 @@ import pytest +from ansys.fluent.core.examples import download_file + def test_pure_meshing_mode(load_mixing_elbow_pure_meshing): pure_meshing_session = load_mixing_elbow_pure_meshing @@ -49,3 +51,45 @@ def test_meshing_mode_post_switching_to_solver(load_mixing_elbow_meshing): # Post switching to solver session, meshing session specific attributes are unavailable with pytest.raises(AttributeError): meshing_session.workflow.InitializeWorkflow(WorkflowType="Watertight Geometry") + + +def test_transfer_mesh_to_solvers( + launch_fluent_pure_meshing, launch_fluent_solver_3ddp_t2 +): + mesh_filename = download_file("mixing_elbow.msh.h5", "pyfluent/mixing_elbow") + pure_meshing_session = launch_fluent_pure_meshing + pure_meshing_session.tui.file.read_mesh(mesh_filename) + pure_meshing_session.tui.mesh.check_mesh() + mesh_info = pure_meshing_session.scheme_eval.string_eval( + "(%tg-length-of-entity-list)" + ) + pure_meshing_session_cell_count = mesh_info.strip("( )").split()[3] + + solver_session = launch_fluent_solver_3ddp_t2 + pure_meshing_session.transfer_mesh_to_solvers([solver_session], file_type="mesh") + solver_session.tui.mesh.check() + mesh_info = solver_session.scheme_eval.string_eval("(inquire-grids)") + solver_session_cell_count = mesh_info.strip("( )").split()[1] + + assert pure_meshing_session_cell_count == solver_session_cell_count + + +def test_transfer_case_to_solvers( + launch_fluent_pure_meshing, launch_fluent_solver_3ddp_t2 +): + case_filename = download_file("mixing_elbow.cas.h5", "pyfluent/mixing_elbow") + pure_meshing_session = launch_fluent_pure_meshing + pure_meshing_session.tui.file.read_case(case_filename) + pure_meshing_session.tui.mesh.check_mesh() + mesh_info = pure_meshing_session.scheme_eval.string_eval( + "(%tg-length-of-entity-list)" + ) + pure_meshing_session_cell_count = mesh_info.strip("( )").split()[3] + + solver_session = launch_fluent_solver_3ddp_t2 + pure_meshing_session.transfer_mesh_to_solvers([solver_session], file_type="case") + solver_session.tui.mesh.check() + mesh_info = solver_session.scheme_eval.string_eval("(inquire-grids)") + solver_session_cell_count = mesh_info.strip("( )").split()[1] + + assert pure_meshing_session_cell_count == solver_session_cell_count diff --git a/tests/util/fixture_fluent.py b/tests/util/fixture_fluent.py index ad3682f5957b..a985fe8aa998 100644 --- a/tests/util/fixture_fluent.py +++ b/tests/util/fixture_fluent.py @@ -57,6 +57,13 @@ def sample_solver_session(with_launching_container): solver_session.exit() +@pytest.fixture +def launch_fluent_pure_meshing(with_launching_container): + pure_meshing_session = pyfluent.launch_fluent(mode="pure-meshing") + yield pure_meshing_session + pure_meshing_session.exit() + + @pytest.fixture def launch_fluent_solver_3ddp_t2(with_launching_container): solver_session = pyfluent.launch_fluent(