ICON Community Interface 0.4.0
Loading...
Searching...
No Matches
yac_input_external.c
Go to the documentation of this file.
1#include "yac.h"
2#include "yac_config.h"
3#include <assert.h>
4#include <math.h>
5#include <stdio.h>
6#include <stdlib.h>
7
8int main(int argc, char** argv) {
9 if (argc != 2) {
10 fprintf(stderr,
11 "Please provide the variable name as command-line argument!\n");
12 return 1;
13 }
14 const char* field_name = argv[1];
15
16 yac_cinit();
17
18 int comp_id;
19 yac_cdef_comp("yac_input_external", &comp_id);
20
21 double* x_vertices = malloc(360 * sizeof(*x_vertices));
22 for (int i = 0; i < 360; ++i) {
23 x_vertices[i] = (M_PI / 180.) * i;
24 }
25 double* y_vertices = malloc(181 * sizeof(*y_vertices));
26 for (int i = -90; i <= 90; ++i) {
27 y_vertices[i + 90] = (M_PI / 180.) * i;
28 }
29 int grid_id;
30 int dims[] = {360, 181};
31 int cyclic[] = {1, 0};
32 const char* grid_name = "yac_input_external_grid";
33 yac_cdef_grid_reg2d(grid_name, dims, cyclic, x_vertices, y_vertices,
34 &grid_id);
35
36 int point_id;
37 yac_cdef_points_reg2d(grid_id, dims, YAC_LOCATION_CORNER, x_vertices,
38 y_vertices, &point_id);
39 free(x_vertices);
40 free(y_vertices);
41
42 yac_csync_def();
43 const char* dt = yac_cget_field_timestep("yac_input_plugin",
44 "comin_yac_plugin_grid", field_name);
45
46 int field_id;
47 yac_cdef_field(field_name, comp_id, &point_id, 1, 1, dt,
48 YAC_TIME_UNIT_ISO_FORMAT, &field_id);
49
50 int interp_id;
51 yac_cget_interp_stack_config(&interp_id);
52#if YAC_VERSION_MAJOR == 3 && YAC_VERSION_MINOR <= 3
53 yac_cadd_interp_stack_config_nnn(interp_id, YAC_NNN_AVG, 1, 1.0);
54#else
55 yac_cadd_interp_stack_config_nnn(interp_id, YAC_NNN_AVG, 1, 0.0, 1.0);
56#endif
57
58 yac_cdef_couple("yac_input_external", grid_name, field_name,
59 "yac_input_plugin", "comin_yac_plugin_grid", field_name, dt,
60 YAC_TIME_UNIT_ISO_FORMAT, YAC_REDUCTION_TIME_NONE, interp_id,
61 1, 0);
62 yac_cfree_interp_stack_config(interp_id);
63
64 yac_cenddef();
65
66 double* data = malloc(dims[0] * dims[1] * sizeof(*data));
67 int info = YAC_ACTION_NONE;
68 int ierror = 0;
69 int t = 0;
70 while (info != YAC_ACTION_OUT_OF_BOUND &&
71 info != YAC_ACTION_PUT_FOR_RESTART) {
72 // fill with artificial data
73 for (int i = 0; i < dims[0]; ++i) {
74 for (int j = 0; j < dims[1]; j++) {
75 double lon = (M_PI / 180.) * i;
76 double lat = (M_PI / 180.) * j;
77 data[i * dims[1] + j] = cos(lat) * sin(lon + t * 0.1);
78 }
79 }
80
81 const char* time = yac_cget_field_datetime(field_id);
82 yac_cput_(field_id, 1, data, &info, &ierror);
83 fprintf(stderr, "datetime: %s: yac info: %d\n", time, info);
84 assert(ierror == 0);
85 ++t;
86 }
87
88 yac_cfinalize();
89 return 0;
90}
int main(int argc, char **argv)
int field_id
int comp_id