ComIn 0.5.1
ICON Community Interface
Loading...
Searching...
No Matches
comin.py
Go to the documentation of this file.
1# @authors 11/2023 :: ICON Community Interface <comin@icon-model.org>
2#
3# SPDX-License-Identifier: BSD-3-Clause
4#
5# Please see the file LICENSE in the root of the source tree for this code.
6# Where software is supplied by third parties, it is indicated in the
7# headers of the routines.
8
9
11
12from _comin import * # noqa: F403
13
14import _comin
15from dataclasses import dataclass
16import shlex as _shlex
17import sys as _sys
18import collections.abc as _abc
19from typing import List, Tuple
20
21
22COMIN_ZAXIS_UNDEF = -1
23COMIN_ZAXIS_NONE = 0
24COMIN_ZAXIS_2D = 1
25COMIN_ZAXIS_3D = 2
26COMIN_ZAXIS_3D_HALF = 3
27
28
30 """
31 @brief variable handle for accessing data
32
33 Implements the `__array__` (and `__cuda_array_interface__`) interface.
34 """
35
36 def __init__(self, handle):
37 self._handle = handle
38 try:
39 import numpy as _np
40
41 self._np = _np
42 except ImportError:
43 print("Warning: cant import numpy", file=_sys.stderr)
44
45 def __array__(self):
46 return self._np.asarray(_comin._var_get_buffer(self._handle))
47
48 @property
49 def __cuda_array_interface__(self):
50 host_buf = _comin._var_get_buffer(self._handle)
51 return {
52 "shape": host_buf.shape,
53 "typestr": self._np.dtype(host_buf.format).str,
54 "data": (_comin._var_get_device_ptr(self._handle), False),
55 "version": 3,
56 "strides": host_buf.strides,
57 }
58
59 @property
60 def dim_semantics(self):
61 return _comin._var_get_dim_semantics(self._handle)
62
63 def to_xarray(self):
64 import xarray as xr
65
66 unused_dims = tuple(
67 i
68 for i, s in enumerate(self.dim_semantics)
69 if s == COMIN_DIM_SEMANTICS_UNUSED
70 )
71 data = self._np.squeeze(self._np.asarray(self), axis=unused_dims)
72 return xr.DataArray(
73 data,
74 dims=tuple(
75 _comin_dim_semantics_get_name(s)
76 for s in self.dim_semantics
77 if s != COMIN_DIM_SEMANTICS_UNUSED
78 ),
79 name=self.descriptor[0],
80 attrs=dict(metadata(self.descriptor)),
81 )
82
83 @property
84 def ncontained(self):
85 return _comin._var_get_ncontained(self._handle)
86
87 @property
88 def to_3d(self):
89 ds = self.dim_semantics
90 if COMIN_DIM_SEMANTICS_LEVEL in ds:
91 pos = (
92 ds.index(COMIN_DIM_SEMANTICS_NPROMA),
93 ds.index(COMIN_DIM_SEMANTICS_LEVEL),
94 ds.index(COMIN_DIM_SEMANTICS_BLOCK),
95 )
96 else:
97 pos = (
98 ds.index(COMIN_DIM_SEMANTICS_NPROMA),
99 ds.index(COMIN_DIM_SEMANTICS_BLOCK),
100 )
101 missing_dims = {*range(5)}.difference({*pos})
102 return self._np.asarray(self).transpose(*pos, *missing_dims)[..., 0, 0]
103
104 @property
105 def descriptor(self):
106 return _comin._var_get_descriptor(self._handle)
107
108
110 """
111 Represents an Entry Point.
112
113 Can be used as a function decorator or as an argument for @ref var_get.
114 """
115
116 def __init__(self, ep_int):
117 self._ep = ep_int
118
119 def __call__(self, fun):
120 _comin._callback_register(self._ep, fun)
121 return fun
122
123 def __index__(self):
124 return self._ep
125
126
127for _ep in range(1, _comin._EP_DESTRUCTOR() + 1):
128 _name = _comin.callback_get_ep_name(_ep)
129 vars()[_name] = entry_point(_ep)
130
131
132def register_callback(ep: entry_point):
133 """
134 @brief Registers a callback function for a given endpoint.
135
136 @param ep The endpoint to register the callback for.
137 """
138
139 def callback(fun):
140 _comin._callback_register(ep, fun)
141 return fun
142
143 return callback
144
145
146def var_get(context: List[entry_point], var_descriptor: Tuple[str, int], flag: int):
147 """get variable object, arguments: [entry point], (name string, domain id), access flag)"""
148 return variable(_comin._var_get(context, var_descriptor, flag))
149
150
151@dataclass(frozen=True)
153 """
154 @brief plugin information
155
156 @param id Plugin ID
157 @param name Plugin name
158 @param options Options string
159 @param comm Communicator name
160 """
161
162 id: int
163 name: str
164 options: str
165 comm: str
166
167 @property
168 def args(self):
169 """
170 @brief Extract options as list of strings
171
172 Extract the argument from the options string like as the
173 script was called from the command line. This is supposed to
174 be passed to `argparse.ArgumentParser.parse_args`.
175 """
176 return _shlex.split(self.options)[1:]
177
178
179def current_get_plugin_info() -> plugin_info:
180 """returns object describing the current plugin"""
181 return plugin_info(**_comin._current_get_plugin_info())
182
183
184class _descrdata:
185 def __init__(self, properties, jg=0):
186 self.properties = properties
187 self.jg = jg
188
189 def __dir__(self):
190 return self.properties.keys()
191
192 def __getattr__(self, key):
193 val = _comin._descrdata_eval_property(self.properties[key], jg=self.jg)
194 if isinstance(val, dict):
195 return _descrdata(val, jg=self.jg)
196 else:
197 return val
198
199
200def descrdata_get_domain(jg: int) -> _descrdata:
201 """returns descriptive data for a given domain, arguments: jg"""
202 return _descrdata(_comin._descrdata_get_domain(), jg=jg)
203
204
205def descrdata_get_global() -> _descrdata:
206 """returns global descriptive data object"""
207 return _descrdata(_comin._descrdata_get_global())
208
209
211 """List of exposed variables (descriptors)"""
212 current = _comin._var_get_descr_list_head()
213 try:
214 while current is not None:
215 yield _comin._var_get_descr_list_var_desc(current)
216 current = _comin._var_get_descr_list_next(current)
217 finally:
218 if current is not None:
219 _comin._var_descr_list_iterator_delete(current)
220
221
222def metadata_set(var_descriptor: Tuple[str, int], **kwargs):
223 """sets metadata for a requested field, arguments: name string, domain id, metadata key, metadata value"""
224 for n, v in kwargs.items():
225 _comin._metadata_set(var_descriptor, n, v)
226
227
228class metadata(_abc.Mapping):
229 """
230 Metadata mapping for a variable
231 """
232
233 def __init__(self, var_descr):
234 self.descr = var_descr
235
236 def __getitem__(self, key):
237 return _comin.metadata_get(self.descr, key)
238
239 def __iter__(self):
240 it = _comin._metadata_get_iterator_begin(self.descr)
241 end = _comin._metadata_get_iterator_end(self.descr)
242 while not _comin._metadata_iterator_compare(it, end):
243 yield _comin._metadata_iterator_get_key(it)
244 _comin._metadata_iterator_next(it)
245 _comin._metadata_iterator_delete(it)
246 _comin._metadata_iterator_delete(end)
247
248 def __len__(self):
249 # impl. could be improved
250 return len(self.__iter__)
251
252
253@dataclass(frozen=True)
255 """
256 @brief simulation interface information
257
258 @param exp_start
259 @param exp_end
260 @param run_start
261 @param run_end
262 """
263
264 exp_start: str
265 exp_stop: str
266 run_start: str
267 run_stop: str
268
269
270def descrdata_get_simulation_interval() -> simulation_interval:
271 """returns simulation interval
272
273 @see simulation_interval
274 """
275 return simulation_interval(**_comin._descrdata_get_simulation_interval())
276
277
278COMIN_FLAG_NONE = 0
279COMIN_FLAG_READ = 1 << 1
280COMIN_FLAG_WRITE = 1 << 2
281COMIN_FLAG_SYNC_HALO = 1 << 3
282COMIN_FLAG_DEVICE = 1 << 4
283
284COMIN_HGRID_UNSTRUCTURED_CELL = 1
285COMIN_HGRID_UNSTRUCTURED_EDGE = 2
286COMIN_HGRID_UNSTRUCTURED_VERTEX = 3
287
288COMIN_VAR_DATATYPE_DOUBLE = 1
289COMIN_VAR_DATATYPE_FLOAT = 2
290COMIN_VAR_DATATYPE_INT = 3
291
292COMIN_DIM_SEMANTICS_UNDEF = 1
293COMIN_DIM_SEMANTICS_NPROMA = 2
294COMIN_DIM_SEMANTICS_BLOCK = 3
295COMIN_DIM_SEMANTICS_UNBLOCK = 4
296COMIN_DIM_SEMANTICS_LEVEL = 5
297COMIN_DIM_SEMANTICS_CONTAINER = 6
298COMIN_DIM_SEMANTICS_OTHER = 7
299COMIN_DIM_SEMANTICS_UNUSED = 8
300
301
302def _comin_dim_semantics_get_name(ds):
303 return {
304 COMIN_DIM_SEMANTICS_UNDEF: "undef",
305 COMIN_DIM_SEMANTICS_NPROMA: "nproma",
306 COMIN_DIM_SEMANTICS_BLOCK: "block",
307 COMIN_DIM_SEMANTICS_UNBLOCK: "unblock",
308 COMIN_DIM_SEMANTICS_LEVEL: "level",
309 COMIN_DIM_SEMANTICS_CONTAINER: "container",
310 COMIN_DIM_SEMANTICS_OTHER: "other",
311 COMIN_DIM_SEMANTICS_UNUSED: "unused",
312 }[ds]
313
314
315
args(self)
Extract options as list of strings.
Definition comin.py:168
descriptor(self)
Definition comin.py:105
to_3d(self)
Definition comin.py:88
dim_semantics(self)
Definition comin.py:60
to_xarray(self)
Definition comin.py:63
ncontained(self)
Definition comin.py:84
Metadata mapping for a variable.
Definition comin.py:228
Represents an Entry Point.
Definition comin.py:109
variable handle for accessing data
Definition comin.py:29
simulation interface information
Definition comin.py:254
plugin information
Definition comin.py:152
simulation_interval descrdata_get_simulation_interval()
returns simulation interval
Definition comin.py:270
var_get(List[entry_point] context, Tuple[str, int] var_descriptor, int flag)
get variable object, arguments: [entry point], (name string, domain id), access flag)
Definition comin.py:146
metadata_set(Tuple[str, int] var_descriptor, **kwargs)
sets metadata for a requested field, arguments: name string, domain id, metadata key,...
Definition comin.py:222
var_descr_list()
List of exposed variables (descriptors)
Definition comin.py:210
_descrdata descrdata_get_domain(int jg)
returns descriptive data for a given domain, arguments: jg
Definition comin.py:200
plugin_info current_get_plugin_info()
returns object describing the current plugin
Definition comin.py:179
_descrdata descrdata_get_global()
returns global descriptive data object
Definition comin.py:205
register_callback(entry_point ep)
Registers a callback function for a given endpoint.
Definition comin.py:132