YAC 3.8.0
Yet Another Coupler
Loading...
Searching...
No Matches
test_dummy_coupling_c.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 <mpi.h>
6
7#include <stdlib.h>
8#include <stdio.h>
9#include <string.h>
10#include "tests.h"
11#include "test_common.h"
12#include "yac.h"
13#include "basic_grid.h"
14
21struct {
22 char const * name;
24} field[] =
25 {{.name = "TAUX", .collection_size = 2},
26 {.name = "TAUY", .collection_size = 2},
27 {.name = "SFWFLX", .collection_size = 3},
28 {.name = "SFTEMP", .collection_size = 1},
29 {.name = "THFLX", .collection_size = 4},
30 {.name = "ICEATM", .collection_size = 4},
31 {.name = "SST", .collection_size = 1},
32 {.name = "OCEANU", .collection_size = 1},
33 {.name = "OCEANV", .collection_size = 1},
34 {.name = "ICEOCE", .collection_size = 5}};
35
37
38enum {
39 NO_OF_FIELDS = sizeof(field) / sizeof(field[0]),
42};
44
47int comp_ids[1];
48
51
53
56
57double * buffer;
58double * buffer_lon;
59double * buffer_lat;
61
64
65int flag;
66
67static void dummy_atmosphere ();
68static void dummy_ocean ();
69static void dummy_io ();
70
71int main(int argc, char** argv) {
72
73 yac_cinit();
74
75 int size, rank;
76 MPI_Comm_rank ( MPI_COMM_WORLD, &rank );
77 MPI_Comm_size ( MPI_COMM_WORLD, &size );
78
79 if (argc != 2) {
80 PUT_ERR("ERROR: missing config file directory");
81 xt_finalize();
82 MPI_Finalize();
83 return TEST_EXIT_CODE;
84 }
85
87 strcat(
88 strcpy(
89 malloc(strlen(argv[1]) + 32), argv[1]), "coupling_test.yaml");
90
91 switch ( rank ) {
92
93 case 0:
95 break;
96
97 case 1:
98 dummy_ocean ( );
99 break;
100
101 case 2:
102 dummy_io ( );
103 break;
104
105 default:
106 PUT_ERR("Too many processes have been launched\n");
107 return TEST_EXIT_CODE;
108 }
109
110 free(yaml_filename);
111
112 yac_cfinalize ();
113
114 return TEST_EXIT_CODE;
115}
116
117/* -------------------------------------------------------------------- */
118
119static void dummy_atmosphere () {
120
121 int size, rank;
122
123 MPI_Comm local_comm;
124
125 char * comp_name = "dummy_atmosphere";
126 char * grid_name = "dummy_atmosphere_grid";
127
128 // Inform the coupler about what we are
129 yac_cdef_comp ( comp_name, &comp_id );
130 comp_ids[0] = comp_id;
131
132 yac_cget_comp_comm ( comp_id, &local_comm );
133
134 MPI_Comm_rank ( local_comm, &rank );
135 MPI_Comm_size ( local_comm, &size );
136
137 // printf (" %s rank %d : local size %d \n", comp_name, rank, size );
138
139 buffer_lon = xmalloc ( NBR_VERTICES * sizeof(*buffer_lon) );
140 buffer_lat = xmalloc ( NBR_VERTICES * sizeof(*buffer_lat) );
141 cell_to_vertex = xmalloc ( 3 * NBR_CELLS * sizeof(*cell_to_vertex) );
142
143 /* Define vertices
144
145 0
146 / \
147 / o \
148 / \
149 1-------2 Eq.
150 \ /
151 \ o /
152 \ /
153 3
154
155 */
156
157 buffer_lon[0] = 0.0; buffer_lat[0] = 1.0;
158 buffer_lon[1] = -1.0; buffer_lat[1] = 0.0;
159 buffer_lon[2] = 1.0; buffer_lat[2] = 0.0;
160 buffer_lon[3] = 0.0; buffer_lat[3] = -1.0;
161
162 // Connectivity
163
164 cell_to_vertex[0] = 0; cell_to_vertex[1] = 1; cell_to_vertex[2] = 2; // cell 1
165 cell_to_vertex[3] = 1; cell_to_vertex[4] = 3; cell_to_vertex[5] = 2; // cell 2
166
167 for (unsigned i = 0; i < NBR_CELLS; ++i ) nbr_vertices_per_cell[i] = 3;
168
169 // Define unstructured grid
170
174
175 // Test computation of cell areas
176 double * cell_areas = xmalloc(NBR_CELLS * sizeof(*cell_areas));
177 for (unsigned i = 0; i < NBR_CELLS; ++i) cell_areas[i] = -1.0;
179 for (unsigned i = 0; i < NBR_CELLS; ++i)
180 if (cell_areas[i] == -1.0)
181 PUT_ERR("ERROR in yac_ccompute_grid_cell_areas");
182
183 // Decomposition information
184
185 for (int i = 0; i < NBR_CELLS; ++i ) {
186 global_index[i] = i;
187 cell_core_mask[i] = 1;
188 }
189
192
193 // Center points in cells (needed e.g. for nearest neighbour)
194
195 buffer_lon[0] = 0.0; buffer_lat[0] = 0.5;
196 buffer_lon[1] = 0.0; buffer_lat[1] = -0.5;
197
200
201 free ( buffer_lon );
202 free ( buffer_lat );
203
204 // Mask generation
205
206 cell_mask = xmalloc (NBR_CELLS * sizeof(*cell_mask));
207
208 for (unsigned i = 0; i < NBR_CELLS; ++i) cell_mask[i] = 1;
209
211
213
214 free (cell_mask);
215
217
219 PUT_ERR("ERROR in yac_cget_calendar");
220
221 field_id = xmalloc ( NO_OF_FIELDS * sizeof(*field_id));
222
223 for (unsigned i = 0; i < NO_OF_FIELDS/2; ++i )
224 yac_cdef_field ( field[i].name,
225 comp_id,
227 1, field[i].collection_size,
229 &field_id[i] );
230
231 for (unsigned i = NO_OF_FIELDS/2; i < NO_OF_FIELDS; ++i )
232 yac_cdef_field_mask ( field[i].name,
233 comp_id,
236 1, field[i].collection_size,
238 &field_id[i] );
239
240 // read couplings from YAML configuration file
242
243 yac_cenddef ( );
244
245 // these queries can only be fulfilled once the search has been completed.
246
247 for (unsigned i = 0; i < NO_OF_FIELDS; ++i ) {
248 const char* timestep_string = yac_cget_timestep_from_field_id ( field_id[i] );
249 if (strcmp(timestep_string,"PT10M")) PUT_ERR ( "wrong model time step\n");
250
251 int collection_size;
252 int const ref_collection_size[NO_OF_FIELDS] = {2,2,3,1,4,4,1,1,1,5};
254 if (collection_size != ref_collection_size[i])
255 PUT_ERR ( "wrong collection size\n");
256
258 if ((i < 6) && (role != 1)) PUT_ERR( "Wrong requested role\n" );
259 if ((i > 5) && (role != 2)) PUT_ERR( "Wrong requested role\n" );
260 }
261
262 // Data exchange
263
264 buffer = xmalloc (5 * NBR_CELLS * sizeof (*buffer));
265
266 /* field_id[0] represents "TAUX" wind stress component
267 field_id[1] represents "TAUY" wind stress component
268 field_id[2] represents "SFWFLX" surface fresh water flux
269 field_id[3] represents "SFTEMP" surface temperature
270 field_id[4] represents "THFLX" total heat flux
271 field_id[5] represents "ICEATM" ice temperatures and melt potential
272
273 field_id[6] represents "SST" sea surface temperature
274 field_id[7] represents "OCEANU" u component of ocean surface current
275 field_id[8] represents "OCEANV" v component of ocean surface current
276 field_id[9] represents "ICEOCE" ice thickness, concentration and temperatures
277 */
278
279 // Send fields to ocean
280 // --------------------
281
282 {
283 double *point_set_data[5];
284 double **collection_data[5];
285
286 for (int i = 0; i < 5; ++i) {
287 point_set_data[i] = buffer + i * NBR_CELLS;
288 collection_data[i] = &(point_set_data[i]);
289 }
290
291 // meridional wind stress
292 for (unsigned i = 0; i < NBR_CELLS; ++i ) buffer[0*NBR_CELLS+i] = 10.1;
293 for (unsigned i = 0; i < NBR_CELLS; ++i ) buffer[1*NBR_CELLS+i] = 10.2;
294
295 yac_cput ( field_id[0], 2, collection_data, &info, &ierror );
296
297 // zonal wind stress
298 for (unsigned i = 0; i < NBR_CELLS; ++i ) buffer[0*NBR_CELLS+i] = 20.1;
299 for (unsigned i = 0; i < NBR_CELLS; ++i ) buffer[1*NBR_CELLS+i] = 20.2;
300
301 yac_cput ( field_id[1], 2, collection_data, &info, &ierror );
302
303 // surface fresh water flux
304 for (unsigned i = 0; i < NBR_CELLS; ++i ) buffer[0*NBR_CELLS+i] = 30.1;
305 for (unsigned i = 0; i < NBR_CELLS; ++i ) buffer[1*NBR_CELLS+i] = 30.2;
306 for (unsigned i = 0; i < NBR_CELLS; ++i ) buffer[2*NBR_CELLS+i] = 30.3;
307
308 yac_cput ( field_id[2], 3, collection_data, &info, &ierror );
309
310 // surface temperature
311
312 for (unsigned i = 0; i < NBR_CELLS; ++i ) buffer[0*NBR_CELLS+i] = 40.1;
313
314 yac_cput ( field_id[3], 1, collection_data, &info, &ierror );
315
316 // total heat flux
317
318 for (unsigned i = 0; i < NBR_CELLS; ++i ) buffer[0*NBR_CELLS+i] = 50.1;
319 for (unsigned i = 0; i < NBR_CELLS; ++i ) buffer[1*NBR_CELLS+i] = 50.2;
320 for (unsigned i = 0; i < NBR_CELLS; ++i ) buffer[2*NBR_CELLS+i] = 50.3;
321 for (unsigned i = 0; i < NBR_CELLS; ++i ) buffer[3*NBR_CELLS+i] = 50.4;
322
323 yac_cput ( field_id[4], 4, collection_data, &info, &ierror );
324
325 // ice temperatures and melt potential
326
327 for (unsigned i = 0; i < NBR_CELLS; ++i ) buffer[0*NBR_CELLS+i] = 60.1;
328 for (unsigned i = 0; i < NBR_CELLS; ++i ) buffer[1*NBR_CELLS+i] = 60.2;
329 for (unsigned i = 0; i < NBR_CELLS; ++i ) buffer[2*NBR_CELLS+i] = 60.3;
330 for (unsigned i = 0; i < NBR_CELLS; ++i ) buffer[3*NBR_CELLS+i] = 60.4;
331
332 yac_cput ( field_id[5], 4, collection_data, &info, &ierror );
333
334 // check whether yac_ctest does not crash here
335 yac_ctest ( field_id[5], &flag );
336 }
337
338 //
339 // Receive fields from ocean
340 // -------------------------
341
342 {
343 double *collection_data[5];
344
345 for (int i = 0; i < 5; ++i) {
346 collection_data[i] = buffer + i * NBR_CELLS;
347 }
348
349 // SST
350
351 yac_cget ( field_id[6], 1, collection_data, &info, &ierror );
352 if (info > 0 && double_are_unequal(buffer[0], 110.1 ))
353 PUT_ERR("wrong atmosphere CPL SST\n");
354
355 // zonal velocity
356
357 yac_cget ( field_id[7], 1, collection_data, &info, &ierror );
358 if (info > 0 && double_are_unequal(buffer[0], 120.1 ))
359 PUT_ERR("wrong atmosphere CPL OCEANU\n");
360
361 // meridional velocity
362
363 yac_cget ( field_id[8], 1, collection_data, &info, &ierror );
364 if (info > 0 && double_are_unequal(buffer[0], 130.1 ))
365 PUT_ERR("wrong atmosphere CPL OCEANV\n");
366
367 // Ice thickness, concentration, T1 and T2
368
369 yac_cget_async ( field_id[9], 5, collection_data, &info, &ierror );
370 yac_cwait ( field_id[9] );
371
372 for (int i = 0; i < NBR_CELLS; ++i) {
373 if ( info > 0 ) {
374 if (double_are_unequal(buffer[0*NBR_CELLS + i], 140.1 ))
375 PUT_ERR ( "wrong atmosphere CPL ice 1\n");
376 if (double_are_unequal(buffer[1*NBR_CELLS + i], 140.2 ))
377 PUT_ERR ( "wrong atmosphere CPL ice 2\n");
378 if (double_are_unequal(buffer[2*NBR_CELLS + i], 140.3 ))
379 PUT_ERR ( "wrong atmosphere CPL ice 3\n");
380 if (double_are_unequal(buffer[3*NBR_CELLS + i], 140.4 ))
381 PUT_ERR ( "wrong atmosphere CPL ice 4\n");
382 if (double_are_unequal(buffer[4*NBR_CELLS + i], 140.5 ))
383 PUT_ERR ( "wrong atmosphere CPL ice 5\n");
384 }
385 }
386
387 // for target fields, yac_ctest should always return 1
388 yac_ctest ( field_id[9], &flag );
389 if (!flag) PUT_ERR("error in yac_ctest");
390 }
391
392 free (buffer);
393 free (field_id);
394
395 MPI_Comm_free ( &local_comm );
396}
397
398/* -------------------------------------------------------------------- */
399
400static void dummy_ocean () {
401
402 int size, rank;
403
404 MPI_Comm local_comm;
405
406 char * comp_name = "dummy_ocean";
407 char * grid_name = "dummy_ocean_grid";
408
409 // Inform the coupler about what we are
410 yac_cdef_comp ( comp_name, &comp_id );
411 comp_ids[0] = comp_id;
412
413 yac_cget_comp_comm ( comp_id, &local_comm );
414
415 MPI_Comm_rank ( local_comm, &rank );
416 MPI_Comm_size ( local_comm, &size );
417
418 // printf (" %s rank %d : local size %d \n", comp_name, rank, size );
419
420 buffer_lon = xmalloc ( NBR_VERTICES * sizeof(*buffer_lon) );
421 buffer_lat = xmalloc ( NBR_VERTICES * sizeof(*buffer_lat) );
422 cell_to_vertex = xmalloc ( 3 * NBR_CELLS * sizeof(*cell_to_vertex) );
423
424 /* Define vertices
425
426 0
427 / \
428 / o \
429 / \
430 1-------2 Eq.
431 \ /
432 \ o /
433 \ /
434 3
435
436 */
437
438 buffer_lon[0] = 0.0; buffer_lat[0] = 1.0;
439 buffer_lon[1] = -1.0; buffer_lat[1] = 0.0;
440 buffer_lon[2] = 1.0; buffer_lat[2] = 0.0;
441 buffer_lon[3] = 0.0; buffer_lat[3] = -1.0;
442
443 // Connectivity
444
445 cell_to_vertex[0] = 0; cell_to_vertex[1] = 1; cell_to_vertex[2] = 2; // cell 1
446 cell_to_vertex[3] = 1; cell_to_vertex[4] = 3; cell_to_vertex[5] = 2; // cell 2
447
448 for (unsigned i = 0; i < NBR_CELLS; ++i ) nbr_vertices_per_cell[i] = 3;
449
453
454 // Decomposition information
455
456 for (int i = 0; i < NBR_CELLS; ++i ) {
457 global_index[i] = i;
458 cell_core_mask[i] = 1;
459 }
460
463
464 // Center points in cells (needed e.g. for nearest neighbour)
465
466 buffer_lon[0] = 0.0; buffer_lat[0] = 0.5;
467 buffer_lon[1] = 0.0; buffer_lat[1] = -0.5;
468
471
472 free ( buffer_lon );
473 free ( buffer_lat );
474
475 // Mask generation
476
477 cell_mask = xmalloc (NBR_CELLS * sizeof(*cell_mask));
478
479 for (unsigned i = 0; i < NBR_CELLS; ++i) cell_mask[i] = 1;
480
482
484
485 free (cell_mask);
486
488
489 field_id = xmalloc ( NO_OF_FIELDS * sizeof(*field_id));
490
491 for (unsigned i = 0; i < NO_OF_FIELDS/2; ++i )
492 yac_cdef_field ( field[i].name,
493 comp_id,
495 1, field[i].collection_size,
496 "3600", YAC_TIME_UNIT_SECOND,
497 &field_id[i] );
498
499 for (unsigned i = NO_OF_FIELDS/2; i < NO_OF_FIELDS; ++i )
500 yac_cdef_field_mask ( field[i].name,
501 comp_id,
504 1, field[i].collection_size,
505 "3600", YAC_TIME_UNIT_SECOND,
506 &field_id[i] );
507
508 // read couplings from YAML configuration file
510
511 yac_cenddef ( );
512
513 // Data exchange
514
515 buffer = xmalloc (5 * NBR_CELLS * sizeof (*buffer));
516
517 /* field_id[0] represents "TAUX" wind stress component
518 field_id[1] represents "TAUY" wind stress component
519 field_id[2] represents "SFWFLX" surface fresh water flux
520 field_id[3] represents "SFTEMP" surface temperature
521 field_id[4] represents "THFLX" total heat flux
522 field_id[5] represents "ICEATM" ice temperatures and melt potential
523
524 field_id[6] represents "SST" sea surface temperature
525 field_id[7] represents "OCEANU" u component of ocean surface current
526 field_id[8] represents "OCEANV" v component of ocean surface current
527 field_id[9]represents "ICEOCE" ice thickness, concentration and temperatures
528 */
529
530 // Send fields from ocean to atmosphere
531 // ------------------------------------
532
533 {
534 double *point_set_data[5];
535 double **collection_data[5];
536
537 for (unsigned i = 0; i < 5; ++i) {
538 point_set_data[i] = buffer + i * NBR_CELLS;
539 collection_data[i] = &(point_set_data[i]);
540 }
541
542 // SST
543 for (unsigned i = 0; i < NBR_CELLS; ++i ) buffer[0*NBR_CELLS+i] = 110.1;
544
545 yac_cput ( field_id[6], 1, collection_data, &info, &ierror );
546
547 // zonal velocity
548
549 for (unsigned i = 0; i < NBR_CELLS; ++i ) buffer[0*NBR_CELLS+i] = 120.1;
550
551 yac_cput ( field_id[7], 1, collection_data, &info, &ierror );
552
553 // meridional velocity
554
555 for (unsigned i = 0; i < NBR_CELLS; ++i ) buffer[0*NBR_CELLS+i] = 130.1;
556
557 yac_cput ( field_id[8], 1, collection_data, &info, &ierror );
558
559 // Ice thickness, concentration, T1 and T2
560
561 for (unsigned i = 0; i < NBR_CELLS; ++i ) buffer[0*NBR_CELLS+i] = 140.1;
562 for (unsigned i = 0; i < NBR_CELLS; ++i ) buffer[1*NBR_CELLS+i] = 140.2;
563 for (unsigned i = 0; i < NBR_CELLS; ++i ) buffer[2*NBR_CELLS+i] = 140.3;
564 for (unsigned i = 0; i < NBR_CELLS; ++i ) buffer[3*NBR_CELLS+i] = 140.4;
565 for (unsigned i = 0; i < NBR_CELLS; ++i ) buffer[4*NBR_CELLS+i] = 140.5;
566
567 yac_cput ( field_id[9], 5, collection_data, &info, &ierror );
568 }
569
570 // Receive fields from atmosphere
571 // ------------------------------
572
573 {
574 double *collection_data[5];
575
576 for (unsigned i = 0; i < 5; ++i) {
577 collection_data[i] = buffer + i * NBR_CELLS;
578 }
579
580 // zonal wind stress
581
582 yac_cget ( field_id[0], 2, collection_data, &info, &ierror );
583
584 // meridional wind stress
585
586 yac_cget ( field_id[1], 2, collection_data, &info, &ierror );
587
588 // freshwater flux
589
590 yac_cget ( field_id[2], 3, collection_data, &info, &ierror );
591
592 // surface air temperature
593 yac_cget ( field_id[3], 1, collection_data, &info, &ierror );
594
595 // total heat flux - 4 parts - record 5
596
597 yac_cget ( field_id[4], 4, collection_data, &info, &ierror );
598
599 // ice parameter
600
601 yac_cget ( field_id[5], 4, collection_data, &info, &ierror );
602
603 }
604
605 free (buffer);
606 free (field_id);
607
608 MPI_Comm_free ( &local_comm );
609}
610
611/* -------------------------------------------------------------------- */
612
613static void dummy_io () {
614
615 int size, rank;
616
617 MPI_Comm local_comm;
618
619 field_id = NULL;
620
621 char * comp_name = "dummy_io";
622
623 // Inform the coupler about what we are
624 yac_cdef_comp ( comp_name, &comp_id );
625
626 yac_cget_comp_comm ( comp_id, &local_comm );
627
628 MPI_Comm_rank ( local_comm, &rank );
629 MPI_Comm_size ( local_comm, &size );
630
631 // printf (" %s rank %d : local size %d \n", comp_name, rank, size );
632
633 // An empty search call to mark the end of the definition phase
634
635 yac_cenddef ( );
636
637 MPI_Comm_free ( &local_comm );
638}
639
@ YAC_LOC_CELL
Definition location.h:14
#define xmalloc(size)
Definition ppm_xfuncs.h:66
int double_are_unequal(double a, double b)
static void dummy_atmosphere()
int nbr_vertices_per_cell[NBR_CELLS]
int * cell_to_vertex
int comp_ids[1]
int * cell_mask
static void dummy_io()
int global_index[NBR_CELLS]
int grid_id
int collection_size
char const * name
int cell_core_mask[NBR_CELLS]
double * buffer
int cell_mask_ids[1]
double * buffer_lat
double * buffer_lon
int * field_id
struct @84 field[]
char * yaml_filename
int cell_point_ids[1]
int comp_id
static void dummy_ocean()
#define TEST_EXIT_CODE
Definition tests.h:14
#define PUT_ERR(string)
Definition tests.h:10
void yac_ccompute_grid_cell_areas(int grid_id, double *cell_areas)
Definition yac.c:4887
void yac_cenddef(void)
Definition yac.c:4206
void yac_cdef_field_mask(char const *name, int const comp_id, int const *point_ids, int const *mask_ids, int const num_pointsets, int collection_size, const char *timestep, int time_unit, int *field_id)
Definition yac.c:1238
void yac_cset_global_index(int const *global_index, int location, int grid_id)
Definition yac.c:4795
int yac_cget_role_from_field_id(int field_id)
Definition yac.c:4528
const char * yac_cget_timestep_from_field_id(int field_id)
Definition yac.c:4514
void yac_cinit(void)
Definition yac.c:436
void yac_cfinalize()
Finalises YAC.
Definition yac.c:661
void yac_cget_comp_comm(int comp_id, MPI_Comm *comp_comm)
Definition yac.c:771
void yac_cget(int const field_id, int collection_size, double **recv_field, int *info, int *ierr)
Definition yac.c:2572
int yac_cget_collection_size_from_field_id(int field_id)
Definition yac.c:4521
int const YAC_TIME_UNIT_SECOND
Definition yac.c:55
void yac_cdef_grid_unstruct(const char *grid_name, int nbr_vertices, int nbr_cells, int *num_vertices_per_cell, double *x_vertices, double *y_vertices, int *cell_to_vertex, int *grid_id)
Definition yac.c:4673
void yac_cdef_points_unstruct(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:1096
void yac_cput(int const field_id, int const collection_size, double ***const send_field, int *info, int *ierr)
Definition yac.c:3527
void yac_cget_async(int const field_id, int collection_size, double **recv_field, int *info, int *ierr)
Definition yac.c:2581
void yac_cread_config_yaml(const char *yaml_filename)
Definition yac.c:516
void yac_cdef_calendar(int calendar)
Definition yac.c:690
void yac_cset_core_mask(int const *is_core, int location, int grid_id)
Definition yac.c:4836
void yac_cwait(int field_id)
Definition yac.c:3048
int yac_cget_calendar()
Definition yac.c:707
int const YAC_PROLEPTIC_GREGORIAN
Definition yac.c:64
void yac_cset_mask(int const *is_valid, int points_id)
Definition yac.c:1219
void yac_cdef_mask(int const grid_id, int const nbr_points, int const located, int const *is_valid, int *mask_id)
Definition yac.c:1210
void yac_ctest(int field_id, int *flag)
Definition yac.c:3024
void yac_cdef_comp(char const *comp_name, int *comp_id)
Definition yac.c:928
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:1311