Skip to content

Commit 344529b

Browse files
committed
#3398 mv the LFRic dofmap symbol creation to the Invoke constructor
1 parent 07e4aa1 commit 344529b

9 files changed

Lines changed: 90 additions & 98 deletions

src/psyclone/domain/lfric/kern_call_arg_list.py

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
from psyclone import psyGen
5050
from psyclone.core import AccessType, Signature, VariablesAccessMap
5151
from psyclone.domain.lfric.arg_ordering import ArgOrdering
52+
from psyclone.domain.lfric.function_space import FunctionSpace
5253
from psyclone.domain.lfric.lfric_constants import LFRicConstants
5354
from psyclone.domain.lfric.lfric_types import LFRicTypes
5455
from psyclone.errors import GenerationError, InternalError
@@ -641,14 +642,16 @@ def fs_common(self, function_space,
641642
function_space=function_space.orig_name))
642643

643644
def fs_compulsory_field(
644-
self, function_space,
645-
var_accesses: Optional[VariablesAccessMap] = None):
646-
'''Add compulsory arguments associated with this function space to
645+
self,
646+
function_space: FunctionSpace,
647+
var_accesses: Optional[VariablesAccessMap] = None
648+
) -> None:
649+
'''
650+
Add compulsory arguments associated with this function space to
647651
the list. If supplied it also stores this access in var_accesses.
648652
649653
:param function_space: the function space for which the compulsory
650654
arguments are added.
651-
:type function_space: :py:class:`psyclone.domain.lfric.FunctionSpace`
652655
:param var_accesses: optional VariablesAccessMap instance to store
653656
the information about variable accesses.
654657
@@ -661,16 +664,7 @@ def fs_compulsory_field(
661664
self.append(sym.name, var_accesses)
662665

663666
map_name = function_space.map_name
664-
intrinsic_type = LFRicTypes("LFRicIntegerScalarDataType")()
665-
dtype = UnsupportedFortranType(
666-
f"{intrinsic_type.intrinsic.name}("
667-
f"kind={intrinsic_type.precision.name}), pointer, "
668-
f"dimension(:,:) :: {map_name} => null()",
669-
partial_datatype=ArrayType(
670-
intrinsic_type,
671-
[ArrayType.Extent.DEFERRED, ArrayType.Extent.DEFERRED]))
672-
sym = self._symtab.find_or_create_tag(
673-
map_name, symbol_type=DataSymbol, datatype=dtype)
667+
sym = self._symtab.lookup_with_tag(map_name)
674668

675669
if self._kern.iterates_over == 'domain':
676670
# This kernel takes responsibility for iterating over cells so

src/psyclone/domain/lfric/lfric_dofmaps.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -222,12 +222,16 @@ def invoke_declarations(self):
222222
super().invoke_declarations()
223223
# Function space dofmaps
224224
for dmap in sorted(self._unique_fs_maps):
225-
if dmap not in self.symtab:
226-
dmap_sym = DataSymbol(
227-
dmap, UnsupportedFortranType(
228-
f"integer(kind=i_def), pointer :: {dmap}(:,:) "
229-
f"=> null()"))
230-
self.symtab.add(dmap_sym, tag=dmap)
225+
intrinsic_type = LFRicTypes("LFRicIntegerScalarDataType")()
226+
dtype = UnsupportedFortranType(
227+
f"{intrinsic_type.intrinsic.name.lower()}("
228+
f"kind={intrinsic_type.precision.name}), pointer, "
229+
f"dimension(:,:) :: {dmap} => null()",
230+
partial_datatype=ArrayType(
231+
intrinsic_type,
232+
[ArrayType.Extent.DEFERRED, ArrayType.Extent.DEFERRED]))
233+
dmap_sym = self.symtab.find_or_create_tag(
234+
dmap, symbol_type=DataSymbol, datatype=dtype)
231235

232236
# Column-banded dofmaps
233237
for dmap in sorted(self._unique_cbanded_maps):

src/psyclone/domain/lfric/lfric_invoke.py

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,19 @@ def __init__(self,
223223

224224
self._alg_unique_args.extend(self._alg_unique_halo_depth_args)
225225

226+
# Declare all quantities required by this Invoke
227+
for entities in [self.scalar_args, self. scalar_array_args,
228+
self.fields, self.lma_ops,
229+
self.stencil, self.meshes,
230+
self.function_spaces, self.dofmaps, self.cma_ops,
231+
self.boundary_conditions, self.evaluators,
232+
self.halo_depths,
233+
self.proxies, self.cell_iterators,
234+
self.reference_element_properties,
235+
self.mesh_properties, self.loop_bounds,
236+
self.run_time_checks]:
237+
entities.invoke_declarations()
238+
226239
def arg_for_funcspace(self, fspace):
227240
'''
228241
Returns an argument object which is on the requested
@@ -292,23 +305,11 @@ def field_on_space(self, func_space):
292305
return None
293306

294307
def setup_psy_layer_symbols(self):
295-
''' Declare, initialise and deallocate all symbols required by the
296-
PSy-layer Invoke subroutine.
308+
''' Initialise and deallocate all symbols required by the
309+
PSy-layer Invoke subroutine (the symbols are created in the
310+
constructor).
297311
298312
'''
299-
# Declare all quantities required by this PSy routine (Invoke)
300-
for entities in [self.scalar_args, self. scalar_array_args,
301-
self.fields, self.lma_ops,
302-
self.stencil, self.meshes,
303-
self.function_spaces, self.dofmaps, self.cma_ops,
304-
self.boundary_conditions, self.evaluators,
305-
self.halo_depths,
306-
self.proxies, self.cell_iterators,
307-
self.reference_element_properties,
308-
self.mesh_properties, self.loop_bounds,
309-
self.run_time_checks]:
310-
entities.invoke_declarations()
311-
312313
cursor = 0
313314
for entities in [self.proxies, self.run_time_checks,
314315
self.cell_iterators, self.meshes,

src/psyclone/tests/domain/lfric/lfric_builtins_test.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2206,7 +2206,7 @@ def test_field_access_info_for_arrays_in_builtins():
22062206
assert Signature("f2_data") in vam
22072207

22082208
assert (
2209-
"a: READ, df: WRITE+READ, f1_data: READ, f2_data: WRITE, field_type: "
2209+
"a: READ, df: WRITE+READ, f1_data: READ, f2_data: WRITE, field_proxy_type: CONSTANT, field_type: "
22102210
"CONSTANT, i_def: CONSTANT, r_def: CONSTANT, "
22112211
"uninitialised_loop0_start: READ, uninitialised_loop0_stop: READ"
22122212
== str(vam))

src/psyclone/tests/domain/lfric/lfric_field_codegen_test.py

Lines changed: 36 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ def test_field(tmpdir):
6666
api=TEST_API)
6767
psy = PSyFactory(TEST_API, distributed_memory=False).create(invoke_info)
6868

69-
generated_code = psy.gen
69+
generated_code = str(psy.gen)
7070
output = (
7171
"module single_invoke_psy\n"
7272
" use constants_mod, only : r_def\n"
@@ -95,9 +95,9 @@ def test_field(tmpdir):
9595
" integer(kind=i_def) :: undf_w2\n"
9696
" integer(kind=i_def) :: ndf_w3\n"
9797
" integer(kind=i_def) :: undf_w3\n"
98-
" integer(kind=i_def), pointer :: map_w1(:,:) => null()\n"
99-
" integer(kind=i_def), pointer :: map_w2(:,:) => null()\n"
100-
" integer(kind=i_def), pointer :: map_w3(:,:) => null()\n"
98+
" INTEGER(kind=i_def), pointer, dimension(:,:) :: map_w1 => null()\n"
99+
" INTEGER(kind=i_def), pointer, dimension(:,:) :: map_w2 => null()\n"
100+
" INTEGER(kind=i_def), pointer, dimension(:,:) :: map_w3 => null()\n"
101101
" type(field_proxy_type) :: f1_proxy\n"
102102
" type(field_proxy_type) :: f2_proxy\n"
103103
" type(field_proxy_type) :: m1_proxy\n"
@@ -149,7 +149,7 @@ def test_field(tmpdir):
149149
" end subroutine invoke_0_testkern_type\n"
150150
"\n"
151151
"end module single_invoke_psy\n")
152-
assert output == str(generated_code)
152+
assert output == generated_code
153153
assert LFRicBuild(tmpdir).code_compiles(psy)
154154

155155

@@ -199,9 +199,9 @@ def test_field_deref(tmpdir, dist_mem):
199199
" integer(kind=i_def) :: undf_w2\n"
200200
" integer(kind=i_def) :: ndf_w3\n"
201201
" integer(kind=i_def) :: undf_w3\n"
202-
" integer(kind=i_def), pointer :: map_w1(:,:) => null()\n"
203-
" integer(kind=i_def), pointer :: map_w2(:,:) => null()\n"
204-
" integer(kind=i_def), pointer :: map_w3(:,:) => null()\n"
202+
" integer(kind=i_def), pointer, dimension(:,:) :: map_w1 => null()\n"
203+
" integer(kind=i_def), pointer, dimension(:,:) :: map_w2 => null()\n"
204+
" integer(kind=i_def), pointer, dimension(:,:) :: map_w3 => null()\n"
205205
" type(field_proxy_type) :: f1_proxy\n"
206206
" type(field_proxy_type) :: est_f2_proxy\n"
207207
" type(field_proxy_type) :: m1_proxy\n"
@@ -378,19 +378,19 @@ def test_field_fs(tmpdir):
378378
integer(kind=i_def) :: undf_wchi
379379
integer(kind=i_def) :: ndf_any_w2
380380
integer(kind=i_def) :: undf_any_w2
381-
integer(kind=i_def), pointer :: map_any_w2(:,:) => null()
382-
integer(kind=i_def), pointer :: map_w0(:,:) => null()
383-
integer(kind=i_def), pointer :: map_w1(:,:) => null()
384-
integer(kind=i_def), pointer :: map_w2(:,:) => null()
385-
integer(kind=i_def), pointer :: map_w2broken(:,:) => null()
386-
integer(kind=i_def), pointer :: map_w2h(:,:) => null()
387-
integer(kind=i_def), pointer :: map_w2htrace(:,:) => null()
388-
integer(kind=i_def), pointer :: map_w2trace(:,:) => null()
389-
integer(kind=i_def), pointer :: map_w2v(:,:) => null()
390-
integer(kind=i_def), pointer :: map_w2vtrace(:,:) => null()
391-
integer(kind=i_def), pointer :: map_w3(:,:) => null()
392-
integer(kind=i_def), pointer :: map_wchi(:,:) => null()
393-
integer(kind=i_def), pointer :: map_wtheta(:,:) => null()
381+
integer(kind=i_def), pointer, dimension(:,:) :: map_any_w2 => null()
382+
integer(kind=i_def), pointer, dimension(:,:) :: map_w0 => null()
383+
integer(kind=i_def), pointer, dimension(:,:) :: map_w1 => null()
384+
integer(kind=i_def), pointer, dimension(:,:) :: map_w2 => null()
385+
integer(kind=i_def), pointer, dimension(:,:) :: map_w2broken => null()
386+
integer(kind=i_def), pointer, dimension(:,:) :: map_w2h => null()
387+
integer(kind=i_def), pointer, dimension(:,:) :: map_w2htrace => null()
388+
integer(kind=i_def), pointer, dimension(:,:) :: map_w2trace => null()
389+
integer(kind=i_def), pointer, dimension(:,:) :: map_w2v => null()
390+
integer(kind=i_def), pointer, dimension(:,:) :: map_w2vtrace => null()
391+
integer(kind=i_def), pointer, dimension(:,:) :: map_w3 => null()
392+
integer(kind=i_def), pointer, dimension(:,:) :: map_wchi => null()
393+
integer(kind=i_def), pointer, dimension(:,:) :: map_wtheta => null()
394394
type(field_proxy_type) :: f1_proxy
395395
type(field_proxy_type) :: f2_proxy
396396
type(field_proxy_type) :: m1_proxy
@@ -719,21 +719,21 @@ def test_int_field_fs(tmpdir):
719719
integer(kind=i_def) :: undf_as1_f8
720720
integer(kind=i_def) :: ndf_ads1_m7
721721
integer(kind=i_def) :: undf_ads1_m7
722-
integer(kind=i_def), pointer :: map_ads1_m7(:,:) => null()
723-
integer(kind=i_def), pointer :: map_any_w2(:,:) => null()
724-
integer(kind=i_def), pointer :: map_as1_f8(:,:) => null()
725-
integer(kind=i_def), pointer :: map_w0(:,:) => null()
726-
integer(kind=i_def), pointer :: map_w1(:,:) => null()
727-
integer(kind=i_def), pointer :: map_w2(:,:) => null()
728-
integer(kind=i_def), pointer :: map_w2broken(:,:) => null()
729-
integer(kind=i_def), pointer :: map_w2h(:,:) => null()
730-
integer(kind=i_def), pointer :: map_w2htrace(:,:) => null()
731-
integer(kind=i_def), pointer :: map_w2trace(:,:) => null()
732-
integer(kind=i_def), pointer :: map_w2v(:,:) => null()
733-
integer(kind=i_def), pointer :: map_w2vtrace(:,:) => null()
734-
integer(kind=i_def), pointer :: map_w3(:,:) => null()
735-
integer(kind=i_def), pointer :: map_wchi(:,:) => null()
736-
integer(kind=i_def), pointer :: map_wtheta(:,:) => null()
722+
integer(kind=i_def), pointer, dimension(:,:) :: map_ads1_m7 => null()
723+
integer(kind=i_def), pointer, dimension(:,:) :: map_any_w2 => null()
724+
integer(kind=i_def), pointer, dimension(:,:) :: map_as1_f8 => null()
725+
integer(kind=i_def), pointer, dimension(:,:) :: map_w0 => null()
726+
integer(kind=i_def), pointer, dimension(:,:) :: map_w1 => null()
727+
integer(kind=i_def), pointer, dimension(:,:) :: map_w2 => null()
728+
integer(kind=i_def), pointer, dimension(:,:) :: map_w2broken => null()
729+
integer(kind=i_def), pointer, dimension(:,:) :: map_w2h => null()
730+
integer(kind=i_def), pointer, dimension(:,:) :: map_w2htrace => null()
731+
integer(kind=i_def), pointer, dimension(:,:) :: map_w2trace => null()
732+
integer(kind=i_def), pointer, dimension(:,:) :: map_w2v => null()
733+
integer(kind=i_def), pointer, dimension(:,:) :: map_w2vtrace => null()
734+
integer(kind=i_def), pointer, dimension(:,:) :: map_w3 => null()
735+
integer(kind=i_def), pointer, dimension(:,:) :: map_wchi => null()
736+
integer(kind=i_def), pointer, dimension(:,:) :: map_wtheta => null()
737737
type(integer_field_proxy_type) :: f1_proxy
738738
type(integer_field_proxy_type) :: f2_proxy
739739
type(integer_field_proxy_type) :: m1_proxy

src/psyclone/tests/domain/lfric/lfric_invoke_test.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -172,9 +172,8 @@ def test_lfricinvoke_setup_psy_layer_symbols(monkeypatch, dist_mem):
172172
# Apply an OpenMP Parallel for all loops
173173
rtrans.apply(schedule.children[0:2])
174174
# Check that setup_psy_layer_symbols() populates the symbol table.
175-
assert "f1_proxy" not in invoke.schedule.symbol_table
176-
invoke.setup_psy_layer_symbols()
177175
assert "f1_proxy" in invoke.schedule.symbol_table
176+
invoke.setup_psy_layer_symbols()
178177
assert invoke.schedule.symbol_table.lookup_with_tag("omp_num_threads")
179178
assert "omp_get_max_threads" in invoke.schedule.symbol_table
180179

src/psyclone/tests/domain/lfric/lfric_scalar_codegen_test.py

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -87,9 +87,9 @@ def test_real_scalar(tmpdir):
8787
" integer(kind=i_def) :: undf_w2\n"
8888
" integer(kind=i_def) :: ndf_w3\n"
8989
" integer(kind=i_def) :: undf_w3\n"
90-
" integer(kind=i_def), pointer :: map_w1(:,:) => null()\n"
91-
" integer(kind=i_def), pointer :: map_w2(:,:) => null()\n"
92-
" integer(kind=i_def), pointer :: map_w3(:,:) => null()\n"
90+
" integer(kind=i_def), pointer, dimension(:,:) :: map_w1 => null()\n"
91+
" integer(kind=i_def), pointer, dimension(:,:) :: map_w2 => null()\n"
92+
" integer(kind=i_def), pointer, dimension(:,:) :: map_w3 => null()\n"
9393
" type(field_proxy_type) :: f1_proxy\n"
9494
" type(field_proxy_type) :: f2_proxy\n"
9595
" type(field_proxy_type) :: m1_proxy\n"
@@ -191,9 +191,9 @@ def test_int_scalar(tmpdir):
191191
" integer(kind=i_def) :: undf_w2\n"
192192
" integer(kind=i_def) :: ndf_w3\n"
193193
" integer(kind=i_def) :: undf_w3\n"
194-
" integer(kind=i_def), pointer :: map_w1(:,:) => null()\n"
195-
" integer(kind=i_def), pointer :: map_w2(:,:) => null()\n"
196-
" integer(kind=i_def), pointer :: map_w3(:,:) => null()\n"
194+
" integer(kind=i_def), pointer, dimension(:,:) :: map_w1 => null()\n"
195+
" integer(kind=i_def), pointer, dimension(:,:) :: map_w2 => null()\n"
196+
" integer(kind=i_def), pointer, dimension(:,:) :: map_w3 => null()\n"
197197
" type(field_proxy_type) :: f1_proxy\n"
198198
" type(field_proxy_type) :: f2_proxy\n"
199199
" type(field_proxy_type) :: m1_proxy\n"
@@ -298,9 +298,9 @@ def test_two_real_scalars(tmpdir):
298298
" integer(kind=i_def) :: undf_w2\n"
299299
" integer(kind=i_def) :: ndf_w3\n"
300300
" integer(kind=i_def) :: undf_w3\n"
301-
" integer(kind=i_def), pointer :: map_w1(:,:) => null()\n"
302-
" integer(kind=i_def), pointer :: map_w2(:,:) => null()\n"
303-
" integer(kind=i_def), pointer :: map_w3(:,:) => null()\n"
301+
" integer(kind=i_def), pointer, dimension(:,:) :: map_w1 => null()\n"
302+
" integer(kind=i_def), pointer, dimension(:,:) :: map_w2 => null()\n"
303+
" integer(kind=i_def), pointer, dimension(:,:) :: map_w3 => null()\n"
304304
" type(field_proxy_type) :: f1_proxy\n"
305305
" type(field_proxy_type) :: f2_proxy\n"
306306
" type(field_proxy_type) :: m1_proxy\n"
@@ -403,9 +403,9 @@ def test_two_int_scalars(tmpdir):
403403
" integer(kind=i_def) :: undf_w2\n"
404404
" integer(kind=i_def) :: ndf_w3\n"
405405
" integer(kind=i_def) :: undf_w3\n"
406-
" integer(kind=i_def), pointer :: map_w1(:,:) => null()\n"
407-
" integer(kind=i_def), pointer :: map_w2(:,:) => null()\n"
408-
" integer(kind=i_def), pointer :: map_w3(:,:) => null()\n"
406+
" integer(kind=i_def), pointer, dimension(:,:) :: map_w1 => null()\n"
407+
" integer(kind=i_def), pointer, dimension(:,:) :: map_w2 => null()\n"
408+
" integer(kind=i_def), pointer, dimension(:,:) :: map_w3 => null()\n"
409409
" type(field_proxy_type) :: f1_proxy\n"
410410
" type(field_proxy_type) :: f2_proxy\n"
411411
" type(field_proxy_type) :: m1_proxy\n"
@@ -528,9 +528,9 @@ def test_three_scalars(tmpdir):
528528
" integer(kind=i_def) :: undf_w2\n"
529529
" integer(kind=i_def) :: ndf_w3\n"
530530
" integer(kind=i_def) :: undf_w3\n"
531-
" integer(kind=i_def), pointer :: map_w1(:,:) => null()\n"
532-
" integer(kind=i_def), pointer :: map_w2(:,:) => null()\n"
533-
" integer(kind=i_def), pointer :: map_w3(:,:) => null()\n"
531+
" integer(kind=i_def), pointer, dimension(:,:) :: map_w1 => null()\n"
532+
" integer(kind=i_def), pointer, dimension(:,:) :: map_w2 => null()\n"
533+
" integer(kind=i_def), pointer, dimension(:,:) :: map_w3 => null()\n"
534534
" type(field_proxy_type) :: f1_proxy\n"
535535
" type(field_proxy_type) :: f2_proxy\n"
536536
" type(field_proxy_type) :: m1_proxy\n"

src/psyclone/tests/domain/lfric/lfric_scalar_mdata_test.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -529,11 +529,10 @@ def test_scalar_different_data_types_invoke():
529529
os.path.join(BASE_PATH,
530530
"4.16_multikernel_invokes_real_int_scalar_invalid.f90"),
531531
api=TEST_API)
532-
psy = PSyFactory(TEST_API, distributed_memory=False).create(invoke_info)
533532

534533
const = LFRicConstants()
535534
with pytest.raises(GenerationError) as excinfo:
536-
_ = psy.gen
535+
_ = PSyFactory(TEST_API, distributed_memory=False).create(invoke_info)
537536
assert (f"Scalar argument(s) ['b'] in Invoke "
538537
f"'invoke_real_and_integer_scalars' have different metadata for "
539538
f"data type ({const.VALID_SCALAR_DATA_TYPES}) in different "
@@ -549,10 +548,10 @@ def test_scalar_array_different_data_types_invoke():
549548
os.path.join(BASE_PATH,
550549
"28.1_multikernel_invokes_scalar_array_invalid.f90"),
551550
api=TEST_API)
552-
psy = PSyFactory(TEST_API, distributed_memory=False).create(invoke_info)
553551

554552
with pytest.raises(GenerationError):
555-
_ = psy.gen
553+
_ = PSyFactory(TEST_API, distributed_memory=False).create(invoke_info)
554+
556555
assert ("ScalarArray argument(s) ['b'] in Invoke "
557556
"'invoke_real_and_logical_scalars' is/are passed to more than "
558557
"one kernel and the kernel metadata for the corresponding "

src/psyclone/tests/lfric_quadrature_test.py

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -668,11 +668,6 @@ def test_lfricbasisfns_initialise(monkeypatch):
668668
api=API)
669669
psy = PSyFactory(API, distributed_memory=False).create(invoke_info)
670670
dinf = LFRicBasisFunctions(psy.invokes.invoke_list[0])
671-
# We need some pre-declared symbol in order to call the initialise directly
672-
for name in ["quadrature_xyoz_proxy_type", "qr_proxy", "f1_proxy",
673-
"f2_proxy", "m2_proxy"]:
674-
psy.container.children[0].symbol_table.add(
675-
DataSymbol(name, UnresolvedType()))
676671
# Break the shape of the first basis function
677672
dinf._basis_fns[0]["shape"] = "not-a-shape"
678673
with pytest.raises(InternalError) as err:

0 commit comments

Comments
 (0)