ComIn 0.5.1
ICON Community Interface
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;
15
17void defcomp();
19void recv_field();
20
21void comin_main() {
23 descr.id = 1;
24
26
27 comin_metadata_set_integer(descr, "zaxis_id", COMIN_ZAXIS_2D);
28
29 comin_callback_register(EP_SECONDARY_CONSTRUCTOR, secondary_constructor);
30 comin_callback_register(EP_ATM_YAC_DEFCOMP_BEFORE, defcomp);
31 comin_callback_register(EP_ATM_YAC_SYNCDEF_BEFORE, create_grid_and_field);
32 comin_callback_register(EP_ATM_TIMELOOP_START, recv_field);
33}
34
36 t_comin_entry_point ep = EP_ATM_TIMELOOP_START;
37 comin_var = comin_var_get(1, &ep, descr, COMIN_FLAG_WRITE);
38 if (comin_var == NULL)
39 comin_plugin_finish_f("yac_input_plugin", "Failed to get variable %s",
40 descr.name);
41}
42
43void defcomp() {
45 yac_cpredef_comp_instance(instance_id, "yac_input_plugin", &comp_id);
46 fprintf(stderr, "comp_id: %d\n", comp_id);
47}
48
50 int n_patch_cells = comin_descrdata_get_domain_cells_ncells(1);
51 int n_patch_verts = comin_descrdata_get_domain_verts_nverts(1);
52
53 int* num_vertices_per_cell =
54 malloc(n_patch_cells * sizeof(*num_vertices_per_cell));
55 for (int i = 0; i < n_patch_cells; ++i)
56 num_vertices_per_cell[i] = 3;
57
58 int vlon_size[2];
59 const double* vlon;
60 comin_descrdata_get_domain_verts_vlon(1, &vlon, vlon_size);
61 int vlat_size[2];
62 const double* vlat;
63 comin_descrdata_get_domain_verts_vlat(1, &vlat, vlat_size);
64
65 // yac needs radiants
66 double* vlon_rad = malloc(n_patch_verts * sizeof(*vlon_rad));
67 double* vlat_rad = malloc(n_patch_verts * sizeof(*vlat_rad));
68 for (int i = 0; i < n_patch_verts; ++i) {
69 vlon_rad[i] = vlon[i] / 180. * M_PI;
70 vlat_rad[i] = vlat[i] / 180. * M_PI;
71 }
72
73 int vertex_idx_size[3]; // nproma, nblks, 3
74 const int *vertex_idx, *vertex_blk;
75 comin_descrdata_get_domain_cells_vertex_idx(1, &vertex_idx, vertex_idx_size);
76 comin_descrdata_get_domain_cells_vertex_blk(1, &vertex_blk, vertex_idx_size);
77 int nproma = vertex_idx_size[0];
78
79 int* vertex_idx_transposed =
80 malloc(3 * n_patch_cells * sizeof(*vertex_idx_transposed));
81 for (int i = 0; i < n_patch_cells; ++i)
82 for (int k = 0; k < 3; ++k) {
83 vertex_idx_transposed[k + 3 * i] =
84 vertex_idx[i + k * vertex_idx_size[0] * vertex_idx_size[1]] - 1 +
85 nproma *
86 (vertex_blk[i + k * vertex_idx_size[0] * vertex_idx_size[1]] - 1);
87 }
88
89 int grid_id;
90 yac_cdef_grid_unstruct("comin_yac_plugin_grid", n_patch_verts, n_patch_cells,
91 num_vertices_per_cell, vlon_rad, vlat_rad,
92 vertex_idx_transposed, &grid_id);
93 free(vlon_rad);
94 free(vlat_rad);
95 free(vertex_idx_transposed);
96
97 int clon_size[2];
98 const double* clon;
99 comin_descrdata_get_domain_cells_clon(1, &clon, clon_size);
100 int clat_size[2];
101 const double* clat;
102 comin_descrdata_get_domain_cells_clat(1, &clat, clat_size);
103
104 // yac needs radiants
105 double* clon_rad = malloc(n_patch_cells * sizeof(*clon_rad));
106 double* clat_rad = malloc(n_patch_cells * sizeof(*clat_rad));
107 for (int i = 0; i < n_patch_cells; ++i) {
108 clon_rad[i] = clon[i] / 180. * M_PI;
109 clat_rad[i] = clat[i] / 180. * M_PI;
110 }
111
112 int point_id;
113 yac_cdef_points_unstruct(grid_id, n_patch_cells, YAC_LOCATION_CELL, clon_rad,
114 clat_rad, &point_id);
115
116 free(clon_rad);
117 free(clat_rad);
118
120
121 char dt_str[16];
122 sprintf(dt_str, "%d", ((int)dt * 1000));
123 yac_cdef_field(descr.name, comp_id, &point_id, 1, 1, dt_str,
124 YAC_TIME_UNIT_MILLISECOND, &field_id);
125
126 free(num_vertices_per_cell);
127}
128
130 int info, ierror;
131 double* ptr = comin_var_get_ptr_double(comin_var);
132 yac_cget_(field_id, 1, ptr, &info, &ierror);
133}
C interface for the ICON Community Interface.
void comin_plugin_finish_f(const char *routine, const char *fmt,...)
const char * comin_current_get_plugin_options()
double comin_descrdata_get_timesteplength(int jg)
void comin_var_request_add(t_comin_var_descriptor var_desc, bool lmodexclusive)
void comin_descrdata_get_domain_cells_clat(int jg, const double **clat, int *arr_size)
Latitude of centers of triangular cells.
void comin_descrdata_get_domain_cells_clon(int jg, const double **clon, int *arr_size)
Longitude of centers of triangular cells.
int comin_descrdata_get_domain_cells_ncells(int jg)
Number of local cells.
void comin_descrdata_get_domain_verts_vlat(int jg, const double **vlat, int *arr_size)
Latitude of vertex.
void comin_descrdata_get_domain_cells_vertex_idx(int jg, const int **vertex_idx, int *arr_size)
Line indices of verts of triangle.
void comin_descrdata_get_domain_verts_vlon(int jg, const double **vlon, int *arr_size)
Longitude of vertex.
int comin_descrdata_get_global_yac_instance_id()
The yac instance id used by the host model.
int comin_descrdata_get_domain_verts_nverts(int jg)
Number of local verts.
void comin_descrdata_get_domain_cells_vertex_blk(int jg, const int **vertex_blk, int *arr_size)
Block indices of verts of triangle.
void comin_callback_register(t_comin_entry_point entry_point, t_comin_callback_function fct_ptr)
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