17#include "mtime_calendar.h"
21#include "mtime_datetime.h"
126 xmalloc(1 *
sizeof(*couple_config));
134 couple_config->
grids = NULL;
145 return couple_config;
149 return (
string != NULL)?strdup(
string):NULL;
154 free((
void*)field->name);
155 free((
void*)field->timestep);
156 free(field->metadata);
163 for (
size_t i = 0; i < component->
num_fields; ++i)
166 free((
void*)(component->
name));
197 free((
void*)grid->
name);
203 void * config_output_) {
207 free((
void*)config_output->
name);
208 free((
void*)config_output->
ref);
214 "ERROR(yac_couple_config_grid_compare): "
215 "invalid name (NULL is not allowed)");
227 "ERROR(yac_couple_config_field_compare): "
228 "invalid name (NULL is not allowed)");
233 void const * a_,
void const * b_) {
237 "ERROR(yac_couple_config_component_compare): "
238 "invalid name (NULL is not allowed)");
243 void const * a_,
void const * b_) {
261 void const * a_,
void const * b_) {
273 void const * a,
void const * b) {
277 "ERROR(yac_couple_config_config_output_compare): "
278 "invalid ref (NULL is not allowed)");
284 char const * string_name,
char **
string, MPI_Comm comm) {
287 MPI_Comm_rank(comm, &rank);
292 size_t len = (*
string != NULL)?(strlen(*
string) + 1):0;
295 "ERROR(couple_config_sync_string): \"%s\" too long", string_name);
296 data_pair.len = (int)len;
297 data_pair.rank = rank;
302 MPI_IN_PLACE, &data_pair, 1, MPI_2INT, MPI_MAXLOC, comm), comm);
303 if (data_pair.len == 0)
return;
306 char const * string_bak = NULL;
307 if (data_pair.rank != rank) {
308 string_bak = *string;
309 *
string =
xmalloc((
size_t)data_pair.len *
sizeof(**
string));
312 MPI_Bcast(*
string, data_pair.len, MPI_CHAR, data_pair.rank, comm), comm);
315 if (data_pair.rank != rank) {
317 (string_bak == NULL) ||
318 !strcmp(string_bak, *
string),
319 "ERROR(couple_config_sync_string): inconsistent \"%s\" definition "
320 "(\"%s\" != \"%s\")", string_name, string_bak, *
string);
321 free((
void*)string_bak);
326 char const * flag_value_name,
enum flag_value * flag, MPI_Comm comm) {
328 int int_flag = (*flag ==
FLAG_UNSET)?INT_MAX:((int)*flag);
333 MPI_IN_PLACE, &int_flag, 1, MPI_INT, MPI_MIN, comm), comm);
336 if (int_flag == INT_MAX)
return;
340 (*flag ==
FLAG_UNSET) || ((
int)(*flag) == int_flag),
341 "ERROR(couple_config_sync_flag_value): inconsistent \"%s\"-flag definition "
342 "(%s != %s)", flag_value_name, ((int_flag ==
FLAG_TRUE)?
"TRUE":
"FALSE"),
351 int calendar = (int)getCalendarType();
352 if (calendar == CALENDAR_NOT_SET) calendar = INT_MAX;
357 MPI_IN_PLACE, &calendar, 1, MPI_INT, MPI_MIN, comm), comm);
360 if (calendar == INT_MAX)
return;
368 void * a_,
void * b_, MPI_Comm comm) {
383 "component metadata", (
char **)&(a->
metadata), comm);
387 void * a_,
void * b_, MPI_Comm comm) {
405 void * a_,
void * b_, MPI_Comm comm) {
419 MPI_Comm_rank(comm, &rank);
423 } data_pairs[DATA_PAIR_COUNT];
424 size_t timestep_len =
426 size_t metadata_len =
429 timestep_len <= INT_MAX,
430 "ERROR(yac_couple_config_field_merge): timestep string too long");
432 metadata_len <= INT_MAX,
433 "ERROR(yac_couple_config_field_merge): metadata string too long");
437 "ERROR(yac_couple_config_field_merge): invalid collection size \"%zu\"",
439 data_pairs[TIMESTEP_IDX].len = (int)timestep_len;
440 data_pairs[TIMESTEP_IDX].rank = rank;
441 data_pairs[METADATA_IDX].len = (int)metadata_len;
442 data_pairs[METADATA_IDX].rank = rank;
443 data_pairs[FRAC_MASK_IDX].len =
445 data_pairs[FRAC_MASK_IDX].rank = rank;
446 data_pairs[COLLECTION_SIZE_IDX].len =
449 data_pairs[COLLECTION_SIZE_IDX].rank = rank;
454 MPI_IN_PLACE, data_pairs, DATA_PAIR_COUNT, MPI_2INT,
455 MPI_MAXLOC, comm), comm);
458 if (data_pairs[TIMESTEP_IDX].len > 0) {
461 char * timestep_buffer =
xmalloc((
size_t)data_pairs[TIMESTEP_IDX].len);
462 if (data_pairs[TIMESTEP_IDX].rank == rank)
463 strcpy(timestep_buffer, b->
timestep);
466 timestep_buffer, data_pairs[TIMESTEP_IDX].len, MPI_CHAR,
467 data_pairs[TIMESTEP_IDX].rank, comm), comm);
471 (b == NULL) || (b->
timestep == NULL) ||
472 !strcmp(b->
timestep, timestep_buffer),
473 "ERROR(yac_couple_config_field_merge): "
474 "inconsistent timestep definition (\"%s\" != \"%s\")",
483 if (data_pairs[METADATA_IDX].len > 0) {
486 char * metadata_buffer =
xmalloc((
size_t)data_pairs[METADATA_IDX].len);
487 if (data_pairs[METADATA_IDX].rank == rank)
488 strcpy(metadata_buffer, b->
metadata);
491 metadata_buffer, data_pairs[METADATA_IDX].len, MPI_CHAR,
492 data_pairs[METADATA_IDX].rank, comm), comm);
496 (b == NULL) || (b->
metadata == NULL) ||
497 !strcmp(b->
metadata, metadata_buffer),
498 "ERROR(yac_couple_config_field_merge): "
499 "inconsistent metadata definition (\"%s\" != \"%s\")",
508 if (data_pairs[FRAC_MASK_IDX].len != 0) {
511 double frac_mask_fallback_value;
512 if (data_pairs[FRAC_MASK_IDX].rank == rank)
516 &frac_mask_fallback_value, 1, MPI_DOUBLE,
517 data_pairs[FRAC_MASK_IDX].rank, comm), comm);
526 sizeof(frac_mask_fallback_value)),
527 "ERROR(yac_couple_config_field_merge): "
528 "inconsistent fractional mask fallback value definition "
538 if (data_pairs[COLLECTION_SIZE_IDX].len > -1) {
544 "ERROR(yac_couple_config_field_merge): "
545 "inconsistent collection size definition (\"%zu\" != \"%d\")",
554 void * a_,
void * b_, MPI_Comm comm) {
558 if (b_ == NULL)
return;
565 "ERROR(yac_couple_config_field_couple_merge): "
569 "ERROR(yac_couple_config_field_couple_merge): "
573 "ERROR(yac_couple_config_field_couple_merge): "
574 "inconsistent mapping side (%d != %d)",
578 "ERROR(yac_couple_config_field_couple_merge): "
579 "inconsistent interpolation stack")
582 "ERROR(yac_couple_config_field_couple_merge): "
583 "inconsistent coupling period operation (%d != %d)",
587 "ERROR(yac_couple_config_field_couple_merge): "
588 "inconsistent coupling period (%s != %s)",
592 "ERROR(yac_couple_config_field_couple_merge): "
593 "inconsistent defintion of enforce_write_weight_file (%d != %d)",
598 "ERROR(yac_couple_config_field_couple_merge): "
599 "inconsistent weight_file_name (%s != %s)",
604 "ERROR(yac_couple_config_field_couple_merge): "
605 "inconsistent weight_file_on_existing (%d != %d)",
609 "ERROR(yac_couple_config_field_couple_merge): "
610 "inconsistent scale factor (%lf != %lf)",
614 "ERROR(yac_couple_config_field_couple_merge): "
615 "inconsistent scale summand (%lf != %lf)",
619 "ERROR(yac_couple_config_field_couple_merge): "
620 "inconsistent number of source mask names (%zu != %zu)",
624 "ERROR(yac_couple_config_field_couple_merge): "
625 "inconsistent availability of source mask names (%s != %s)",
631 "ERROR(yac_couple_config_field_couple_merge): "
632 "inconsistent source mask names at index %zu (\"%s\" != \"%s\")",
636 "ERROR(yac_couple_config_field_couple_merge): "
637 "inconsistent availability of target mask name (%s != %s)",
643 "ERROR(yac_couple_config_field_couple_merge): "
644 "inconsistent target mask name (\"%s\" != \"%s\")",
648 "ERROR(yac_couple_config_field_couple_merge): "
649 "inconsistent availability of yaxt exchanger name (%s != %s)",
655 "ERROR(yac_couple_config_field_couple_merge): "
656 "inconsistent yaxt exchanger name (\"%s\" != \"%s\")",
660 "ERROR(yac_couple_config_field_couple_merge): "
661 "inconsistent defintion of use_raw_exchange (%d != %d)",
666 size_t * num_field_couples,
670 void * a_,
void * b_, MPI_Comm comm) {
687 void * a_,
void * b_, MPI_Comm comm) {
696 "ERROR(yac_couple_config_config_output_merge): "
697 "inconsistent file names for ref \"%s\" (\"%s\" != \"%s\")",
701 "ERROR(yac_couple_config_config_output_merge): "
702 "inconsistent file types for ref \"%s\" (%d != %d)",
722 for (
size_t i = 0; i < couple_config->
num_grids; ++i){
725 free(couple_config->
grids);
732 for (
size_t couple_idx = 0; couple_idx < couple_config->
num_couples;
744 "ERROR(yac_couple_config_add_grid_): "
745 "invalid name (NULL is not allowed)")
747 for (
size_t i = 0; i < couple_config->
num_grids; ++i)
750 size_t grid_idx = couple_config->
num_grids;
752 couple_config->
grids =
754 couple_config->
grids,
773 "ERROR(yac_couple_config_add_component_): "
774 "invalid name (NULL is not allowed)")
789 return component_idx;
800 char const * comp_name,
const char* metadata) {
804 = metadata==NULL?NULL:strdup(metadata);
809 char const * grid_name,
const char* output_filename) {
814 output_filename != NULL,
815 "ERROR(yac_couple_config_grid_set_output_filename): invalid output filename "
816 "for grid \"%s\" (NULL is not allowed)",
821 "ERROR(yac_couple_config_grid_set_output_filename): output file name for grid "
822 "\"%s\" has already been set (\"%s\" != \"%s\")",
830 char const * grid_name,
const char* metadata) {
836 = metadata==NULL?NULL:strdup(metadata);
841 const char* comp_name,
const char * grid_name,
const char* field_name,
842 const char* metadata) {
846 comp_idx, grid_idx, field_name);
849 = metadata==NULL?NULL:strdup(metadata);
854 const char * comp_name) {
861 const char * grid_name) {
868 const char * grid_name) {
875 const char* comp_name,
const char * grid_name,
const char* field_name) {
879 comp_idx, grid_idx, field_name);
885 char const * routine_name,
int line) {
889 "ERROR(%s:%d:%s): invalid component_idx", __FILE__, line, routine_name)
894 char const * routine_name,
int line) {
898 "ERROR(%s:%d:%s): invalid grid_idx", __FILE__, line, routine_name)
903 size_t comp_idx,
size_t grid_idx,
char const *
name,
904 char const * timestep,
size_t collection_size) {
907 couple_config, comp_idx,
908 "yac_couple_config_component_add_field_", __LINE__);
910 couple_config, grid_idx,
911 "yac_couple_config_component_add_field_", __LINE__);
916 for (
size_t i = 0; i < component->
num_fields; i++) {
928 "ERROR(yac_couple_config_component_add_field): "
929 "inconsistent timestep definition (\"%s\" != \"%s\")",
932 collection_size == SIZE_MAX ||
934 "ERROR(yac_couple_config_component_add_field): "
935 "inconsistent collection_size definition (%zu != %zu)",
948 sizeof(*(component->
fields)));
950 component->
fields + field_idx;
952 field->name = strdup(
name);
955 field->metadata = NULL;
963 const char* grid_name,
const char*
name,
char const *
timestep,
992 int missing_definition_is_fatal) {
1000 "ERROR(yac_couple_config_set_missing_definition_is_fatal): "
1001 "inconsistent setting of \"missing_definition_is_fatal\"-flag "
1002 "(old: %s new: %s)",
1004 (user_value ==
FLAG_TRUE)?
"TRUE":
"FALSE");
1011 char const * routine_name,
int line) {
1014 couple_idx < couple_config->num_couples,
1015 "ERROR(%s:%d:%s): invalid couple_idx", __FILE__, line, routine_name);
1022 couple_config, couple_idx,
"yac_couple_config_get_num_couple_fields",
1030 char const * couple_component_names[2]) {
1033 couple_config, couple_idx,
"yac_couple_config_get_couple_component_names",
1036 for (
int i = 0; i < 2; ++i)
1037 couple_component_names[i] =
1047 "ERROR(yac_couple_config_component_name_is_valid): component name is NULL")
1050 "ERROR(yac_couple_config_component_name_is_valid): "
1051 "component name is too long (maximum is YAC_MAX_CHARLEN)")
1053 for (
size_t component_idx = 0; component_idx < couple_config->
num_components;
1055 if (!strcmp(component_name, couple_config->
components[component_idx].
name))
1075 "yac_couple_config_get_num_fields", __LINE__);
1082 size_t component_idx = SIZE_MAX;
1084 (component_idx == SIZE_MAX); ++i)
1089 component_idx != SIZE_MAX,
1090 "ERROR(yac_couple_config_get_component_idx): "
1091 "Component \"%s\" not found in coupling configuration",
1094 return component_idx;
1103 if (!strcmp(couple_config->
grids[i].
name, grid_name))
1108 "ERROR(yac_couple_config_get_grid_idx): "
1109 "grid name \"%s\" not in list of grids", grid_name)
1116 size_t grid_idx,
char const * field_name) {
1118 couple_config, component_idx,
1119 "yac_couple_config_get_component_name", __LINE__);
1121 size_t field_idx = SIZE_MAX;
1126 (i<nbr_fields) && (field_idx == SIZE_MAX); ++i)
1134 field_idx != SIZE_MAX,
1135 "ERROR(yac_couple_config_get_field_idx): "
1137 "(component_idx %zu grid_idx %zu field_name \"%s\"",
1138 component_idx, grid_idx, field_name);
1147 couple_config, component_idx,
1148 "yac_couple_config_get_component_name", __LINE__);
1155 size_t field_idx,
char const * routine_name,
int line) {
1158 couple_config, component_idx, routine_name, __LINE__);
1163 "ERROR(%s:%d:%s): invalid field_idx", __FILE__,
1172 couple_config, component_idx, field_idx,
1173 "yac_couple_config_get_field_grid_name", __LINE__);
1176 couple_config->
grids[
1187 couple_config, component_idx, field_idx,
1188 "yac_couple_config_get_field_name", __LINE__);
1198 char const * component_name,
char const * grid_name,
1199 char const * field_name) {
1201 size_t component_idx =
1207 couple_config, component_idx, grid_idx, field_name);
1213 return field->timestep;
1218 char const * component_name,
char const * grid_name,
1219 char const * field_name) {
1221 size_t component_idx =
1227 couple_config, component_idx,
grid_idx, field_name);
1230 for(
size_t couple_idx = 0; couple_idx<nbr_couples; ++couple_idx){
1236 for(
size_t trans_couple_idx = 0; trans_couple_idx < nbr_trans_couples;
1237 ++trans_couple_idx){
1257 "yac_couple_config_field_is_valid", __LINE__);
1260 "yac_couple_config_field_is_valid", __LINE__);
1266 return (field->collection_size != SIZE_MAX) &&
1267 (field->timestep != NULL);
1272 size_t field_couple_idx,
char const * routine_name,
int line) {
1279 "ERROR(%s:%d:%s): invalid field_couple_idx",
1280 __FILE__, line, routine_name)
1285 size_t couple_idx,
size_t field_couple_idx) {
1288 couple_config, couple_idx, field_couple_idx,
1289 "yac_couple_config_get_interp_stack", __LINE__);
1293 couples[couple_idx].
1294 field_couples[field_couple_idx].interp_stack;
1299 size_t couple_idx,
size_t field_couple_idx,
1300 char const ** src_grid_name,
char const ** tgt_grid_name) {
1303 couple_config, couple_idx, field_couple_idx,
1304 "yac_couple_config_get_field_grid_names", __LINE__);
1306 size_t src_component_idx =
1307 couple_config->
couples[couple_idx].
1308 field_couples[field_couple_idx].
1309 source.component_idx;
1310 size_t src_field_idx =
1311 couple_config->
couples[couple_idx].
1312 field_couples[field_couple_idx].
1315 size_t tgt_component_idx =
1316 couple_config->
couples[couple_idx].
1317 field_couples[field_couple_idx].
1318 target.component_idx;
1319 size_t tgt_field_idx =
1320 couple_config->
couples[couple_idx].
1321 field_couples[field_couple_idx].
1325 couple_config->
grids[
1326 couple_config->
components[src_component_idx].
1327 fields[src_field_idx].grid_idx].
name;
1329 couple_config->
grids[
1330 couple_config->
components[tgt_component_idx].
1331 fields[tgt_field_idx].grid_idx].
name;
1336 char const * comp_name,
char const * grid_name,
char const * field_name,
1337 double frac_mask_fallback_value) {
1341 "ERROR(yac_couple_config_field_enable_frac_mask): "
1342 "\"%lf\" is not a valid fractional mask fallback value "
1343 "(component: \"%s\" grid: \"%s\" field \"%s\")",
1344 frac_mask_fallback_value, comp_name, grid_name, field_name);
1349 comp_idx, grid_idx, field_name);
1351 double old_frac_mask_fallback_value =
1353 frac_mask_fallback_value;
1359 &old_frac_mask_fallback_value, &frac_mask_fallback_value,
1360 sizeof(frac_mask_fallback_value)),
1361 "ERROR(yac_couple_config_field_enable_frac_mask): "
1362 "fractional mask fallback value was already set:\n"
1363 "\told value \"%lf\" new value \"%lf\" "
1364 "(component: \"%s\" grid: \"%s\" field \"%s\")",
1365 old_frac_mask_fallback_value, frac_mask_fallback_value,
1366 comp_name, grid_name, field_name);
1369 frac_mask_fallback_value = frac_mask_fallback_value;
1374 char const * component_name,
char const * grid_name,
1375 char const * field_name) {
1377 size_t component_idx =
1383 couple_config, component_idx, grid_idx, field_name);
1391 "ERROR(yac_couple_config_get_frac_mask_fallback_value): "
1392 "no valid fractional mask fallback value defined "
1393 "(component: \"%s\" grid: \"%s\" field \"%s\")",
1394 couple_config->
components[component_idx].
name, grid_name, field->name);
1396 return field->frac_mask_fallback_value;
1401 char const * component_name,
char const * grid_name,
1402 char const * field_name) {
1404 size_t component_idx =
1410 couple_config, component_idx,
grid_idx, field_name);
1416 return field->collection_size;
1421 size_t couple_idx,
size_t field_couple_idx,
1422 char const ** src_component_name,
char const ** tgt_component_name) {
1425 couple_config, couple_idx, field_couple_idx,
1426 "yac_couple_config_get_field_couple_component_names", __LINE__);
1428 *src_component_name =
1430 couple_config->
couples[couple_idx].
1431 field_couples[field_couple_idx].source.component_idx].
name;
1432 *tgt_component_name =
1434 couple_config->
couples[couple_idx].
1435 field_couples[field_couple_idx].target.component_idx].
name;
1440 size_t couple_idx,
size_t field_couple_idx,
1441 char const ** src_field_name,
const char ** tgt_field_name) {
1444 couple_config, couple_idx, field_couple_idx,
1445 "yac_couple_config_get_field_names", __LINE__);
1447 size_t src_component_idx =
1448 couple_config->
couples[couple_idx].
1449 field_couples[field_couple_idx].source.component_idx;
1450 size_t tgt_component_idx =
1451 couple_config->
couples[couple_idx].
1452 field_couples[field_couple_idx].target.component_idx;
1453 size_t src_field_idx =
1454 couple_config->
couples[couple_idx].
1455 field_couples[field_couple_idx].source.field_idx;
1456 size_t tgt_field_idx =
1457 couple_config->
couples[couple_idx].
1458 field_couples[field_couple_idx].target.field_idx;
1461 couple_config->
components[src_component_idx].
1462 fields[src_field_idx].name;
1464 couple_config->
components[tgt_component_idx].
1465 fields[tgt_field_idx].name;
1470 size_t couple_idx,
size_t field_couple_idx) {
1473 couple_config, couple_idx, field_couple_idx,
1474 "yac_couple_config_mapping_on_source", __LINE__);
1478 couples[couple_idx].
1479 field_couples[field_couple_idx].
1485 size_t couple_idx,
size_t field_couple_idx) {
1488 couple_config, couple_idx, field_couple_idx,
1489 "yac_couple_config_get_source_lag", __LINE__);
1493 couples[couple_idx].
1494 field_couples[field_couple_idx].
1500 size_t couple_idx,
size_t field_couple_idx) {
1503 couple_config, couple_idx, field_couple_idx,
1504 "yac_couple_config_get_target_lag", __LINE__);
1508 couples[couple_idx].
1509 field_couples[field_couple_idx].
1515 size_t couple_idx,
size_t field_couple_idx) {
1518 couple_config, couple_idx, field_couple_idx,
1519 "yac_couple_config_get_coupling_period", __LINE__);
1523 couples[couple_idx].
1524 field_couples[field_couple_idx].
1530 size_t couple_idx,
size_t field_couple_idx) {
1533 couple_config, couple_idx, field_couple_idx,
1534 "yac_couple_config_get_source_timestep", __LINE__);
1538 char const * timestep =
1544 "ERROR(yac_couple_config_get_source_timestep): "
1545 "no valid timestep defined (component: \"%s\" field \"%s\")",
1555 size_t couple_idx,
size_t field_couple_idx) {
1558 couple_config, couple_idx, field_couple_idx,
1559 "yac_couple_config_get_target_timestep", __LINE__);
1563 char const * timestep =
1572 size_t couple_idx,
size_t field_couple_idx) {
1575 couple_config, couple_idx, field_couple_idx,
1576 "yac_couple_config_get_coupling_period_operation", __LINE__);
1580 couples[couple_idx].
1581 field_couples[field_couple_idx].
1586 char const * type_datetime,
struct _datetime ** old,
char const * str_new) {
1588 if ((str_new == NULL) || (strlen(str_new) == 0))
return;
1592 "ERROR(set_datetime): calendar has not yet been set");
1594 struct _datetime *
new = newDateTime(str_new);
1598 "ERROR(set_datetime): failed to parse datetime \"%s\"", str_new);
1600 char old_datetime_buffer[MAX_DATETIME_STR_LEN],
1601 new_datetime_buffer[MAX_DATETIME_STR_LEN];
1604 (*old == NULL) || (equal_to == compareDatetime(*old,
new)),
1605 "ERROR(set_datetime): inconsistent %s datetime "
1606 "(old: \"%s\" new: \"%s\")", type_datetime,
1607 datetimeToString(*old, old_datetime_buffer),
1608 datetimeToString(
new, new_datetime_buffer));
1610 deallocateDateTime(*old);
1617 char const * start,
char const * end) {
1627 "ERROR(yac_couple_config_get_start_datetime): "
1628 "start_datetime not yet defined");
1630 char datetime_buffer[MAX_DATETIME_STR_LEN];
1633 strdup(datetimeToString(couple_config->
start_datetime, datetime_buffer));
1640 "ERROR(yac_couple_config_get_start_datetime): "
1641 "start_datetime not yet defined");
1643 char datetime_buffer[MAX_DATETIME_STR_LEN];
1646 strdup(datetimeToString(couple_config->
end_datetime, datetime_buffer));
1654 "ERROR(yac_couple_config_get_grid_name): "
1655 "Invalid grid idx %zu", grid_idx);
1657 return couple_config->
grids[grid_idx].
name;
1662 size_t couple_idx,
size_t field_couple_idx) {
1665 couple_config, couple_idx, field_couple_idx,
1666 "yac_couple_config_enforce_write_weight_file", __LINE__);
1670 couples[couple_idx].
1671 field_couples[field_couple_idx].
1672 enforce_write_weight_file;
1677 size_t couple_idx,
size_t field_couple_idx) {
1680 couple_config, couple_idx, field_couple_idx,
1681 "yac_couple_config_get_weight_file_name", __LINE__);
1683 static char dummy[] =
"\0";
1684 char const * weight_file_name =
1686 couples[couple_idx].
1687 field_couples[field_couple_idx].
1690 return (weight_file_name != NULL)?weight_file_name:dummy;
1695 size_t couple_idx,
size_t field_couple_idx) {
1698 couple_config, couple_idx, field_couple_idx,
1699 "yac_couple_config_get_weight_file_on_existing", __LINE__);
1703 couples[couple_idx].
1704 field_couples[field_couple_idx].
1705 weight_file_on_existing;
1710 size_t couple_idx,
size_t field_couple_idx) {
1713 couple_config, couple_idx, field_couple_idx,
1714 "yac_couple_config_get_scale_factor", __LINE__);
1718 couples[couple_idx].
1719 field_couples[field_couple_idx].
1725 size_t couple_idx,
size_t field_couple_idx) {
1728 couple_config, couple_idx, field_couple_idx,
1729 "yac_couple_config_get_scale_summand", __LINE__);
1733 couples[couple_idx].
1734 field_couples[field_couple_idx].
1740 size_t couple_idx,
size_t field_couple_idx,
1741 char const *
const ** mask_names,
size_t * num_mask_names) {
1744 couple_config, couple_idx, field_couple_idx,
1745 "yac_couple_config_get_src_mask_names", __LINE__);
1748 (
char const *
const *)(
1750 couples[couple_idx].
1751 field_couples[field_couple_idx].
1755 couples[couple_idx].
1756 field_couples[field_couple_idx].
1762 size_t couple_idx,
size_t field_couple_idx) {
1765 couple_config, couple_idx, field_couple_idx,
1766 "yac_couple_config_get_tgt_mask_name", __LINE__);
1770 couples[couple_idx].
1771 field_couples[field_couple_idx].
1777 size_t couple_idx,
size_t field_couple_idx) {
1780 couple_config, couple_idx, field_couple_idx,
1781 "yac_couple_config_get_yaxt_exchanger_name", __LINE__);
1785 couples[couple_idx].
1786 field_couples[field_couple_idx].
1787 yaxt_exchanger_name;
1792 size_t couple_idx,
size_t field_couple_idx) {
1795 couple_config, couple_idx, field_couple_idx,
1796 "yac_couple_config_get_use_raw_exchange", __LINE__);
1800 couples[couple_idx].
1801 field_couples[field_couple_idx].
1808 for (
size_t grid_idx = 0; grid_idx < couple_config->
num_grids;
1810 if (!strcmp(couple_config->
grids[grid_idx].
name, grid_name))
1816 char const *
string, MPI_Comm comm) {
1818 int strlen_pack_size, string_pack_size;
1819 yac_mpi_call(MPI_Pack_size(1, MPI_INT, comm, &strlen_pack_size), comm);
1821 if (
string != NULL) {
1824 (
int)(strlen(
string)), MPI_CHAR, comm, &string_pack_size), comm);
1826 string_pack_size = 0;
1829 return (
size_t)strlen_pack_size + (size_t)string_pack_size;
1833 void * grid_, MPI_Comm comm) {
1841 void * field_, MPI_Comm comm) {
1847 field->grid_idx <= INT_MAX,
1848 "ERROR(yac_couple_config_get_field_pack_size):"
1849 "grid_idx is too big")
1852 yac_mpi_call(MPI_Pack_size(1, MPI_INT, comm, &int_pack_size), comm);
1856 return int_pack_size +
1861 void * component_, MPI_Comm comm) {
1871 void * field_couple_, MPI_Comm comm) {
1877 yac_mpi_call(MPI_Pack_size(12, MPI_INT, comm, &ints_pack_size), comm);
1878 int doubles_pack_size;
1879 yac_mpi_call(MPI_Pack_size(2, MPI_DOUBLE, comm, &doubles_pack_size), comm);
1880 int src_mask_names_pack_size = 0;
1883 src_mask_names_pack_size +=
1888 (
size_t)ints_pack_size +
1908 src_mask_names_pack_size +
1916 void * couple_, MPI_Comm comm) {
1920 int component_indices_pack_size;
1922 MPI_Pack_size(2, MPI_INT, comm, &component_indices_pack_size), comm);
1924 return (
size_t)component_indices_pack_size;
1928 void * config_output_, MPI_Comm comm) {
1932 int filetype_pack_size;
1934 MPI_Pack_size(1, MPI_INT, comm, &filetype_pack_size), comm);
1937 filetype_pack_size +
1943 char const *
string,
void * buffer,
int buffer_size,
int * position,
1946 size_t len = (
string == NULL)?0:strlen(
string);
1949 len <= INT_MAX,
"ERROR(yac_couple_config_pack_string): string too long")
1951 int len_int = (int)len;
1955 &len_int, 1, MPI_INT, buffer, buffer_size, position, comm), comm);
1960 string, len_int, MPI_CHAR, buffer, buffer_size, position, comm),
1965 void * grid_,
void * buffer,
int buffer_size,
int * position, MPI_Comm comm) {
1970 grid->
name, buffer, buffer_size, position, comm);
1974 void * field_,
void * buffer,
int buffer_size,
int * position, MPI_Comm comm) {
1980 field->grid_idx <= INT_MAX,
1981 "ERROR(yac_couple_config_pack_field): grid_idx is too big")
1983 int grid_idx = (int)field->grid_idx;
1987 &
grid_idx, 1, MPI_INT, buffer, buffer_size, position, comm), comm);
1989 buffer_size, position, comm);
1993 void * component_,
void * buffer,
int buffer_size,
int * position, MPI_Comm comm) {
1999 component->
name, buffer, buffer_size, position, comm);
2003 void * field_couple_,
void * buffer,
int buffer_size,
int * position,
2011 "ERROR(yac_couple_config_pack_field_couple): "
2012 "source.component_idx bigger than INT_MAX")
2015 "ERROR(yac_couple_config_pack_field_couple): "
2016 "source.field_idx bigger than INT_MAX")
2019 "ERROR(yac_couple_config_pack_field_couple): "
2020 "target.component_idx bigger than INT_MAX")
2023 "ERROR(yac_couple_config_pack_field_couple): "
2024 "target.field_idx bigger than INT_MAX")
2027 "ERROR(yac_couple_config_pack_field_couple): "
2028 "mapping_on_source bigger than INT_MAX")
2031 "ERROR(yac_couple_config_pack_field_couple): "
2032 "coupling_period_operation bigger than INT_MAX")
2035 "ERROR(yac_couple_config_pack_field_couple): "
2036 "enforce_write_weight_file bigger than INT_MAX")
2039 "ERROR(yac_couple_config_pack_field_couple): "
2040 "weight_file_on_existing bigger than INT_MAX")
2043 "ERROR(yac_couple_config_pack_field_couple): "
2044 "num_src_mask_names bigger than INT_MAX")
2059 enum {NUM_INTS =
sizeof(ints) /
sizeof(ints[0])};
2063 ints, NUM_INTS, MPI_INT, buffer, buffer_size, position, comm), comm);
2070 double doubles[2] = {
2075 MPI_Pack(doubles, 2, MPI_DOUBLE, buffer, buffer_size, position, comm),
2079 field_couple->
interp_stack, buffer, buffer_size, position, comm);
2084 field_couple->
src_mask_names[i], buffer, buffer_size, position, comm);
2087 field_couple->
tgt_mask_name, buffer, buffer_size, position, comm);
2094 void * couple_,
void * buffer,
int buffer_size,
int * position, MPI_Comm comm) {
2102 "ERROR(yac_couple_config_pack_couple): "
2103 "component_indices bigger than INT_MAX")
2115 void * config_output_,
void * buffer,
int buffer_size,
int * position,
2122 config_output->
name, buffer, buffer_size, position, comm);
2123 int filetype_int = (int)config_output->
type;
2126 &filetype_int, 1, MPI_INT, buffer, buffer_size, position, comm), comm);
2128 config_output->
ref, buffer, buffer_size, position, comm);
2132 void * buffer,
int buffer_size,
int * position, MPI_Comm comm) {
2137 buffer, buffer_size, position, &string_len, 1, MPI_INT, comm), comm);
2139 if (string_len <= 0)
return NULL;
2141 char *
string =
xmalloc(((
size_t)string_len + 1) *
sizeof(*
string));
2144 buffer, buffer_size, position,
string, string_len, MPI_CHAR, comm), comm);
2145 string[string_len] =
'\0';
2150 void * buffer,
int buffer_size,
int * position,
void * grid_,
2163 void * buffer,
int buffer_size,
int * position,
void * field_,
2172 buffer, buffer_size, position, &grid_idx_int, 1, MPI_INT, comm), comm);
2176 "ERROR(yac_couple_config_unpack_field): invalid number of grid_idx_int")
2178 field->grid_idx = (size_t)grid_idx_int;
2180 field->collection_size = SIZE_MAX;
2182 buffer_size, position, comm);
2183 field->timestep = NULL;
2184 field->metadata = NULL;
2188 void * buffer,
int buffer_size,
int * position,
void * component_,
2198 component->
fields = NULL;
2202 void * buffer,
int buffer_size,
int * position,
void * field_couple_,
2211 buffer, buffer_size, position, ints, 12, MPI_INT, comm), comm);
2215 "ERROR(yac_couple_config_unpack_field_couple): "
2216 "invalid source.component_idx")
2219 "ERROR(yac_couple_config_unpack_field_couple): "
2220 "invalid source.field_idx")
2223 "ERROR(yac_couple_config_unpack_field_couple): "
2224 "target.component_idx bigger than INT_MAX")
2227 "ERROR(yac_couple_config_unpack_field_couple): "
2228 "invalid target.field_idx")
2231 "ERROR(yac_couple_config_unpack_field_couple): "
2232 "invalid mapping_on_source")
2235 "ERROR(yac_couple_config_unpack_field_couple): "
2236 "invalid coupling_period_operation")
2239 "ERROR(yac_couple_config_unpack_field_couple): "
2240 "invalid enforce_write_weight_file")
2243 "ERROR(yac_couple_config_unpack_field_couple): "
2244 "invalid weight_file_on_existing")
2247 "ERROR(yac_couple_config_unpack_field_couple): "
2248 "invalid num_src_mask_names")
2250 (ints[11] == 0) || (ints[11] == 1),
2251 "ERROR(yac_couple_config_unpack_field_couple): "
2252 "invalid use_raw_exchange")
2277 buffer, buffer_size, position, doubles, 2, MPI_DOUBLE, comm), comm);
2293 buffer, buffer_size, position, comm);
2300 buffer, buffer_size, position, comm);
2304 buffer, buffer_size, position, comm);
2308 void * buffer,
int buffer_size,
int * position,
void * couple_,
2322 "ERROR(yac_couple_config_unpack_couple): invalid component indices")
2331 void * buffer,
int buffer_size,
int * position,
void * config_output_,
2337 config_output->
name =
2342 buffer, buffer_size, position, &filetype_int, 1, MPI_INT, comm),
2345 config_output->
ref =
2352 char const * src_comp_name,
char const * src_grid_name,
char const * src_field_name,
2353 char const * tgt_comp_name,
char const * tgt_grid_name,
char const * tgt_field_name,
2354 char const * coupling_period,
int time_reduction,
2356 const char* weight_file_name,
int weight_file_on_existing,
2357 int mapping_on_source,
double scale_factor,
double scale_summand,
2358 size_t num_src_mask_names,
char const *
const * src_mask_names,
2359 char const * tgt_mask_name,
char const * yaxt_exchanger_name,
2360 int use_raw_exchange) {
2362 YAC_ASSERT(src_comp_name && src_comp_name[0] !=
'\0',
2363 "ERROR(yac_couple_config_def_couple): invalid parameter: src_comp_name");
2364 YAC_ASSERT(src_grid_name && src_grid_name[0] !=
'\0',
2365 "ERROR(yac_couple_config_def_couple): invalid parameter: src_grid_name");
2366 YAC_ASSERT(src_field_name && src_field_name[0] !=
'\0',
2367 "ERROR(yac_couple_config_def_couple): invalid parameter: src_field_name");
2368 YAC_ASSERT(tgt_comp_name && tgt_comp_name[0] !=
'\0',
2369 "ERROR(yac_couple_config_def_couple): invalid parameter: tgt_comp_name");
2370 YAC_ASSERT(tgt_grid_name && tgt_grid_name[0] !=
'\0',
2371 "ERROR(yac_couple_config_def_couple): invalid parameter: tgt_grid_name");
2372 YAC_ASSERT(tgt_field_name && tgt_field_name[0] !=
'\0',
2373 "ERROR(yac_couple_config_def_couple): invalid parameter: tgt_field_name");
2374 YAC_ASSERT(coupling_period && coupling_period[0] !=
'\0',
2375 "ERROR(yac_couple_config_def_couple): invalid parameter: coupling_period");
2382 "ERROR(yac_couple_config_def_couple): invalid parameter: time_reduction");
2384 "ERROR(yac_couple_config_def_couple): \"%lf\" is not a valid scale factor",
2386 YAC_ASSERT_F(isnormal(scale_summand) || (scale_summand == 0.0),
2387 "ERROR(yac_couple_config_def_couple): \"%lf\" is not a valid scale summand",
2393 "ERROR(yac_couple_config_def_couple): invalid parameter: weight_file_on_existing");
2396 size_t src_comp_idx =
2398 size_t tgt_comp_idx =
2400 size_t src_grid_idx =
2402 size_t tgt_grid_idx =
2406 size_t component_indices[2];
2407 if(src_comp_idx < tgt_comp_idx){
2408 component_indices[0] = src_comp_idx;
2409 component_indices[1] = tgt_comp_idx;
2411 component_indices[0] = tgt_comp_idx;
2412 component_indices[1] = src_comp_idx;
2415 for(
size_t i = 0; (i < couple_config->
num_couples) && !couple; ++i)
2418 couple = &couple_config->
couples[i];
2435 size_t src_field_idx =
2437 couple_config, src_comp_idx, src_grid_idx,
2438 src_field_name, NULL, SIZE_MAX);
2439 size_t tgt_field_idx =
2441 couple_config, tgt_comp_idx, tgt_grid_idx,
2442 tgt_field_name, NULL, SIZE_MAX);
2497 char const * type_datetime,
struct _datetime ** datetime, MPI_Comm comm) {
2500 char datetime_buffer[MAX_DATETIME_STR_LEN];
2501 char * str_datetime = datetimeToString(*datetime, datetime_buffer);
2504 if (str_datetime != NULL) str_datetime = strdup(str_datetime);
2507 deallocateDateTime(*datetime);
2513 *datetime = newDateTime(str_datetime);
2575 size_t* old_to_new_idx;
2576 void * p_grids = couple_config->
grids;
2579 sizeof(couple_config->
grids[0]),
2581 couple_config->
grids = p_grids;
2584 for(
size_t comp_idx = 0; comp_idx < couple_config->
num_components;
2588 for(
size_t field_idx = 0; field_idx < component->
num_fields; ++field_idx)
2593 free(old_to_new_idx);
2602 size_t* old_to_new_idx;
2603 void * p_fields = component->
fields;
2606 sizeof(component->
fields[0]),
2608 component->
fields = p_fields;
2611 for(
size_t couple_idx = 0; couple_idx < couple_config->
num_couples;
2614 couple_config->
couples + couple_idx;
2615 for(
size_t field_couple_idx = 0;
2628 free(old_to_new_idx);
2636 size_t* old_to_new_idx;
2637 void * p_components = couple_config->
components;
2645 for(
size_t couple_idx = 0; couple_idx < couple_config->
num_couples;
2648 couple_config->
couples + couple_idx;
2656 for(
size_t field_couple_idx = 0;
2666 free(old_to_new_idx);
2669 for (
size_t comp_idx = 0; comp_idx < couple_config->
num_components; ++comp_idx)
2689 void * p_couples = couple_config->
couples;
2692 sizeof(couple_config->
couples[0]),
2694 couple_config->
couples = p_couples;
2712 char const * output_ref){
2723 "missing_definition_is_fatal",
2727 if (output_ref != NULL)
2729 (config_output == NULL); ++i)
2733 if (config_output != NULL) {
2736 MPI_Comm_rank(comm, &rank);
2741 FILE * config_file = fopen(config_output->
name,
"w");
2744 config_file != NULL,
2745 "ERROR(yac_couple_config_sync): "
2746 "failed to create coupling configuration file \"%s\"",
2747 config_output->
name);
2752 "ERROR(yac_couple_config_sync): "
2753 "invalid coupling configuration filetype (type = %d)",
2754 config_output->
type);
2757 switch(config_output->
type) {
2770 char * str_couple_config =
2774 fputs(str_couple_config, config_file);
2775 free(str_couple_config);
2776 fclose(config_file);
2789 "ERROR(yac_couple_config_set_config_output_filename): filename is NULL");
2794 "ERROR(yac_couple_config_set_config_output_filename): "
2795 "invalid output configuration filetype (type = %d)",
2800 "ERROR(yac_couple_config_set_config_output_filename): ref is NULL");
2808 "ERROR(yac_couple_config_set_config_output_filename): "
2809 "an filename has already been set for reference "
2810 "(ref \"%s\" curr filename \"%s\" filetype %d; "
2811 "new filename \"%s\" filetype %d",
2838 char const * tgt_component_name,
char const * tgt_grid_name,
2839 char const * tgt_field_name,
char const ** src_component_name,
2840 char const ** src_grid_name,
char const ** src_field_name) {
2842 size_t tgt_comp_idx =
2844 size_t tgt_grid_idx =
2846 size_t tgt_field_idx =
2848 couple_config, tgt_comp_idx, tgt_grid_idx, tgt_field_name);
2851 for (
size_t couple_idx = 0; couple_idx < couple_config->
num_couples;
2855 couple_config->
couples + couple_idx;
2861 for (
size_t temp_field_couple_idx = 0;
2863 ++temp_field_couple_idx) {
2872 field_couple == NULL,
2873 "ERROR(yac_couple_config_get_field_source): "
2874 "multiple couples with the same target field is not supported by "
2875 "this routine (target component: \"%s\" target grid: \"%s\""
2876 "target field: \"%s\")", tgt_component_name, tgt_grid_name,
2879 field_couple = temp_field_couple;
2885 field_couple != NULL,
2886 "ERROR(yac_couple_config_get_field_source): "
2887 "provided field is not defined as a target in any coupling "
2888 "(target component: \"%s\" target grid: \"%s\" target field: \"%s\")",
2889 tgt_component_name, tgt_grid_name, tgt_field_name);
2898 *src_component_name = src_component->
name;
2899 *src_grid_name = src_grid->
name;
2900 *src_field_name = src_field->
name;
char * yac_yaml_emit_coupling(struct yac_couple_config *couple_config, int emit_flags, int include_definitions)
int const YAC_YAML_EMITTER_DEFAULT
emit to YAML format
int const YAC_YAML_EMITTER_JSON
emit to JSON format
void yac_couple_config_grid_set_metadata(struct yac_couple_config *couple_config, char const *grid_name, const char *metadata)
struct yac_dist_merge_vtable dist_merge_vtable_couple
static void check_field_couple_idx(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx, char const *routine_name, int line)
static void yac_couple_config_grid_merge(void *a_, void *b_, MPI_Comm comm)
int yac_couple_config_field_is_valid(struct yac_couple_config *couple_config, size_t component_idx, size_t field_idx)
void yac_couple_config_get_field_source(struct yac_couple_config *couple_config, char const *tgt_component_name, char const *tgt_grid_name, char const *tgt_field_name, char const **src_component_name, char const **src_grid_name, char const **src_field_name)
static void set_datetime(char const *type_datetime, struct _datetime **old, char const *str_new)
static void couple_config_sync_time(struct yac_couple_config *couple_config, MPI_Comm comm)
static void yac_couple_config_field_couple_free(void *field_couple_)
char const * yac_couple_config_get_yaxt_exchanger_name(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx)
struct yac_dist_merge_vtable dist_merge_vtable_config_output
static int yac_couple_config_grid_compare(void const *a, void const *b)
static size_t yac_couple_config_get_grid_pack_size(void *grid_, MPI_Comm comm)
void yac_couple_config_sync(struct yac_couple_config *couple_config, MPI_Comm comm, char const *output_ref)
static void yac_couple_config_component_merge(void *a_, void *b_, MPI_Comm comm)
void yac_couple_config_field_enable_frac_mask(struct yac_couple_config *couple_config, char const *comp_name, char const *grid_name, char const *field_name, double frac_mask_fallback_value)
static void couple_config_sync_string(char const *string_name, char **string, MPI_Comm comm)
static void yac_couple_config_config_output_free(void *config_output_)
static void couple_config_sync_datetime(char const *type_datetime, struct _datetime **datetime, MPI_Comm comm)
static size_t yac_couple_config_get_field_couple_pack_size(void *field_couple_, MPI_Comm comm)
static void merge_fields(struct yac_couple_config *couple_config, size_t comp_idx, MPI_Comm comm)
static void yac_couple_config_couple_free(void *couple_)
size_t yac_couple_config_get_num_fields(struct yac_couple_config *couple_config, size_t component_idx)
void yac_couple_config_get_field_grid_names(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx, char const **src_grid_name, char const **tgt_grid_name)
int yac_couple_config_contains_grid_name(struct yac_couple_config *couple_config, char const *grid_name)
static void yac_couple_config_unpack_field(void *buffer, int buffer_size, int *position, void *field_, MPI_Comm comm)
const char * yac_couple_config_grid_get_output_filename(struct yac_couple_config *couple_config, const char *grid_name)
char * yac_couple_config_get_start_datetime(struct yac_couple_config *couple_config)
void yac_couple_config_set_datetime(struct yac_couple_config *couple_config, char const *start, char const *end)
void yac_couple_config_component_add_field(struct yac_couple_config *couple_config, const char *component_name, const char *grid_name, const char *name, char const *timestep, size_t collection_size)
char const * yac_couple_config_get_field_timestep(struct yac_couple_config *couple_config, char const *component_name, char const *grid_name, char const *field_name)
static void yac_couple_config_unpack_config_output(void *buffer, int buffer_size, int *position, void *config_output_, MPI_Comm comm)
void yac_couple_config_def_couple(struct yac_couple_config *couple_config, 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_period, int time_reduction, struct yac_interp_stack_config *interp_stack, int src_lag, int tgt_lag, const char *weight_file_name, int weight_file_on_existing, int mapping_on_source, double scale_factor, double scale_summand, size_t num_src_mask_names, char const *const *src_mask_names, char const *tgt_mask_name, char const *yaxt_exchanger_name, int use_raw_exchange)
int yac_couple_config_mapping_on_source(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx)
int yac_couple_config_get_field_role(struct yac_couple_config *couple_config, char const *component_name, char const *grid_name, char const *field_name)
int yac_couple_config_component_name_is_valid(struct yac_couple_config *couple_config, char const *component_name)
struct yac_dist_merge_vtable dist_merge_vtable_grid
static void yac_couple_config_pack_field(void *field_, void *buffer, int buffer_size, int *position, MPI_Comm comm)
static char * yac_couple_config_unpack_string(void *buffer, int buffer_size, int *position, MPI_Comm comm)
char const * yac_couple_config_get_coupling_period(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx)
void yac_couple_config_field_set_metadata(struct yac_couple_config *couple_config, const char *comp_name, const char *grid_name, const char *field_name, const char *metadata)
struct yac_interp_stack_config * yac_couple_config_get_interp_stack(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx)
enum yac_weight_file_on_existing yac_couple_config_get_weight_file_on_existing(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx)
char const * yac_couple_config_get_field_name(struct yac_couple_config *couple_config, size_t component_idx, size_t field_idx)
size_t yac_couple_config_get_field_idx(struct yac_couple_config *couple_config, size_t component_idx, size_t grid_idx, char const *field_name)
static void couple_config_sync_calendar(MPI_Comm comm)
static size_t yac_couple_config_add_component_(struct yac_couple_config *couple_config, char const *name)
void yac_couple_config_component_set_metadata(struct yac_couple_config *couple_config, char const *comp_name, const char *metadata)
size_t yac_couple_config_get_field_collection_size(struct yac_couple_config *couple_config, char const *component_name, char const *grid_name, char const *field_name)
static size_t yac_couple_config_add_grid_(struct yac_couple_config *couple_config, char const *name)
static size_t yac_couple_config_get_config_output_pack_size(void *config_output_, MPI_Comm comm)
static void merge_components(struct yac_couple_config *couple_config, MPI_Comm comm)
static void check_couple_idx(struct yac_couple_config *couple_config, size_t couple_idx, char const *routine_name, int line)
static void couple_config_sync_flag_value(char const *flag_value_name, enum flag_value *flag, MPI_Comm comm)
static void yac_couple_config_unpack_grid(void *buffer, int buffer_size, int *position, void *grid_, MPI_Comm comm)
size_t yac_couple_config_get_num_couple_fields(struct yac_couple_config *couple_config, size_t couple_idx)
void yac_couple_config_get_src_mask_names(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx, char const *const **mask_names, size_t *num_mask_names)
static int yac_couple_config_component_compare(void const *a_, void const *b_)
static size_t yac_couple_config_get_couple_pack_size(void *couple_, MPI_Comm comm)
static char * string_dup(char const *string)
static void yac_couple_config_pack_config_output(void *config_output_, void *buffer, int buffer_size, int *position, MPI_Comm comm)
static void yac_couple_config_pack_field_couple(void *field_couple_, void *buffer, int buffer_size, int *position, MPI_Comm comm)
struct yac_dist_merge_vtable dist_merge_vtable_field
int yac_couple_config_get_use_raw_exchange(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx)
static size_t yac_couple_config_get_field_pack_size(void *field_, MPI_Comm comm)
static void yac_couple_config_pack_grid(void *grid_, void *buffer, int buffer_size, int *position, MPI_Comm comm)
size_t yac_couple_config_get_num_couples(struct yac_couple_config *couple_config)
static int yac_couple_config_field_compare(void const *a_, void const *b_)
static void yac_couple_config_couple_merge(void *a_, void *b_, MPI_Comm comm)
int yac_couple_config_get_target_lag(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx)
double yac_couple_config_get_frac_mask_fallback_value(struct yac_couple_config *couple_config, char const *component_name, char const *grid_name, char const *field_name)
int yac_couple_config_get_source_lag(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx)
const char * yac_couple_config_field_get_metadata(struct yac_couple_config *couple_config, const char *comp_name, const char *grid_name, const char *field_name)
static void merge_grids(struct yac_couple_config *couple_config, MPI_Comm comm)
static int yac_couple_config_couple_compare(void const *a_, void const *b_)
void yac_couple_config_get_couple_component_names(struct yac_couple_config *couple_config, size_t couple_idx, char const *couple_component_names[2])
const char * yac_couple_config_grid_get_metadata(struct yac_couple_config *couple_config, const char *grid_name)
static void merge_field_couples(size_t *num_field_couples, struct yac_couple_config_field_couple **field_couples, MPI_Comm comm)
const char * yac_couple_config_component_get_metadata(struct yac_couple_config *couple_config, const char *comp_name)
double yac_couple_config_get_scale_factor(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx)
size_t yac_couple_config_get_grid_idx(struct yac_couple_config *couple_config, char const *grid_name)
size_t yac_couple_config_get_component_idx(struct yac_couple_config *couple_config, char const *component_name)
char const * yac_couple_config_get_tgt_mask_name(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx)
struct yac_dist_merge_vtable dist_merge_vtable_component
void yac_couple_config_add_grid(struct yac_couple_config *couple_config, char const *name)
static void yac_couple_config_unpack_couple(void *buffer, int buffer_size, int *position, void *couple_, MPI_Comm comm)
char const * yac_couple_config_get_grid_name(struct yac_couple_config *couple_config, size_t grid_idx)
double yac_couple_config_get_scale_summand(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx)
enum yac_reduction_type yac_couple_config_get_coupling_period_operation(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx)
static void yac_couple_config_unpack_field_couple(void *buffer, int buffer_size, int *position, void *field_couple_, MPI_Comm comm)
static size_t yac_couple_config_get_string_pack_size(char const *string, MPI_Comm comm)
static void yac_couple_config_config_output_merge(void *a_, void *b_, MPI_Comm comm)
static size_t yac_couple_config_get_component_pack_size(void *component_, MPI_Comm comm)
int yac_couple_config_enforce_write_weight_file(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx)
static void yac_couple_config_pack_couple(void *couple_, void *buffer, int buffer_size, int *position, MPI_Comm comm)
static void yac_couple_config_grid_free(void *grid_)
void yac_couple_config_grid_set_output_filename(struct yac_couple_config *couple_config, char const *grid_name, const char *output_filename)
static void merge_config_output(struct yac_couple_config *couple_config, MPI_Comm comm)
void yac_couple_config_get_field_names(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx, char const **src_field_name, const char **tgt_field_name)
static void yac_couple_config_unpack_component(void *buffer, int buffer_size, int *position, void *component_, MPI_Comm comm)
struct yac_couple_config * yac_couple_config_new()
char const * yac_couple_config_get_weight_file_name(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx)
static void check_grid_idx(struct yac_couple_config *couple_config, size_t grid_idx, char const *routine_name, int line)
static size_t yac_couple_config_component_add_field_(struct yac_couple_config *couple_config, size_t comp_idx, size_t grid_idx, char const *name, char const *timestep, size_t collection_size)
int yac_couple_config_get_missing_definition_is_fatal(struct yac_couple_config *couple_config)
struct yac_dist_merge_vtable dist_merge_vtable_field_couple
void yac_couple_config_get_field_couple_component_names(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx, char const **src_component_name, char const **tgt_component_name)
static void yac_couple_config_field_free(void *field_)
char const * yac_couple_config_get_component_name(struct yac_couple_config *couple_config, size_t component_idx)
static void yac_couple_config_field_couple_merge(void *a_, void *b_, MPI_Comm comm)
void yac_couple_config_set_missing_definition_is_fatal(struct yac_couple_config *couple_config, int missing_definition_is_fatal)
static int yac_couple_config_field_couple_compare(void const *a_, void const *b_)
char const * yac_couple_config_get_source_timestep(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx)
static void yac_couple_config_component_free(void *component_)
static void yac_couple_config_pack_string(char const *string, void *buffer, int buffer_size, int *position, MPI_Comm comm)
void yac_couple_config_add_component(struct yac_couple_config *couple_config, char const *name)
static int yac_couple_config_config_output_compare(void const *a, void const *b)
size_t yac_couple_config_get_num_grids(struct yac_couple_config *couple_config)
char const * yac_couple_config_get_field_grid_name(struct yac_couple_config *couple_config, size_t component_idx, size_t field_idx)
void yac_couple_config_set_config_output_filename(struct yac_couple_config *couple_config, char const *filename, enum yac_text_filetype filetype, char const *ref, int include_definitions)
static void check_field_idx(struct yac_couple_config *couple_config, size_t component_idx, size_t field_idx, char const *routine_name, int line)
char * yac_couple_config_get_end_datetime(struct yac_couple_config *couple_config)
static void check_component_idx(struct yac_couple_config *couple_config, size_t component_idx, char const *routine_name, int line)
static void merge_couples(struct yac_couple_config *couple_config, MPI_Comm comm)
static void yac_couple_config_pack_component(void *component_, void *buffer, int buffer_size, int *position, MPI_Comm comm)
char const * yac_couple_config_get_target_timestep(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx)
static void yac_couple_config_field_merge(void *a_, void *b_, MPI_Comm comm)
void yac_couple_config_delete(struct yac_couple_config *couple_config)
size_t yac_couple_config_get_num_components(struct yac_couple_config *couple_config)
#define MISSING_DEFINITION_IS_FATAL_DEFAULT_VALUE
@ YAC_TEXT_FILETYPE_YAML
YAML format.
@ YAC_TEXT_FILETYPE_JSON
JSON format.
void yac_dist_merge(size_t *count, void **array, size_t element_size, MPI_Comm comm, struct yac_dist_merge_vtable *vtable, size_t **idx_old_to_new)
int yac_interp_stack_config_compare(void const *a_, void const *b_)
struct yac_interp_stack_config * yac_interp_stack_config_unpack(void *buffer, int buffer_size, int *position, MPI_Comm comm)
void yac_interp_stack_config_delete(struct yac_interp_stack_config *interp_stack_config)
struct yac_interp_stack_config * yac_interp_stack_config_copy(struct yac_interp_stack_config *interp_stack)
size_t yac_interp_stack_config_get_pack_size(struct yac_interp_stack_config *interp_stack, MPI_Comm comm)
void yac_interp_stack_config_pack(struct yac_interp_stack_config *interp_stack, void *buffer, int buffer_size, int *position, MPI_Comm comm)
yac_weight_file_on_existing
@ YAC_WEIGHT_FILE_KEEP
keep existing weight file
@ YAC_WEIGHT_FILE_OVERWRITE
overwrite existing weight file
@ YAC_WEIGHT_FILE_ERROR
error when weight file existis already
double const YAC_FRAC_MASK_NO_VALUE
#define YAC_FRAC_MASK_VALUE_IS_SET(value)
#define YAC_FRAC_MASK_VALUE_IS_VALID(value)
#define xrealloc(ptr, size)
struct yac_couple_config_field * fields
enum yac_text_filetype type
enum flag_value include_definitions
size_t component_indices[2]
struct yac_couple_config_field_couple * field_couples
char const * coupling_period
size_t num_src_mask_names
struct yac_couple_config_field_couple::@61 source
enum yac_weight_file_on_existing weight_file_on_existing
struct yac_interp_stack_config * interp_stack
enum yac_reduction_type coupling_period_operation
int enforce_write_weight_file
struct yac_couple_config_field_couple::@61 target
char const * weight_file_name
char * yaxt_exchanger_name
double frac_mask_fallback_value
char const * output_filename
struct yac_couple_config_couple * couples
struct yac_couple_config_config_output * config_outputs
size_t num_config_outputs
struct _datetime * end_datetime
struct yac_couple_config_grid * grids
enum flag_value missing_definition_is_fatal
struct _datetime * start_datetime
struct yac_couple_config_component * components
size_t(* get_pack_size)(void *element, MPI_Comm comm)
static struct user_input_data_component ** components
static size_t num_components
int const YAC_EXCHANGE_TYPE_SOURCE
int const YAC_EXCHANGE_TYPE_NONE
int const YAC_EXCHANGE_TYPE_TARGET
void yac_cdef_calendar(int calendar)
int const YAC_CALENDAR_NOT_SET
#define YAC_ASSERT_F(exp, format,...)
#define YAC_ASSERT(exp, msg)
#define yac_mpi_call(call, comm)