ICON Community Interface 0.4.0
Loading...
Searching...
No Matches
yaxt_c_plugin.c
Go to the documentation of this file.
1/*
2 --------------------------------------------------------------------
3 Example plugin for the ICON Community Interface (ComIn)
4 to demonstrate the usage of YAXT.
5
6 @authors 08/2021 :: ICON Community Interface <icon@dwd.de>
7
8 Note that in order to demonstrate ComIn's language interoperability,
9 a similary plugin has been implemented in Fortran, see the subdirectory
10 "yaxt_fortran".
11 --------------------------------------------------------------------
12 */
13
14#include <stdio.h>
15#include <string.h>
16
17#include <comin.h>
18#include <mpi.h>
19#include <yaxt.h>
20
21#define ASSERT(COND) \
22 if (!(COND)) { \
23 fprintf(stderr, "assertion failed: %s\n", #COND); \
24 MPI_Abort(MPI_COMM_WORLD, 1); \
25 }
26
27const int jg = 1;
28int rank = -1;
29MPI_Comm plugin_comm = MPI_COMM_NULL;
30t_comin_var_handle* temp_var = NULL;
31Xt_int* idxlist = NULL;
32double* buffer = NULL;
33int ncells = 0;
35Xt_redist yaxt_redist;
36const int* decomp_domain = NULL;
37
39void offload();
40void destructor();
41
42void comin_main() {
43 rank = comin_parallel_get_host_mpi_rank();
44 comin_callback_register(EP_SECONDARY_CONSTRUCTOR, secondary_constructor);
45
46 comin_callback_register(EP_ATM_WRITE_OUTPUT_BEFORE, offload);
47
48 comin_callback_register(EP_DESTRUCTOR, destructor);
49
50 plugin_comm = MPI_Comm_f2c(comin_parallel_get_plugin_mpi_comm());
51
52 if (!xt_initialized())
53 xt_initialize(plugin_comm);
54
56
57 int decomp_domain_size[2] = {0, 0};
59 decomp_domain_size);
60
61 const int* glb_index = NULL;
62 int glb_index_size = 0;
63 comin_descrdata_get_domain_cells_glb_index(jg, &glb_index, &glb_index_size);
64
65 ASSERT(decomp_domain_size[0] * decomp_domain_size[1] > glb_index_size);
66
67 idxlist = malloc(ncells * sizeof(*idxlist));
69 for (int i = 0; i < ncells; ++i) {
70 if (decomp_domain[i] == 0) {
71 idxlist[prognostic_cells] = glb_index[i];
73 }
74 }
75 Xt_idxlist idxvec = xt_idxvec_new(idxlist, prognostic_cells);
76
77 Xt_idxlist empty_idxlist = xt_idxempty_new();
78
79 Xt_xmap xmap = xt_xmap_all2all_new(idxvec, empty_idxlist, plugin_comm);
80
81 yaxt_redist = xt_redist_p2p_new(xmap, MPI_DOUBLE);
82 xt_xmap_delete(xmap);
83 xt_idxlist_delete(empty_idxlist);
84 xt_idxlist_delete(idxvec);
85
86 buffer = malloc(prognostic_cells * sizeof(*buffer));
87}
88
90 t_comin_entry_point ep = EP_ATM_WRITE_OUTPUT_BEFORE;
91 t_comin_var_descriptor var_desc;
92 strcpy(var_desc.name, "temp");
93 var_desc.id = 1;
94 temp_var = comin_var_get(1, &ep, var_desc, COMIN_FLAG_READ);
95}
96
97void offload() {
98 // this callback is only called in entrypoints outside of domain loops
99 ASSERT(comin_current_get_domain_id() == COMIN_DOMAIN_OUTSIDE_LOOP);
100 double* temp_ptr = comin_var_get_ptr_double(temp_var); // ensures [jc, jb, jk]
101 int shape[5];
102 comin_var_get_shape(temp_var, shape);
105 for (int i = 0; i < ncells; ++i) {
106 if (decomp_domain[i] == 0) {
107 int idx0 = i % shape[0];
108 int idx2 = i / shape[0];
110 temp_ptr[idx0 + nlev * shape[0] + idx2 * shape[0] * shape[1]];
112 }
113 }
114
115 xt_redist_s_exchange1(yaxt_redist, buffer, NULL);
116}
117
119 free(idxlist);
120 free(buffer);
121}
C interface for the ICON Community Interface.
integer(c_int) function comin_descrdata_get_domain_cells_ncells(jg)
subroutine comin_descrdata_get_domain_cells_glb_index(jg, glb_index, arr_size)
integer(c_int) function comin_descrdata_get_domain_nlev(jg)
subroutine comin_descrdata_get_domain_cells_decomp_domain(jg, decomp_domain, arr_size)
void offload()
MPI_Comm plugin_comm
void destructor()
const int jg
int rank
double * buffer
t_comin_var_handle * temp_var
int ncells
void secondary_constructor()
#define ASSERT(COND)
int prognostic_cells
const int * decomp_domain
Xt_int * idxlist
void comin_main()
Xt_redist yaxt_redist