From b6cb5ffe4ab11d4be4d1e1f456c8bc81ea53efcd Mon Sep 17 00:00:00 2001 From: Uwe Date: Sat, 13 Aug 2022 16:27:56 +0200 Subject: [PATCH] [FEM] Elmer: fixes for multi-threading - load the results depending on the used cores, not always the multi-thread results - avoid unnecessary console output - this info is already output in tasks.py - handle number of cores as int to save in total 2 conversions --- src/Mod/Fem/femsolver/elmer/tasks.py | 30 ++++++++++++++++----------- src/Mod/Fem/femsolver/elmer/writer.py | 4 ++-- src/Mod/Fem/femsolver/settings.py | 6 +----- 3 files changed, 21 insertions(+), 19 deletions(-) diff --git a/src/Mod/Fem/femsolver/elmer/tasks.py b/src/Mod/Fem/femsolver/elmer/tasks.py index f27213252a..57fe57c928 100644 --- a/src/Mod/Fem/femsolver/elmer/tasks.py +++ b/src/Mod/Fem/femsolver/elmer/tasks.py @@ -130,12 +130,12 @@ class Solve(run.Solve): self.pushStatus("Number of CPU cores to be used for the solver run: {}\n" .format(num_cores)) args = [] - if int(num_cores) > 1: + if num_cores > 1: if system() != "Windows": args.extend(["mpirun"]) else: args.extend(["mpiexec"]) - args.extend(["-np", num_cores]) + args.extend(["-np", str(num_cores)]) args.extend([binary]) if system() == "Windows": self._process = subprocess.Popen( @@ -283,16 +283,22 @@ class Results(run.Results): possible_post_file_old = os.path.join(self.directory, "case0001.vtu") possible_post_file_single = os.path.join(self.directory, "case_t0001.vtu") possible_post_file_multi = os.path.join(self.directory, "case_t0001.pvtu") - # first try the multi-thread result, then single then old name - if os.path.isfile(possible_post_file_multi): - postPath = possible_post_file_multi - elif os.path.isfile(possible_post_file_single): - postPath = possible_post_file_single - elif os.path.isfile(possible_post_file_old): - postPath = possible_post_file_old - else: - self.report.error("Result file not found.") - self.fail() + # depending on the currently set number of cores we try to load either + # the multi-thread result or the single result + if settings.get_cores("ElmerSolver") > 1: + if os.path.isfile(possible_post_file_multi): + postPath = possible_post_file_multi + else: + self.report.error("Result file not found.") + self.fail() + else: + if os.path.isfile(possible_post_file_single): + postPath = possible_post_file_single + elif os.path.isfile(possible_post_file_old): + postPath = possible_post_file_old + else: + self.report.error("Result file not found.") + self.fail() return postPath ## @} diff --git a/src/Mod/Fem/femsolver/elmer/writer.py b/src/Mod/Fem/femsolver/elmer/writer.py index 60d1c234ca..7119fc2648 100644 --- a/src/Mod/Fem/femsolver/elmer/writer.py +++ b/src/Mod/Fem/femsolver/elmer/writer.py @@ -241,9 +241,9 @@ class Writer(object): ) else: subprocess.call(args, stdout=subprocess.DEVNULL) - if int(num_cores) > 1: + if num_cores > 1: args = argsBasic - args.extend(["-partdual", "-metiskway", num_cores, + args.extend(["-partdual", "-metiskway", str(num_cores), "-out", self.directory]) if system() == "Windows": subprocess.call( diff --git a/src/Mod/Fem/femsolver/settings.py b/src/Mod/Fem/femsolver/settings.py index 81dbebf1b1..533ee485e5 100644 --- a/src/Mod/Fem/femsolver/settings.py +++ b/src/Mod/Fem/femsolver/settings.py @@ -116,10 +116,6 @@ def get_cores(name): """ if name in _SOLVER_PARAM: cores = _SOLVER_PARAM[name].get_cores() - FreeCAD.Console.PrintMessage( - "Number of CPU cores to be used for the solver run: {}\n" - .format(cores) - ) return cores else: FreeCAD.Console.PrintError( @@ -244,7 +240,7 @@ class _SolverDlg(object): return the_found_binary def get_cores(self): - cores = str(self.param_group.GetInt("UseNumberOfCores")) + cores = self.param_group.GetInt("UseNumberOfCores") return cores def get_write_comments(self):