YAC 3.13.0
Yet Another Coupler
Loading...
Searching...
No Matches
toy_output.c
Go to the documentation of this file.
1// Copyright (c) 2024 The YAC Authors
2//
3// SPDX-License-Identifier: BSD-3-Clause
4
5#include <assert.h>
6#include <stdlib.h>
7#include <stdio.h>
8#include <math.h>
9#include <string.h>
10#include <netcdf.h>
11#include "yac.h"
12
13#define YAC_HANDLE_ERROR(exp) \
14 do { \
15 int handle_error_status = (exp); \
16 if (handle_error_status != NC_NOERR) { \
17 fprintf(stderr, "Error: %s\n", nc_strerror(handle_error_status)); \
18 exit(handle_error_status); \
19 } \
20 } while(0)
21
22
23int main(int argc, char** argv){
24 assert(argc == 4);
25 const char* source_comp = argv[1];
26 const char* source_grid = argv[2];
27 const char* field_name = argv[3];
28
29 yac_cinit();
30
31 char filename[32];
32 int ncid;
33 sprintf(filename, "%s.nc", field_name);
34 YAC_HANDLE_ERROR(nc_create(filename, NC_CLOBBER, &ncid));
35
36 printf("Writing file %s", filename);
37
38 int comp_id;
39 char comp_name[256];
40 sprintf(comp_name, "toy_output_%s_%s_%s", source_comp, source_grid, field_name);
41 yac_cdef_comp(comp_name, &comp_id);
42
43 int grid_id;
44 int nbr_vertices[] = {360, 181};
45 int cyclic[] = {1, 0};
46 double* x_vertices = malloc(nbr_vertices[0]*sizeof(*x_vertices));
47 for(int i = 0; i<nbr_vertices[0]; ++i){
48 x_vertices[i] = -M_PI + i*2*M_PI/nbr_vertices[0];
49 }
50 double* y_vertices = malloc(nbr_vertices[1]*sizeof(*y_vertices));
51 for(int i = 0; i<nbr_vertices[1]; ++i){
52 y_vertices[i] = -0.5*M_PI + i*M_PI/nbr_vertices[1];
53 }
54
55 const char * grid_name = "toy_output_grid";
56 yac_cdef_grid_reg2d ( grid_name,
57 nbr_vertices,
58 cyclic,
59 x_vertices,
60 y_vertices,
61 &grid_id);
62
63 free(x_vertices);
64 free(y_vertices);
65
66 int nbr_cells[] = {nbr_vertices[0], nbr_vertices[1]-1};
67 double* x_cells = malloc(nbr_cells[0]*sizeof(*x_cells));
68 for(int i = 0; i<nbr_cells[0]; ++i){
69 x_cells[i] = -M_PI + (((double)i) + 0.5)*2*M_PI/nbr_cells[0];
70 }
71 double* y_cells = malloc(nbr_cells[1]*sizeof(*y_cells));
72 for(int i = 0; i<nbr_cells[1]; ++i){
73 y_cells[i] = -0.5*M_PI + (((double)i) + 0.5)*M_PI/nbr_cells[1];
74 }
75 int point_id;
77 nbr_cells,
79 x_cells,
80 y_cells,
81 &point_id );
82
84
85 const char* dt = yac_cget_field_timestep(source_comp, source_grid, field_name);
86 printf("toy_output: timestep for %s is %s\n", field_name, dt);
87
88 int collection_size = yac_cget_field_collection_size(source_comp, source_grid, field_name);
89 printf("toy_output: collection_size for %s is %d\n", field_name, collection_size);
90
91 int field_id;
92 yac_cdef_field ( field_name,
93 comp_id,
94 &point_id,
95 1,
96 /*collection_size*/ collection_size,
97 dt,
99 &field_id );
100
101 int lat_dimid, lon_dimid, t_dimid, z_dimid;
102 YAC_HANDLE_ERROR(nc_def_dim(ncid, "lat", nbr_cells[1], &lat_dimid));
103 YAC_HANDLE_ERROR(nc_def_dim(ncid, "lon", nbr_cells[0], &lon_dimid));
104 YAC_HANDLE_ERROR(nc_def_dim(ncid, "time", NC_UNLIMITED, &t_dimid));
105 YAC_HANDLE_ERROR(nc_def_dim(ncid, "z", collection_size, &z_dimid));
106
107 free(x_cells);
108 free(y_cells);
109
110 int varid;
111 int dimids[] = {t_dimid, z_dimid, lat_dimid, lon_dimid};
112 YAC_HANDLE_ERROR(nc_def_var(ncid, field_name, NC_DOUBLE, 4, dimids, &varid));
113
114 int interp_stack_config_id;
115 yac_cget_interp_stack_config(&interp_stack_config_id);
117 interp_stack_config_id, YAC_NNN_AVG, 1, 0.0, 1.0);
118
119 yac_cdef_couple( source_comp, source_grid, field_name,
120 comp_name, grid_name, field_name,
122 interp_stack_config_id, 0, 1);
123
124 yac_cfree_interp_stack_config(interp_stack_config_id);
125
126 YAC_HANDLE_ERROR(nc_enddef(ncid));
127
128 yac_cenddef();
129
130 double* data = malloc(nbr_cells[0]*nbr_cells[1]*sizeof(data)*collection_size);
131 int info, ierror;
132 int time_counter = 0;
133 while(1){
134 const char* t = yac_cget_field_datetime(field_id);
135 printf("receiving %s at %s\n", field_name, t);
138 data,
139 &info,
140 &ierror );
141 size_t start[] = {time_counter, 0, 0, 0};
142 size_t count[] = {1, collection_size, nbr_cells[1], nbr_cells[0]};
143 YAC_HANDLE_ERROR(nc_put_vara_double (ncid, varid, start, count, data ));
145 if (info == YAC_ACTION_OUT_OF_BOUND)
146 break;
147 time_counter++;
148 }
149 printf("done, wrote %d timesteps for %s\n", time_counter, field_name);
150
151 free(data);
152
153 YAC_HANDLE_ERROR(nc_close(ncid));
154
156
157 return 0;
158}
int collection_size
double * data
int point_id
unsigned cyclic[2]
int info
int grid_id
int ierror
int * field_id
int comp_id
#define YAC_HANDLE_ERROR(exp)
Definition toy_output.c:13
void yac_cenddef(void)
Definition yac.c:4400
int const YAC_ACTION_OUT_OF_BOUND
put/get is outside of the valid range
Definition yac.c:50
void yac_cget_(int const field_id, int const collection_size, double *recv_field, int *info, int *ierr)
Definition yac.c:2741
int const YAC_LOCATION_CELL
Definition yac.c:34
void yac_csync_def(void)
Definition yac.c:4385
void yac_cinit(void)
Definition yac.c:510
void yac_cfinalize()
Finalises YAC.
Definition yac.c:740
const char * yac_cget_field_datetime(int field_id)
Definition yac.c:2423
void yac_cget_action(int field_id, int *action)
Definition yac.c:2380
void yac_cdef_grid_reg2d(const char *grid_name, int nbr_vertices[2], int cyclic[2], double *x_vertices, double *y_vertices, int *grid_id)
Definition yac.c:4831
void yac_cdef_points_reg2d(int const grid_id, int const *nbr_points, int const located, double const *x_points, double const *y_points, int *point_id)
Definition yac.c:1103
int yac_cget_field_collection_size(const char *comp_name, const char *grid_name, const char *field_name)
Definition yac.c:4779
int const YAC_TIME_UNIT_ISO_FORMAT
Definition yac.c:65
void yac_cfree_interp_stack_config(int interp_stack_config_id)
Definition yac.c:5151
int const YAC_NNN_AVG
Definition yac.c:79
void yac_cadd_interp_stack_config_nnn(int interp_stack_config_id, int type, size_t n, double max_search_distance, double scale)
Definition yac.c:5208
void yac_cget_interp_stack_config(int *interp_stack_config_id)
Definition yac.c:5137
void yac_cdef_comp(char const *comp_name, int *comp_id)
Definition yac.c:1013
void yac_cdef_field(char const *name, int const comp_id, int const *point_ids, int const num_pointsets, int collection_size, const char *timestep, int time_unit, int *field_id)
Definition yac.c:1396
void yac_cdef_couple(char const *src_comp_name, char const *src_grid_name, char const *src_field_name, char const *tgt_comp_name, char const *tgt_grid_name, char const *tgt_field_name, char const *coupling_timestep, int time_unit, int time_reduction, int interp_stack_config_id, int src_lag, int tgt_lag)
Definition yac.c:1951
int const YAC_REDUCTION_TIME_NONE
Definition yac.c:52
const char * yac_cget_field_timestep(const char *comp_name, const char *grid_name, const char *field_name)
Definition yac.c:4743