ComIn 0.5.1
ICON Community Interface
Loading...
Searching...
No Matches
descrdata.cpp
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#define PY_SSIZE_T_CLEAN
10#include <Python.h>
11#include <cstring>
12#include <iostream>
13#include <stdexcept>
14#include <string>
15#include <tuple>
16#include <vector>
17
18#include "util.h"
19
20#include "comin.h"
22#include "exception.h"
23
24namespace comin::python {
25
26static PyObject* current_get_plugin_info(PyObject* /*self*/,
27 PyObject* /*args*/) {
28 int plugin_id = comin_current_get_plugin_id();
30 const char* plugin_name = comin_current_get_plugin_name();
32
33 const char* plugin_options = comin_current_get_plugin_options();
35
38
39 return Py_BuildValue("{sissssss}", "id", plugin_id, "name", plugin_name,
40 "options", plugin_options, "comm", plugin_comm);
41}
42
43static PyObject* descrdata_get_domain(PyObject* /*self*/, PyObject* /*args*/) {
45}
46
47static PyObject* descrdata_get_global(PyObject* /*self*/, PyObject* /*args*/) {
49}
50
51static PyObject* descrdata_get_simulation_interval(PyObject* /*self*/,
52 PyObject* /*args*/) {
61
62 return Py_BuildValue("{ssssssss}", "exp_start", exp_start, "exp_stop",
63 exp_stop, "run_start", run_start, "run_stop", run_stop);
64}
65
73static PyObject* descrdata_get_timesteplength(PyObject* /*self*/,
74 PyObject* args,
75 PyObject* kwargs) {
76 int j;
77 static char const* kwlist[] = {"j", NULL};
78 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)&kwlist, &j))
79 return NULL;
82 return PyFloat_FromDouble(t);
83}
84
94static PyObject* descrdata_get_index(PyObject* /*self*/, PyObject* args,
95 PyObject* kwargs) {
96 int j;
97 static char const* kwlist[] = {"j", NULL};
98 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)&kwlist, &j))
99 return NULL;
100 int i = comin_descrdata_get_index(j);
101 check_error();
102 return PyLong_FromLong(i);
103}
104
114static PyObject* descrdata_get_block(PyObject* /*self*/, PyObject* args,
115 PyObject* kwargs) {
116 int j;
117 static char const* kwlist[] = {"j", NULL};
118 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)&kwlist, &j))
119 return NULL;
120 int b = comin_descrdata_get_block(j);
121 check_error();
122 return PyLong_FromLong(b);
123}
124
125using BlockLimitGetterFn = void (*)(int jg, int irl_start, int irl_end,
126 int* i_startblk, int* i_endblk);
127
146template <BlockLimitGetterFn get_block_limits>
147static PyObject* descrdata_get_block_limits(PyObject* /*self*/, PyObject* args,
148 PyObject* kwargs) {
149 int jg, irl_start, irl_end;
150 static char const* kwlist[] = {"jg", "irl_start", "irl_end", NULL};
151 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "iii", (char**)&kwlist, &jg,
152 &irl_start, &irl_end))
153 return NULL;
154 int i_startblk, i_endblk;
155 get_block_limits(jg, irl_start, irl_end, &i_startblk, &i_endblk);
156 check_error();
157 return Py_BuildValue("ii", i_startblk, i_endblk);
158}
159
160using IndexGetterFn = void (*)(int jg, int i_blk, int i_startblk, int i_endblk,
161 int* i_startidx, int* i_endidx, int irl_start,
162 int irl_end);
163
185template <IndexGetterFn get_indices>
186static PyObject* descrdata_get_indices(PyObject* /*self*/, PyObject* args,
187 PyObject* kwargs) {
188 int jg, i_blk, i_startblk, i_endblk, irl_start, irl_end;
189 static char const* kwlist[] = {
190 "jg", "i_blk", "i_startblk", "i_endblk", "irl_start", "irl_end", NULL};
191 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "iiiiii", (char**)&kwlist, &jg,
192 &i_blk, &i_startblk, &i_endblk, &irl_start,
193 &irl_end))
194 return NULL;
195 int i_startidx, i_endidx;
196 get_indices(jg, i_blk, i_startblk, i_endblk, &i_startidx, &i_endidx,
197 irl_start, irl_end);
198 check_error();
199 return Py_BuildValue("ii", i_startidx, i_endidx);
200}
201
211static PyObject* descrdata_get_cell_npromz(PyObject* /*self*/, PyObject* args,
212 PyObject* kwargs) {
213 int jg;
214 static char const* kwlist[] = {"jg", NULL};
215 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)&kwlist, &jg))
216 return NULL;
217 int npz = comin_descrdata_get_cell_npromz(jg);
218 check_error();
219 return PyLong_FromLong(npz);
220}
221
231static PyObject* descrdata_get_edge_npromz(PyObject* /*self*/, PyObject* args,
232 PyObject* kwargs) {
233 int jg;
234 static char const* kwlist[] = {"jg", NULL};
235 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)&kwlist, &jg))
236 return NULL;
237 int npz = comin_descrdata_get_edge_npromz(jg);
238 check_error();
239 return PyLong_FromLong(npz);
240}
241
251static PyObject* descrdata_get_vert_npromz(PyObject* /*self*/, PyObject* args,
252 PyObject* kwargs) {
253 int jg;
254 static char const* kwlist[] = {"jg", NULL};
255 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "i", (char**)&kwlist, &jg))
256 return NULL;
257 int npz = comin_descrdata_get_vert_npromz(jg);
258 check_error();
259 return PyLong_FromLong(npz);
260}
261
271static PyObject* current_get_datetime(PyObject* /*self*/, PyObject* /*args*/) {
272 const char* datetime_str = comin_current_get_datetime();
273 check_error();
274 return PyUnicode_FromString(datetime_str);
275}
276
286static PyObject* current_get_domain_id(PyObject* /*self*/, PyObject* /*args*/) {
288 check_error();
289 if (jg < 0)
290 return PyErr_Format(PyExc_RuntimeError,
291 "comin_current_get_domain_id failed. (jg=%d)", jg);
292 return PyLong_FromLong(jg);
293}
294
305static PyObject* descrdata_index_lookup_glb2loc_cell(PyObject* /*self*/,
306 PyObject* args,
307 PyObject* kwargs) {
308 int jg, global_idx;
309 static char const* kwlist[] = {"jg", "global_idx", NULL};
310 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "ii", (char**)&kwlist, &jg,
311 &global_idx))
312 return NULL;
313 int loc = comin_descrdata_index_lookup_glb2loc_cell(jg, global_idx);
314 check_error();
315 return PyLong_FromLong(loc);
316}
317
328static PyObject* descrdata_index_lookup_glb2loc_edge(PyObject* /*self*/,
329 PyObject* args,
330 PyObject* kwargs) {
331 int jg, global_idx;
332 static char const* kwlist[] = {"jg", "global_idx", NULL};
333 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "ii", (char**)&kwlist, &jg,
334 &global_idx))
335 return NULL;
336 int loc = comin_descrdata_index_lookup_glb2loc_edge(jg, global_idx);
337 check_error();
338 return PyLong_FromLong(loc);
339}
340
351static PyObject* descrdata_index_lookup_glb2loc_vert(PyObject* /*self*/,
352 PyObject* args,
353 PyObject* kwargs) {
354 int jg, global_idx;
355 static char const* kwlist[] = {"jg", "global_idx", NULL};
356 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "ii", (char**)&kwlist, &jg,
357 &global_idx))
358 return NULL;
359 int loc = comin_descrdata_index_lookup_glb2loc_vert(jg, global_idx);
360 check_error();
361 return PyLong_FromLong(loc);
362}
363
373static PyObject* setup_get_version(PyObject* /*self*/, PyObject* /*args*/) {
374 unsigned int major, minor, patch;
375 comin_setup_get_version(&major, &minor, &patch);
376 check_error();
377 return Py_BuildValue("iii", major, minor, patch);
378}
379
389static PyObject* parallel_get_host_mpi_comm(PyObject* /*self*/,
390 PyObject* /*args*/) {
391 int comm = comin_parallel_get_host_mpi_comm();
392 check_error();
393 return PyLong_FromLong((long)comm);
394}
395
405static PyObject* parallel_get_plugin_mpi_comm(PyObject* /*self*/,
406 PyObject* /*args*/) {
407 int comm = comin_parallel_get_plugin_mpi_comm();
408 check_error();
409 return PyLong_FromLong((long)comm);
410}
411
421static PyObject* parallel_get_host_mpi_rank(PyObject* /*self*/,
422 PyObject* /*args*/) {
423 int rank = comin_parallel_get_host_mpi_rank();
424 check_error();
425 return PyLong_FromLong((long)rank);
426}
427
435static PyObject* print_debug(PyObject* /*self*/, PyObject* args,
436 PyObject* kwargs) {
437 PyObject* pymsg;
438 static char const* kwlist[] = {"msg", NULL};
439 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)&kwlist, &pymsg))
440 return NULL;
441 PyObject* msg_str = PyObject_Str(pymsg);
442 if (!PyUnicode_Check(msg_str)) {
443 return PyErr_Format(PyExc_ValueError, "Conversion to string failed");
444 }
445 const char* val_str = PyUnicode_AsUTF8(msg_str);
446 if (!val_str)
447 return NULL;
448 comin_print_debug(val_str);
449 check_error();
450 Py_DECREF(msg_str);
451 Py_RETURN_NONE;
452}
453
461static PyObject* print_info(PyObject* /*self*/, PyObject* args,
462 PyObject* kwargs) {
463 PyObject* pymsg;
464 static char const* kwlist[] = {"msg", NULL};
465 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)&kwlist, &pymsg))
466 return NULL;
467 PyObject* msg_str = PyObject_Str(pymsg);
468 if (!PyUnicode_Check(msg_str)) {
469 return PyErr_Format(PyExc_ValueError, "Conversion to string failed");
470 }
471 const char* val_str = PyUnicode_AsUTF8(msg_str);
472 if (!val_str)
473 return NULL;
474 comin_print_info(val_str);
475 check_error();
476 Py_DECREF(msg_str);
477 Py_RETURN_NONE;
478}
479
487static PyObject* print_warning(PyObject* /*self*/, PyObject* args,
488 PyObject* kwargs) {
489 PyObject* pymsg;
490 static char const* kwlist[] = {"msg", NULL};
491 if (!PyArg_ParseTupleAndKeywords(args, kwargs, "O", (char**)&kwlist, &pymsg))
492 return NULL;
493 PyObject* msg_str = PyObject_Str(pymsg);
494 if (!PyUnicode_Check(msg_str)) {
495 return PyErr_Format(PyExc_ValueError, "Conversion to string failed");
496 }
497 const char* val_str = PyUnicode_AsUTF8(msg_str);
498 if (!val_str)
499 return NULL;
500 comin_print_warning(val_str);
501 check_error();
502 Py_DECREF(msg_str);
503 Py_RETURN_NONE;
504}
505
506const std::vector<PyMethodDef> descrdata_methods() {
507 return {
508 {"_current_get_plugin_info", func_wrapper<current_get_plugin_info>,
509 METH_NOARGS, ""},
510 {"_descrdata_eval_property",
512 METH_VARARGS | METH_KEYWORDS, ""},
513 {"_descrdata_get_domain", func_wrapper<descrdata_get_domain>, METH_NOARGS,
514 ""},
515 {"_descrdata_get_global", func_wrapper<descrdata_get_global>, METH_NOARGS,
516 ""},
517 {"_descrdata_get_simulation_interval",
519 {"descrdata_get_timesteplength",
521 METH_VARARGS | METH_KEYWORDS,
522 "C function signature: `void double "
523 "comin_descrdata_get_timesteplength(int jg)`"},
524 {"descrdata_get_index", (PyCFunction)func_wrapper<descrdata_get_index>,
525 METH_VARARGS | METH_KEYWORDS,
526 "C function signature: `int comin_descrdata_get_index(int j)`"},
527 {"descrdata_get_block", (PyCFunction)func_wrapper<descrdata_get_block>,
528 METH_VARARGS | METH_KEYWORDS,
529 "C function signature: `int comin_descrdata_get_block(int j)`"},
530 {"descrdata_get_cell_block_limits",
531 (PyCFunction)func_wrapper<
533 METH_VARARGS | METH_KEYWORDS,
534 "C function signature: `void comin_descrdata_get_cell_block_limits(int "
535 "jg, int irl_start, int irl_end, int* i_startblk, int* i_endblk)`"},
536 {"descrdata_get_edge_block_limits",
537 (PyCFunction)func_wrapper<
539 METH_VARARGS | METH_KEYWORDS,
540 "C function signature: `void comin_descrdata_get_edge_block_limits(int "
541 "jg, int irl_start, int irl_end, int* i_startblk, int* i_endblk)`"},
542 {"descrdata_get_vert_block_limits",
543 (PyCFunction)func_wrapper<
545 METH_VARARGS | METH_KEYWORDS,
546 "C function signature: `void comin_descrdata_get_vert_block_limits(int "
547 "jg, int irl_start, int irl_end, int* i_startblk, int* i_endblk)`"},
548 {"descrdata_get_cell_indices",
549 (PyCFunction)func_wrapper<
551 METH_VARARGS | METH_KEYWORDS,
552 "C function signature: `void comin_descrdata_get_cell_indices(int jg, "
553 "int i_blk, int i_startblk, int i_endblk, int* i_startidx, int* "
554 "i_endidx, int irl_start, int irl_end)`"},
555 {"descrdata_get_edge_indices",
556 (PyCFunction)func_wrapper<
558 METH_VARARGS | METH_KEYWORDS,
559 "C function signature: `void comin_descrdata_get_edge_indices(int jg, "
560 "int i_blk, int i_startblk, int i_endblk, int* i_startidx, int* "
561 "i_endidx, int irl_start, int irl_end)`"},
562 {"descrdata_get_vert_indices",
563 (PyCFunction)func_wrapper<
565 METH_VARARGS | METH_KEYWORDS,
566 "C function signature: `void comin_descrdata_get_vert_indices(int jg, "
567 "int i_blk, int i_startblk, int i_endblk, int* i_startidx, int* "
568 "i_endidx, int irl_start, int irl_end)`"},
569 {"descrdata_get_cell_npromz",
571 METH_VARARGS | METH_KEYWORDS,
572 "C function signature: `int comin_descrdata_get_cell_npromz(int jg)`"},
573 {"descrdata_get_edge_npromz",
575 METH_VARARGS | METH_KEYWORDS,
576 "C function signature: `int comin_descrdata_get_edge_npromz(int jg)`"},
577 {"descrdata_get_vert_npromz",
579 METH_VARARGS | METH_KEYWORDS,
580 "C function signature: `int comin_descrdata_get_vert_npromz(int jg)`"},
581 {"current_get_datetime", func_wrapper<current_get_datetime>, METH_NOARGS,
582 "C function signature: `const char* comin_current_get_datetime();`"},
583 {"current_get_domain_id", func_wrapper<current_get_domain_id>,
584 METH_NOARGS,
585 "C function signature: `int comin_current_get_domain_id()`"},
586 {"descrdata_index_lookup_glb2loc_cell",
588 METH_VARARGS | METH_KEYWORDS,
589 "C function signature: `int "
590 "comin_descrdata_index_lookup_glb2loc_cell(int jg, int global_idx)`"},
591 {"descrdata_index_lookup_glb2loc_edge",
593 METH_VARARGS | METH_KEYWORDS,
594 "C function signature: `int "
595 "comin_descrdata_index_lookup_glb2loc_edge(int jg, int global_idx)`"},
596 {"descrdata_index_lookup_glb2loc_vert",
598 METH_VARARGS | METH_KEYWORDS,
599 "C function signature: `int "
600 "comin_descrdata_index_lookup_glb2loc_vert(int jg, int global_idx)`"},
601 {"setup_get_version", func_wrapper<setup_get_version>, METH_NOARGS,
602 "returns (major, minor, patch) version info"},
603 {"parallel_get_host_mpi_comm", func_wrapper<parallel_get_host_mpi_comm>,
604 METH_NOARGS,
605 "C function signature: `int comin_parallel_get_host_mpi_comm()`"},
606 {"parallel_get_plugin_mpi_comm",
608 "C function signature: `int comin_parallel_get_host_mpi_comm()`"},
609 {"parallel_get_host_mpi_rank", func_wrapper<parallel_get_host_mpi_rank>,
610 METH_NOARGS,
611 "C function signature: `int comin_parallel_get_host_mpi_rank()`"},
612 {"print_debug", (PyCFunction)func_wrapper<print_debug>,
613 METH_VARARGS | METH_KEYWORDS,
614 "C function signature: `void comin_print_debug(const char* msg)`"},
615 {"print_info", (PyCFunction)func_wrapper<print_info>,
616 METH_VARARGS | METH_KEYWORDS,
617 "C function signature: `void comin_print_info(const char* msg)`"},
618 {"print_warning", (PyCFunction)func_wrapper<print_warning>,
619 METH_VARARGS | METH_KEYWORDS,
620 "C function signature: `void comin_print_warning(const char* msg)`"},
621 };
622}
623} // namespace comin::python
C interface for the ICON Community Interface.
const char * comin_current_get_plugin_name()
const char * comin_current_get_plugin_options()
const char * comin_current_get_plugin_comm()
void comin_setup_get_version(unsigned int *major, unsigned int *minor, unsigned int *patch)
const char * comin_descrdata_get_simulation_interval_exp_start()
const char * comin_descrdata_get_simulation_interval_exp_stop()
int comin_current_get_plugin_id()
int comin_descrdata_index_lookup_glb2loc_cell(int jg, int glb)
const char * comin_current_get_datetime()
int comin_descrdata_index_lookup_glb2loc_vert(int jg, int glb)
const char * comin_descrdata_get_simulation_interval_run_start()
const char * comin_descrdata_get_simulation_interval_run_stop()
int comin_descrdata_index_lookup_glb2loc_edge(int jg, int glb)
int comin_current_get_domain_id()
double comin_descrdata_get_timesteplength(int jg)
static const struct comin_descrdata_property_t comin_descrdata_domain_properties[]
static const struct comin_descrdata_property_t comin_descrdata_global_properties[]
simulation_interval descrdata_get_simulation_interval()
returns simulation interval
Definition comin.py:270
static PyObject * print_info(PyObject *, PyObject *args, PyObject *kwargs)
Print info message through ComIn's message system.
static PyObject * parallel_get_plugin_mpi_comm(PyObject *, PyObject *)
Plugin MPI Communicator.
static PyObject * descrdata_get_vert_npromz(PyObject *, PyObject *args, PyObject *kwargs)
get npromz.
static PyObject * descrdata_get_index(PyObject *, PyObject *args, PyObject *kwargs)
get nproma index.
Definition descrdata.cpp:94
static PyObject * print_debug(PyObject *, PyObject *args, PyObject *kwargs)
Print debug message through ComIn's message system.
static PyObject * setup_get_version(PyObject *, PyObject *)
Get version.
static PyObject * current_get_datetime(PyObject *, PyObject *)
Get current datetime string.
static PyObject * descrdata_get_block_limits(PyObject *, PyObject *args, PyObject *kwargs)
get block limits.
static PyObject * descrdata_get_indices(PyObject *, PyObject *args, PyObject *kwargs)
get indices.
static PyObject * descrdata_get_cell_npromz(PyObject *, PyObject *args, PyObject *kwargs)
get npromz.
static PyObject * current_get_domain_id(PyObject *, PyObject *)
Get current domain ID.
static PyObject * print_warning(PyObject *, PyObject *args, PyObject *kwargs)
Print warning message through ComIn's message system.
static PyObject * descrdata_index_lookup_glb2loc_edge(PyObject *, PyObject *args, PyObject *kwargs)
Maps global to local indices.
static PyObject * descrdata_get_edge_npromz(PyObject *, PyObject *args, PyObject *kwargs)
get npromz.
static PyObject * parallel_get_host_mpi_comm(PyObject *, PyObject *)
Host MPI Communicator.
static PyObject * descrdata_get_block(PyObject *, PyObject *args, PyObject *kwargs)
get block index.
plugin_info current_get_plugin_info()
returns object describing the current plugin
Definition comin.py:179
static PyObject * descrdata_index_lookup_glb2loc_cell(PyObject *, PyObject *args, PyObject *kwargs)
Maps global to local indices.
static PyObject * parallel_get_host_mpi_rank(PyObject *, PyObject *)
Rank number in host communicator.
_descrdata descrdata_get_global()
returns global descriptive data object
Definition comin.py:205
static PyObject * descrdata_index_lookup_glb2loc_vert(PyObject *, PyObject *args, PyObject *kwargs)
Maps global to local indices.
static PyObject * descrdata_get_timesteplength(PyObject *, PyObject *args, PyObject *kwargs)
Get timestep length for domain.
Definition descrdata.cpp:73
void(*)(int jg, int irl_start, int irl_end, int *i_startblk, int *i_endblk) BlockLimitGetterFn
void check_error(std::string add_info)
Definition exception.cpp:7
static PyObject * descrdata_get_domain(PyObject *, PyObject *)
Definition descrdata.cpp:43
void(*)(int jg, int i_blk, int i_startblk, int i_endblk, int *i_startidx, int *i_endidx, int irl_start, int irl_end) IndexGetterFn
static PyObject * descrdata_properties_to_dict(const comin_descrdata_property_t *properties)
const std::vector< PyMethodDef > descrdata_methods()
PyObject * func_wrapper(PyObject *self, PyObject *args)
Definition exception.h:33
MPI_Comm plugin_comm
const int jg
int rank