diff --git a/scripts/lib/CIME/XML/env_mach_specific.py b/scripts/lib/CIME/XML/env_mach_specific.py index ba012966ccb..253082aa34d 100644 --- a/scripts/lib/CIME/XML/env_mach_specific.py +++ b/scripts/lib/CIME/XML/env_mach_specific.py @@ -321,7 +321,7 @@ def get_module_system_cmd_path(self, lang): cmd_nodes = self.get_optional_node("cmd_path", attributes={"lang":lang}) return cmd_nodes.text if cmd_nodes is not None else None - def get_mpirun(self, case, attribs, check_members=None, job="case.run"): + def get_mpirun(self, case, attribs, check_members=None, job="case.run", exe_only=False): """ Find best match, return (executable, {arg_name : text}) """ @@ -372,16 +372,17 @@ def get_mpirun(self, case, attribs, check_members=None, job="case.run"): the_match = best_match if best_match is not None else default_match # Now that we know the best match, compute the arguments - arg_node = self.get_optional_node("arguments", root=the_match) - if arg_node is not None: - arg_nodes = self.get_nodes("arg", root=arg_node) - for arg_node in arg_nodes: - arg_value = transform_vars(arg_node.text, - case=case, - subgroup=job, - check_members=check_members, - default=arg_node.get("default")) - args[arg_node.get("name")] = arg_value + if exe_only: + arg_node = self.get_optional_node("arguments", root=the_match) + if arg_node is not None: + arg_nodes = self.get_nodes("arg", root=arg_node) + for arg_node in arg_nodes: + arg_value = transform_vars(arg_node.text, + case=case, + subgroup=job, + check_members=check_members, + default=arg_node.get("default")) + args[arg_node.get("name")] = arg_value exec_node = self.get_node("executable", root=the_match) expect(exec_node is not None,"No executable found") diff --git a/scripts/lib/CIME/case.py b/scripts/lib/CIME/case.py index ecfede3886c..677c80e7987 100644 --- a/scripts/lib/CIME/case.py +++ b/scripts/lib/CIME/case.py @@ -123,9 +123,10 @@ def _initialize_derived_attributes(self): These are derived variables which can be used in the config_* files for variable substitution using the {{ var }} syntax """ - env_mach_pes = self.get_env("mach_pes") - comp_classes = self.get_values("COMP_CLASSES") - pes_per_node = self.get_value("PES_PER_NODE") + env_mach_pes = self.get_env("mach_pes") + env_mach_spec = self.get_env('mach_specific') + comp_classes = self.get_values("COMP_CLASSES") + pes_per_node = self.get_value("PES_PER_NODE") self.total_tasks = env_mach_pes.get_total_tasks(comp_classes) self.thread_count = env_mach_pes.get_max_thread_count(comp_classes) @@ -139,7 +140,14 @@ def _initialize_derived_attributes(self): threads_per_core = 1 if (threads_per_node <= pes_per_node) else smt_factor self.cores_per_task = self.thread_count / threads_per_core - if self.get_value("MACH") == "titan": + mpi_attribs = { + "compiler" : self.get_value("COMPILER"), + "mpilib" : self.get_value("MPILIB"), + "threaded" : get_build_threaded(self) + } + + executable = env_mach_spec.get_mpirun(self, mpi_attribs, job="case.run", exe_only=True)[0] + if executable == "aprun": self.num_nodes = get_aprun_cmd_for_case(self, "acme.exe")[1] else: self.num_nodes = env_mach_pes.get_total_nodes(self.total_tasks, self.thread_count) @@ -1068,7 +1076,9 @@ def get_mpirun_cmd(self, job="case.run"): # special case for aprun if executable == "aprun": - return get_aprun_cmd_for_case(self, run_exe)[0] + " " + run_misc_suffix + aprun_cmd, num_nodes = get_aprun_cmd_for_case(self, run_exe) + expect(num_nodes == self.num_nodes, "Not using optimized num nodes") + return aprun_cmd + " " + run_misc_suffix else: mpi_arg_string = " ".join(args.values())