19#include "mtime_calendar.h"
23#include "mtime_datetime.h"
134 xmalloc(1 *
sizeof(*couple_config));
142 couple_config->
grids = NULL;
153 return couple_config;
157 return (
string != NULL)?strdup(
string):NULL;
162 free((
void*)field->name);
163 free((
void*)field->timestep);
164 free(field->metadata);
171 for (
size_t i = 0; i < component->
num_fields; ++i)
174 free((
void*)(component->
name));
206 free((
void*)grid->name);
207 free((
void*)grid->output_filename);
208 free(grid->metadata);
212 void * config_output_) {
216 free((
void*)config_output->
name);
217 free((
void*)config_output->
ref);
223 "ERROR(yac_couple_config_grid_compare): "
224 "invalid name (NULL is not allowed)");
236 "ERROR(yac_couple_config_field_compare): "
237 "invalid name (NULL is not allowed)");
242 void const * a_,
void const * b_) {
246 "ERROR(yac_couple_config_component_compare): "
247 "invalid name (NULL is not allowed)");
252 void const * a_,
void const * b_) {
270 void const * a_,
void const * b_) {
282 void const * a,
void const * b) {
286 "ERROR(yac_couple_config_config_output_compare): "
287 "invalid ref (NULL is not allowed)");
293 char const * string_name,
char **
string, MPI_Comm comm) {
296 MPI_Comm_rank(comm, &rank);
301 size_t len = (*
string != NULL)?(strlen(*
string) + 1):0;
304 "ERROR(couple_config_sync_string): \"%s\" too long", string_name);
305 data_pair.len = (int)len;
306 data_pair.rank = rank;
311 MPI_IN_PLACE, &data_pair, 1, MPI_2INT, MPI_MAXLOC, comm), comm);
312 if (data_pair.len == 0)
return;
315 char const * string_bak = NULL;
316 if (data_pair.rank != rank) {
317 string_bak = *string;
318 *
string =
xmalloc((
size_t)data_pair.len *
sizeof(**
string));
321 MPI_Bcast(*
string, data_pair.len, MPI_CHAR, data_pair.rank, comm), comm);
324 if (data_pair.rank != rank) {
326 (string_bak == NULL) ||
327 !strcmp(string_bak, *
string),
328 "ERROR(couple_config_sync_string): inconsistent \"%s\" definition "
329 "(\"%s\" != \"%s\")", string_name, string_bak, *
string);
330 free((
void*)string_bak);
335 char const * flag_value_name,
enum flag_value *
flag, MPI_Comm comm) {
342 MPI_IN_PLACE, &int_flag, 1, MPI_INT, MPI_MIN, comm), comm);
345 if (int_flag == INT_MAX)
return;
350 "ERROR(couple_config_sync_flag_value): inconsistent \"%s\"-flag definition "
351 "(%s != %s)", flag_value_name, ((int_flag ==
FLAG_TRUE)?
"TRUE":
"FALSE"),
360 int calendar = (int)getCalendarType();
361 if (calendar == CALENDAR_NOT_SET) calendar = INT_MAX;
366 MPI_IN_PLACE, &calendar, 1, MPI_INT, MPI_MIN, comm), comm);
369 if (calendar == INT_MAX)
return;
377 void * a_,
void * b_, MPI_Comm comm) {
392 "component metadata", (
char **)&(a->
metadata), comm);
396 void * a_,
void * b_, MPI_Comm comm) {
414 void * a_,
void * b_, MPI_Comm comm) {
428 MPI_Comm_rank(comm, &rank);
432 } data_pairs[DATA_PAIR_COUNT];
433 size_t timestep_len =
435 size_t metadata_len =
438 timestep_len <= INT_MAX,
439 "ERROR(yac_couple_config_field_merge): timestep string too long");
441 metadata_len <= INT_MAX,
442 "ERROR(yac_couple_config_field_merge): metadata string too long");
446 "ERROR(yac_couple_config_field_merge): invalid collection size \"%zu\"",
448 data_pairs[TIMESTEP_IDX].len = (int)timestep_len;
449 data_pairs[TIMESTEP_IDX].rank = rank;
450 data_pairs[METADATA_IDX].len = (int)metadata_len;
451 data_pairs[METADATA_IDX].rank = rank;
452 data_pairs[FRAC_MASK_IDX].len =
454 data_pairs[FRAC_MASK_IDX].rank = rank;
455 data_pairs[COLLECTION_SIZE_IDX].len =
458 data_pairs[COLLECTION_SIZE_IDX].rank = rank;
463 MPI_IN_PLACE, data_pairs, DATA_PAIR_COUNT, MPI_2INT,
464 MPI_MAXLOC, comm), comm);
467 if (data_pairs[TIMESTEP_IDX].len > 0) {
470 char * timestep_buffer =
xmalloc((
size_t)data_pairs[TIMESTEP_IDX].len);
471 if (data_pairs[TIMESTEP_IDX].rank == rank)
472 strcpy(timestep_buffer, b->
timestep);
475 timestep_buffer, data_pairs[TIMESTEP_IDX].len, MPI_CHAR,
476 data_pairs[TIMESTEP_IDX].rank, comm), comm);
480 (b == NULL) || (b->
timestep == NULL) ||
481 !strcmp(b->
timestep, timestep_buffer),
482 "ERROR(yac_couple_config_field_merge): "
483 "inconsistent timestep definition (\"%s\" != \"%s\")",
492 if (data_pairs[METADATA_IDX].len > 0) {
495 char * metadata_buffer =
xmalloc((
size_t)data_pairs[METADATA_IDX].len);
496 if (data_pairs[METADATA_IDX].rank == rank)
497 strcpy(metadata_buffer, b->
metadata);
500 metadata_buffer, data_pairs[METADATA_IDX].len, MPI_CHAR,
501 data_pairs[METADATA_IDX].rank, comm), comm);
505 (b == NULL) || (b->
metadata == NULL) ||
506 !strcmp(b->
metadata, metadata_buffer),
507 "ERROR(yac_couple_config_field_merge): "
508 "inconsistent metadata definition (\"%s\" != \"%s\")",
517 if (data_pairs[FRAC_MASK_IDX].len != 0) {
520 double frac_mask_fallback_value;
521 if (data_pairs[FRAC_MASK_IDX].rank == rank)
525 &frac_mask_fallback_value, 1, MPI_DOUBLE,
526 data_pairs[FRAC_MASK_IDX].rank, comm), comm);
535 sizeof(frac_mask_fallback_value)),
536 "ERROR(yac_couple_config_field_merge): "
537 "inconsistent fractional mask fallback value definition "
547 if (data_pairs[COLLECTION_SIZE_IDX].len > -1) {
553 "ERROR(yac_couple_config_field_merge): "
554 "inconsistent collection size definition (\"%zu\" != \"%d\")",
563 void * a_,
void * b_, MPI_Comm comm) {
567 if (b_ == NULL)
return;
574 "ERROR(yac_couple_config_field_couple_merge): "
578 "ERROR(yac_couple_config_field_couple_merge): "
582 "ERROR(yac_couple_config_field_couple_merge): "
583 "inconsistent mapping side (%d != %d)",
587 "ERROR(yac_couple_config_field_couple_merge): "
588 "inconsistent interpolation stack")
591 "ERROR(yac_couple_config_field_couple_merge): "
592 "inconsistent coupling period operation (%d != %d)",
596 "ERROR(yac_couple_config_field_couple_merge): "
597 "inconsistent coupling period (%s != %s)",
601 "ERROR(yac_couple_config_field_couple_merge): "
602 "inconsistent definition of enforce_write_weight_file (%d != %d)",
607 "ERROR(yac_couple_config_field_couple_merge): "
608 "inconsistent weight_file_name (%s != %s)",
613 "ERROR(yac_couple_config_field_couple_merge): "
614 "inconsistent weight_file_on_existing (%d != %d)",
618 "ERROR(yac_couple_config_field_couple_merge): "
619 "inconsistent scale factor (%lf != %lf)",
623 "ERROR(yac_couple_config_field_couple_merge): "
624 "inconsistent scale summand (%lf != %lf)",
628 "ERROR(yac_couple_config_field_couple_merge): "
629 "inconsistent number of source mask names (%zu != %zu)",
633 "ERROR(yac_couple_config_field_couple_merge): "
634 "inconsistent availability of source mask names (%s != %s)",
640 "ERROR(yac_couple_config_field_couple_merge): "
641 "inconsistent source mask names at index %zu (\"%s\" != \"%s\")",
645 "ERROR(yac_couple_config_field_couple_merge): "
646 "inconsistent availability of target mask name (%s != %s)",
652 "ERROR(yac_couple_config_field_couple_merge): "
653 "inconsistent target mask name (\"%s\" != \"%s\")",
657 "ERROR(yac_couple_config_field_couple_merge): "
658 "inconsistent availability of yaxt exchanger name (%s != %s)",
664 "ERROR(yac_couple_config_field_couple_merge): "
665 "inconsistent yaxt exchanger name (\"%s\" != \"%s\")",
670 "ERROR(yac_couple_config_field_couple_merge): "
671 "inconsistent collection selection definition")
674 "ERROR(yac_couple_config_field_couple_merge): "
675 "inconsistent definition of use_raw_exchange (%d != %d)",
680 size_t * num_field_couples,
684 void * a_,
void * b_, MPI_Comm comm) {
701 void * a_,
void * b_, MPI_Comm comm) {
710 "ERROR(yac_couple_config_config_output_merge): "
711 "inconsistent file names for ref \"%s\" (\"%s\" != \"%s\")",
715 "ERROR(yac_couple_config_config_output_merge): "
716 "inconsistent file types for ref \"%s\" (%d != %d)",
736 for (
size_t i = 0; i < couple_config->
num_grids; ++i){
739 free(couple_config->
grids);
746 for (
size_t couple_idx = 0; couple_idx < couple_config->
num_couples;
758 "ERROR(yac_couple_config_add_grid_): "
759 "invalid name (NULL is not allowed)")
761 for (
size_t i = 0; i < couple_config->
num_grids; ++i)
766 couple_config->
grids =
768 couple_config->
grids,
787 "ERROR(yac_couple_config_add_component_): "
788 "invalid name (NULL is not allowed)")
814 char const * comp_name,
const char* metadata) {
818 = metadata==NULL?NULL:strdup(metadata);
823 char const * grid_name,
const char* output_filename) {
828 output_filename != NULL,
829 "ERROR(yac_couple_config_grid_set_output_filename): invalid output filename "
830 "for grid \"%s\" (NULL is not allowed)",
835 "ERROR(yac_couple_config_grid_set_output_filename): output file name for grid "
836 "\"%s\" has already been set (\"%s\" != \"%s\")",
844 char const * grid_name,
const char* metadata) {
850 = metadata==NULL?NULL:strdup(metadata);
855 const char* comp_name,
const char * grid_name,
const char* field_name,
856 const char* metadata) {
863 = metadata==NULL?NULL:strdup(metadata);
868 const char * comp_name) {
875 const char * grid_name) {
882 const char * grid_name) {
889 const char* comp_name,
const char * grid_name,
const char* field_name) {
899 char const * routine_name,
int line) {
903 "ERROR(%s:%d:%s): invalid component_idx", __FILE__, line, routine_name)
908 char const * routine_name,
int line) {
912 "ERROR(%s:%d:%s): invalid grid_idx", __FILE__, line, routine_name)
921 couple_config, comp_idx,
922 "yac_couple_config_component_add_field_", __LINE__);
925 "yac_couple_config_component_add_field_", __LINE__);
930 for (
size_t i = 0; i < component->
num_fields; i++) {
942 "ERROR(yac_couple_config_component_add_field): "
943 "inconsistent timestep definition (\"%s\" != \"%s\")",
948 "ERROR(yac_couple_config_component_add_field): "
949 "inconsistent collection_size definition (%zu != %zu)",
962 sizeof(*(component->
fields)));
964 component->
fields + field_idx;
966 field->name = strdup(
name);
969 field->metadata = NULL;
977 const char* grid_name,
const char*
name,
char const *
timestep,
1006 int missing_definition_is_fatal) {
1014 "ERROR(yac_couple_config_set_missing_definition_is_fatal): "
1015 "inconsistent setting of \"missing_definition_is_fatal\"-flag "
1016 "(old: %s new: %s)",
1018 (user_value ==
FLAG_TRUE)?
"TRUE":
"FALSE");
1025 char const * routine_name,
int line) {
1028 couple_idx < couple_config->num_couples,
1029 "ERROR(%s:%d:%s): invalid couple_idx", __FILE__, line, routine_name);
1036 couple_config, couple_idx,
"yac_couple_config_get_num_couple_fields",
1044 char const * couple_component_names[2]) {
1047 couple_config, couple_idx,
"yac_couple_config_get_couple_component_names",
1050 for (
int i = 0; i < 2; ++i)
1051 couple_component_names[i] =
1061 "ERROR(yac_couple_config_component_name_is_valid): component name is NULL")
1064 "ERROR(yac_couple_config_component_name_is_valid): "
1065 "component name is too long (maximum is YAC_MAX_CHARLEN)")
1089 "yac_couple_config_get_num_fields", __LINE__);
1104 "ERROR(yac_couple_config_get_component_idx): "
1105 "Component \"%s\" not found in coupling configuration",
1117 if (!strcmp(couple_config->
grids[i].
name, grid_name))
1122 "ERROR(yac_couple_config_get_grid_idx): "
1123 "grid name \"%s\" not in list of grids", grid_name)
1130 size_t grid_idx,
char const * field_name) {
1133 "yac_couple_config_get_component_name", __LINE__);
1135 size_t field_idx = SIZE_MAX;
1140 (i<
nbr_fields) && (field_idx == SIZE_MAX); ++i)
1148 field_idx != SIZE_MAX,
1149 "ERROR(yac_couple_config_get_field_idx): "
1151 "(component_idx %zu grid_idx %zu field_name \"%s\"",
1162 "yac_couple_config_get_component_name", __LINE__);
1169 size_t field_idx,
char const * routine_name,
int line) {
1177 "ERROR(%s:%d:%s): invalid field_idx", __FILE__,
1187 "yac_couple_config_get_field_grid_name", __LINE__);
1190 couple_config->
grids[
1202 "yac_couple_config_get_field_name", __LINE__);
1212 char const * component_name,
char const * grid_name,
1213 char const * field_name) {
1227 return field->timestep;
1232 char const * component_name,
char const * grid_name,
1233 char const * field_name) {
1244 for(
size_t couple_idx = 0; couple_idx<nbr_couples; ++couple_idx){
1250 for(
size_t trans_couple_idx = 0; trans_couple_idx < nbr_trans_couples;
1251 ++trans_couple_idx){
1271 "yac_couple_config_field_is_valid", __LINE__);
1274 "yac_couple_config_field_is_valid", __LINE__);
1280 return (field->collection_size != SIZE_MAX) &&
1281 (field->timestep != NULL);
1286 size_t field_couple_idx,
char const * routine_name,
int line) {
1293 "ERROR(%s:%d:%s): invalid field_couple_idx",
1294 __FILE__, line, routine_name)
1299 size_t couple_idx,
size_t field_couple_idx) {
1302 couple_config, couple_idx, field_couple_idx,
1303 "yac_couple_config_get_interp_stack", __LINE__);
1307 couples[couple_idx].
1308 field_couples[field_couple_idx].interp_stack;
1313 size_t couple_idx,
size_t field_couple_idx,
1317 couple_config, couple_idx, field_couple_idx,
1318 "yac_couple_config_get_field_grid_names", __LINE__);
1320 size_t src_component_idx =
1321 couple_config->
couples[couple_idx].
1322 field_couples[field_couple_idx].
1323 source.component_idx;
1324 size_t src_field_idx =
1325 couple_config->
couples[couple_idx].
1326 field_couples[field_couple_idx].
1329 size_t tgt_component_idx =
1330 couple_config->
couples[couple_idx].
1331 field_couples[field_couple_idx].
1332 target.component_idx;
1333 size_t tgt_field_idx =
1334 couple_config->
couples[couple_idx].
1335 field_couples[field_couple_idx].
1339 couple_config->
grids[
1340 couple_config->
components[src_component_idx].
1341 fields[src_field_idx].grid_idx].
name;
1343 couple_config->
grids[
1344 couple_config->
components[tgt_component_idx].
1345 fields[tgt_field_idx].grid_idx].
name;
1350 char const * comp_name,
char const * grid_name,
char const * field_name,
1351 double frac_mask_fallback_value) {
1355 "ERROR(yac_couple_config_field_enable_frac_mask): "
1356 "\"%lf\" is not a valid fractional mask fallback value "
1357 "(component: \"%s\" grid: \"%s\" field \"%s\")",
1358 frac_mask_fallback_value, comp_name, grid_name, field_name);
1365 double old_frac_mask_fallback_value =
1367 frac_mask_fallback_value;
1373 &old_frac_mask_fallback_value, &frac_mask_fallback_value,
1374 sizeof(frac_mask_fallback_value)),
1375 "ERROR(yac_couple_config_field_enable_frac_mask): "
1376 "fractional mask fallback value was already set:\n"
1377 "\told value \"%lf\" new value \"%lf\" "
1378 "(component: \"%s\" grid: \"%s\" field \"%s\")",
1379 old_frac_mask_fallback_value, frac_mask_fallback_value,
1380 comp_name, grid_name, field_name);
1383 frac_mask_fallback_value = frac_mask_fallback_value;
1388 char const * component_name,
char const * grid_name,
1389 char const * field_name) {
1405 "ERROR(yac_couple_config_get_frac_mask_fallback_value): "
1406 "no valid fractional mask fallback value defined "
1407 "(component: \"%s\" grid: \"%s\" field \"%s\")",
1410 return field->frac_mask_fallback_value;
1415 char const * component_name,
char const * grid_name,
1416 char const * field_name) {
1430 return field->collection_size;
1435 size_t couple_idx,
size_t field_couple_idx,
1436 char const ** src_component_name,
char const ** tgt_component_name) {
1439 couple_config, couple_idx, field_couple_idx,
1440 "yac_couple_config_get_field_couple_component_names", __LINE__);
1442 *src_component_name =
1444 couple_config->
couples[couple_idx].
1445 field_couples[field_couple_idx].source.component_idx].
name;
1446 *tgt_component_name =
1448 couple_config->
couples[couple_idx].
1449 field_couples[field_couple_idx].target.component_idx].
name;
1454 size_t couple_idx,
size_t field_couple_idx,
1455 char const ** src_field_name,
const char ** tgt_field_name) {
1458 couple_config, couple_idx, field_couple_idx,
1459 "yac_couple_config_get_field_names", __LINE__);
1461 size_t src_component_idx =
1462 couple_config->
couples[couple_idx].
1463 field_couples[field_couple_idx].source.component_idx;
1464 size_t tgt_component_idx =
1465 couple_config->
couples[couple_idx].
1466 field_couples[field_couple_idx].target.component_idx;
1467 size_t src_field_idx =
1468 couple_config->
couples[couple_idx].
1469 field_couples[field_couple_idx].source.field_idx;
1470 size_t tgt_field_idx =
1471 couple_config->
couples[couple_idx].
1472 field_couples[field_couple_idx].target.field_idx;
1475 couple_config->
components[src_component_idx].
1476 fields[src_field_idx].name;
1478 couple_config->
components[tgt_component_idx].
1479 fields[tgt_field_idx].name;
1484 size_t couple_idx,
size_t field_couple_idx) {
1487 couple_config, couple_idx, field_couple_idx,
1488 "yac_couple_config_mapping_on_source", __LINE__);
1492 couples[couple_idx].
1493 field_couples[field_couple_idx].
1499 size_t couple_idx,
size_t field_couple_idx) {
1502 couple_config, couple_idx, field_couple_idx,
1503 "yac_couple_config_get_source_lag", __LINE__);
1507 couples[couple_idx].
1508 field_couples[field_couple_idx].
1514 size_t couple_idx,
size_t field_couple_idx) {
1517 couple_config, couple_idx, field_couple_idx,
1518 "yac_couple_config_get_target_lag", __LINE__);
1522 couples[couple_idx].
1523 field_couples[field_couple_idx].
1529 size_t couple_idx,
size_t field_couple_idx) {
1532 couple_config, couple_idx, field_couple_idx,
1533 "yac_couple_config_get_coupling_period", __LINE__);
1537 couples[couple_idx].
1538 field_couples[field_couple_idx].
1544 size_t couple_idx,
size_t field_couple_idx) {
1547 couple_config, couple_idx, field_couple_idx,
1548 "yac_couple_config_get_source_timestep", __LINE__);
1552 char const * timestep =
1558 "ERROR(yac_couple_config_get_source_timestep): "
1559 "no valid timestep defined (component: \"%s\" field \"%s\")",
1569 size_t couple_idx,
size_t field_couple_idx) {
1572 couple_config, couple_idx, field_couple_idx,
1573 "yac_couple_config_get_target_timestep", __LINE__);
1577 char const * timestep =
1586 size_t couple_idx,
size_t field_couple_idx) {
1589 couple_config, couple_idx, field_couple_idx,
1590 "yac_couple_config_get_coupling_period_operation", __LINE__);
1594 couples[couple_idx].
1595 field_couples[field_couple_idx].
1600 char const * type_datetime,
struct _datetime ** old,
char const * str_new) {
1602 if ((str_new == NULL) || (strlen(str_new) == 0))
return;
1606 "ERROR(set_datetime): calendar has not yet been set");
1608 struct _datetime *
new = newDateTime(str_new);
1612 "ERROR(set_datetime): failed to parse datetime \"%s\"", str_new);
1614 char old_datetime_buffer[MAX_DATETIME_STR_LEN],
1615 new_datetime_buffer[MAX_DATETIME_STR_LEN];
1618 (*old == NULL) || (equal_to == compareDatetime(*old,
new)),
1619 "ERROR(set_datetime): inconsistent %s datetime "
1620 "(old: \"%s\" new: \"%s\")", type_datetime,
1621 datetimeToString(*old, old_datetime_buffer),
1622 datetimeToString(
new, new_datetime_buffer));
1624 deallocateDateTime(*old);
1631 char const * start,
char const * end) {
1641 "ERROR(yac_couple_config_get_start_datetime): "
1642 "start_datetime not yet defined");
1644 char datetime_buffer[MAX_DATETIME_STR_LEN];
1647 strdup(datetimeToString(couple_config->
start_datetime, datetime_buffer));
1654 "ERROR(yac_couple_config_get_start_datetime): "
1655 "start_datetime not yet defined");
1657 char datetime_buffer[MAX_DATETIME_STR_LEN];
1660 strdup(datetimeToString(couple_config->
end_datetime, datetime_buffer));
1668 "ERROR(yac_couple_config_get_grid_name): "
1676 size_t couple_idx,
size_t field_couple_idx) {
1679 couple_config, couple_idx, field_couple_idx,
1680 "yac_couple_config_enforce_write_weight_file", __LINE__);
1684 couples[couple_idx].
1685 field_couples[field_couple_idx].
1686 enforce_write_weight_file;
1691 size_t couple_idx,
size_t field_couple_idx) {
1694 couple_config, couple_idx, field_couple_idx,
1695 "yac_couple_config_get_weight_file_name", __LINE__);
1697 static char dummy[] =
"\0";
1700 couples[couple_idx].
1701 field_couples[field_couple_idx].
1709 size_t couple_idx,
size_t field_couple_idx) {
1712 couple_config, couple_idx, field_couple_idx,
1713 "yac_couple_config_get_weight_file_on_existing", __LINE__);
1717 couples[couple_idx].
1718 field_couples[field_couple_idx].
1719 weight_file_on_existing;
1724 size_t couple_idx,
size_t field_couple_idx) {
1727 couple_config, couple_idx, field_couple_idx,
1728 "yac_couple_config_get_scale_factor", __LINE__);
1732 couples[couple_idx].
1733 field_couples[field_couple_idx].
1739 size_t couple_idx,
size_t field_couple_idx) {
1742 couple_config, couple_idx, field_couple_idx,
1743 "yac_couple_config_get_scale_summand", __LINE__);
1747 couples[couple_idx].
1748 field_couples[field_couple_idx].
1754 size_t couple_idx,
size_t field_couple_idx,
1755 char const *
const ** mask_names,
size_t * num_mask_names) {
1758 couple_config, couple_idx, field_couple_idx,
1759 "yac_couple_config_get_src_mask_names", __LINE__);
1762 (
char const *
const *)(
1764 couples[couple_idx].
1765 field_couples[field_couple_idx].
1769 couples[couple_idx].
1770 field_couples[field_couple_idx].
1776 size_t couple_idx,
size_t field_couple_idx) {
1779 couple_config, couple_idx, field_couple_idx,
1780 "yac_couple_config_get_tgt_mask_name", __LINE__);
1784 couples[couple_idx].
1785 field_couples[field_couple_idx].
1791 size_t couple_idx,
size_t field_couple_idx) {
1794 couple_config, couple_idx, field_couple_idx,
1795 "yac_couple_config_get_yaxt_exchanger_name", __LINE__);
1799 couples[couple_idx].
1800 field_couples[field_couple_idx].
1801 yaxt_exchanger_name;
1807 size_t couple_idx,
size_t field_couple_idx) {
1810 couple_config, couple_idx, field_couple_idx,
1811 "yac_couple_config_get_collection_selection", __LINE__);
1815 couples[couple_idx].
1816 field_couples[field_couple_idx].
1817 collection_selection;
1822 size_t couple_idx,
size_t field_couple_idx) {
1825 couple_config, couple_idx, field_couple_idx,
1826 "yac_couple_config_get_use_raw_exchange", __LINE__);
1830 couples[couple_idx].
1831 field_couples[field_couple_idx].
1846 void * grid_, MPI_Comm comm) {
1852 "yac_couple_config_get_grid_pack_size", grid->name, comm, 1);
1856 void * field_, MPI_Comm comm) {
1862 field->grid_idx <= INT_MAX,
1863 "ERROR(yac_couple_config_get_field_pack_size):"
1864 "grid_idx is too big")
1867 yac_mpi_call(MPI_Pack_size(1, MPI_INT, comm, &int_pack_size), comm);
1868 size_t name_pack_size =
1870 "yac_couple_config_get_field_pack_size", field->name, comm, 1);
1872 return int_pack_size +
1877 void * component_, MPI_Comm comm) {
1884 "yac_couple_config_get_component_pack_size",
1885 component->
name, comm, 1);
1889 void * field_couple_, MPI_Comm comm) {
1895 yac_mpi_call(MPI_Pack_size(12, MPI_INT, comm, &ints_pack_size), comm);
1896 int doubles_pack_size;
1897 yac_mpi_call(MPI_Pack_size(2, MPI_DOUBLE, comm, &doubles_pack_size), comm);
1898 int src_mask_names_pack_size = 0;
1901 src_mask_names_pack_size +=
1903 "yac_couple_config_get_field_couple_pack_size",
1907 (
size_t)ints_pack_size +
1922 "yac_couple_config_get_field_couple_pack_size",
1925 "yac_couple_config_get_field_couple_pack_size",
1929 src_mask_names_pack_size +
1931 "yac_couple_config_get_field_couple_pack_size",
1934 "yac_couple_config_get_field_couple_pack_size",
1941 void * couple_, MPI_Comm comm) {
1945 int component_indices_pack_size;
1947 MPI_Pack_size(2, MPI_INT, comm, &component_indices_pack_size), comm);
1949 return (
size_t)component_indices_pack_size;
1953 void * config_output_, MPI_Comm comm) {
1957 int filetype_pack_size;
1959 MPI_Pack_size(1, MPI_INT, comm, &filetype_pack_size), comm);
1962 filetype_pack_size +
1964 "yac_couple_config_get_config_output_pack_size",
1965 config_output->
name, comm, 1) +
1967 "yac_couple_config_get_config_output_pack_size",
1968 config_output->
ref, comm, 1);
1972 void * grid_,
void *
buffer,
int buffer_size,
int * position, MPI_Comm comm) {
1977 "yac_couple_config_pack_grid", grid->name,
buffer, buffer_size,
1982 void * field_,
void *
buffer,
int buffer_size,
int * position, MPI_Comm comm) {
1988 field->grid_idx <= INT_MAX,
1989 "ERROR(yac_couple_config_pack_field): grid_idx is too big")
1991 int grid_idx = (int)field->grid_idx;
1995 &
grid_idx, 1, MPI_INT,
buffer, buffer_size, position, comm), comm);
1997 "yac_couple_config_pack_field", field->name,
buffer,
1998 buffer_size, position, comm, 1);
2002 void * component_,
void *
buffer,
int buffer_size,
int * position, MPI_Comm comm) {
2008 "yac_couple_config_pack_component", component->
name,
2009 buffer, buffer_size, position, comm, 1);
2013 void * field_couple_,
void *
buffer,
int buffer_size,
int * position,
2021 "ERROR(yac_couple_config_pack_field_couple): "
2022 "source.component_idx bigger than INT_MAX")
2025 "ERROR(yac_couple_config_pack_field_couple): "
2026 "source.field_idx bigger than INT_MAX")
2029 "ERROR(yac_couple_config_pack_field_couple): "
2030 "target.component_idx bigger than INT_MAX")
2033 "ERROR(yac_couple_config_pack_field_couple): "
2034 "target.field_idx bigger than INT_MAX")
2037 "ERROR(yac_couple_config_pack_field_couple): "
2038 "mapping_on_source bigger than INT_MAX")
2041 "ERROR(yac_couple_config_pack_field_couple): "
2042 "coupling_period_operation bigger than INT_MAX")
2045 "ERROR(yac_couple_config_pack_field_couple): "
2046 "enforce_write_weight_file bigger than INT_MAX")
2049 "ERROR(yac_couple_config_pack_field_couple): "
2050 "weight_file_on_existing bigger than INT_MAX")
2053 "ERROR(yac_couple_config_pack_field_couple): "
2054 "num_src_mask_names bigger than INT_MAX")
2069 enum {NUM_INTS =
sizeof(ints) /
sizeof(ints[0])};
2073 ints, NUM_INTS, MPI_INT,
buffer, buffer_size, position, comm), comm);
2076 "yac_couple_config_pack_field_couple",
2080 "yac_couple_config_pack_field_couple",
2083 double doubles[2] = {
2088 MPI_Pack(doubles, 2, MPI_DOUBLE,
buffer, buffer_size, position, comm),
2097 "yac_couple_config_pack_field_couple", field_couple->
src_mask_names[i],
2098 buffer, buffer_size, position, comm, 1);
2101 "yac_couple_config_pack_field_couple",
2105 "yac_couple_config_pack_field_couple",
2113 void * couple_,
void *
buffer,
int buffer_size,
int * position, MPI_Comm comm) {
2121 "ERROR(yac_couple_config_pack_couple): "
2122 "component_indices bigger than INT_MAX")
2134 void * config_output_,
void *
buffer,
int buffer_size,
int * position,
2141 "yac_couple_config_pack_config_output",
2142 config_output->
name,
buffer, buffer_size, position, comm, 1);
2143 int filetype_int = (int)config_output->
type;
2146 &filetype_int, 1, MPI_INT,
buffer, buffer_size, position, comm), comm);
2148 "yac_couple_config_pack_config_output",
2149 config_output->
ref,
buffer, buffer_size, position, comm, 1);
2153 void *
buffer,
int buffer_size,
int * position,
void * grid_,
2161 grid->output_filename = NULL;
2162 grid->metadata = NULL;
2166 void *
buffer,
int buffer_size,
int * position,
void * field_,
2175 buffer, buffer_size, position, &grid_idx_int, 1, MPI_INT, comm), comm);
2179 "ERROR(yac_couple_config_unpack_field): invalid number of grid_idx_int")
2181 field->grid_idx = (size_t)grid_idx_int;
2183 field->collection_size = SIZE_MAX;
2185 field->timestep = NULL;
2186 field->metadata = NULL;
2190 void *
buffer,
int buffer_size,
int * position,
void * component_,
2199 component->
fields = NULL;
2203 void *
buffer,
int buffer_size,
int * position,
void * field_couple_,
2212 buffer, buffer_size, position, ints, 12, MPI_INT, comm), comm);
2216 "ERROR(yac_couple_config_unpack_field_couple): "
2217 "invalid source.component_idx")
2220 "ERROR(yac_couple_config_unpack_field_couple): "
2221 "invalid source.field_idx")
2224 "ERROR(yac_couple_config_unpack_field_couple): "
2225 "target.component_idx bigger than INT_MAX")
2228 "ERROR(yac_couple_config_unpack_field_couple): "
2229 "invalid target.field_idx")
2232 "ERROR(yac_couple_config_unpack_field_couple): "
2233 "invalid mapping_on_source")
2236 "ERROR(yac_couple_config_unpack_field_couple): "
2237 "invalid coupling_period_operation")
2240 "ERROR(yac_couple_config_unpack_field_couple): "
2241 "invalid enforce_write_weight_file")
2244 "ERROR(yac_couple_config_unpack_field_couple): "
2245 "invalid weight_file_on_existing")
2248 "ERROR(yac_couple_config_unpack_field_couple): "
2249 "invalid num_src_mask_names")
2251 (ints[11] == 0) || (ints[11] == 1),
2252 "ERROR(yac_couple_config_unpack_field_couple): "
2253 "invalid use_raw_exchange")
2278 buffer, buffer_size, position, doubles, 2, MPI_DOUBLE, comm), comm);
2306 buffer, buffer_size, position, comm);
2310 void *
buffer,
int buffer_size,
int * position,
void * couple_,
2324 "ERROR(yac_couple_config_unpack_couple): invalid component indices")
2333 void *
buffer,
int buffer_size,
int * position,
void * config_output_,
2339 config_output->
name =
2344 buffer, buffer_size, position, &filetype_int, 1, MPI_INT, comm),
2347 config_output->
ref =
2354 char const * src_comp_name,
char const *
src_grid_name,
char const * src_field_name,
2355 char const * tgt_comp_name,
char const *
tgt_grid_name,
char const * tgt_field_name,
2356 char const * coupling_period,
int time_reduction,
2359 int mapping_on_source,
double scale_factor,
double scale_summand,
2360 size_t num_src_mask_names,
char const *
const * src_mask_names,
2361 char const * tgt_mask_name,
char const * yaxt_exchanger_name,
2363 int use_raw_exchange) {
2365 YAC_ASSERT(src_comp_name && src_comp_name[0] !=
'\0',
2366 "ERROR(yac_couple_config_def_couple): invalid parameter: src_comp_name");
2368 "ERROR(yac_couple_config_def_couple): invalid parameter: src_grid_name");
2369 YAC_ASSERT(src_field_name && src_field_name[0] !=
'\0',
2370 "ERROR(yac_couple_config_def_couple): invalid parameter: src_field_name");
2371 YAC_ASSERT(tgt_comp_name && tgt_comp_name[0] !=
'\0',
2372 "ERROR(yac_couple_config_def_couple): invalid parameter: tgt_comp_name");
2374 "ERROR(yac_couple_config_def_couple): invalid parameter: tgt_grid_name");
2375 YAC_ASSERT(tgt_field_name && tgt_field_name[0] !=
'\0',
2376 "ERROR(yac_couple_config_def_couple): invalid parameter: tgt_field_name");
2377 YAC_ASSERT(coupling_period && coupling_period[0] !=
'\0',
2378 "ERROR(yac_couple_config_def_couple): invalid parameter: coupling_period");
2385 "ERROR(yac_couple_config_def_couple): invalid parameter: time_reduction");
2387 "ERROR(yac_couple_config_def_couple): \"%lf\" is not a valid scale factor",
2389 YAC_ASSERT_F(isnormal(scale_summand) || (scale_summand == 0.0),
2390 "ERROR(yac_couple_config_def_couple): \"%lf\" is not a valid scale summand",
2393 (collection_selection == NULL) ||
2395 "ERROR(yac_couple_config_def_couple): invalid collection selection "
2396 "(size has to be > 0, if provided)");
2401 "ERROR(yac_couple_config_def_couple): invalid parameter: weight_file_on_existing");
2404 size_t src_comp_idx =
2406 size_t tgt_comp_idx =
2408 size_t src_grid_idx =
2410 size_t tgt_grid_idx =
2414 size_t component_indices[2];
2415 if(src_comp_idx < tgt_comp_idx){
2416 component_indices[0] = src_comp_idx;
2417 component_indices[1] = tgt_comp_idx;
2419 component_indices[0] = tgt_comp_idx;
2420 component_indices[1] = src_comp_idx;
2423 for(
size_t i = 0; (i < couple_config->
num_couples) && !couple; ++i)
2426 couple = &couple_config->
couples[i];
2443 size_t src_field_idx =
2445 couple_config, src_comp_idx, src_grid_idx,
2446 src_field_name, NULL, SIZE_MAX);
2447 size_t tgt_field_idx =
2449 couple_config, tgt_comp_idx, tgt_grid_idx,
2450 tgt_field_name, NULL, SIZE_MAX);
2507 char const * type_datetime,
struct _datetime ** datetime, MPI_Comm comm) {
2510 char datetime_buffer[MAX_DATETIME_STR_LEN];
2511 char * str_datetime = datetimeToString(*datetime, datetime_buffer);
2514 if (str_datetime != NULL) str_datetime = strdup(str_datetime);
2517 deallocateDateTime(*datetime);
2523 *datetime = newDateTime(str_datetime);
2585 size_t* old_to_new_idx;
2586 void * p_grids = couple_config->
grids;
2589 sizeof(couple_config->
grids[0]),
2591 couple_config->
grids = p_grids;
2594 for(
size_t comp_idx = 0; comp_idx < couple_config->
num_components;
2598 for(
size_t field_idx = 0; field_idx < component->
num_fields; ++field_idx)
2603 free(old_to_new_idx);
2612 size_t* old_to_new_idx;
2613 void * p_fields = component->
fields;
2616 sizeof(component->
fields[0]),
2618 component->
fields = p_fields;
2621 for(
size_t couple_idx = 0; couple_idx < couple_config->
num_couples;
2624 couple_config->
couples + couple_idx;
2625 for(
size_t field_couple_idx = 0;
2638 free(old_to_new_idx);
2646 size_t* old_to_new_idx;
2647 void * p_components = couple_config->
components;
2655 for(
size_t couple_idx = 0; couple_idx < couple_config->
num_couples;
2658 couple_config->
couples + couple_idx;
2666 for(
size_t field_couple_idx = 0;
2676 free(old_to_new_idx);
2679 for (
size_t comp_idx = 0; comp_idx < couple_config->
num_components; ++comp_idx)
2699 void * p_couples = couple_config->
couples;
2702 sizeof(couple_config->
couples[0]),
2704 couple_config->
couples = p_couples;
2722 char const * output_ref){
2733 "missing_definition_is_fatal",
2737 if (output_ref != NULL)
2739 (config_output == NULL); ++i)
2743 if (config_output != NULL) {
2746 MPI_Comm_rank(comm, &rank);
2751 FILE * config_file = fopen(config_output->
name,
"w");
2754 config_file != NULL,
2755 "ERROR(yac_couple_config_sync): "
2756 "failed to create coupling configuration file \"%s\"",
2757 config_output->
name);
2762 "ERROR(yac_couple_config_sync): "
2763 "invalid coupling configuration filetype (type = %d)",
2764 config_output->
type);
2767 switch(config_output->
type) {
2780 char * str_couple_config =
2784 fputs(str_couple_config, config_file);
2785 free(str_couple_config);
2786 fclose(config_file);
2799 "ERROR(yac_couple_config_set_config_output_filename): filename is NULL");
2804 "ERROR(yac_couple_config_set_config_output_filename): "
2805 "invalid output configuration filetype (type = %d)",
2810 "ERROR(yac_couple_config_set_config_output_filename): ref is NULL");
2818 "ERROR(yac_couple_config_set_config_output_filename): "
2819 "an filename has already been set for reference "
2820 "(ref \"%s\" curr filename \"%s\" filetype %d; "
2821 "new filename \"%s\" filetype %d",
2848 char const * tgt_component_name,
char const *
tgt_grid_name,
2849 char const * tgt_field_name,
char const ** src_component_name,
2850 char const **
src_grid_name,
char const ** src_field_name) {
2852 size_t tgt_comp_idx =
2854 size_t tgt_grid_idx =
2856 size_t tgt_field_idx =
2858 couple_config, tgt_comp_idx, tgt_grid_idx, tgt_field_name);
2861 for (
size_t couple_idx = 0; couple_idx < couple_config->
num_couples;
2865 couple_config->
couples + couple_idx;
2871 for (
size_t temp_field_couple_idx = 0;
2873 ++temp_field_couple_idx) {
2882 field_couple == NULL,
2883 "ERROR(yac_couple_config_get_field_source): "
2884 "multiple couples with the same target field is not supported by "
2885 "this routine (target component: \"%s\" target grid: \"%s\""
2889 field_couple = temp_field_couple;
2895 field_couple != NULL,
2896 "ERROR(yac_couple_config_get_field_source): "
2897 "provided field is not defined as a target in any coupling "
2898 "(target component: \"%s\" target grid: \"%s\" target field: \"%s\")",
2906 couple_config->
grids + src_field->grid_idx;
2908 *src_component_name = src_component->
name;
2910 *src_field_name = src_field->name;
2916 size_t couple_idx,
size_t field_couple_idx) {
2919 couple_config, couple_idx, field_couple_idx,
2920 "yac_couple_config_get_interpolation_gen_config", __LINE__);
2923 &couple_config->
couples[couple_idx];
2932 &couple_config->
grids[src_field->grid_idx];
2939 &couple_config->
grids[tgt_field->grid_idx];
2954 "ERROR(yac_couple_config_get_interpolation_gen_config): "
2955 "no valid fractional mask fallback value defined "
2956 "(component: \"%s\" grid: \"%s\" field \"%s\")",
2957 src_comp->
name, src_grid->name, src_field->name);
2973 size_t src_collection_size = src_field->collection_size;
2974 size_t tgt_collection_size = tgt_field->collection_size;
2982 "ERROR(yac_couple_config_get_interpolation_gen_config): "
2983 "target field collection size does not match size of provided "
2984 "collection selection: \n"
2986 " component name: \"%s\"\n"
2987 " grid name: \"%s\"\n"
2988 " field name: \"%s\"\n"
2989 " collection_size: %zu\n"
2991 " component name: \"%s\"\n"
2992 " grid name: \"%s\"\n"
2993 " field name: \"%s\"\n"
2994 " collection_size: %zu\n"
2995 " collection selection:\n"
2997 " max_index: %zu\n",
2998 src_comp->
name, src_grid->name, src_field->name, src_collection_size,
2999 tgt_comp->
name, tgt_grid->name, tgt_field->name, tgt_collection_size,
3007 "ERROR(yac_couple_config_get_interpolation_gen_config): "
3008 "maximum index of provided collection selection exceeds source "
3009 "field collection size: \n"
3011 " component name: \"%s\"\n"
3012 " grid name: \"%s\"\n"
3013 " field name: \"%s\"\n"
3014 " collection_size: %zu\n"
3016 " component name: \"%s\"\n"
3017 " grid name: \"%s\"\n"
3018 " field name: \"%s\"\n"
3019 " collection_size: %zu\n"
3020 " collection selection:\n"
3022 " max_index: %zu\n",
3023 src_comp->
name, src_grid->name, src_field->name, src_collection_size,
3024 tgt_comp->
name, tgt_grid->name, tgt_field->name, tgt_collection_size,
3035 src_collection_size == tgt_collection_size,
3036 "ERROR(yac_couple_config_get_interpolation_gen_config): "
3037 "collection sizes do not match for coupled fields (%zu != %zu): \n"
3039 " component name: \"%s\"\n"
3040 " grid name: \"%s\"\n"
3041 " field name: \"%s\"\n"
3043 " component name: \"%s\"\n"
3044 " grid name: \"%s\"\n"
3045 " field name: \"%s\"\n",
3046 src_collection_size, tgt_collection_size,
3047 src_comp->
name, src_grid->name, src_field->name,
3048 tgt_comp->
name, tgt_grid->name, tgt_field->name);
3051 interp_gen_config, src_collection_size);
3054 return interp_gen_config;
unsigned component_idx[3]
#define YAC_ASSERT(exp, msg)
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)
struct yac_interpolation_gen_config * yac_couple_config_get_interpolation_gen_config(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx)
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)
struct yac_collection_selection const * yac_couple_config_get_collection_selection(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 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_)
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)
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, struct yac_collection_selection const *collection_selection, int use_raw_exchange)
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)
size_t yac_collection_selection_get_collection_size(struct yac_collection_selection const *collection_selection)
Get the size of the collection selection.
struct yac_collection_selection * yac_collection_selection_unpack(void const *buffer, int buffer_size, int *position, MPI_Comm comm)
Unpack a collection selection from a contiguous MPI buffer.
size_t yac_collection_selection_get_pack_size(struct yac_collection_selection const *sel, MPI_Comm comm)
Compute the MPI pack size of a collection selection.
void yac_collection_selection_delete(struct yac_collection_selection *collection_selection)
Delete a collection selection object.
int yac_collection_selection_compare(struct yac_collection_selection const *a, struct yac_collection_selection const *b)
Compare two collection selections.
struct yac_collection_selection * yac_collection_selection_copy(const struct yac_collection_selection *collection_selection)
Selection of indices from a collection.
void yac_collection_selection_pack(struct yac_collection_selection const *sel, void *buffer, int buffer_size, int *position, MPI_Comm comm)
Pack a collection selection into a contiguous MPI buffer.
size_t yac_collection_selection_get_max_index(struct yac_collection_selection const *selection)
Get the maximum index of a collection selection.
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_MAPPING_ON_TGT
weights will be applied at target processes
@ YAC_MAPPING_ON_SRC
weights will be applied at source processes
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
void yac_interpolation_gen_config_set_reorder(struct yac_interpolation_gen_config *config, enum yac_interp_weights_reorder_type reorder)
Set the reordering strategy for interpolation weights.
void yac_interpolation_gen_config_set_collection_size(struct yac_interpolation_gen_config *config, size_t collection_size)
Set the number of contiguous fields (starting at "0") in the field collection.
void yac_interpolation_gen_config_set_collection_selection(struct yac_interpolation_gen_config *config, struct yac_collection_selection const *collection_selection)
Set the collection selection of source field in the source field collection.
void yac_interpolation_gen_config_set_scaling_factor(struct yac_interpolation_gen_config *config, double scaling_factor)
Set the multiplicative scaling factor.
void yac_interpolation_gen_config_set_yaxt_exchanger_name(struct yac_interpolation_gen_config *config, char const *name)
Set the name of the Yaxt exchanger.
void yac_interpolation_gen_config_set_frac_mask_fallback_value(struct yac_interpolation_gen_config *config, double frac_mask_fallback_value)
Set the fractional mask fallback value.
struct yac_interpolation_gen_config * yac_interpolation_gen_config_new(void)
Allocate and initialise an interpolation generation configuration structure.
void yac_interpolation_gen_config_set_scaling_summand(struct yac_interpolation_gen_config *config, double scaling_summand)
Set the additive scaling summand.
Configuration management for interpolation generation.
Defines internal basic interpolation definitions.
#define YAC_FRAC_MASK_VALUE_IS_SET(value)
Test whether a fractional mask value is explicitly set.
#define YAC_FRAC_MASK_VALUE_IS_VALID(value)
Test whether a fractional mask value is valid.
#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::@78 target
size_t num_src_mask_names
enum yac_weight_file_on_existing weight_file_on_existing
struct yac_interp_stack_config * interp_stack
enum yac_reduction_type coupling_period_operation
struct yac_couple_config_field_couple::@78 source
int enforce_write_weight_file
char const * weight_file_name
struct yac_collection_selection * collection_selection
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)
Configuration structure for interpolation generation.
double frac_mask_fallback_value
char const * weight_file_name
char const src_grid_name[]
char const tgt_grid_name[]
static struct user_input_data_component ** 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,...)
size_t yac_string_get_pack_size(char const *caller, char const *string, MPI_Comm comm, int allow_null)
Compute number of bytes required to pack a string for MPI transport.
char * yac_string_unpack(void const *buffer, int buffer_size, int *position, MPI_Comm comm)
Unpack a C string from a buffer packed with yac_string_pack.
void yac_string_pack(char const *caller, char const *string, void *buffer, int buffer_size, int *position, MPI_Comm comm, int allow_null)
Pack a C string into a provided buffer using MPI_Pack semantics.
#define yac_mpi_call(call, comm)