ICON Community Interface 0.4.0
Loading...
Searching...
No Matches
yac_input_plugin.c
Go to the documentation of this file.
1#include <assert.h>
2#include <math.h>
3#include <stdio.h>
4#include <stdlib.h>
5#include <string.h>
6
7#include <comin.h>
8#include <mpi.h>
9#include <yac.h>
10
13t_comin_var_handle* comin_var;
14t_comin_var_descriptor descr;
15
17void defcomp();
19void recv_field();
20
21void comin_main() {
22 const char* options = NULL;
23 int options_len = 0;
24 comin_current_get_plugin_options(&options, &options_len);
25 strncpy(descr.name, options, options_len);
26 descr.id = 1;
27
28 comin_var_request_add(descr, false);
29
30 comin_metadata_set_integer(descr, "zaxis_id", COMIN_ZAXIS_2D);
31
32 comin_callback_register(EP_SECONDARY_CONSTRUCTOR, secondary_constructor);
33 comin_callback_register(EP_ATM_YAC_DEFCOMP_BEFORE, defcomp);
34 comin_callback_register(EP_ATM_YAC_SYNCDEF_BEFORE, create_grid_and_field);
35 comin_callback_register(EP_ATM_TIMELOOP_START, recv_field);
36}
37
39 t_comin_entry_point ep = EP_ATM_TIMELOOP_START;
40 comin_var = comin_var_get(1, &ep, descr, COMIN_FLAG_WRITE);
41 if (comin_var == NULL)
42 comin_plugin_finish("yac_input_plugin", "Failed to get variable");
43}
44
45void defcomp() {
47 yac_cpredef_comp_instance(instance_id, "yac_input_plugin", &comp_id);
48 fprintf(stderr, "comp_id: %d\n", comp_id);
49}
50
52 int n_patch_cells = comin_descrdata_get_domain_cells_ncells(1);
53 int n_patch_verts = comin_descrdata_get_domain_verts_nverts(1);
54
55 int* num_vertices_per_cell =
56 malloc(n_patch_cells * sizeof(*num_vertices_per_cell));
57 for (int i = 0; i < n_patch_cells; ++i)
58 num_vertices_per_cell[i] = 3;
59
60 int vlon_size[2];
61 const double* vlon;
62 comin_descrdata_get_domain_verts_vlon(1, &vlon, vlon_size);
63 int vlat_size[2];
64 const double* vlat;
65 comin_descrdata_get_domain_verts_vlat(1, &vlat, vlat_size);
66
67 // yac needs radiants
68 double* vlon_rad = malloc(n_patch_verts * sizeof(*vlon_rad));
69 double* vlat_rad = malloc(n_patch_verts * sizeof(*vlat_rad));
70 for (int i = 0; i < n_patch_verts; ++i) {
71 vlon_rad[i] = vlon[i] / 180. * M_PI;
72 vlat_rad[i] = vlat[i] / 180. * M_PI;
73 }
74
75 int vertex_idx_size[3]; // nproma, nblks, 3
76 const int *vertex_idx, *vertex_blk;
77 comin_descrdata_get_domain_cells_vertex_idx(1, &vertex_idx, vertex_idx_size);
78 comin_descrdata_get_domain_cells_vertex_blk(1, &vertex_blk, vertex_idx_size);
79 int nproma = vertex_idx_size[0];
80
81 int* vertex_idx_transposed =
82 malloc(3 * n_patch_cells * sizeof(*vertex_idx_transposed));
83 for (int i = 0; i < n_patch_cells; ++i)
84 for (int k = 0; k < 3; ++k) {
85 vertex_idx_transposed[k + 3 * i] =
86 vertex_idx[i + k * vertex_idx_size[0] * vertex_idx_size[1]] - 1 +
87 nproma *
88 (vertex_blk[i + k * vertex_idx_size[0] * vertex_idx_size[1]] - 1);
89 }
90
91 int grid_id;
92 yac_cdef_grid_unstruct("comin_yac_plugin_grid", n_patch_verts, n_patch_cells,
93 num_vertices_per_cell, vlon_rad, vlat_rad,
94 vertex_idx_transposed, &grid_id);
95 free(vlon_rad);
96 free(vlat_rad);
97 free(vertex_idx_transposed);
98
99 int clon_size[2];
100 const double* clon;
101 comin_descrdata_get_domain_cells_clon(1, &clon, clon_size);
102 int clat_size[2];
103 const double* clat;
104 comin_descrdata_get_domain_cells_clat(1, &clat, clat_size);
105
106 // yac needs radiants
107 double* clon_rad = malloc(n_patch_cells * sizeof(*clon_rad));
108 double* clat_rad = malloc(n_patch_cells * sizeof(*clat_rad));
109 for (int i = 0; i < n_patch_cells; ++i) {
110 clon_rad[i] = clon[i] / 180. * M_PI;
111 clat_rad[i] = clat[i] / 180. * M_PI;
112 }
113
114 int point_id;
115 yac_cdef_points_unstruct(grid_id, n_patch_cells, YAC_LOCATION_CELL, clon_rad,
116 clat_rad, &point_id);
117
118 free(clon_rad);
119 free(clat_rad);
120
121 double dt = comin_descrdata_get_timesteplength(1);
122
123 char dt_str[16];
124 sprintf(dt_str, "%d", ((int)dt * 1000));
125 yac_cdef_field(descr.name, comp_id, &point_id, 1, 1, dt_str,
126 YAC_TIME_UNIT_MILLISECOND, &field_id);
127
128 free(num_vertices_per_cell);
129}
130
132 int info, ierror;
133 double* ptr = comin_var_get_ptr_double(comin_var);
134 yac_cget_(field_id, 1, ptr, &info, &ierror);
135}
C interface for the ICON Community Interface.
integer(c_int) function comin_descrdata_get_domain_cells_ncells(jg)
subroutine comin_descrdata_get_domain_cells_clon(jg, clon, arr_size)
subroutine comin_descrdata_get_domain_verts_vlon(jg, vlon, arr_size)
subroutine comin_descrdata_get_domain_cells_vertex_idx(jg, vertex_idx, arr_size)
subroutine comin_descrdata_get_domain_verts_vlat(jg, vlat, arr_size)
subroutine comin_descrdata_get_domain_cells_clat(jg, clat, arr_size)
integer(c_int) function comin_descrdata_get_domain_verts_nverts(jg)
subroutine comin_descrdata_get_domain_cells_vertex_blk(jg, vertex_blk, arr_size)
integer(c_int) function comin_descrdata_get_global_yac_instance_id()
int field_id
t_comin_var_handle * comin_var
void create_grid_and_field()
void recv_field()
void defcomp()
void secondary_constructor()
void comin_main()
t_comin_var_descriptor descr
int comp_id