From 8960bf01b05808b443ead889eae799c500dad227 Mon Sep 17 00:00:00 2001 From: Cowsreal Date: Sun, 12 Apr 2026 21:02:26 -0400 Subject: [PATCH 1/8] Add guards for incorrect WENO/MUSCL parameters for corresponding recon_type set --- toolchain/mfc/case_validator.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/toolchain/mfc/case_validator.py b/toolchain/mfc/case_validator.py index 79e136eb6e..7f2b3e0f7f 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,10 @@ def check_muscl(self): if recon_type != 2: return + weno_params = ["weno_order", "weno_eps", "mapped_weno", "wenoz", "teno", "teno_CT", "wenoz_q", "mp_weno", "weno_avg", "null_weights", "weno_Re_flux"] + for param in weno_params: + self.prohibit(self.is_set(param), f"recon_type = 2 (MUSCL) is not compatible with {param}") + muscl_order = self.get("muscl_order") m = self.get("m", 0) n = self.get("n", 0) From 73d09ae326b972b81ae71bcbd16a3ad713cf9a5e Mon Sep 17 00:00:00 2001 From: Mark Zhang Date: Thu, 23 Apr 2026 17:43:41 -0400 Subject: [PATCH 2/8] changes --- toolchain/mfc/case_validator.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/toolchain/mfc/case_validator.py b/toolchain/mfc/case_validator.py index 7f2b3e0f7f..39a85116d7 100644 --- a/toolchain/mfc/case_validator.py +++ b/toolchain/mfc/case_validator.py @@ -360,9 +360,12 @@ def check_muscl(self): if recon_type != 2: return - weno_params = ["weno_order", "weno_eps", "mapped_weno", "wenoz", "teno", "teno_CT", "wenoz_q", "mp_weno", "weno_avg", "null_weights", "weno_Re_flux"] - for param in weno_params: - self.prohibit(self.is_set(param), f"recon_type = 2 (MUSCL) is not compatible with {param}") + weno_log_params = ["mapped_weno", "wenoz", "wenoz_q", "teno", "teno_CT", "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_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) From 63e1623ea66e20e7f755d4472f9ac27eb63a84dc Mon Sep 17 00:00:00 2001 From: Mark Zhang Date: Thu, 23 Apr 2026 17:50:02 -0400 Subject: [PATCH 3/8] Fix Cray compilers inlining option in $:GPU_ROUTINE --- src/common/include/parallel_macros.fpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/common/include/parallel_macros.fpp b/src/common/include/parallel_macros.fpp index b1382ec49a..5364849d0b 100644 --- a/src/common/include/parallel_macros.fpp +++ b/src/common/include/parallel_macros.fpp @@ -69,12 +69,13 @@ #: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. @@ -89,12 +90,13 @@ #: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 From 6cae04091ef89ad9e6a7daeb6802eb859c9f58d3 Mon Sep 17 00:00:00 2001 From: Mark Zhang Date: Thu, 23 Apr 2026 17:51:14 -0400 Subject: [PATCH 4/8] Fix Cray compilers inlining option in $:GPU_ROUTINE --- src/common/include/parallel_macros.fpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/common/include/parallel_macros.fpp b/src/common/include/parallel_macros.fpp index 5364849d0b..49e4f3c704 100644 --- a/src/common/include/parallel_macros.fpp +++ b/src/common/include/parallel_macros.fpp @@ -75,7 +75,6 @@ #elif MFC_OpenMP $:omp_directive #else - #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. @@ -96,7 +95,6 @@ #elif MFC_OpenMP $:omp_directive #else - #endif #elif MFC_OpenACC $:acc_directive From 51976e14984648e7b4be291d4cc0fe172d796f1d Mon Sep 17 00:00:00 2001 From: Mark Zhang Date: Thu, 23 Apr 2026 18:10:08 -0400 Subject: [PATCH 5/8] Split logical parameters into logical and numerical --- toolchain/mfc/case_validator.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/toolchain/mfc/case_validator.py b/toolchain/mfc/case_validator.py index 215b7e261d..546cd00f9c 100644 --- a/toolchain/mfc/case_validator.py +++ b/toolchain/mfc/case_validator.py @@ -360,10 +360,14 @@ def check_muscl(self): if recon_type != 2: return - weno_log_params = ["mapped_weno", "wenoz", "wenoz_q", "teno", "teno_CT", "mp_weno", "weno_avg", "null_weights", "weno_Re_flux"] + 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}") From 3d1177f8cd93a2b01046739aaf3007a7dcba3269 Mon Sep 17 00:00:00 2001 From: Cowsreal Date: Fri, 24 Apr 2026 02:03:55 -0400 Subject: [PATCH 6/8] Fix MUSCL tests cases from failing and necessary initializations inside $:GPU_ROUTINE macro --- src/common/include/parallel_macros.fpp | 3 +++ toolchain/mfc/case_validator.py | 5 +++++ toolchain/mfc/test/case.py | 4 +++- toolchain/mfc/test/cases.py | 3 ++- 4 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/common/include/parallel_macros.fpp b/src/common/include/parallel_macros.fpp index 49e4f3c704..25e19da094 100644 --- a/src/common/include/parallel_macros.fpp +++ b/src/common/include/parallel_macros.fpp @@ -63,6 +63,9 @@ & 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" diff --git a/toolchain/mfc/case_validator.py b/toolchain/mfc/case_validator.py index 546cd00f9c..32642f7aa5 100644 --- a/toolchain/mfc/case_validator.py +++ b/toolchain/mfc/case_validator.py @@ -731,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" 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..9c69fbc24a 100644 --- a/toolchain/mfc/test/cases.py +++ b/toolchain/mfc/test/cases.py @@ -300,7 +300,8 @@ 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"]: From b9bf56579c920a6d7acceae675588e3b26ab55b7 Mon Sep 17 00:00:00 2001 From: Cowsreal Date: Fri, 24 Apr 2026 02:08:30 -0400 Subject: [PATCH 7/8] Format --- src/common/include/parallel_macros.fpp | 3 ++- toolchain/mfc/test/cases.py | 3 +-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/common/include/parallel_macros.fpp b/src/common/include/parallel_macros.fpp index 25e19da094..a134670bbb 100644 --- a/src/common/include/parallel_macros.fpp +++ b/src/common/include/parallel_macros.fpp @@ -78,9 +78,10 @@ #elif MFC_OpenMP $:omp_directive #else -#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 diff --git a/toolchain/mfc/test/cases.py b/toolchain/mfc/test/cases.py index 9c69fbc24a..4a871de6de 100644 --- a/toolchain/mfc/test/cases.py +++ b/toolchain/mfc/test/cases.py @@ -300,8 +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, - "weno_eps": None, "wenoz_q": None, "teno_CT": None}) + 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"]: From 589d0dfc2aa350346c705c094cb233f2de4c47f9 Mon Sep 17 00:00:00 2001 From: Mark Zhang Date: Sat, 25 Apr 2026 18:08:41 -0400 Subject: [PATCH 8/8] Fix WENO numerical parameters for example test cases. Add similar corresponding recon_type check for check_muscl_simulation --- toolchain/mfc/case_validator.py | 5 +++++ toolchain/mfc/test/cases.py | 4 ++++ 2 files changed, 9 insertions(+) diff --git a/toolchain/mfc/case_validator.py b/toolchain/mfc/case_validator.py index 32642f7aa5..972f1253c3 100644 --- a/toolchain/mfc/case_validator.py +++ b/toolchain/mfc/case_validator.py @@ -770,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/cases.py b/toolchain/mfc/test/cases.py index 4a871de6de..ac072d0816 100644 --- a/toolchain/mfc/test/cases.py +++ b/toolchain/mfc/test/cases.py @@ -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: