diff --git a/toolchain/mfc/case_validator.py b/toolchain/mfc/case_validator.py index 5c0a02fabc..291f2bcf23 100644 --- a/toolchain/mfc/case_validator.py +++ b/toolchain/mfc/case_validator.py @@ -328,11 +328,15 @@ def check_igr(self): def check_weno(self): """Checks constraints regarding WENO order""" recon_type = self.get("recon_type", 1) + self.prohibit(recon_type not in [1, 2], "recon_type must be 1 (WENO) or 2 (MUSCL)") # WENO_TYPE = 1 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) @@ -349,6 +353,8 @@ def check_weno(self): def check_muscl(self): """Check constraints regarding MUSCL order""" recon_type = self.get("recon_type", 1) + self.prohibit(recon_type not in [1, 2], "recon_type must be 1 (WENO) or 2 (MUSCL)") + int_comp = self.get("int_comp", "F") == "T" self.prohibit(int_comp and recon_type != 2, "int_comp (THINC interface compression) requires recon_type = 2 (MUSCL)") @@ -357,6 +363,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 +734,13 @@ def check_finite_difference(self): def check_weno_simulation(self): """Checks WENO-specific constraints for simulation""" + recon_type = self.get("recon_type", 1) + self.prohibit(recon_type not in [1, 2], "recon_type must be 1 (WENO) or 2 (MUSCL)") + + # 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 +775,13 @@ def check_weno_simulation(self): def check_muscl_simulation(self): """Checks MUSCL-specific constraints for simulation""" + recon_type = self.get("recon_type", 1) + self.prohibit(recon_type not in [1, 2], "recon_type must be 1 (WENO) or 2 (MUSCL)") + + # 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: