From fc8c72b69e0fe08db8cd1fac4589e489e017e807 Mon Sep 17 00:00:00 2001 From: mayankansys Date: Thu, 12 Mar 2026 16:04:59 +0530 Subject: [PATCH 01/10] refactor: added the changes --- doc/changelog.d/4265.fixed.md | 2 + .../fluent/core/launcher/launcher_utils.py | 12 ++- .../core/launcher/standalone_launcher.py | 74 +++++++++++++------ src/ansys/fluent/core/session_solver.py | 12 ++- src/ansys/fluent/core/session_solver.pyi | 3 +- tests/test_launcher.py | 41 ++++++++++ 6 files changed, 117 insertions(+), 27 deletions(-) create mode 100644 doc/changelog.d/4265.fixed.md diff --git a/doc/changelog.d/4265.fixed.md b/doc/changelog.d/4265.fixed.md new file mode 100644 index 00000000000..40d959e7507 --- /dev/null +++ b/doc/changelog.d/4265.fixed.md @@ -0,0 +1,2 @@ +- Fixed `launch_fluent()` ordering so `case_file_name`/`case_data_file_name` are processed before `journal_file_names` when both are provided. +- In lightweight mode, deferred journal replay now completes before the background sync step begins. \ No newline at end of file diff --git a/src/ansys/fluent/core/launcher/launcher_utils.py b/src/ansys/fluent/core/launcher/launcher_utils.py index 61fa10221bc..f3a587bf6ee 100644 --- a/src/ansys/fluent/core/launcher/launcher_utils.py +++ b/src/ansys/fluent/core/launcher/launcher_utils.py @@ -181,12 +181,16 @@ def _confirm_watchdog_start(start_watchdog, cleanup_on_exit, fluent_connection): def _build_journal_argument( - topy: None | bool | str, journal_file_names: None | str | list[str] + topy: None | bool | str, + journal_file_names: None | str | list[str], + include_journal_file_names: bool = True, ) -> str: """Build Fluent commandline journal argument.""" def _impl( - topy: None | bool | str, journal_file_names: None | str | list[str] + topy: None | bool | str, + journal_file_names: None | str | list[str], + include_journal_file_names: bool, ) -> str: if journal_file_names and not isinstance(journal_file_names, (str, list)): raise TypeError( @@ -199,7 +203,7 @@ def _impl( fluent_jou_arg = "" if isinstance(journal_file_names, str): journal_file_names = [journal_file_names] - if journal_file_names: + if journal_file_names and include_journal_file_names: fluent_jou_arg += "".join( [f' -i "{journal}"' for journal in journal_file_names] ) @@ -210,4 +214,4 @@ def _impl( fluent_jou_arg += " -topy" return fluent_jou_arg - return _impl(topy, journal_file_names) + return _impl(topy, journal_file_names, include_journal_file_names) diff --git a/src/ansys/fluent/core/launcher/standalone_launcher.py b/src/ansys/fluent/core/launcher/standalone_launcher.py index 7812a253458..7561578e5cd 100644 --- a/src/ansys/fluent/core/launcher/standalone_launcher.py +++ b/src/ansys/fluent/core/launcher/standalone_launcher.py @@ -228,8 +228,14 @@ def __init__( ) if self.argvals["cwd"]: self._kwargs.update(cwd=self.argvals["cwd"]) + self._defer_journal_file_read = bool( + self.argvals["journal_file_names"] + and (self.argvals["case_file_name"] or self.argvals["case_data_file_name"]) + ) self._launch_string += _build_journal_argument( - self.argvals["topy"], self.argvals["journal_file_names"] + self.argvals["topy"], + self.argvals["journal_file_names"], + include_journal_file_names=not self._defer_journal_file_read, ) if is_windows(): @@ -292,26 +298,7 @@ def __call__(self): if len(values) == 3: ip, port, password = values watchdog.launch(os.getpid(), port, password, ip) - if self.argvals["case_file_name"]: - if FluentMode.is_meshing(self.argvals["mode"]): - session.tui.file.read_case(self.argvals["case_file_name"]) - elif self.argvals["lightweight_mode"]: - session.read_case_lightweight(self.argvals["case_file_name"]) - else: - session.settings.file.read( - file_type="case", - file_name=self.argvals["case_file_name"], - ) - if self.argvals["case_data_file_name"]: - if not FluentMode.is_meshing(self.argvals["mode"]): - session.settings.file.read( - file_type="case-data", - file_name=self.argvals["case_data_file_name"], - ) - else: - raise RuntimeError( - "Case and data file cannot be read in meshing mode." - ) + self._process_case_data_and_journals(session) return session except Exception as ex: @@ -321,3 +308,48 @@ def __call__(self): server_info_file = Path(self._server_info_file_name) if server_info_file.exists(): server_info_file.unlink() + + @staticmethod + def _get_journal_file_names( + journal_file_names: None | str | list[str], + ) -> list[str]: + if isinstance(journal_file_names, str): + return [journal_file_names] + return journal_file_names or [] + + def _read_journals(self, session) -> None: + for journal_file_name in self._get_journal_file_names( + self.argvals["journal_file_names"] + ): + session.execute_tui( + f'/file/read-journal "{Path(journal_file_name).as_posix()}"' + ) + + def _process_case_data_and_journals(self, session) -> None: + lightweight_sync_deferred = False + if self.argvals["case_file_name"]: + if FluentMode.is_meshing(self.argvals["mode"]): + session.tui.file.read_case(self.argvals["case_file_name"]) + elif self.argvals["lightweight_mode"]: + session.read_case_lightweight( + self.argvals["case_file_name"], + start_sync=not self._defer_journal_file_read, + ) + lightweight_sync_deferred = self._defer_journal_file_read + else: + session.settings.file.read( + file_type="case", + file_name=self.argvals["case_file_name"], + ) + if self.argvals["case_data_file_name"]: + if not FluentMode.is_meshing(self.argvals["mode"]): + session.settings.file.read( + file_type="case-data", + file_name=self.argvals["case_data_file_name"], + ) + else: + raise RuntimeError("Case and data file cannot be read in meshing mode.") + if self._defer_journal_file_read: + self._read_journals(session) + if lightweight_sync_deferred: + session.start_case_lightweight_sync() diff --git a/src/ansys/fluent/core/session_solver.py b/src/ansys/fluent/core/session_solver.py index ad7d904a948..05039ec3b17 100644 --- a/src/ansys/fluent/core/session_solver.py +++ b/src/ansys/fluent/core/session_solver.py @@ -316,13 +316,21 @@ def _stop_bg_sessions(self): if thread.is_alive(): thread.join() - def read_case_lightweight(self, file_name: str): + def start_case_lightweight_sync(self): + """Start pending lightweight background sync sessions.""" + for thread in self._bg_session_threads: + if thread.ident is None: + thread.start() + + def read_case_lightweight(self, file_name: str, start_sync: bool = True): """Read a case file using light IO mode. Parameters ---------- file_name : str Case file name + start_sync : bool, optional + Whether to immediately start lightweight background sync. """ self.settings.file.read( @@ -336,6 +344,8 @@ def read_case_lightweight(self, file_name: str): target=self._start_bg_session_and_sync, args=(launcher_args,) ) ) + if start_sync: + self.start_case_lightweight_sync() def get_state(self) -> StateT: """Get the state of the object.""" diff --git a/src/ansys/fluent/core/session_solver.pyi b/src/ansys/fluent/core/session_solver.pyi index 0fb2ca3385e..0284e0b6e6c 100644 --- a/src/ansys/fluent/core/session_solver.pyi +++ b/src/ansys/fluent/core/session_solver.pyi @@ -39,7 +39,8 @@ class Solver: def system_coupling(self) -> SystemCoupling: ... @property def preferences(self) -> preferences_root: ... - def read_case_lightweight(self, file_name: str): ... + def start_case_lightweight_sync(self): ... + def read_case_lightweight(self, file_name: str, start_sync: bool = True): ... def read_case(self, file_name: str): ... def write_case(self, file_name: str): ... @property diff --git a/tests/test_launcher.py b/tests/test_launcher.py index d6b7c73f11f..ce67c1dd984 100644 --- a/tests/test_launcher.py +++ b/tests/test_launcher.py @@ -57,6 +57,7 @@ _build_fluent_launch_args_string, get_fluent_exe_path, ) +from ansys.fluent.core.launcher.standalone_launcher import StandaloneLauncher from ansys.fluent.core.utils.fluent_version import FluentVersion import ansys.platform.instancemanagement as pypim @@ -474,6 +475,46 @@ def test_build_journal_argument(topy, journal_file_names, result, raises): assert _build_journal_argument(topy, journal_file_names) == result +def test_build_journal_argument_without_journal_files_but_with_topy(): + assert ( + _build_journal_argument("a.py", ["a.jou"], include_journal_file_names=False) + == ' -topy="a.py"' + ) + + +def test_lightweight_case_journal_read_is_completed_before_sync_step(): + launcher = object.__new__(StandaloneLauncher) + launcher.argvals = { + "case_file_name": "a.cas.h5", + "case_data_file_name": None, + "mode": FluentMode.SOLVER, + "lightweight_mode": True, + "journal_file_names": ["a.jou", "b.jou"], + } + launcher._defer_journal_file_read = True + + calls = [] + + class _DummySession: + def read_case_lightweight(self, file_name, start_sync=True): + calls.append(("read_case_lightweight", file_name, start_sync)) + + def execute_tui(self, command): + calls.append(("execute_tui", command)) + + def start_case_lightweight_sync(self): + calls.append(("start_case_lightweight_sync",)) + + launcher._process_case_data_and_journals(_DummySession()) + + assert calls == [ + ("read_case_lightweight", "a.cas.h5", False), + ("execute_tui", '/file/read-journal "a.jou"'), + ("execute_tui", '/file/read-journal "b.jou"'), + ("start_case_lightweight_sync",), + ] + + def test_show_gui_raises_warning(): with pytest.warns(PyFluentDeprecationWarning): grpc_kwds = get_grpc_launcher_args_for_gh_runs() From f94faa66206257d7ce3b4f9dbc5ad70c81ef3818 Mon Sep 17 00:00:00 2001 From: pyansys-ci-bot <92810346+pyansys-ci-bot@users.noreply.github.com> Date: Thu, 12 Mar 2026 10:46:22 +0000 Subject: [PATCH 02/10] chore: adding changelog file 4990.miscellaneous.md [dependabot-skip] --- doc/changelog.d/4990.miscellaneous.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 doc/changelog.d/4990.miscellaneous.md diff --git a/doc/changelog.d/4990.miscellaneous.md b/doc/changelog.d/4990.miscellaneous.md new file mode 100644 index 00000000000..e61b5c8ce96 --- /dev/null +++ b/doc/changelog.d/4990.miscellaneous.md @@ -0,0 +1 @@ +Couple of issues in launch fluent From 25a3143afe893782e97de15f0214584f2a307301 Mon Sep 17 00:00:00 2001 From: mayankansys Date: Tue, 17 Mar 2026 17:10:53 +0530 Subject: [PATCH 03/10] update --- tests/test_launcher.py | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/tests/test_launcher.py b/tests/test_launcher.py index ce67c1dd984..d6da5580f0e 100644 --- a/tests/test_launcher.py +++ b/tests/test_launcher.py @@ -515,6 +515,42 @@ def start_case_lightweight_sync(self): ] +def test_case_and_case_data_are_processed_before_journal_files(): + launcher = object.__new__(StandaloneLauncher) + launcher.argvals = { + "case_file_name": "a.cas.h5", + "case_data_file_name": "a.cas.h5", + "mode": FluentMode.SOLVER, + "lightweight_mode": False, + "journal_file_names": ["a.jou", "b.jou"], + } + launcher._defer_journal_file_read = True + + calls = [] + + class _DummyFile: + def read(self, **kwargs): + calls.append(("read", kwargs)) + + class _DummySettings: + file = _DummyFile() + + class _DummySession: + settings = _DummySettings() + + def execute_tui(self, command): + calls.append(("execute_tui", command)) + + launcher._process_case_data_and_journals(_DummySession()) + + assert calls == [ + ("read", {"file_type": "case", "file_name": "a.cas.h5"}), + ("read", {"file_type": "case-data", "file_name": "a.cas.h5"}), + ("execute_tui", '/file/read-journal "a.jou"'), + ("execute_tui", '/file/read-journal "b.jou"'), + ] + + def test_show_gui_raises_warning(): with pytest.warns(PyFluentDeprecationWarning): grpc_kwds = get_grpc_launcher_args_for_gh_runs() From 26d259fb62867b0374ddba9dab438df03eff746f Mon Sep 17 00:00:00 2001 From: mayankansys Date: Tue, 16 Jun 2026 20:58:39 +0530 Subject: [PATCH 04/10] updated the standalone_launcher --- .../core/launcher/standalone_launcher.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/ansys/fluent/core/launcher/standalone_launcher.py b/src/ansys/fluent/core/launcher/standalone_launcher.py index e429d5d0107..9106fec01db 100644 --- a/src/ansys/fluent/core/launcher/standalone_launcher.py +++ b/src/ansys/fluent/core/launcher/standalone_launcher.py @@ -232,11 +232,11 @@ def __init__( self.argvals["journal_file_names"] and (self.argvals["case_file_name"] or self.argvals["case_data_file_name"]) ) - self._launch_string += _build_journal_argument( - self.argvals["topy"], - self.argvals["journal_file_names"], - include_journal_file_names=not self._defer_journal_file_read, - ) + topy = self.argvals.get("topy", []) + if topy: + self._launch_string += _build_journal_argument( + topy, self.argvals.get("journal_file_names") + ) if is_windows(): self._launch_cmd = self._launch_string @@ -351,6 +351,15 @@ def _process_case_data_and_journals(self, session) -> None: ) else: raise RuntimeError("Case and data file cannot be read in meshing mode.") + + if not self.argvals.get("topy"): + journal_file_names = self.argvals.get("journal_file_names") + if journal_file_names and not self._defer_journal_file_read: + if isinstance(journal_file_names, str): + journal_file_names = [journal_file_names] + for journal_file_name in journal_file_names: + session.tui.file.read_journal(journal_file_name) + if self._defer_journal_file_read: self._read_journals(session) if lightweight_sync_deferred: From bbcd2fdcaff58713c974900caab59eff81d57d67 Mon Sep 17 00:00:00 2001 From: mayankansys Date: Wed, 17 Jun 2026 14:46:00 +0530 Subject: [PATCH 05/10] resolved the conflict --- doc/changelog.d/4265.fixed.md | 2 + .../fluent/core/launcher/launcher_utils.py | 12 ++- .../core/launcher/standalone_launcher.py | 86 ++++++++++++------- src/ansys/fluent/core/session_solver.py | 12 ++- tests/test_launcher.py | 41 +++++++++ 5 files changed, 118 insertions(+), 35 deletions(-) create mode 100644 doc/changelog.d/4265.fixed.md diff --git a/doc/changelog.d/4265.fixed.md b/doc/changelog.d/4265.fixed.md new file mode 100644 index 00000000000..40d959e7507 --- /dev/null +++ b/doc/changelog.d/4265.fixed.md @@ -0,0 +1,2 @@ +- Fixed `launch_fluent()` ordering so `case_file_name`/`case_data_file_name` are processed before `journal_file_names` when both are provided. +- In lightweight mode, deferred journal replay now completes before the background sync step begins. \ No newline at end of file diff --git a/src/ansys/fluent/core/launcher/launcher_utils.py b/src/ansys/fluent/core/launcher/launcher_utils.py index c4cc1e112d9..602199a8f20 100644 --- a/src/ansys/fluent/core/launcher/launcher_utils.py +++ b/src/ansys/fluent/core/launcher/launcher_utils.py @@ -210,12 +210,16 @@ def _confirm_watchdog_start(start_watchdog, cleanup_on_exit, fluent_connection): def _build_journal_argument( - topy: None | bool | str, journal_file_names: None | str | list[str] + topy: None | bool | str, + journal_file_names: None | str | list[str], + include_journal_file_names: bool = True, ) -> str: """Build Fluent commandline journal argument.""" def _impl( - topy: None | bool | str, journal_file_names: None | str | list[str] + topy: None | bool | str, + journal_file_names: None | str | list[str], + include_journal_file_names: bool, ) -> str: if journal_file_names and not isinstance(journal_file_names, (str, list)): raise TypeError( @@ -228,7 +232,7 @@ def _impl( fluent_jou_arg = "" if isinstance(journal_file_names, str): journal_file_names = [journal_file_names] - if journal_file_names: + if journal_file_names and include_journal_file_names: fluent_jou_arg += "".join( [f' -i "{journal}"' for journal in journal_file_names] ) @@ -239,4 +243,4 @@ def _impl( fluent_jou_arg += " -topy" return fluent_jou_arg - return _impl(topy, journal_file_names) + return _impl(topy, journal_file_names, include_journal_file_names) diff --git a/src/ansys/fluent/core/launcher/standalone_launcher.py b/src/ansys/fluent/core/launcher/standalone_launcher.py index 339a7412aec..d8c72e512ca 100644 --- a/src/ansys/fluent/core/launcher/standalone_launcher.py +++ b/src/ansys/fluent/core/launcher/standalone_launcher.py @@ -250,10 +250,16 @@ def __init__( self._kwargs = _get_subprocess_kwargs_for_fluent( self.argvals.get("env") or {}, self.argvals ) - if self.argvals.get("cwd"): - self._kwargs.update(cwd=self.argvals.get("cwd")) + if self.argvals["cwd"]: + self._kwargs.update(cwd=self.argvals["cwd"]) + self._defer_journal_file_read = bool( + self.argvals["journal_file_names"] + and (self.argvals["case_file_name"] or self.argvals["case_data_file_name"]) + ) self._launch_string += _build_journal_argument( - self.argvals.get("topy", []), self.argvals.get("journal_file_names") + self.argvals["topy"], + self.argvals["journal_file_names"], + include_journal_file_names=not self._defer_journal_file_read, ) if is_windows(): @@ -319,33 +325,8 @@ def __call__( values = _get_server_info(self._server_info_file_name) if len(values) == 3: ip, port, password = values - watchdog.launch( - os.getpid(), - port, - password, - ip, - inside_container=False, - ) - if self.argvals.get("case_file_name"): - if FluentMode.is_meshing(self.argvals.get("mode")): - session.tui.file.read_case(self.argvals.get("case_file_name")) - elif self.argvals.get("lightweight_mode"): - session.read_case_lightweight(self.argvals.get("case_file_name")) - else: - session.settings.file.read( - file_type="case", - file_name=self.argvals.get("case_file_name"), - ) - if self.argvals.get("case_data_file_name"): - if not FluentMode.is_meshing(self.argvals.get("mode")): - session.settings.file.read( - file_type="case-data", - file_name=self.argvals.get("case_data_file_name"), - ) - else: - raise RuntimeError( - "Case and data file cannot be read in meshing mode." - ) + watchdog.launch(os.getpid(), port, password, ip) + self._process_case_data_and_journals(session) return session except Exception as ex: @@ -355,3 +336,48 @@ def __call__( server_info_file = Path(self._server_info_file_name) if server_info_file.exists(): server_info_file.unlink() + + @staticmethod + def _get_journal_file_names( + journal_file_names: None | str | list[str], + ) -> list[str]: + if isinstance(journal_file_names, str): + return [journal_file_names] + return journal_file_names or [] + + def _read_journals(self, session) -> None: + for journal_file_name in self._get_journal_file_names( + self.argvals["journal_file_names"] + ): + session.execute_tui( + f'/file/read-journal "{Path(journal_file_name).as_posix()}"' + ) + + def _process_case_data_and_journals(self, session) -> None: + lightweight_sync_deferred = False + if self.argvals["case_file_name"]: + if FluentMode.is_meshing(self.argvals["mode"]): + session.tui.file.read_case(self.argvals["case_file_name"]) + elif self.argvals["lightweight_mode"]: + session.read_case_lightweight( + self.argvals["case_file_name"], + start_sync=not self._defer_journal_file_read, + ) + lightweight_sync_deferred = self._defer_journal_file_read + else: + session.settings.file.read( + file_type="case", + file_name=self.argvals["case_file_name"], + ) + if self.argvals["case_data_file_name"]: + if not FluentMode.is_meshing(self.argvals["mode"]): + session.settings.file.read( + file_type="case-data", + file_name=self.argvals["case_data_file_name"], + ) + else: + raise RuntimeError("Case and data file cannot be read in meshing mode.") + if self._defer_journal_file_read: + self._read_journals(session) + if lightweight_sync_deferred: + session.start_case_lightweight_sync() diff --git a/src/ansys/fluent/core/session_solver.py b/src/ansys/fluent/core/session_solver.py index 56fe17e9f8f..8360aeabe88 100644 --- a/src/ansys/fluent/core/session_solver.py +++ b/src/ansys/fluent/core/session_solver.py @@ -385,13 +385,21 @@ def _stop_bg_sessions(self): if thread.is_alive(): thread.join() - def read_case_lightweight(self, file_name: str): + def start_case_lightweight_sync(self): + """Start pending lightweight background sync sessions.""" + for thread in self._bg_session_threads: + if thread.ident is None: + thread.start() + + def read_case_lightweight(self, file_name: str, start_sync: bool = True): """Read a case file using light IO mode. Parameters ---------- file_name : str Case file name + start_sync : bool, optional + Whether to immediately start lightweight background sync. """ self.settings.file.read( @@ -405,6 +413,8 @@ def read_case_lightweight(self, file_name: str): target=self._start_bg_session_and_sync, args=(launcher_args,) ) ) + if start_sync: + self.start_case_lightweight_sync() def get_state(self) -> StateT: """Get the state of the object.""" diff --git a/tests/test_launcher.py b/tests/test_launcher.py index 994335b0c1a..def4c0d8fed 100644 --- a/tests/test_launcher.py +++ b/tests/test_launcher.py @@ -57,6 +57,7 @@ _build_fluent_launch_args_string, get_fluent_exe_path, ) +from ansys.fluent.core.launcher.standalone_launcher import StandaloneLauncher from ansys.fluent.core.utils.fluent_version import FluentVersion import ansys.platform.instancemanagement as pypim @@ -473,6 +474,46 @@ def test_build_journal_argument(topy, journal_file_names, result, raises): assert _build_journal_argument(topy, journal_file_names) == result +def test_build_journal_argument_without_journal_files_but_with_topy(): + assert ( + _build_journal_argument("a.py", ["a.jou"], include_journal_file_names=False) + == ' -topy="a.py"' + ) + + +def test_lightweight_case_journal_read_is_completed_before_sync_step(): + launcher = object.__new__(StandaloneLauncher) + launcher.argvals = { + "case_file_name": "a.cas.h5", + "case_data_file_name": None, + "mode": FluentMode.SOLVER, + "lightweight_mode": True, + "journal_file_names": ["a.jou", "b.jou"], + } + launcher._defer_journal_file_read = True + + calls = [] + + class _DummySession: + def read_case_lightweight(self, file_name, start_sync=True): + calls.append(("read_case_lightweight", file_name, start_sync)) + + def execute_tui(self, command): + calls.append(("execute_tui", command)) + + def start_case_lightweight_sync(self): + calls.append(("start_case_lightweight_sync",)) + + launcher._process_case_data_and_journals(_DummySession()) + + assert calls == [ + ("read_case_lightweight", "a.cas.h5", False), + ("execute_tui", '/file/read-journal "a.jou"'), + ("execute_tui", '/file/read-journal "b.jou"'), + ("start_case_lightweight_sync",), + ] + + def test_show_gui_raises_warning(): with pytest.warns(PyFluentDeprecationWarning): grpc_kwds = get_grpc_launcher_args_for_gh_runs() From 482b20fbc2889314576b0d519d9d993fa24ab64c Mon Sep 17 00:00:00 2001 From: mayankansys Date: Tue, 17 Mar 2026 17:10:53 +0530 Subject: [PATCH 06/10] update --- tests/test_launcher.py | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/tests/test_launcher.py b/tests/test_launcher.py index def4c0d8fed..b8a358c9359 100644 --- a/tests/test_launcher.py +++ b/tests/test_launcher.py @@ -514,6 +514,42 @@ def start_case_lightweight_sync(self): ] +def test_case_and_case_data_are_processed_before_journal_files(): + launcher = object.__new__(StandaloneLauncher) + launcher.argvals = { + "case_file_name": "a.cas.h5", + "case_data_file_name": "a.cas.h5", + "mode": FluentMode.SOLVER, + "lightweight_mode": False, + "journal_file_names": ["a.jou", "b.jou"], + } + launcher._defer_journal_file_read = True + + calls = [] + + class _DummyFile: + def read(self, **kwargs): + calls.append(("read", kwargs)) + + class _DummySettings: + file = _DummyFile() + + class _DummySession: + settings = _DummySettings() + + def execute_tui(self, command): + calls.append(("execute_tui", command)) + + launcher._process_case_data_and_journals(_DummySession()) + + assert calls == [ + ("read", {"file_type": "case", "file_name": "a.cas.h5"}), + ("read", {"file_type": "case-data", "file_name": "a.cas.h5"}), + ("execute_tui", '/file/read-journal "a.jou"'), + ("execute_tui", '/file/read-journal "b.jou"'), + ] + + def test_show_gui_raises_warning(): with pytest.warns(PyFluentDeprecationWarning): grpc_kwds = get_grpc_launcher_args_for_gh_runs() From 7c5fd0ca9f88dbeb8372a339e9664a4e8dd9c725 Mon Sep 17 00:00:00 2001 From: pyansys-ci-bot <92810346+pyansys-ci-bot@users.noreply.github.com> Date: Thu, 12 Mar 2026 10:46:22 +0000 Subject: [PATCH 07/10] chore: adding changelog file 4990.miscellaneous.md [dependabot-skip] --- doc/changelog.d/4990.miscellaneous.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 doc/changelog.d/4990.miscellaneous.md diff --git a/doc/changelog.d/4990.miscellaneous.md b/doc/changelog.d/4990.miscellaneous.md new file mode 100644 index 00000000000..e61b5c8ce96 --- /dev/null +++ b/doc/changelog.d/4990.miscellaneous.md @@ -0,0 +1 @@ +Couple of issues in launch fluent From b74d2265fd7757785803df7d9ae198d9290c7362 Mon Sep 17 00:00:00 2001 From: mayankansys Date: Tue, 16 Jun 2026 20:58:39 +0530 Subject: [PATCH 08/10] updated the standalone_launcher --- .../core/launcher/standalone_launcher.py | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/src/ansys/fluent/core/launcher/standalone_launcher.py b/src/ansys/fluent/core/launcher/standalone_launcher.py index d8c72e512ca..89601020b05 100644 --- a/src/ansys/fluent/core/launcher/standalone_launcher.py +++ b/src/ansys/fluent/core/launcher/standalone_launcher.py @@ -256,11 +256,11 @@ def __init__( self.argvals["journal_file_names"] and (self.argvals["case_file_name"] or self.argvals["case_data_file_name"]) ) - self._launch_string += _build_journal_argument( - self.argvals["topy"], - self.argvals["journal_file_names"], - include_journal_file_names=not self._defer_journal_file_read, - ) + topy = self.argvals.get("topy", []) + if topy: + self._launch_string += _build_journal_argument( + topy, self.argvals.get("journal_file_names") + ) if is_windows(): self._launch_cmd = self._launch_string @@ -377,6 +377,15 @@ def _process_case_data_and_journals(self, session) -> None: ) else: raise RuntimeError("Case and data file cannot be read in meshing mode.") + + if not self.argvals.get("topy"): + journal_file_names = self.argvals.get("journal_file_names") + if journal_file_names and not self._defer_journal_file_read: + if isinstance(journal_file_names, str): + journal_file_names = [journal_file_names] + for journal_file_name in journal_file_names: + session.tui.file.read_journal(journal_file_name) + if self._defer_journal_file_read: self._read_journals(session) if lightweight_sync_deferred: From 1bc029cd14ad764bc7909575f09b35a2c23dc0d3 Mon Sep 17 00:00:00 2001 From: mayankansys Date: Mon, 22 Jun 2026 23:21:29 +0530 Subject: [PATCH 09/10] standalone launcher updated for the lightweight_mode, case_file and journal_file condition --- .../core/launcher/standalone_launcher.py | 43 ++++++++----------- 1 file changed, 17 insertions(+), 26 deletions(-) diff --git a/src/ansys/fluent/core/launcher/standalone_launcher.py b/src/ansys/fluent/core/launcher/standalone_launcher.py index cdd31f8e31c..6a888eabaa1 100644 --- a/src/ansys/fluent/core/launcher/standalone_launcher.py +++ b/src/ansys/fluent/core/launcher/standalone_launcher.py @@ -41,6 +41,7 @@ from pathlib import Path import subprocess from typing import TYPE_CHECKING, Any, TypedDict +import warnings from typing_extensions import Unpack @@ -67,6 +68,7 @@ _get_server_info_file_names, ) import ansys.fluent.core.launcher.watchdog as watchdog +from ansys.fluent.core.pyfluent_warnings import PyFluentUserWarning from ansys.fluent.core.utils.fluent_version import FluentVersion if TYPE_CHECKING: @@ -224,6 +226,15 @@ def __init__( self.argvals["ui_mode"] = UIMode(kwargs.get("ui_mode")) if self.argvals.get("lightweight_mode") is None: self.argvals["lightweight_mode"] = False + + if self.argvals["lightweight_mode"] and self.argvals.get("journal_file_names"): + warnings.warn( + "'lightweight_mode' is not supported together with " + "'journal_file_names' and will be ignored.", + PyFluentUserWarning, + ) + self.argvals["lightweight_mode"] = False + fluent_version = _get_standalone_launch_fluent_version(self.argvals) if ( @@ -257,10 +268,7 @@ def __init__( ) if self.argvals["cwd"]: self._kwargs.update(cwd=self.argvals["cwd"]) - self._defer_journal_file_read = bool( - self.argvals["journal_file_names"] - and (self.argvals["case_file_name"] or self.argvals["case_data_file_name"]) - ) + topy = self.argvals.get("topy", []) if topy: self._launch_string += _build_journal_argument( @@ -370,25 +378,15 @@ def _get_journal_file_names( return [journal_file_names] return journal_file_names or [] - def _read_journals(self, session) -> None: - for journal_file_name in self._get_journal_file_names( - self.argvals["journal_file_names"] - ): - session.execute_tui( - f'/file/read-journal "{Path(journal_file_name).as_posix()}"' - ) - def _process_case_data_and_journals(self, session) -> None: - lightweight_sync_deferred = False if self.argvals["case_file_name"]: if FluentMode.is_meshing(self.argvals["mode"]): session.tui.file.read_case(self.argvals["case_file_name"]) elif self.argvals["lightweight_mode"]: session.read_case_lightweight( self.argvals["case_file_name"], - start_sync=not self._defer_journal_file_read, + start_sync=True, ) - lightweight_sync_deferred = self._defer_journal_file_read else: session.settings.file.read( file_type="case", @@ -404,14 +402,7 @@ def _process_case_data_and_journals(self, session) -> None: raise RuntimeError("Case and data file cannot be read in meshing mode.") if not self.argvals.get("topy"): - journal_file_names = self.argvals.get("journal_file_names") - if journal_file_names and not self._defer_journal_file_read: - if isinstance(journal_file_names, str): - journal_file_names = [journal_file_names] - for journal_file_name in journal_file_names: - session.tui.file.read_journal(journal_file_name) - - if self._defer_journal_file_read: - self._read_journals(session) - if lightweight_sync_deferred: - session.start_case_lightweight_sync() + for journal_file_name in self._get_journal_file_names( + self.argvals.get("journal_file_names") + ): + session.tui.file.write_journal(f"{journal_file_name}.topy") From 0a2861fea2135d277dcc827d3a9a4d21366a193d Mon Sep 17 00:00:00 2001 From: mayankansys Date: Mon, 22 Jun 2026 23:49:43 +0530 Subject: [PATCH 10/10] updated the condition logic & minor things --- .../core/launcher/standalone_launcher.py | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/src/ansys/fluent/core/launcher/standalone_launcher.py b/src/ansys/fluent/core/launcher/standalone_launcher.py index 6a888eabaa1..3b4b6d32801 100644 --- a/src/ansys/fluent/core/launcher/standalone_launcher.py +++ b/src/ansys/fluent/core/launcher/standalone_launcher.py @@ -190,6 +190,8 @@ def __init__( lightweight_mode : bool, optional If True, runs in lightweight mode where mesh settings are read into a background solver session, replacing it once complete. This parameter is only applicable when `case_file_name` is provided; defaults to False. + When combined with `journal_file_names`, a warning is issued and `lightweight_mode` is set to False, as + journal processing cannot be reliably ordered with mesh-only initialization. py : bool, optional If True, runs Fluent in Python mode. Defaults to None. gpu : bool, optional @@ -216,6 +218,10 @@ def __init__( ----- In job scheduler environments (e.g., SLURM, LSF, PBS), resources and compute nodes are allocated, and core counts are queried from these environments before being passed to Fluent. + + File processing order: Case files are processed before case-data files, which are processed before + journal files. In lightweight mode, journal files are read before the background session is synchronized + with the foreground session. """ import ansys.fluent.core as pyfluent @@ -385,7 +391,7 @@ def _process_case_data_and_journals(self, session) -> None: elif self.argvals["lightweight_mode"]: session.read_case_lightweight( self.argvals["case_file_name"], - start_sync=True, + start_sync=False, ) else: session.settings.file.read( @@ -401,8 +407,16 @@ def _process_case_data_and_journals(self, session) -> None: else: raise RuntimeError("Case and data file cannot be read in meshing mode.") - if not self.argvals.get("topy"): + if self.argvals.get("topy"): for journal_file_name in self._get_journal_file_names( self.argvals.get("journal_file_names") ): session.tui.file.write_journal(f"{journal_file_name}.topy") + else: + for journal_file_name in self._get_journal_file_names( + self.argvals.get("journal_file_names") + ): + session.execute_tui(f'/file/read-journal "{journal_file_name}"') + + if self.argvals.get("lightweight_mode"): + session.start_case_lightweight_sync()