ICON Community Interface 0.4.0
Loading...
Searching...
No Matches
halo_sync_test.py
Go to the documentation of this file.
1"""
2Test plugin for the ICON Community Interface (ComIn)
3
4This simple test plugin shows how to use the basic features of
5ComIn analogous to simple_c_plugin and simple_fortran_plugin.
6
7@authors 11/2023 :: ICON Community Interface <comin@icon-model.org>
8
9SPDX-License-Identifier: BSD-3-Clause
10
11Please see the file LICENSE in the root of the source tree for this code.
12Where software is supplied by third parties, it is indicated in the
13headers of the routines.
14"""
15
16import numpy as np
17import numpy.ma as npma
18import comin
19from itertools import product
20
21rank = comin.parallel_get_host_mpi_rank()
22# first domain
24domains = [comin.descrdata_get_domain(jg) for jg in range(1, glob.n_dom + 1)]
25
26# create owner mask
27owner_masks = [
28 np.asarray(domains[jg - 1].cells.decomp_domain) == 0
29 for jg in range(1, glob.n_dom + 1)
30]
31
32promz_c_masks = [
33 np.full((glob.nproma, domains[jg - 1].cells.nblks), False)
34 for jg in range(1, glob.n_dom + 1)
35]
36for jg in range(1, glob.n_dom + 1):
37 promz_c_masks[jg - 1][comin.descrdata_get_cell_npromz(jg) :, -1] = True
38
39dim2comin_zaxis = {2: comin.COMIN_ZAXIS_2D, 3: comin.COMIN_ZAXIS_3D}
40
41comin_dtypes = [
42 comin.COMIN_VAR_DATATYPE_DOUBLE,
43 comin.COMIN_VAR_DATATYPE_FLOAT,
44 comin.COMIN_VAR_DATATYPE_INT,
45]
46
47var_descriptors = [
48 (
49 (f"test_var_{dim}D_{dtype}_{sync_mode}", jg),
50 {"zaxis_id": dim2comin_zaxis[dim], "datatype": dtype},
51 sync_mode,
52 )
53 for dim, dtype, jg, sync_mode in product(
54 [2, 3], comin_dtypes, range(1, glob.n_dom + 1), ["after_write", "before_read"]
55 )
56]
57
58for var_descr, metadata, _ in var_descriptors:
59 comin.var_request_add(var_descr, False)
60 comin.metadata_set(var_descr, **metadata)
61
62
63@comin.register_callback(comin.EP_SECONDARY_CONSTRUCTOR)
65 global test_vars_before_sync, test_vars_after_sync
66
67 test_vars_before_sync = [
69 [comin.EP_ATM_TIMELOOP_START],
70 var_descr,
71 comin.COMIN_FLAG_WRITE
72 | (comin.COMIN_FLAG_SYNC_HALO if sm == "after_write" else 0),
73 )
74 for var_descr, _, sm in var_descriptors
75 ]
76
77 test_vars_after_sync = [
79 [comin.EP_ATM_TIMELOOP_END],
80 var_descr,
81 comin.COMIN_FLAG_READ
82 | (comin.COMIN_FLAG_SYNC_HALO if sm == "before_read" else 0),
83 )
84 for var_descr, _, sm in var_descriptors
85 ]
86
87
88@comin.register_callback(comin.EP_ATM_TIMELOOP_START)
90 # fill test_var
91 for test_var in test_vars_before_sync:
92 comin.print_info(f"Filling {test_var.descriptor}")
93 name, jg = test_var.descriptor
94 if comin.COMIN_DIM_SEMANTICS_LEVEL in test_var.dim_semantics: # 3d
95 mask = np.repeat(
96 owner_masks[jg - 1][:, None, :], domains[jg - 1].nlev, axis=1
97 )
98 else: # 2d
99 mask = owner_masks[jg - 1]
100 test_var_np = np.asarray(test_var)
101 test_var_np[mask] = rank + 1
102 test_var_np[~mask] = -1.0
103
104
105@comin.register_callback(comin.EP_ATM_TIMELOOP_END)
107 for test_var in test_vars_after_sync:
108 comin.print_info(f"Checking {test_var.descriptor}")
109 name, jg = test_var.descriptor
110 if comin.COMIN_DIM_SEMANTICS_LEVEL in test_var.dim_semantics: # 3d
111 test_var_np = npma.array(
112 test_var,
113 mask=np.repeat(
114 promz_c_masks[jg - 1][:, None, :], domains[jg - 1].nlev, axis=1
115 ),
116 )
117 mask = np.repeat(
118 owner_masks[jg - 1][:, None, :], domains[jg - 1].nlev, axis=1
119 )
120 else: # 2d
121 test_var_np = npma.array(test_var, mask=promz_c_masks[jg - 1])
122 mask = owner_masks[jg - 1]
123 assert npma.all(
124 test_var_np >= 1
125 ), "Invalid value. (Non-owner cell was probably not overwritten."
126 assert npma.all(
127 test_var_np[mask] == (rank + 1)
128 ), "Invaid value. Owner cell was overwritten."
var_get(context, var_descriptor, flag)
get variable object, arguments: [entry point], (name string, domain id), access flag)
Definition comin.py:107
metadata_set(var_descriptor, **kwargs)
sets metadata for a requested field, arguments: name string, domain id, metadata key,...
Definition comin.py:189
descrdata_get_domain(jg)
returns descriptive data for a given domain, arguments: jg
Definition comin.py:167
descrdata_get_global()
returns global descriptive data object
Definition comin.py:172