@@ -250,6 +250,21 @@ def _validate_logical(self, key: str):
250250 if val is not None and val not in ("T" , "F" ):
251251 self .errors .append (f"{ key } must be 'T' or 'F', got '{ val } '" )
252252
253+ def _check_order_fits_grid (self , order : int , param_name : str ) -> None :
254+ """Prohibit reconstruction order that exceeds grid cell count in any active dimension."""
255+ m = self .get ("m" , 0 )
256+ n = self .get ("n" , 0 ) or 0
257+ p = self .get ("p" , 0 ) or 0
258+ self .prohibit (m + 1 < order , f"m must be at least { param_name } - 1 (= { order - 1 } )" )
259+ self .prohibit (n > 0 and n + 1 < order , f"For 2D: n must be at least { param_name } - 1 (= { order - 1 } )" )
260+ self .prohibit (p > 0 and p + 1 < order , f"For 3D: p must be at least { param_name } - 1 (= { order - 1 } )" )
261+
262+ def _get_recon_type (self ) -> int :
263+ """Return recon_type after validating it is 1 (WENO) or 2 (MUSCL)."""
264+ recon_type = self .get ("recon_type" , 1 )
265+ self .prohibit (recon_type not in [1 , 2 ], "recon_type must be 1 (WENO) or 2 (MUSCL)" )
266+ return recon_type
267+
253268 def check_parameter_types (self ):
254269 """Validate parameter types before other checks.
255270
@@ -316,72 +331,44 @@ def check_igr(self):
316331 return
317332
318333 igr_order = self .get ("igr_order" )
319- m = self .get ("m" , 0 )
320- n = self .get ("n" , 0 )
321- p = self .get ("p" , 0 )
322334 self .prohibit (igr_order not in [None , 3 , 5 ], "igr_order must be 3 or 5" )
323335 if igr_order :
324- self .prohibit (m + 1 < igr_order , f"m must be at least igr_order - 1 (= { igr_order - 1 } )" )
325- self .prohibit (n is not None and n > 0 and n + 1 < igr_order , f"n must be at least igr_order - 1 (= { igr_order - 1 } )" )
326- self .prohibit (p is not None and p > 0 and p + 1 < igr_order , f"p must be at least igr_order - 1 (= { igr_order - 1 } )" )
336+ self ._check_order_fits_grid (igr_order , "igr_order" )
327337
328338 def check_weno (self ):
329339 """Checks constraints regarding WENO order"""
330- recon_type = self .get ("recon_type" , 1 )
331- self .prohibit (recon_type not in [1 , 2 ], "recon_type must be 1 (WENO) or 2 (MUSCL)" )
332-
333- # WENO_TYPE = 1
334- if recon_type != 1 :
340+ if self ._get_recon_type () != 1 :
335341 return
336342
337343 for param in ["muscl_order" , "muscl_lim" ]:
338344 self .prohibit (self .is_set (param ), f"recon_type = 1 (WENO) is not compatible with { param } " )
339345
340346 weno_order = self .get ("weno_order" )
341- m = self .get ("m" , 0 )
342- n = self .get ("n" , 0 )
343- p = self .get ("p" , 0 )
344-
345347 if weno_order is None :
346348 return
347349
348350 self .prohibit (weno_order not in [1 , 3 , 5 , 7 ], "weno_order must be 1, 3, 5, or 7" )
349- self .prohibit (m + 1 < weno_order , f"m must be at least weno_order - 1 (= { weno_order - 1 } )" )
350- self .prohibit (n is not None and n > 0 and n + 1 < weno_order , f"For 2D simulation, n must be at least weno_order - 1 (= { weno_order - 1 } )" )
351- self .prohibit (p is not None and p > 0 and p + 1 < weno_order , f"For 3D simulation, p must be at least weno_order - 1 (= { weno_order - 1 } )" )
351+ self ._check_order_fits_grid (weno_order , "weno_order" )
352352
353353 def check_muscl (self ):
354354 """Check constraints regarding MUSCL order"""
355- recon_type = self .get ("recon_type" , 1 )
356- self .prohibit (recon_type not in [1 , 2 ], "recon_type must be 1 (WENO) or 2 (MUSCL)" )
357-
358- # MUSCL_TYPE = 2
359- if recon_type != 2 :
355+ if self ._get_recon_type () != 2 :
360356 return
361357
362- weno_log_params = ["mapped_weno" , "wenoz" , "teno" , "mp_weno" , "weno_avg" , "null_weights" , "weno_Re_flux" ]
363- for param in weno_log_params :
358+ for param in ["mapped_weno" , "wenoz" , "teno" , "mp_weno" , "weno_avg" , "null_weights" , "weno_Re_flux" ]:
364359 self .prohibit (self .get (param ) == "T" , f"recon_type = 2 (MUSCL) is not compatible with { param } = T" )
365-
366- weno_numeric_params = ["wenoz_q" , "teno_CT" , "weno_eps" ]
367- for param in weno_numeric_params :
360+ for param in ["wenoz_q" , "teno_CT" , "weno_eps" ]:
368361 self .prohibit (self .is_set (param ), f"recon_type = 2 (MUSCL) is not compatible with { param } " )
369362
370363 weno_order = self .get ("weno_order" )
371364 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 } " )
372365
373366 muscl_order = self .get ("muscl_order" )
374- m = self .get ("m" , 0 )
375- n = self .get ("n" , 0 )
376- p = self .get ("p" , 0 )
377-
378367 if muscl_order is None :
379368 return
380369
381370 self .prohibit (muscl_order not in [1 , 2 ], "muscl_order must be 1 or 2" )
382- self .prohibit (m + 1 < muscl_order , f"m must be at least muscl_order - 1 (= { muscl_order - 1 } )" )
383- self .prohibit (n is not None and n > 0 and n + 1 < muscl_order , f"For 2D simulation, n must be at least muscl_order - 1 (= { muscl_order - 1 } )" )
384- self .prohibit (p is not None and p > 0 and p + 1 < muscl_order , f"For 3D simulation, p must be at least muscl_order - 1 (= { muscl_order - 1 } )" )
371+ self ._check_order_fits_grid (muscl_order , "muscl_order" )
385372
386373 def check_interface_compression (self ):
387374 """Check constraints regarding interface compression"""
@@ -752,11 +739,7 @@ def check_finite_difference(self):
752739
753740 def check_weno_simulation (self ):
754741 """Checks WENO-specific constraints for simulation"""
755- recon_type = self .get ("recon_type" , 1 )
756- self .prohibit (recon_type not in [1 , 2 ], "recon_type must be 1 (WENO) or 2 (MUSCL)" )
757-
758- # WENO_TYPE = 1
759- if recon_type != 1 :
742+ if self ._get_recon_type () != 1 :
760743 return
761744
762745 weno_order = self .get ("weno_order" )
@@ -793,11 +776,7 @@ def check_weno_simulation(self):
793776
794777 def check_muscl_simulation (self ):
795778 """Checks MUSCL-specific constraints for simulation"""
796- recon_type = self .get ("recon_type" , 1 )
797- self .prohibit (recon_type not in [1 , 2 ], "recon_type must be 1 (WENO) or 2 (MUSCL)" )
798-
799- # MUSCL_TYPE = 2
800- if recon_type != 2 :
779+ if self ._get_recon_type () != 2 :
801780 return
802781
803782 muscl_order = self .get ("muscl_order" )
0 commit comments