@@ -1940,16 +1940,22 @@ class TestSubDomainArguments:
19401940 def _make_operator (left_shift = 0 , right_shift = 0 , grid = None , middle = False ):
19411941 grid = grid or Grid (shape = (8 , 32 ))
19421942 y = grid .dimensions [- 1 ]
1943+
19431944 yl = SubDimension .left ('yl' , y , 8 )
19441945 yr = SubDimension .right ('yr' , y , 8 )
19451946 if middle :
19461947 yl = yr = SubDimension .middle ('ym' , y , 8 , 8 )
1948+
19471949 u = TimeFunction (name = 'u' , grid = grid , space_order = 8 )
19481950 v = TimeFunction (name = 'v' , grid = grid , space_order = 8 )
1949- op = Operator ([
1951+
1952+ eqs = [
19501953 Eq (u .forward .subs (y , y + left_shift ), 1 ).subs (y , yl ),
19511954 Eq (v .forward , u .forward .subs (y , y + right_shift ) + 1 ).subs (y , yr )
1952- ], name = 'subdomain_arguments' )
1955+ ]
1956+
1957+ op = Operator (eqs , name = 'subdomain_arguments' )
1958+
19531959 return op , (u , v )
19541960
19551961 @pytest .mark .parametrize ('middle' , [False , True ])
@@ -1960,9 +1966,11 @@ def _make_operator(left_shift=0, right_shift=0, grid=None, middle=False):
19601966 @pytest .mark .parametrize ('override' , ['function' , 'bounds' , 'thickness' ])
19611967 def test_stencil_gap (self , middle , left_shift , right_shift , margin , override ):
19621968 op , (u , v ) = self ._make_operator (left_shift , right_shift , middle = middle )
1969+
19631970 size = 16 + 8 + margin
19641971 if override == 'function' :
19651972 grid = Grid (shape = (8 , size ))
1973+
19661974 kwargs = {f .name : TimeFunction (name = f'runtime_{ f .name } ' , grid = grid ,
19671975 space_order = 8 ) for f in (u , v )}
19681976 elif override == 'bounds' :
@@ -1983,10 +1991,13 @@ def test_stencil_gap(self, middle, left_shift, right_shift, margin, override):
19831991 def test_runtime_space_order (self , middle , space_order , margin ):
19841992 """Override metadata does not change the compiled stencil order."""
19851993 op , fields = self ._make_operator (middle = middle )
1994+
19861995 required = 8
19871996 grid = Grid (shape = (8 , 16 + required + margin ))
1997+
19881998 kwargs = {f .name : TimeFunction (name = f'runtime_{ f .name } ' , grid = grid ,
19891999 space_order = space_order ) for f in fields }
2000+
19902001 if middle and margin < 0 :
19912002 with pytest .raises (InvalidArgument ,
19922003 match = f'at least { required } interior points' ):
@@ -1997,6 +2008,7 @@ def test_runtime_space_order(self, middle, space_order, margin):
19972008 @pytest .mark .parametrize ('side' , ['left' , 'right' ])
19982009 def test_empty_slab (self , side ):
19992010 op , _ = self ._make_operator (right_shift = - 4 )
2011+
20002012 d , = [d for d in op .dimensions if d .is_Sub and getattr (d , f'is_{ side } ' )]
20012013 thickness = d .ltkn if side == 'left' else d .rtkn
20022014
@@ -2005,23 +2017,29 @@ def test_empty_slab(self, side):
20052017
20062018 def test_before_autotuning (self ):
20072019 op , _ = self ._make_operator (right_shift = - 4 , middle = True )
2020+
20082021 with pytest .raises (InvalidArgument , match = 'interior points' ):
20092022 op .arguments (time_M = 0 , y_M = 22 , autotune = True )
2023+
20102024 assert 'autotuning' not in op ._state
20112025
20122026 op .arguments (time_M = 0 , y_M = 23 , autotune = True )
2027+
20132028 assert len (op ._state ['autotuning' ]) == 1
20142029
20152030 @pytest .mark .parametrize ('left' , [15 , 16 , 17 , 25 ])
20162031 @pytest .mark .parallel (mode = [(2 , 'basic' )])
20172032 def test_distributed_middle (self , left , mode ):
20182033 grid = Grid (shape = (16 , 32 ), topology = (1 , 2 ))
2034+
20192035 op , _ = self ._make_operator (grid = grid , middle = True )
2036+
20202037 d , = [d for d in op .dimensions if d .is_Sub ]
20212038
20222039 # Rank 0 has one point or an empty middle (possibly with inverted bounds).
20232040 # Only the global size determines whether the middle is large enough
20242041 kwargs = {d .ltkn .name : left , d .rtkn .name : 0 }
2042+
20252043 if left == 25 :
20262044 with pytest .raises (InvalidArgument , match = 'at least 8 interior points' ):
20272045 op .arguments (time_M = 0 , ** kwargs )
@@ -2031,7 +2049,9 @@ def test_distributed_middle(self, left, mode):
20312049 @pytest .mark .parallel (mode = [(2 , 'basic' )])
20322050 def test_collective_rejection (self , mode ):
20332051 grid = Grid (shape = (32 , 32 ), topology = (2 , 1 ))
2052+
20342053 op , _ = self ._make_operator (right_shift = - 4 , grid = grid , middle = True )
2054+
20352055 dl , = [d for d in op .dimensions if d .is_Sub and d .is_middle ]
20362056 left = 24 if grid .distributor .myrank == 0 else 0
20372057
@@ -2047,14 +2067,21 @@ def define(self, dimensions):
20472067 return {x : x , y : ('middle' , 8 , 8 )}
20482068
20492069 grid = Grid (shape = (16 , 32 ))
2070+
20502071 f = Function (name = 'f' , grid = Interior (grid = grid ), space_order = 8 )
20512072 original = f .dimensions [- 1 ]
2052- op = Operator (Eq (f , f + 1 ), name = 'subdomain_function_arguments' )
2073+
2074+ eq = Eq (f , f + 1 )
2075+
2076+ op = Operator (eq , name = 'subdomain_function_arguments' )
2077+
20532078 concrete , = [d for d in op .dimensions if d .is_Sub ]
20542079
20552080 # Function validation visits `original`; Operator validation visits `concrete`
20562081 assert original not in op .dimensions
2082+
20572083 args = op .arguments ()
2084+
20582085 assert original .ltkn .name not in args
20592086 assert concrete .ltkn .name in args
20602087
0 commit comments