diff --git a/src/common/include/parallel_macros.fpp b/src/common/include/parallel_macros.fpp index b1382ec49a..a134670bbb 100644 --- a/src/common/include/parallel_macros.fpp +++ b/src/common/include/parallel_macros.fpp @@ -63,21 +63,25 @@ & extraAccArgs=extraAccArgs) #:set omp_directive = OMP_ROUTINE(function_name=function_name, nohost=nohost, extraOmpArgs=extraOmpArgs) + #:set cray_noinline_directive = '' + #:set cray_directive = '' + #:if cray_noinline == True #:if not isinstance(function_name, str) #:stop "When using cray_noinline, function name must be given and given as a string" #:endif #:set cray_noinline_directive = ('!DIR$ NOINLINE ' + function_name).strip('\n') #ifdef _CRAYFTN + $:cray_noinline_directive #if MFC_OpenACC $:acc_directive #elif MFC_OpenMP $:omp_directive #else - $:cray_noinline_directive -#endif #! On non-Cray CPU builds (no _CRAYFTN, no MFC_OpenACC, no MFC_OpenMP), nothing is #! emitted — intentional, since !DIR$ NOINLINE is a Cray-specific directive. +#endif + #elif MFC_OpenACC $:acc_directive #elif MFC_OpenMP @@ -89,12 +93,12 @@ #:endif #:set cray_directive = ('!DIR$ INLINEALWAYS ' + function_name).strip('\n') #ifdef _CRAYFTN + $:cray_directive #if MFC_OpenACC $:acc_directive #elif MFC_OpenMP $:omp_directive #else - $:cray_directive #endif #elif MFC_OpenACC $:acc_directive diff --git a/toolchain/mfc/case_validator.py b/toolchain/mfc/case_validator.py index 5c0a02fabc..972f1253c3 100644 --- a/toolchain/mfc/case_validator.py +++ b/toolchain/mfc/case_validator.py @@ -333,6 +333,9 @@ def check_weno(self): if recon_type != 1: return + for param in ["muscl_order", "muscl_lim"]: + self.prohibit(self.is_set(param), f"recon_type = 1 (WENO) is not compatible with {param}") + weno_order = self.get("weno_order") m = self.get("m", 0) n = self.get("n", 0) @@ -357,6 +360,17 @@ def check_muscl(self): if recon_type != 2: return + weno_log_params = ["mapped_weno", "wenoz", "teno", "mp_weno", "weno_avg", "null_weights", "weno_Re_flux"] + for param in weno_log_params: + self.prohibit(self.get(param) == "T", f"recon_type = 2 (MUSCL) is not compatible with {param} = T") + + weno_numeric_params = ["wenoz_q", "teno_CT", "weno_eps"] + for param in weno_numeric_params: + self.prohibit(self.is_set(param), f"recon_type = 2 (MUSCL) is not compatible with {param}") + + weno_order = self.get("weno_order") + self.prohibit(weno_order is not None and weno_order != 0, f"recon_type = 2 (MUSCL) requires weno_order unset or 0, but got {weno_order}") + muscl_order = self.get("muscl_order") m = self.get("m", 0) n = self.get("n", 0) @@ -717,6 +731,11 @@ def check_finite_difference(self): def check_weno_simulation(self): """Checks WENO-specific constraints for simulation""" + recon_type = self.get("recon_type", 1) + # WENO_TYPE = 1 + if recon_type != 1: + return + weno_order = self.get("weno_order") weno_eps = self.get("weno_eps") wenoz = self.get("wenoz", "F") == "T" @@ -751,6 +770,11 @@ def check_weno_simulation(self): def check_muscl_simulation(self): """Checks MUSCL-specific constraints for simulation""" + recon_type = self.get("recon_type", 1) + # MUSCL_TYPE = 2 + if recon_type != 2: + return + muscl_order = self.get("muscl_order") muscl_lim = self.get("muscl_lim") diff --git a/toolchain/mfc/test/case.py b/toolchain/mfc/test/case.py index e497a029fd..c8cf0c2485 100644 --- a/toolchain/mfc/test/case.py +++ b/toolchain/mfc/test/case.py @@ -161,7 +161,9 @@ def __init__(self, trace: str, mods: dict, ppn: int = None, override_tol: float self.ppn = ppn or 1 self.override_tol = override_tol self.restart_check = restart_check - super().__init__({**BASE_CFG.copy(), **mods}) + merge = {**BASE_CFG.copy(), **mods} + merge = {key: val for key, val in merge.items() if val is not None} + super().__init__(merge) def run(self, targets: List[Union[str, MFCTarget]], gpus: Set[int]) -> subprocess.CompletedProcess: if gpus is not None and len(gpus) != 0: diff --git a/toolchain/mfc/test/cases.py b/toolchain/mfc/test/cases.py index 033c433199..ac072d0816 100644 --- a/toolchain/mfc/test/cases.py +++ b/toolchain/mfc/test/cases.py @@ -300,7 +300,7 @@ def alter_igr(): def alter_muscl(): for muscl_order in [1, 2]: - stack.push(f"muscl_order={muscl_order}", {"muscl_order": muscl_order, "recon_type": 2, "weno_order": 0}) + stack.push(f"muscl_order={muscl_order}", {"muscl_order": muscl_order, "recon_type": 2, "weno_order": 0, "weno_eps": None, "wenoz_q": None, "teno_CT": None}) if muscl_order == 1: for int_comp in ["T", "F"]: @@ -1558,6 +1558,10 @@ def modify_example_case(case: dict): case["t_step_stop"] = 50 case["t_step_save"] = 50 + if case.get("recon_type") == 2: + for k in ("weno_order", "weno_eps", "wenoz_q", "teno_CT"): + case[k] = None + caseSize = case["m"] * max(case["n"], 1) * max(case["p"], 1) if caseSize > 25 * 25: if case["n"] == 0 and case["p"] == 0: