17#include "mtime_calendar.h"
21#include "mtime_datetime.h"
123 xmalloc(1 *
sizeof(*couple_config));
131 couple_config->
grids = NULL;
142 return couple_config;
146 return (
string != NULL)?strdup(
string):NULL;
151 free((
void*)field->
name);
161 for (
size_t i = 0; i < component->
num_fields; ++i)
164 free((
void*)(component->
name));
195 free((
void*)grid->
name);
201 void * config_output_) {
205 free((
void*)config_output->
name);
206 free((
void*)config_output->
ref);
212 "ERROR(yac_couple_config_grid_compare): "
213 "invalid name (NULL is not allowed)");
225 "ERROR(yac_couple_config_field_compare): "
226 "invalid name (NULL is not allowed)");
231 void const * a_,
void const * b_) {
235 "ERROR(yac_couple_config_component_compare): "
236 "invalid name (NULL is not allowed)");
241 void const * a_,
void const * b_) {
259 void const * a_,
void const * b_) {
271 void const * a,
void const * b) {
275 "ERROR(yac_couple_config_config_output_compare): "
276 "invalid ref (NULL is not allowed)");
282 char const * string_name,
char **
string, MPI_Comm comm) {
285 MPI_Comm_rank(comm, &rank);
290 size_t len = (*
string != NULL)?(strlen(*
string) + 1):0;
293 "ERROR(couple_config_sync_string): \"%s\" too long", string_name);
294 data_pair.len = (int)len;
295 data_pair.rank = rank;
300 MPI_IN_PLACE, &data_pair, 1, MPI_2INT, MPI_MAXLOC, comm), comm);
301 if (data_pair.len == 0)
return;
304 char const * string_bak = NULL;
305 if (data_pair.rank != rank) {
306 string_bak = *string;
307 *
string =
xmalloc((
size_t)data_pair.len *
sizeof(**
string));
310 MPI_Bcast(*
string, data_pair.len, MPI_CHAR, data_pair.rank, comm), comm);
313 if (data_pair.rank != rank) {
315 (string_bak == NULL) ||
316 !strcmp(string_bak, *
string),
317 "ERROR(couple_config_sync_string): inconsistent \"%s\" definition "
318 "(\"%s\" != \"%s\")", string_name, string_bak, *
string);
319 free((
void*)string_bak);
324 char const * flag_value_name,
enum flag_value * flag, MPI_Comm comm) {
326 int int_flag = (*flag ==
FLAG_UNSET)?INT_MAX:((int)*flag);
331 MPI_IN_PLACE, &int_flag, 1, MPI_INT, MPI_MIN, comm), comm);
334 if (int_flag == INT_MAX)
return;
338 (*flag ==
FLAG_UNSET) || ((
int)(*flag) == int_flag),
339 "ERROR(couple_config_sync_flag_value): inconsistent \"%s\"-flag definition "
340 "(%s != %s)", flag_value_name, ((int_flag ==
FLAG_TRUE)?
"TRUE":
"FALSE"),
349 int calendar = (int)getCalendarType();
350 if (calendar == CALENDAR_NOT_SET) calendar = INT_MAX;
355 MPI_IN_PLACE, &calendar, 1, MPI_INT, MPI_MIN, comm), comm);
358 if (calendar == INT_MAX)
return;
366 void * a_,
void * b_, MPI_Comm comm) {
381 "component metadata", (
char **)&(a->
metadata), comm);
385 void * a_,
void * b_, MPI_Comm comm) {
403 void * a_,
void * b_, MPI_Comm comm) {
417 MPI_Comm_rank(comm, &rank);
421 } data_pairs[DATA_PAIR_COUNT];
422 size_t timestep_len =
424 size_t metadata_len =
427 timestep_len <= INT_MAX,
428 "ERROR(yac_couple_config_field_merge): timestep string too long");
430 metadata_len <= INT_MAX,
431 "ERROR(yac_couple_config_field_merge): metadata string too long");
435 "ERROR(yac_couple_config_field_merge): invalid collection size \"%zu\"",
437 data_pairs[TIMESTEP_IDX].len = (int)timestep_len;
438 data_pairs[TIMESTEP_IDX].rank = rank;
439 data_pairs[METADATA_IDX].len = (int)metadata_len;
440 data_pairs[METADATA_IDX].rank = rank;
441 data_pairs[FRAC_MASK_IDX].len =
443 data_pairs[FRAC_MASK_IDX].rank = rank;
444 data_pairs[COLLECTION_SIZE_IDX].len =
447 data_pairs[COLLECTION_SIZE_IDX].rank = rank;
452 MPI_IN_PLACE, data_pairs, DATA_PAIR_COUNT, MPI_2INT,
453 MPI_MAXLOC, comm), comm);
456 if (data_pairs[TIMESTEP_IDX].len > 0) {
459 char * timestep_buffer =
xmalloc((
size_t)data_pairs[TIMESTEP_IDX].len);
460 if (data_pairs[TIMESTEP_IDX].rank == rank)
461 strcpy(timestep_buffer, b->
timestep);
464 timestep_buffer, data_pairs[TIMESTEP_IDX].len, MPI_CHAR,
465 data_pairs[TIMESTEP_IDX].rank, comm), comm);
469 (b == NULL) || (b->
timestep == NULL) ||
470 !strcmp(b->
timestep, timestep_buffer),
471 "ERROR(yac_couple_config_field_merge): "
472 "inconsistent timestep definition (\"%s\" != \"%s\")",
481 if (data_pairs[METADATA_IDX].len > 0) {
484 char * metadata_buffer =
xmalloc((
size_t)data_pairs[METADATA_IDX].len);
485 if (data_pairs[METADATA_IDX].rank == rank)
486 strcpy(metadata_buffer, b->
metadata);
489 metadata_buffer, data_pairs[METADATA_IDX].len, MPI_CHAR,
490 data_pairs[METADATA_IDX].rank, comm), comm);
494 (b == NULL) || (b->
metadata == NULL) ||
495 !strcmp(b->
metadata, metadata_buffer),
496 "ERROR(yac_couple_config_field_merge): "
497 "inconsistent metadata definition (\"%s\" != \"%s\")",
506 if (data_pairs[FRAC_MASK_IDX].len != 0) {
509 double frac_mask_fallback_value;
510 if (data_pairs[FRAC_MASK_IDX].rank == rank)
514 &frac_mask_fallback_value, 1, MPI_DOUBLE,
515 data_pairs[FRAC_MASK_IDX].rank, comm), comm);
524 sizeof(frac_mask_fallback_value)),
525 "ERROR(yac_couple_config_field_merge): "
526 "inconsistent fractional mask fallback value definition "
536 if (data_pairs[COLLECTION_SIZE_IDX].len > -1) {
542 "ERROR(yac_couple_config_field_merge): "
543 "inconsistent collection size definition (\"%zu\" != \"%d\")",
552 void * a_,
void * b_, MPI_Comm comm) {
556 if (b_ == NULL)
return;
563 "ERROR(yac_couple_config_field_couple_merge): "
567 "ERROR(yac_couple_config_field_couple_merge): "
571 "ERROR(yac_couple_config_field_couple_merge): "
572 "inconsistent mapping side (%d != %d)",
576 "ERROR(yac_couple_config_field_couple_merge): "
577 "inconsistent interpolation stack")
580 "ERROR(yac_couple_config_field_couple_merge): "
581 "inconsistent coupling period operation (%d != %d)",
585 "ERROR(yac_couple_config_field_couple_merge): "
586 "inconsistent coupling period (%s != %s)",
590 "ERROR(yac_couple_config_field_couple_merge): "
591 "inconsistent defintion of enforce_write_weight_file (%d != %d)",
596 "ERROR(yac_couple_config_field_couple_merge): "
597 "inconsistent weight_file_name (%s != %s)",
601 "ERROR(yac_couple_config_field_couple_merge): "
602 "inconsistent scale factor (%lf != %lf)",
606 "ERROR(yac_couple_config_field_couple_merge): "
607 "inconsistent scale summand (%lf != %lf)",
611 "ERROR(yac_couple_config_field_couple_merge): "
612 "inconsistent number of source mask names (%zu != %zu)",
616 "ERROR(yac_couple_config_field_couple_merge): "
617 "inconsistent availability of source mask names (%s != %s)",
623 "ERROR(yac_couple_config_field_couple_merge): "
624 "inconsistent source mask names at index %zu (\"%s\" != \"%s\")",
628 "ERROR(yac_couple_config_field_couple_merge): "
629 "inconsistent availability of target mask name (%s != %s)",
635 "ERROR(yac_couple_config_field_couple_merge): "
636 "inconsistent target mask name (\"%s\" != \"%s\")",
640 "ERROR(yac_couple_config_field_couple_merge): "
641 "inconsistent availability of yaxt exchanger name (%s != %s)",
647 "ERROR(yac_couple_config_field_couple_merge): "
648 "inconsistent yaxt exchanger name (\"%s\" != \"%s\")",
653 size_t * num_field_couples,
657 void * a_,
void * b_, MPI_Comm comm) {
674 void * a_,
void * b_, MPI_Comm comm) {
683 "ERROR(yac_couple_config_config_output_merge): "
684 "inconsistent file names for ref \"%s\" (\"%s\" != \"%s\")",
688 "ERROR(yac_couple_config_config_output_merge): "
689 "inconsistent file types for ref \"%s\" (%d != %d)",
709 for (
size_t i = 0; i < couple_config->
num_grids; ++i){
712 free(couple_config->
grids);
719 for (
size_t couple_idx = 0; couple_idx < couple_config->
num_couples;
731 "ERROR(yac_couple_config_add_grid_): "
732 "invalid name (NULL is not allowed)")
734 for (
size_t i = 0; i < couple_config->
num_grids; ++i)
737 size_t grid_idx = couple_config->
num_grids;
739 couple_config->
grids =
741 couple_config->
grids,
760 "ERROR(yac_couple_config_add_component_): "
761 "invalid name (NULL is not allowed)")
776 return component_idx;
787 char const * comp_name,
const char* metadata) {
791 = metadata==NULL?NULL:strdup(metadata);
796 char const * grid_name,
const char* output_filename) {
801 output_filename != NULL,
802 "ERROR(yac_couple_config_grid_set_output_filename): invalid output filename "
803 "for grid \"%s\" (NULL is not allowed)",
808 "ERROR(yac_couple_config_grid_set_output_filename): output file name for grid "
809 "\"%s\" has already been set (\"%s\" != \"%s\")",
817 char const * grid_name,
const char* metadata) {
823 = metadata==NULL?NULL:strdup(metadata);
828 const char* comp_name,
const char * grid_name,
const char* field_name,
829 const char* metadata) {
833 comp_idx, grid_idx, field_name);
836 = metadata==NULL?NULL:strdup(metadata);
841 const char * comp_name) {
848 const char * grid_name) {
855 const char * grid_name) {
862 const char* comp_name,
const char * grid_name,
const char* field_name) {
866 comp_idx, grid_idx, field_name);
872 char const * routine_name,
int line) {
876 "ERROR(%s:%d:%s): invalid component_idx", __FILE__, line, routine_name)
881 char const * routine_name,
int line) {
885 "ERROR(%s:%d:%s): invalid grid_idx", __FILE__, line, routine_name)
890 size_t comp_idx,
size_t grid_idx,
char const *
name,
891 char const * timestep,
size_t collection_size) {
894 couple_config, comp_idx,
895 "yac_couple_config_component_add_field_", __LINE__);
897 couple_config, grid_idx,
898 "yac_couple_config_component_add_field_", __LINE__);
903 for (
size_t i = 0; i < component->
num_fields; i++) {
915 "ERROR(yac_couple_config_component_add_field): "
916 "inconsistent timestep definition (\"%s\" != \"%s\")",
919 collection_size == SIZE_MAX ||
921 "ERROR(yac_couple_config_component_add_field): "
922 "inconsistent collection_size definition (%zu != %zu)",
935 sizeof(*(component->
fields)));
937 component->
fields + field_idx;
950 const char* grid_name,
const char*
name,
char const *
timestep,
979 int missing_definition_is_fatal) {
987 "ERROR(yac_couple_config_set_missing_definition_is_fatal): "
988 "inconsistent setting of \"missing_definition_is_fatal\"-flag "
991 (user_value ==
FLAG_TRUE)?
"TRUE":
"FALSE");
998 char const * routine_name,
int line) {
1001 couple_idx < couple_config->num_couples,
1002 "ERROR(%s:%d:%s): invalid couple_idx", __FILE__, line, routine_name);
1009 couple_config, couple_idx,
"yac_couple_config_get_num_couple_fields",
1017 char const * couple_component_names[2]) {
1020 couple_config, couple_idx,
"yac_couple_config_get_couple_component_names",
1023 for (
int i = 0; i < 2; ++i)
1024 couple_component_names[i] =
1034 "ERROR(yac_couple_config_component_name_is_valid): component name is NULL")
1037 "ERROR(yac_couple_config_component_name_is_valid): "
1038 "component name is too long (maximum is YAC_MAX_CHARLEN)")
1040 for (
size_t component_idx = 0; component_idx < couple_config->
num_components;
1042 if (!strcmp(component_name, couple_config->
components[component_idx].
name))
1062 "yac_couple_config_get_num_fields", __LINE__);
1069 size_t component_idx = SIZE_MAX;
1071 (component_idx == SIZE_MAX); ++i)
1076 component_idx != SIZE_MAX,
1077 "ERROR(yac_couple_config_get_component_idx): "
1078 "Component \"%s\" not found in coupling configuration",
1081 return component_idx;
1090 if (!strcmp(couple_config->
grids[i].
name, grid_name))
1095 "ERROR(yac_couple_config_get_grid_idx): "
1096 "grid name \"%s\" not in list of grids", grid_name)
1103 size_t grid_idx,
char const * field_name) {
1105 couple_config, component_idx,
1106 "yac_couple_config_get_component_name", __LINE__);
1108 size_t field_idx = SIZE_MAX;
1113 (i<nbr_fields) && (field_idx == SIZE_MAX); ++i)
1121 field_idx != SIZE_MAX,
1122 "ERROR(yac_couple_config_get_field_idx): "
1124 "(component_idx %zu grid_idx %zu field_name \"%s\"",
1125 component_idx, grid_idx, field_name);
1134 couple_config, component_idx,
1135 "yac_couple_config_get_component_name", __LINE__);
1142 size_t field_idx,
char const * routine_name,
int line) {
1145 couple_config, component_idx, routine_name, __LINE__);
1150 "ERROR(%s:%d:%s): invalid field_idx", __FILE__,
1159 couple_config, component_idx, field_idx,
1160 "yac_couple_config_get_field_grid_name", __LINE__);
1163 couple_config->
grids[
1174 couple_config, component_idx, field_idx,
1175 "yac_couple_config_get_field_name", __LINE__);
1185 char const * component_name,
char const * grid_name,
1186 char const * field_name) {
1188 size_t component_idx =
1194 couple_config, component_idx, grid_idx, field_name);
1205 char const * component_name,
char const * grid_name,
1206 char const * field_name) {
1208 size_t component_idx =
1214 couple_config, component_idx,
grid_idx, field_name);
1217 for(
size_t couple_idx = 0; couple_idx<nbr_couples; ++couple_idx){
1223 for(
size_t trans_couple_idx = 0; trans_couple_idx < nbr_trans_couples;
1224 ++trans_couple_idx){
1244 "yac_couple_config_field_is_valid", __LINE__);
1247 "yac_couple_config_field_is_valid", __LINE__);
1259 size_t field_couple_idx,
char const * routine_name,
int line) {
1266 "ERROR(%s:%d:%s): invalid field_couple_idx",
1267 __FILE__, line, routine_name)
1272 size_t couple_idx,
size_t field_couple_idx) {
1275 couple_config, couple_idx, field_couple_idx,
1276 "yac_couple_config_get_interp_stack", __LINE__);
1280 couples[couple_idx].
1281 field_couples[field_couple_idx].interp_stack;
1286 size_t couple_idx,
size_t field_couple_idx,
1287 char const ** src_grid_name,
char const ** tgt_grid_name) {
1290 couple_config, couple_idx, field_couple_idx,
1291 "yac_couple_config_get_field_grid_names", __LINE__);
1293 size_t src_component_idx =
1294 couple_config->
couples[couple_idx].
1295 field_couples[field_couple_idx].
1296 source.component_idx;
1297 size_t src_field_idx =
1298 couple_config->
couples[couple_idx].
1299 field_couples[field_couple_idx].
1302 size_t tgt_component_idx =
1303 couple_config->
couples[couple_idx].
1304 field_couples[field_couple_idx].
1305 target.component_idx;
1306 size_t tgt_field_idx =
1307 couple_config->
couples[couple_idx].
1308 field_couples[field_couple_idx].
1312 couple_config->
grids[
1313 couple_config->
components[src_component_idx].
1314 fields[src_field_idx].grid_idx].
name;
1316 couple_config->
grids[
1317 couple_config->
components[tgt_component_idx].
1318 fields[tgt_field_idx].grid_idx].
name;
1323 char const * comp_name,
char const * grid_name,
char const * field_name,
1324 double frac_mask_fallback_value) {
1328 "ERROR(yac_couple_config_field_enable_frac_mask): "
1329 "\"%lf\" is not a valid fractional mask fallback value "
1330 "(component: \"%s\" grid: \"%s\" field \"%s\")",
1331 frac_mask_fallback_value, comp_name, grid_name, field_name);
1336 comp_idx, grid_idx, field_name);
1338 double old_frac_mask_fallback_value =
1340 frac_mask_fallback_value;
1346 &old_frac_mask_fallback_value, &frac_mask_fallback_value,
1347 sizeof(frac_mask_fallback_value)),
1348 "ERROR(yac_couple_config_field_enable_frac_mask): "
1349 "fractional mask fallback value was already set:\n"
1350 "\told value \"%lf\" new value \"%lf\" "
1351 "(component: \"%s\" grid: \"%s\" field \"%s\")",
1352 old_frac_mask_fallback_value, frac_mask_fallback_value,
1353 comp_name, grid_name, field_name);
1356 frac_mask_fallback_value = frac_mask_fallback_value;
1361 char const * component_name,
char const * grid_name,
1362 char const * field_name) {
1364 size_t component_idx =
1370 couple_config, component_idx, grid_idx, field_name);
1378 "ERROR(yac_couple_config_get_frac_mask_fallback_value): "
1379 "no valid fractional mask fallback value defined "
1380 "(component: \"%s\" grid: \"%s\" field \"%s\")",
1388 char const * component_name,
char const * grid_name,
1389 char const * field_name) {
1391 size_t component_idx =
1397 couple_config, component_idx,
grid_idx, field_name);
1408 size_t couple_idx,
size_t field_couple_idx,
1409 char const ** src_component_name,
char const ** tgt_component_name) {
1412 couple_config, couple_idx, field_couple_idx,
1413 "yac_couple_config_get_field_couple_component_names", __LINE__);
1415 *src_component_name =
1417 couple_config->
couples[couple_idx].
1418 field_couples[field_couple_idx].source.component_idx].
name;
1419 *tgt_component_name =
1421 couple_config->
couples[couple_idx].
1422 field_couples[field_couple_idx].target.component_idx].
name;
1427 size_t couple_idx,
size_t field_couple_idx,
1428 char const ** src_field_name,
const char ** tgt_field_name) {
1431 couple_config, couple_idx, field_couple_idx,
1432 "yac_couple_config_get_field_names", __LINE__);
1434 size_t src_component_idx =
1435 couple_config->
couples[couple_idx].
1436 field_couples[field_couple_idx].source.component_idx;
1437 size_t tgt_component_idx =
1438 couple_config->
couples[couple_idx].
1439 field_couples[field_couple_idx].target.component_idx;
1440 size_t src_field_idx =
1441 couple_config->
couples[couple_idx].
1442 field_couples[field_couple_idx].source.field_idx;
1443 size_t tgt_field_idx =
1444 couple_config->
couples[couple_idx].
1445 field_couples[field_couple_idx].target.field_idx;
1448 couple_config->
components[src_component_idx].
1449 fields[src_field_idx].name;
1451 couple_config->
components[tgt_component_idx].
1452 fields[tgt_field_idx].name;
1457 size_t couple_idx,
size_t field_couple_idx) {
1460 couple_config, couple_idx, field_couple_idx,
1461 "yac_couple_config_mapping_on_source", __LINE__);
1465 couples[couple_idx].
1466 field_couples[field_couple_idx].
1472 size_t couple_idx,
size_t field_couple_idx) {
1475 couple_config, couple_idx, field_couple_idx,
1476 "yac_couple_config_get_source_lag", __LINE__);
1480 couples[couple_idx].
1481 field_couples[field_couple_idx].
1487 size_t couple_idx,
size_t field_couple_idx) {
1490 couple_config, couple_idx, field_couple_idx,
1491 "yac_couple_config_get_target_lag", __LINE__);
1495 couples[couple_idx].
1496 field_couples[field_couple_idx].
1502 size_t couple_idx,
size_t field_couple_idx) {
1505 couple_config, couple_idx, field_couple_idx,
1506 "yac_couple_config_get_coupling_period", __LINE__);
1510 couples[couple_idx].
1511 field_couples[field_couple_idx].
1517 size_t couple_idx,
size_t field_couple_idx) {
1520 couple_config, couple_idx, field_couple_idx,
1521 "yac_couple_config_get_source_timestep", __LINE__);
1525 char const * timestep =
1531 "ERROR(yac_couple_config_get_source_timestep): "
1532 "no valid timestep defined (component: \"%s\" field \"%s\")",
1542 size_t couple_idx,
size_t field_couple_idx) {
1545 couple_config, couple_idx, field_couple_idx,
1546 "yac_couple_config_get_target_timestep", __LINE__);
1550 char const * timestep =
1559 size_t couple_idx,
size_t field_couple_idx) {
1562 couple_config, couple_idx, field_couple_idx,
1563 "yac_couple_config_get_coupling_period_operation", __LINE__);
1567 couples[couple_idx].
1568 field_couples[field_couple_idx].
1573 char const * type_datetime,
struct _datetime ** old,
char const * str_new) {
1575 if ((str_new == NULL) || (strlen(str_new) == 0))
return;
1579 "ERROR(set_datetime): calendar has not yet been set");
1581 struct _datetime *
new = newDateTime(str_new);
1585 "ERROR(set_datetime): failed to parse datetime \"%s\"", str_new);
1587 char old_datetime_buffer[MAX_DATETIME_STR_LEN],
1588 new_datetime_buffer[MAX_DATETIME_STR_LEN];
1591 (*old == NULL) || (equal_to == compareDatetime(*old,
new)),
1592 "ERROR(set_datetime): inconsistent %s datetime "
1593 "(old: \"%s\" new: \"%s\")", type_datetime,
1594 datetimeToString(*old, old_datetime_buffer),
1595 datetimeToString(
new, new_datetime_buffer));
1597 deallocateDateTime(*old);
1604 char const * start,
char const * end) {
1614 "ERROR(yac_couple_config_get_start_datetime): "
1615 "start_datetime not yet defined");
1617 char datetime_buffer[MAX_DATETIME_STR_LEN];
1620 strdup(datetimeToString(couple_config->
start_datetime, datetime_buffer));
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->
end_datetime, datetime_buffer));
1641 "ERROR(yac_couple_config_get_grid_name): "
1642 "Invalid grid idx %zu", grid_idx);
1644 return couple_config->
grids[grid_idx].
name;
1649 size_t couple_idx,
size_t field_couple_idx) {
1652 couple_config, couple_idx, field_couple_idx,
1653 "yac_couple_config_enforce_write_weight_file", __LINE__);
1657 couples[couple_idx].
1658 field_couples[field_couple_idx].
1659 enforce_write_weight_file;
1664 size_t couple_idx,
size_t field_couple_idx) {
1667 couple_config, couple_idx, field_couple_idx,
1668 "yac_couple_config_get_weight_file_name", __LINE__);
1670 static char dummy[] =
"\0";
1671 char const * weight_file_name =
1673 couples[couple_idx].
1674 field_couples[field_couple_idx].
1677 return (weight_file_name != NULL)?weight_file_name:dummy;
1682 size_t couple_idx,
size_t field_couple_idx) {
1685 couple_config, couple_idx, field_couple_idx,
1686 "yac_couple_config_get_scale_factor", __LINE__);
1690 couples[couple_idx].
1691 field_couples[field_couple_idx].
1697 size_t couple_idx,
size_t field_couple_idx) {
1700 couple_config, couple_idx, field_couple_idx,
1701 "yac_couple_config_get_scale_summand", __LINE__);
1705 couples[couple_idx].
1706 field_couples[field_couple_idx].
1712 size_t couple_idx,
size_t field_couple_idx,
1713 char const *
const ** mask_names,
size_t * num_mask_names) {
1716 couple_config, couple_idx, field_couple_idx,
1717 "yac_couple_config_get_src_mask_names", __LINE__);
1720 (
char const *
const *)(
1722 couples[couple_idx].
1723 field_couples[field_couple_idx].
1727 couples[couple_idx].
1728 field_couples[field_couple_idx].
1734 size_t couple_idx,
size_t field_couple_idx) {
1737 couple_config, couple_idx, field_couple_idx,
1738 "yac_couple_config_get_tgt_mask_name", __LINE__);
1742 couples[couple_idx].
1743 field_couples[field_couple_idx].
1749 size_t couple_idx,
size_t field_couple_idx) {
1752 couple_config, couple_idx, field_couple_idx,
1753 "yac_couple_config_get_yaxt_exchanger_name", __LINE__);
1757 couples[couple_idx].
1758 field_couples[field_couple_idx].
1759 yaxt_exchanger_name;
1765 for (
size_t grid_idx = 0; grid_idx < couple_config->
num_grids;
1767 if (!strcmp(couple_config->
grids[grid_idx].
name, grid_name))
1773 char const *
string, MPI_Comm comm) {
1775 int strlen_pack_size, string_pack_size;
1776 yac_mpi_call(MPI_Pack_size(1, MPI_INT, comm, &strlen_pack_size), comm);
1778 if (
string != NULL) {
1781 (
int)(strlen(
string)), MPI_CHAR, comm, &string_pack_size), comm);
1783 string_pack_size = 0;
1786 return (
size_t)strlen_pack_size + (size_t)string_pack_size;
1790 void * grid_, MPI_Comm comm) {
1798 void * field_, MPI_Comm comm) {
1805 "ERROR(yac_couple_config_get_field_pack_size):"
1806 "grid_idx is too big")
1809 yac_mpi_call(MPI_Pack_size(1, MPI_INT, comm, &int_pack_size), comm);
1813 return int_pack_size +
1818 void * component_, MPI_Comm comm) {
1828 void * field_couple_, MPI_Comm comm) {
1834 yac_mpi_call(MPI_Pack_size(10, MPI_INT, comm, &ints_pack_size), comm);
1835 int doubles_pack_size;
1836 yac_mpi_call(MPI_Pack_size(2, MPI_DOUBLE, comm, &doubles_pack_size), comm);
1837 int src_mask_names_pack_size = 0;
1840 src_mask_names_pack_size +=
1845 (
size_t)ints_pack_size +
1863 src_mask_names_pack_size +
1871 void * couple_, MPI_Comm comm) {
1875 int component_indices_pack_size;
1877 MPI_Pack_size(2, MPI_INT, comm, &component_indices_pack_size), comm);
1879 return (
size_t)component_indices_pack_size;
1883 void * config_output_, MPI_Comm comm) {
1887 int filetype_pack_size;
1889 MPI_Pack_size(1, MPI_INT, comm, &filetype_pack_size), comm);
1892 filetype_pack_size +
1898 char const *
string,
void * buffer,
int buffer_size,
int * position,
1901 size_t len = (
string == NULL)?0:strlen(
string);
1904 len <= INT_MAX,
"ERROR(yac_couple_config_pack_string): string too long")
1906 int len_int = (int)len;
1910 &len_int, 1, MPI_INT, buffer, buffer_size, position, comm), comm);
1915 string, len_int, MPI_CHAR, buffer, buffer_size, position, comm),
1920 void * grid_,
void * buffer,
int buffer_size,
int * position, MPI_Comm comm) {
1925 grid->
name, buffer, buffer_size, position, comm);
1929 void * field_,
void * buffer,
int buffer_size,
int * position, MPI_Comm comm) {
1936 "ERROR(yac_couple_config_pack_field): grid_idx is too big")
1942 &
grid_idx, 1, MPI_INT, buffer, buffer_size, position, comm), comm);
1944 buffer_size, position, comm);
1948 void * component_,
void * buffer,
int buffer_size,
int * position, MPI_Comm comm) {
1954 component->
name, buffer, buffer_size, position, comm);
1958 void * field_couple_,
void * buffer,
int buffer_size,
int * position,
1966 "ERROR(yac_couple_config_pack_field_couple): "
1967 "source.component_idx bigger than INT_MAX")
1970 "ERROR(yac_couple_config_pack_field_couple): "
1971 "source.field_idx bigger than INT_MAX")
1974 "ERROR(yac_couple_config_pack_field_couple): "
1975 "target.component_idx bigger than INT_MAX")
1978 "ERROR(yac_couple_config_pack_field_couple): "
1979 "target.field_idx bigger than INT_MAX")
1982 "ERROR(yac_couple_config_pack_field_couple): "
1983 "mapping_on_source bigger than INT_MAX")
1986 "ERROR(yac_couple_config_pack_field_couple): "
1987 "coupling_period_operation bigger than INT_MAX")
1990 "ERROR(yac_couple_config_pack_field_couple): "
1991 "enforce_write_weight_file bigger than INT_MAX")
1994 "ERROR(yac_couple_config_pack_field_couple): "
1995 "num_src_mask_names bigger than INT_MAX")
2010 MPI_Pack(ints, 10, MPI_INT, buffer, buffer_size, position, comm), comm);
2017 double doubles[2] = {
2022 MPI_Pack(doubles, 2, MPI_DOUBLE, buffer, buffer_size, position, comm),
2026 field_couple->
interp_stack, buffer, buffer_size, position, comm);
2031 field_couple->
src_mask_names[i], buffer, buffer_size, position, comm);
2034 field_couple->
tgt_mask_name, buffer, buffer_size, position, comm);
2041 void * couple_,
void * buffer,
int buffer_size,
int * position, MPI_Comm comm) {
2049 "ERROR(yac_couple_config_pack_couple): "
2050 "component_indices bigger than INT_MAX")
2062 void * config_output_,
void * buffer,
int buffer_size,
int * position,
2069 config_output->
name, buffer, buffer_size, position, comm);
2070 int filetype_int = (int)config_output->
type;
2073 &filetype_int, 1, MPI_INT, buffer, buffer_size, position, comm), comm);
2075 config_output->
ref, buffer, buffer_size, position, comm);
2079 void * buffer,
int buffer_size,
int * position, MPI_Comm comm) {
2084 buffer, buffer_size, position, &string_len, 1, MPI_INT, comm), comm);
2086 if (string_len <= 0)
return NULL;
2088 char *
string =
xmalloc(((
size_t)string_len + 1) *
sizeof(*
string));
2091 buffer, buffer_size, position,
string, string_len, MPI_CHAR, comm), comm);
2092 string[string_len] =
'\0';
2097 void * buffer,
int buffer_size,
int * position,
void * grid_,
2110 void * buffer,
int buffer_size,
int * position,
void * field_,
2119 buffer, buffer_size, position, &grid_idx_int, 1, MPI_INT, comm), comm);
2123 "ERROR(yac_couple_config_unpack_field): invalid number of grid_idx_int")
2125 field->
grid_idx = (size_t)grid_idx_int;
2129 buffer_size, position, comm);
2135 void * buffer,
int buffer_size,
int * position,
void * component_,
2145 component->
fields = NULL;
2149 void * buffer,
int buffer_size,
int * position,
void * field_couple_,
2158 buffer, buffer_size, position, ints, 10, MPI_INT, comm), comm);
2162 "ERROR(yac_couple_config_unpack_field_couple): "
2163 "invalid source.component_idx")
2166 "ERROR(yac_couple_config_unpack_field_couple): "
2167 "invalid source.field_idx")
2170 "ERROR(yac_couple_config_unpack_field_couple): "
2171 "target.component_idx bigger than INT_MAX")
2174 "ERROR(yac_couple_config_unpack_field_couple): "
2175 "invalid target.field_idx")
2178 "ERROR(yac_couple_config_unpack_field_couple): "
2179 "invalid mapping_on_source")
2182 "ERROR(yac_couple_config_unpack_field_couple): "
2183 "invalid coupling_period_operation")
2186 "ERROR(yac_couple_config_unpack_field_couple): "
2187 "invalid enforce_write_weight_file")
2190 "ERROR(yac_couple_config_unpack_field_couple): "
2191 "invalid num_src_mask_names")
2213 buffer, buffer_size, position, doubles, 2, MPI_DOUBLE, comm), comm);
2229 buffer, buffer_size, position, comm);
2236 buffer, buffer_size, position, comm);
2240 buffer, buffer_size, position, comm);
2244 void * buffer,
int buffer_size,
int * position,
void * couple_,
2258 "ERROR(yac_couple_config_unpack_couple): invalid component indices")
2267 void * buffer,
int buffer_size,
int * position,
void * config_output_,
2273 config_output->
name =
2278 buffer, buffer_size, position, &filetype_int, 1, MPI_INT, comm),
2281 config_output->
ref =
2288 char const * src_comp_name,
char const * src_grid_name,
char const * src_field_name,
2289 char const * tgt_comp_name,
char const * tgt_grid_name,
char const * tgt_field_name,
2290 char const * coupling_period,
int time_reduction,
2292 int src_lag,
int tgt_lag,
2293 const char* weight_file_name,
int mapping_on_source,
2294 double scale_factor,
double scale_summand,
2295 size_t num_src_mask_names,
char const *
const * src_mask_names,
2296 char const * tgt_mask_name,
char const * yaxt_exchanger_name) {
2298 YAC_ASSERT(src_comp_name && src_comp_name[0] !=
'\0',
2299 "ERROR(yac_couple_config_def_couple): invalid parameter: src_comp_name");
2300 YAC_ASSERT(src_grid_name && src_grid_name[0] !=
'\0',
2301 "ERROR(yac_couple_config_def_couple): invalid parameter: src_grid_name");
2302 YAC_ASSERT(src_field_name && src_field_name[0] !=
'\0',
2303 "ERROR(yac_couple_config_def_couple): invalid parameter: src_field_name");
2304 YAC_ASSERT(tgt_comp_name && tgt_comp_name[0] !=
'\0',
2305 "ERROR(yac_couple_config_def_couple): invalid parameter: tgt_comp_name");
2306 YAC_ASSERT(tgt_grid_name && tgt_grid_name[0] !=
'\0',
2307 "ERROR(yac_couple_config_def_couple): invalid parameter: tgt_grid_name");
2308 YAC_ASSERT(tgt_field_name && tgt_field_name[0] !=
'\0',
2309 "ERROR(yac_couple_config_def_couple): invalid parameter: tgt_field_name");
2310 YAC_ASSERT(coupling_period && coupling_period[0] !=
'\0',
2311 "ERROR(yac_couple_config_def_couple): invalid parameter: coupling_period");
2318 "ERROR(yac_couple_config_def_couple): invalid parameter: time_reduction");
2320 "ERROR(yac_couple_config_def_couple): \"%lf\" is not a valid scale factor",
2322 YAC_ASSERT_F(isnormal(scale_summand) || (scale_summand == 0.0),
2323 "ERROR(yac_couple_config_def_couple): \"%lf\" is not a valid scale summand",
2327 size_t src_comp_idx =
2329 size_t tgt_comp_idx =
2331 size_t src_grid_idx =
2333 size_t tgt_grid_idx =
2337 size_t component_indices[2];
2338 if(src_comp_idx < tgt_comp_idx){
2339 component_indices[0] = src_comp_idx;
2340 component_indices[1] = tgt_comp_idx;
2342 component_indices[0] = tgt_comp_idx;
2343 component_indices[1] = src_comp_idx;
2346 for(
size_t i = 0; (i < couple_config->
num_couples) && !couple; ++i)
2349 couple = &couple_config->
couples[i];
2366 size_t src_field_idx =
2368 couple_config, src_comp_idx, src_grid_idx,
2369 src_field_name, NULL, SIZE_MAX);
2370 size_t tgt_field_idx =
2372 couple_config, tgt_comp_idx, tgt_grid_idx,
2373 tgt_field_name, NULL, SIZE_MAX);
2425 char const * type_datetime,
struct _datetime ** datetime, MPI_Comm comm) {
2428 char datetime_buffer[MAX_DATETIME_STR_LEN];
2429 char * str_datetime = datetimeToString(*datetime, datetime_buffer);
2432 if (str_datetime != NULL) str_datetime = strdup(str_datetime);
2435 deallocateDateTime(*datetime);
2441 *datetime = newDateTime(str_datetime);
2503 size_t* old_to_new_idx;
2504 void * p_grids = couple_config->
grids;
2507 sizeof(couple_config->
grids[0]),
2509 couple_config->
grids = p_grids;
2512 for(
size_t comp_idx = 0; comp_idx < couple_config->
num_components;
2516 for(
size_t field_idx = 0; field_idx < component->
num_fields; ++field_idx)
2521 free(old_to_new_idx);
2530 size_t* old_to_new_idx;
2531 void * p_fields = component->
fields;
2534 sizeof(component->
fields[0]),
2536 component->
fields = p_fields;
2539 for(
size_t couple_idx = 0; couple_idx < couple_config->
num_couples;
2542 couple_config->
couples + couple_idx;
2543 for(
size_t field_couple_idx = 0;
2556 free(old_to_new_idx);
2564 size_t* old_to_new_idx;
2565 void * p_components = couple_config->
components;
2573 for(
size_t couple_idx = 0; couple_idx < couple_config->
num_couples;
2576 couple_config->
couples + couple_idx;
2584 for(
size_t field_couple_idx = 0;
2594 free(old_to_new_idx);
2597 for (
size_t comp_idx = 0; comp_idx < couple_config->
num_components; ++comp_idx)
2617 void * p_couples = couple_config->
couples;
2620 sizeof(couple_config->
couples[0]),
2622 couple_config->
couples = p_couples;
2640 char const * output_ref){
2651 "missing_definition_is_fatal",
2655 if (output_ref != NULL)
2657 (config_output == NULL); ++i)
2661 if (config_output != NULL) {
2664 MPI_Comm_rank(comm, &rank);
2669 FILE * config_file = fopen(config_output->
name,
"w");
2672 config_file != NULL,
2673 "ERROR(yac_couple_config_sync): "
2674 "failed to create coupling configuration file \"%s\"",
2675 config_output->
name);
2680 "ERROR(yac_couple_config_sync): "
2681 "invalid coupling configuration filetype (type = %d)",
2682 config_output->
type);
2685 switch(config_output->
type) {
2698 char * str_couple_config =
2702 fputs(str_couple_config, config_file);
2703 free(str_couple_config);
2704 fclose(config_file);
2717 "ERROR(yac_couple_config_set_config_output_filename): filename is NULL");
2722 "ERROR(yac_couple_config_set_config_output_filename): "
2723 "invalid output configuration filetype (type = %d)",
2728 "ERROR(yac_couple_config_set_config_output_filename): ref is NULL");
2736 "ERROR(yac_couple_config_set_config_output_filename): "
2737 "an filename has already been set for reference "
2738 "(ref \"%s\" curr filename \"%s\" filetype %d; "
2739 "new filename \"%s\" filetype %d",
2766 char const * tgt_component_name,
char const * tgt_grid_name,
2767 char const * tgt_field_name,
char const ** src_component_name,
2768 char const ** src_grid_name,
char const ** src_field_name) {
2770 size_t tgt_comp_idx =
2772 size_t tgt_grid_idx =
2774 size_t tgt_field_idx =
2776 couple_config, tgt_comp_idx, tgt_grid_idx, tgt_field_name);
2779 for (
size_t couple_idx = 0; couple_idx < couple_config->
num_couples;
2783 couple_config->
couples + couple_idx;
2789 for (
size_t temp_field_couple_idx = 0;
2791 ++temp_field_couple_idx) {
2800 field_couple == NULL,
2801 "ERROR(yac_couple_config_get_field_source): "
2802 "multiple couples with the same target field is not supported by "
2803 "this routine (target component: \"%s\" target grid: \"%s\""
2804 "target field: \"%s\")", tgt_component_name, tgt_grid_name,
2807 field_couple = temp_field_couple;
2813 field_couple != NULL,
2814 "ERROR(yac_couple_config_get_field_source): "
2815 "provided field is not defined as a target in any coupling "
2816 "(target component: \"%s\" target grid: \"%s\" target field: \"%s\")",
2817 tgt_component_name, tgt_grid_name, tgt_field_name);
2826 *src_component_name = src_component->
name;
2827 *src_grid_name = src_grid->
name;
2828 *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)
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)
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
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)
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 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)
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)
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
struct yac_couple_config_field_couple::@60 source
size_t num_src_mask_names
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::@60 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)