17#include "mtime_calendar.h"
94 xmalloc(1 *
sizeof(*couple_config));
99 couple_config->
grids = NULL;
108 return couple_config;
112 return (
string != NULL)?strdup(
string):NULL;
117 free((
void*)field->
name);
127 for (
size_t i = 0; i < component->
num_fields; ++i)
130 free((
void*)(component->
name));
160 free((
void*)grid->
name);
167 "ERROR(yac_couple_config_grid_compare): "
168 "invalid name (NULL is not allowed)");
180 "ERROR(yac_couple_config_field_compare): "
181 "invalid name (NULL is not allowed)");
186 void const * a_,
void const * b_) {
190 "ERROR(yac_couple_config_component_compare): "
191 "invalid name (NULL is not allowed)");
196 void const * a_,
void const * b_) {
214 void const * a_,
void const * b_) {
226 char const * string_name,
char **
string, MPI_Comm comm) {
229 MPI_Comm_rank(comm, &rank);
234 size_t len = (*
string != NULL)?(strlen(*
string) + 1):0;
237 "ERROR(couple_config_sync_string): \"%s\" too long", string_name);
238 data_pair.len = (int)len;
239 data_pair.rank = rank;
244 MPI_IN_PLACE, &data_pair, 1, MPI_2INT, MPI_MAXLOC, comm), comm);
245 if (data_pair.len == 0)
return;
248 char const * string_bak = NULL;
249 if (data_pair.rank != rank) {
250 string_bak = *string;
251 *
string =
xmalloc((
size_t)data_pair.len *
sizeof(**
string));
254 MPI_Bcast(*
string, data_pair.len, MPI_CHAR, data_pair.rank, comm), comm);
257 if (data_pair.rank != rank) {
259 (string_bak == NULL) ||
260 !strcmp(string_bak, *
string),
261 "ERROR(couple_config_sync_string): inconsistent \"%s\" definition "
262 "(\"%s\" != \"%s\")", string_name, string_bak, *
string);
263 free((
void*)string_bak);
269 int calendar = (int)getCalendarType();
270 if (calendar == CALENDAR_NOT_SET) calendar = INT_MAX;
275 MPI_IN_PLACE, &calendar, 1, MPI_INT, MPI_MIN, comm), comm);
278 if (calendar == INT_MAX)
return;
286 void * a_,
void * b_, MPI_Comm comm) {
301 "component metadata", (
char **)&(a->
metadata), comm);
305 void * a_,
void * b_, MPI_Comm comm) {
319 void * a_,
void * b_, MPI_Comm comm) {
333 MPI_Comm_rank(comm, &rank);
337 } data_pairs[DATA_PAIR_COUNT];
338 size_t timestep_len =
340 size_t metadata_len =
343 timestep_len <= INT_MAX,
344 "ERROR(yac_couple_config_field_merge): timestep string too long");
346 metadata_len <= INT_MAX,
347 "ERROR(yac_couple_config_field_merge): metadata string too long");
351 "ERROR(yac_couple_config_field_merge): invalid collection size \"%zu\"",
353 data_pairs[TIMESTEP_IDX].len = (int)timestep_len;
354 data_pairs[TIMESTEP_IDX].rank = rank;
355 data_pairs[METADATA_IDX].len = (int)metadata_len;
356 data_pairs[METADATA_IDX].rank = rank;
357 data_pairs[FRAC_MASK_IDX].len =
359 data_pairs[FRAC_MASK_IDX].rank = rank;
360 data_pairs[COLLECTION_SIZE_IDX].len =
363 data_pairs[COLLECTION_SIZE_IDX].rank = rank;
368 MPI_IN_PLACE, data_pairs, DATA_PAIR_COUNT, MPI_2INT,
369 MPI_MAXLOC, comm), comm);
372 if (data_pairs[TIMESTEP_IDX].len > 0) {
375 char * timestep_buffer =
xmalloc((
size_t)data_pairs[TIMESTEP_IDX].len);
376 if (data_pairs[TIMESTEP_IDX].rank == rank)
377 strcpy(timestep_buffer, b->
timestep);
380 timestep_buffer, data_pairs[TIMESTEP_IDX].len, MPI_CHAR,
381 data_pairs[TIMESTEP_IDX].rank, comm), comm);
385 (b == NULL) || (b->
timestep == NULL) ||
386 !strcmp(b->
timestep, timestep_buffer),
387 "ERROR(yac_couple_config_field_merge): "
388 "inconsistent timestep definition (\"%s\" != \"%s\")",
397 if (data_pairs[METADATA_IDX].len > 0) {
400 char * metadata_buffer =
xmalloc((
size_t)data_pairs[METADATA_IDX].len);
401 if (data_pairs[METADATA_IDX].rank == rank)
402 strcpy(metadata_buffer, b->
metadata);
405 metadata_buffer, data_pairs[METADATA_IDX].len, MPI_CHAR,
406 data_pairs[METADATA_IDX].rank, comm), comm);
410 (b == NULL) || (b->
metadata == NULL) ||
411 !strcmp(b->
metadata, metadata_buffer),
412 "ERROR(yac_couple_config_field_merge): "
413 "inconsistent metadata definition (\"%s\" != \"%s\")",
422 if (data_pairs[FRAC_MASK_IDX].len != 0) {
425 double frac_mask_fallback_value;
426 if (data_pairs[FRAC_MASK_IDX].rank == rank)
430 &frac_mask_fallback_value, 1, MPI_DOUBLE,
431 data_pairs[FRAC_MASK_IDX].rank, comm), comm);
440 "ERROR(yac_couple_config_field_merge): "
441 "inconsistent fractional mask fallback value definition "
451 if (data_pairs[COLLECTION_SIZE_IDX].len > -1) {
457 "ERROR(yac_couple_config_field_merge): "
458 "inconsistent collection size definition (\"%zu\" != \"%d\")",
467 void * a_,
void * b_, MPI_Comm comm) {
469 if (b_ == NULL)
return;
476 "ERROR(yac_couple_config_field_couple_merge): "
480 "ERROR(yac_couple_config_field_couple_merge): "
484 "ERROR(yac_couple_config_field_couple_merge): "
485 "inconsistent mapping side (%d != %d)",
489 "ERROR(yac_couple_config_field_couple_merge): "
490 "inconsistent interpolation stack")
493 "ERROR(yac_couple_config_field_couple_merge): "
494 "inconsistent coupling period operation (%d != %d)",
498 "ERROR(yac_couple_config_field_couple_merge): "
499 "inconsistent coupling period (%s != %s)",
503 "ERROR(yac_couple_config_field_couple_merge): "
504 "inconsistent defintion of enforce_write_weight_file (%d != %d)",
509 "ERROR(yac_couple_config_field_couple_merge): "
510 "inconsistent weight_file_name (%s != %s)",
514 "ERROR(yac_couple_config_field_couple_merge): "
515 "inconsistent scale factor (%lf != %lf)",
519 "ERROR(yac_couple_config_field_couple_merge): "
520 "inconsistent scale summand (%lf != %lf)",
524 "ERROR(yac_couple_config_field_couple_merge): "
525 "inconsistent number of source mask names (%zu != %zu)",
529 "ERROR(yac_couple_config_field_couple_merge): "
530 "inconsistent availability of source mask names (%s != %s)",
536 "ERROR(yac_couple_config_field_couple_merge): "
537 "inconsistent source mask names at index %zu (\"%s\" != \"%s\")",
541 "ERROR(yac_couple_config_field_couple_merge): "
542 "inconsistent availability of target mask name (%s != %s)",
548 "ERROR(yac_couple_config_field_couple_merge): "
549 "inconsistent target mask name (\"%s\" != \"%s\")",
554 size_t * num_field_couples,
558 void * a_,
void * b_, MPI_Comm comm) {
579 for (
size_t i = 0; i < couple_config->
num_grids; ++i){
582 free(couple_config->
grids);
589 for (
size_t couple_idx = 0; couple_idx < couple_config->
num_couples;
601 "ERROR(yac_couple_config_add_grid_): "
602 "invalid name (NULL is not allowed)")
604 for (
size_t i = 0; i < couple_config->
num_grids; ++i)
605 if (!strcmp(couple_config->
grids[i].
name, name))
return i;
607 size_t grid_idx = couple_config->
num_grids;
609 couple_config->
grids =
611 couple_config->
grids,
629 "ERROR(yac_couple_config_add_component_): "
630 "invalid name (NULL is not allowed)")
645 return component_idx;
656 char const * comp_name,
const char* metadata) {
660 = metadata==NULL?NULL:strdup(metadata);
665 char const * grid_name,
const char* metadata) {
671 = metadata==NULL?NULL:strdup(metadata);
676 const char* comp_name,
const char * grid_name,
const char* field_name,
677 const char* metadata) {
681 comp_idx, grid_idx, field_name);
684 = metadata==NULL?NULL:strdup(metadata);
689 const char * comp_name) {
696 const char * grid_name) {
703 const char* comp_name,
const char * grid_name,
const char* field_name) {
707 comp_idx, grid_idx, field_name);
713 char const * routine_name,
int line) {
717 "ERROR(%s:%d:%s): invalid component_idx", __FILE__, line, routine_name)
722 char const * routine_name,
int line) {
726 "ERROR(%s:%d:%s): invalid grid_idx", __FILE__, line, routine_name)
731 size_t comp_idx,
size_t grid_idx,
char const * name,
732 char const * timestep,
size_t collection_size) {
735 couple_config, comp_idx,
736 "yac_couple_config_component_add_field_", __LINE__);
738 couple_config, grid_idx,
739 "yac_couple_config_component_add_field_", __LINE__);
744 for (
size_t i = 0; i < component->
num_fields; i++) {
756 "ERROR(yac_couple_config_component_add_field): "
757 "inconsistent timestep definition (\"%s\" != \"%s\")",
760 collection_size == SIZE_MAX ||
762 "ERROR(yac_couple_config_component_add_field): "
763 "inconsistent collection_size definition (%zu != %zu)",
776 sizeof(*(component->
fields)));
778 component->
fields + field_idx;
791 const char* grid_name,
const char*
name,
char const *
timestep,
809 char const * routine_name,
int line) {
812 couple_idx < couple_config->num_couples,
813 "ERROR(%s:%d:%s): invalid couple_idx", __FILE__, line, routine_name);
820 couple_config, couple_idx,
"yac_couple_config_get_num_couple_fields",
828 char const * couple_component_names[2]) {
831 couple_config, couple_idx,
"yac_couple_config_get_couple_component_names",
834 for (
int i = 0; i < 2; ++i)
835 couple_component_names[i] =
845 "ERROR(yac_couple_config_component_name_is_valid): component name is NULL")
848 "ERROR(yac_couple_config_component_name_is_valid): "
849 "component name is too long (maximum is YAC_MAX_CHARLEN)")
851 for (
size_t component_idx = 0; component_idx < couple_config->
num_components;
853 if (!strcmp(component_name, couple_config->
components[component_idx].
name))
874 "yac_couple_config_get_num_fields", __LINE__);
881 size_t component_idx = SIZE_MAX;
883 (component_idx == SIZE_MAX); ++i)
888 component_idx != SIZE_MAX,
889 "ERROR(yac_couple_config_get_component_idx): "
890 "Component \"%s\" not found in coupling configuration",
893 return component_idx;
902 if (!strcmp(couple_config->
grids[i].
name, grid_name))
907 "ERROR(yac_couple_config_get_grid_idx): "
908 "grid name \"%s\" not in list of grids", grid_name)
915 size_t grid_idx,
char const * field_name) {
917 couple_config, component_idx,
918 "yac_couple_config_get_component_name", __LINE__);
920 size_t field_idx = SIZE_MAX;
925 (i<nbr_fields) && (field_idx == SIZE_MAX); ++i)
933 field_idx != INT_MAX,
934 "ERROR(yac_couple_config_get_field_idx): "
936 "(component_idx %zu grid_idx %zu field_name \"%s\"",
937 component_idx, grid_idx, field_name);
946 couple_config, component_idx,
947 "yac_couple_config_get_component_name", __LINE__);
954 size_t field_idx,
char const * routine_name,
int line) {
957 couple_config, component_idx, routine_name, __LINE__);
962 "ERROR(%s:%d:%s): invalid field_idx", __FILE__,
971 couple_config, component_idx, field_idx,
972 "yac_couple_config_get_field_grid_name", __LINE__);
975 couple_config->
grids[
986 couple_config, component_idx, field_idx,
987 "yac_couple_config_get_field_name", __LINE__);
997 char const * component_name,
char const * grid_name,
998 char const * field_name) {
1000 size_t component_idx =
1006 couple_config, component_idx, grid_idx, field_name);
1014 "ERROR(yac_couple_config_get_field_timestep): "
1015 "no valid timestep defined (component: \"%s\" field \"%s\")",
1023 char const * component_name,
char const * grid_name,
1024 char const * field_name) {
1026 size_t component_idx =
1032 couple_config, component_idx,
grid_idx, field_name);
1035 for(
size_t couple_idx = 0; couple_idx<nbr_couples; ++couple_idx){
1041 for(
size_t trans_couple_idx = 0; trans_couple_idx < nbr_trans_couples;
1042 ++trans_couple_idx){
1062 "yac_couple_config_field_is_valid", __LINE__);
1074 size_t field_couple_idx,
char const * routine_name,
int line) {
1081 "ERROR(%s:%d:%s): invalid field_couple_idx",
1082 __FILE__, line, routine_name)
1087 size_t couple_idx,
size_t field_couple_idx) {
1090 couple_config, couple_idx, field_couple_idx,
1091 "yac_couple_config_get_interp_stack", __LINE__);
1095 couples[couple_idx].
1096 field_couples[field_couple_idx].interp_stack;
1101 size_t couple_idx,
size_t field_couple_idx,
1102 char const ** src_grid_name,
char const ** tgt_grid_name) {
1105 couple_config, couple_idx, field_couple_idx,
1106 "yac_couple_config_get_field_grid_names", __LINE__);
1108 size_t src_component_idx =
1109 couple_config->
couples[couple_idx].
1110 field_couples[field_couple_idx].
1111 source.component_idx;
1112 size_t src_field_idx =
1113 couple_config->
couples[couple_idx].
1114 field_couples[field_couple_idx].
1117 size_t tgt_component_idx =
1118 couple_config->
couples[couple_idx].
1119 field_couples[field_couple_idx].
1120 target.component_idx;
1121 size_t tgt_field_idx =
1122 couple_config->
couples[couple_idx].
1123 field_couples[field_couple_idx].
1127 couple_config->
grids[
1128 couple_config->
components[src_component_idx].
1129 fields[src_field_idx].grid_idx].
name;
1131 couple_config->
grids[
1132 couple_config->
components[tgt_component_idx].
1133 fields[tgt_field_idx].grid_idx].
name;
1138 char const * comp_name,
char const * grid_name,
char const * field_name,
1139 double frac_mask_fallback_value) {
1144 "ERROR(yac_couple_config_field_enable_frac_mask): "
1145 "\"%lf\" is not a valid fractional mask fallback value "
1146 "(component: \"%s\" grid: \"%s\" field \"%s\")",
1147 frac_mask_fallback_value, comp_name, grid_name, field_name);
1152 comp_idx, grid_idx, field_name);
1154 double old_frac_mask_fallback_value =
1156 frac_mask_fallback_value;
1161 (old_frac_mask_fallback_value == frac_mask_fallback_value),
1162 "ERROR(yac_couple_config_field_enable_frac_mask): "
1163 "fractional mask fallback value was already set:\n"
1164 "\told value \"%lf\" new value \"%lf\" "
1165 "(component: \"%s\" grid: \"%s\" field \"%s\")",
1166 old_frac_mask_fallback_value, frac_mask_fallback_value,
1167 comp_name, grid_name, field_name);
1170 frac_mask_fallback_value = frac_mask_fallback_value;
1175 char const * component_name,
char const * grid_name,
1176 char const * field_name) {
1178 size_t component_idx =
1184 couple_config, component_idx, grid_idx, field_name);
1192 "ERROR(yac_couple_config_get_frac_mask_fallback_value): "
1193 "no valid fractional mask fallback value defined "
1194 "(component: \"%s\" grid: \"%s\" field \"%s\")",
1202 char const * component_name,
char const * grid_name,
1203 char const * field_name) {
1205 size_t component_idx =
1211 couple_config, component_idx,
grid_idx, field_name);
1219 "ERROR(yac_couple_config_get_collection_size): "
1220 "no valid collection size defined "
1221 "(component: \"%s\" grid: \"%s\" field \"%s\")",
1229 size_t couple_idx,
size_t field_couple_idx,
1230 char const ** src_component_name,
char const ** tgt_component_name) {
1233 couple_config, couple_idx, field_couple_idx,
1234 "yac_couple_config_get_field_couple_component_names", __LINE__);
1236 *src_component_name =
1238 couple_config->
couples[couple_idx].
1239 field_couples[field_couple_idx].source.component_idx].
name;
1240 *tgt_component_name =
1242 couple_config->
couples[couple_idx].
1243 field_couples[field_couple_idx].target.component_idx].
name;
1248 size_t couple_idx,
size_t field_couple_idx,
1249 char const ** src_field_name,
const char ** tgt_field_name) {
1252 couple_config, couple_idx, field_couple_idx,
1253 "yac_couple_config_get_field_names", __LINE__);
1255 size_t src_component_idx =
1256 couple_config->
couples[couple_idx].
1257 field_couples[field_couple_idx].source.component_idx;
1258 size_t tgt_component_idx =
1259 couple_config->
couples[couple_idx].
1260 field_couples[field_couple_idx].target.component_idx;
1261 size_t src_field_idx =
1262 couple_config->
couples[couple_idx].
1263 field_couples[field_couple_idx].source.field_idx;
1264 size_t tgt_field_idx =
1265 couple_config->
couples[couple_idx].
1266 field_couples[field_couple_idx].target.field_idx;
1269 couple_config->
components[src_component_idx].
1270 fields[src_field_idx].name;
1272 couple_config->
components[tgt_component_idx].
1273 fields[tgt_field_idx].name;
1278 size_t couple_idx,
size_t field_couple_idx) {
1281 couple_config, couple_idx, field_couple_idx,
1282 "yac_couple_config_mapping_on_source", __LINE__);
1286 couples[couple_idx].
1287 field_couples[field_couple_idx].
1293 size_t couple_idx,
size_t field_couple_idx) {
1296 couple_config, couple_idx, field_couple_idx,
1297 "yac_couple_config_get_source_lag", __LINE__);
1301 couples[couple_idx].
1302 field_couples[field_couple_idx].
1308 size_t couple_idx,
size_t field_couple_idx) {
1311 couple_config, couple_idx, field_couple_idx,
1312 "yac_couple_config_get_target_lag", __LINE__);
1316 couples[couple_idx].
1317 field_couples[field_couple_idx].
1323 size_t couple_idx,
size_t field_couple_idx) {
1326 couple_config, couple_idx, field_couple_idx,
1327 "yac_couple_config_get_coupling_period", __LINE__);
1331 couples[couple_idx].
1332 field_couples[field_couple_idx].
1338 size_t couple_idx,
size_t field_couple_idx) {
1341 couple_config, couple_idx, field_couple_idx,
1342 "yac_couple_config_get_source_timestep", __LINE__);
1346 char const * timestep =
1352 "ERROR(yac_couple_config_get_source_timestep): "
1353 "no valid timestep defined (component: \"%s\" field \"%s\")",
1363 size_t couple_idx,
size_t field_couple_idx) {
1366 couple_config, couple_idx, field_couple_idx,
1367 "yac_couple_config_get_target_timestep", __LINE__);
1371 char const * timestep =
1377 "ERROR(yac_couple_config_get_target_timestep): "
1378 "no valid timestep defined (component: \"%s\" field \"%s\")",
1388 size_t couple_idx,
size_t field_couple_idx) {
1391 couple_config, couple_idx, field_couple_idx,
1392 "yac_couple_config_get_coupling_period_operation", __LINE__);
1396 couples[couple_idx].
1397 field_couples[field_couple_idx].
1403 char const * start,
char const * end) {
1405 if ((start != NULL) && (strlen(start) > 0)) {
1411 free((
void*)old_start);
1414 if ((end != NULL) && (strlen(end) > 0)) {
1420 free((
void*)old_end);
1428 "ERROR(yac_couple_config_get_start_datetime): "
1429 "start_datetime not yet defined");
1438 "ERROR(yac_couple_config_get_start_datetime): "
1439 "start_datetime not yet defined");
1449 "ERROR(yac_couple_config_get_grid_name): "
1450 "Invalid grid idx %zu", grid_idx);
1452 return couple_config->
grids[grid_idx].
name;
1457 size_t couple_idx,
size_t field_couple_idx) {
1460 couple_config, couple_idx, field_couple_idx,
1461 "yac_couple_config_enforce_write_weight_file", __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_weight_file_name", __LINE__);
1478 static char dummy[] =
"\0";
1481 couples[couple_idx].
1482 field_couples[field_couple_idx].
1490 size_t couple_idx,
size_t field_couple_idx) {
1493 couple_config, couple_idx, field_couple_idx,
1494 "yac_couple_config_get_scale_factor", __LINE__);
1498 couples[couple_idx].
1499 field_couples[field_couple_idx].
1505 size_t couple_idx,
size_t field_couple_idx) {
1508 couple_config, couple_idx, field_couple_idx,
1509 "yac_couple_config_get_scale_summand", __LINE__);
1513 couples[couple_idx].
1514 field_couples[field_couple_idx].
1520 size_t couple_idx,
size_t field_couple_idx,
1521 char const *
const ** mask_names,
size_t * num_mask_names) {
1524 couple_config, couple_idx, field_couple_idx,
1525 "yac_couple_config_get_src_mask_names", __LINE__);
1528 (
char const *
const *)(
1530 couples[couple_idx].
1531 field_couples[field_couple_idx].
1535 couples[couple_idx].
1536 field_couples[field_couple_idx].
1542 size_t couple_idx,
size_t field_couple_idx) {
1545 couple_config, couple_idx, field_couple_idx,
1546 "yac_couple_config_get_tgt_mask_name", __LINE__);
1550 couples[couple_idx].
1551 field_couples[field_couple_idx].
1558 for (
size_t grid_idx = 0; grid_idx < couple_config->
num_grids;
1560 if (!strcmp(couple_config->
grids[grid_idx].
name, grid_name))
1566 char const *
string, MPI_Comm comm) {
1568 int strlen_pack_size, string_pack_size;
1569 yac_mpi_call(MPI_Pack_size(1, MPI_INT, comm, &strlen_pack_size), comm);
1571 if (
string != NULL) {
1574 (
int)(strlen(
string)), MPI_CHAR, comm, &string_pack_size), comm);
1576 string_pack_size = 0;
1579 return (
size_t)strlen_pack_size + (size_t)string_pack_size;
1583 void * grid_, MPI_Comm comm) {
1591 size_t num_grids,
void * grids_, MPI_Comm comm) {
1595 int num_grids_pack_size;
1596 yac_mpi_call(MPI_Pack_size(1, MPI_INT, comm, &num_grids_pack_size), comm);
1598 size_t grids_pack_size = 0;
1603 return (
size_t)num_grids_pack_size + grids_pack_size;
1612 "ERROR(yac_couple_config_get_field_pack_size):"
1613 "grid_idx is too big")
1616 yac_mpi_call(MPI_Pack_size(1, MPI_INT, comm, &int_pack_size), comm);
1617 int double_pack_size;
1618 yac_mpi_call(MPI_Pack_size(1, MPI_DOUBLE, comm, &double_pack_size), comm);
1626 return int_pack_size +
1630 timestep_pack_size +
1635 size_t num_fields,
void * fields_, MPI_Comm comm) {
1639 int num_fields_pack_size;
1641 MPI_Pack_size(1, MPI_INT, comm, &num_fields_pack_size), comm);
1643 size_t fields_pack_size = 0;
1644 for (
size_t i = 0; i < num_fields; ++i)
1649 return (
size_t)num_fields_pack_size +
1665 int num_components_pack_size;
1667 MPI_Pack_size(1, MPI_INT, comm, &num_components_pack_size), comm);
1669 size_t components_pack_size = 0;
1671 components_pack_size +=
1674 return (
size_t)num_components_pack_size + components_pack_size;
1681 yac_mpi_call(MPI_Pack_size(10, MPI_INT, comm, &ints_pack_size), comm);
1682 int doubles_pack_size;
1683 yac_mpi_call(MPI_Pack_size(2, MPI_DOUBLE, comm, &doubles_pack_size), comm);
1684 int src_mask_names_pack_size = 0;
1687 src_mask_names_pack_size +=
1692 (
size_t)ints_pack_size +
1710 src_mask_names_pack_size +
1716 size_t num_field_couples,
void * field_couples_, MPI_Comm comm) {
1720 int num_field_couples_pack_size;
1722 MPI_Pack_size(1, MPI_INT, comm, &num_field_couples_pack_size), comm);
1724 size_t field_couples_pack_size = 0;
1725 for (
size_t i = 0; i < num_field_couples; ++i)
1726 field_couples_pack_size +=
1729 return (
size_t)num_field_couples_pack_size +
1730 field_couples_pack_size;
1736 int component_indices_pack_size;
1738 MPI_Pack_size(2, MPI_INT, comm, &component_indices_pack_size), comm);
1740 return (
size_t)component_indices_pack_size;
1744 size_t num_couples,
void * couples_, MPI_Comm comm) {
1748 int num_couples_pack_size;
1750 MPI_Pack_size(1, MPI_INT, comm, &num_couples_pack_size), comm);
1752 size_t couples_pack_size = 0;
1753 for (
size_t i = 0; i < num_couples; ++i)
1754 couples_pack_size +=
1757 return (
size_t)num_couples_pack_size + couples_pack_size;
1761 char const *
string,
void * buffer,
int buffer_size,
int * position,
1764 size_t len = (
string == NULL)?0:strlen(
string);
1767 len <= INT_MAX,
"ERROR(yac_couple_config_pack_string): string too long")
1769 int len_int = (int)len;
1773 &len_int, 1, MPI_INT, buffer, buffer_size, position, comm), comm);
1778 string, len_int, MPI_CHAR, buffer, buffer_size, position, comm),
1784 void * buffer,
int buffer_size,
int * position, MPI_Comm comm) {
1787 grid->
name, buffer, buffer_size, position, comm);
1792 void * buffer,
int buffer_size,
int * position, MPI_Comm comm) {
1798 "ERROR(yac_couple_config_pack_grids): num_grids bigger than INT_MAX")
1803 &num_grids_int, 1, MPI_INT, buffer, buffer_size, position, comm), comm);
1807 grids + i, buffer, buffer_size, position, comm);
1812 void * buffer,
int buffer_size,
int * position, MPI_Comm comm) {
1816 "ERROR(yac_couple_config_pack_field): grid_idx is too big")
1820 "ERROR(yac_couple_config_pack_field): invalid collection size")
1822 int grid_idx = (int)field->
grid_idx;
1824 int collection_size =
1830 &grid_idx, 1, MPI_INT, buffer, buffer_size, position, comm), comm);
1833 &frac_mask_fallback_value, 1, MPI_DOUBLE, buffer, buffer_size,
1834 position, comm), comm);
1837 &collection_size, 1, MPI_INT, buffer, buffer_size, position, comm), comm);
1839 buffer_size, position, comm);
1841 buffer_size, position, comm);
1843 buffer_size, position, comm);
1847 size_t num_fields,
void * fields_,
void * buffer,
int buffer_size,
1848 int * position, MPI_Comm comm) {
1853 num_fields <= INT_MAX,
1854 "ERROR(yac_couple_config_pack_fields): "
1855 "num_fields bigger than INT_MAX")
1857 int num_fields_int = (int)num_fields;
1860 &num_fields_int, 1, MPI_INT,
1861 buffer, buffer_size, position, comm), comm);
1863 for (
size_t i = 0; i < num_fields; ++i)
1865 fields + i, buffer, buffer_size, position, comm);
1870 void * buffer,
int buffer_size,
int * position, MPI_Comm comm) {
1873 component->
name, buffer, buffer_size, position, comm);
1878 void * buffer,
int buffer_size,
int * position, MPI_Comm comm) {
1884 "ERROR(yac_couple_config_pack_components): "
1885 "num_components bigger than INT_MAX")
1890 &num_components_int, 1, MPI_INT, buffer, buffer_size, position, comm), comm);
1894 components + i, buffer, buffer_size, position, comm);
1899 void * buffer,
int buffer_size,
int * position, MPI_Comm comm) {
1903 "ERROR(yac_couple_config_pack_field_couple): "
1904 "source.component_idx bigger than INT_MAX")
1907 "ERROR(yac_couple_config_pack_field_couple): "
1908 "source.field_idx bigger than INT_MAX")
1911 "ERROR(yac_couple_config_pack_field_couple): "
1912 "target.component_idx bigger than INT_MAX")
1915 "ERROR(yac_couple_config_pack_field_couple): "
1916 "target.field_idx bigger than INT_MAX")
1919 "ERROR(yac_couple_config_pack_field_couple): "
1920 "mapping_on_source bigger than INT_MAX")
1923 "ERROR(yac_couple_config_pack_field_couple): "
1924 "coupling_period_operation bigger than INT_MAX")
1927 "ERROR(yac_couple_config_pack_field_couple): "
1928 "enforce_write_weight_file bigger than INT_MAX")
1931 "ERROR(yac_couple_config_pack_field_couple): "
1932 "num_src_mask_names bigger than INT_MAX")
1947 MPI_Pack(ints, 10, MPI_INT, buffer, buffer_size, position, comm), comm);
1954 double doubles[2] = {
1959 MPI_Pack(doubles, 2, MPI_DOUBLE, buffer, buffer_size, position, comm),
1963 field_couple->
interp_stack, buffer, buffer_size, position, comm);
1968 field_couple->
src_mask_names[i], buffer, buffer_size, position, comm);
1971 field_couple->
tgt_mask_name, buffer, buffer_size, position, comm);
1975 size_t num_field_couples,
void * field_couples_,
1976 void * buffer,
int buffer_size,
int * position, MPI_Comm comm) {
1981 num_field_couples <= INT_MAX,
1982 "ERROR(yac_couple_config_pack_field_couples): "
1983 "num_field_couples bigger than INT_MAX")
1985 int num_field_couples_int = (int)num_field_couples;
1988 &num_field_couples_int, 1, MPI_INT,
1989 buffer, buffer_size, position, comm), comm);
1991 for (
size_t i = 0; i < num_field_couples; ++i)
1993 field_couples + i, buffer, buffer_size, position, comm);
1998 void * buffer,
int buffer_size,
int * position, MPI_Comm comm) {
2003 "ERROR(yac_couple_config_pack_couple_basic): "
2004 "component_indices bigger than INT_MAX")
2011 component_indices, 2, MPI_INT, buffer, buffer_size, position, comm),
2016 size_t num_couples,
void * couples_,
2017 void * buffer,
int buffer_size,
int * position, MPI_Comm comm) {
2022 num_couples <= INT_MAX,
2023 "ERROR(yac_couple_config_pack_couples_basic): "
2024 "num_couples bigger than INT_MAX")
2026 int num_couples_int = (int)num_couples;
2029 &num_couples_int, 1, MPI_INT, buffer, buffer_size, position, comm), comm);
2031 for (
size_t i = 0; i < num_couples; ++i)
2033 couples + i, buffer, buffer_size, position, comm);
2037 void * buffer,
int buffer_size,
int * position, MPI_Comm comm) {
2042 buffer, buffer_size, position, &string_len, 1, MPI_INT, comm), comm);
2044 if (string_len <= 0)
return NULL;
2046 char *
string =
xmalloc(((
size_t)string_len + 1) *
sizeof(*
string));
2049 buffer, buffer_size, position,
string, string_len, MPI_CHAR, comm), comm);
2050 string[string_len] =
'\0';
2055 void * buffer,
int buffer_size,
int * position,
2064 void * buffer,
int buffer_size,
int * position,
2065 size_t *
num_grids,
void * grids_, MPI_Comm comm) {
2072 buffer, buffer_size, position, &num_grids_int, 1, MPI_INT, comm), comm);
2076 "ERROR(yac_couple_config_unpack_grids): invalid number of grids")
2083 buffer, buffer_size, position, *
grids + i, comm);
2087 void * buffer,
int buffer_size,
int * position,
2091 double frac_mask_fallback_value;
2092 int collection_size;
2096 buffer, buffer_size, position, &grid_idx, 1, MPI_INT, comm), comm);
2099 buffer, buffer_size, position, &frac_mask_fallback_value, 1,
2100 MPI_DOUBLE, comm), comm);
2103 buffer, buffer_size, position, &collection_size, 1, MPI_INT, comm),
2108 "ERROR(yac_couple_config_unpack_field): invalid number of grid_idx")
2110 collection_size >= 0,
2111 "ERROR(yac_couple_config_unpack_field): invalid collection_size")
2113 field->
grid_idx = (size_t)grid_idx;
2116 (collection_size == INT_MAX)?SIZE_MAX:((int)collection_size);
2118 buffer_size, position, comm);
2120 buffer_size, position, comm);
2122 buffer_size, position, comm);
2126 void * buffer,
int buffer_size,
int * position,
2127 size_t * num_fields,
void * fields_, MPI_Comm comm) {
2134 buffer, buffer_size, position, &num_fields_int, 1,
2135 MPI_INT, comm), comm);
2138 num_fields_int >= 0,
2139 "ERROR(yac_couple_config_unpack_fields): "
2140 "invalid number of fields")
2142 *num_fields = (size_t)num_fields_int;
2144 xmalloc(*num_fields *
sizeof(**fields));
2146 for (
size_t i = 0; i < *num_fields; ++i)
2148 buffer, buffer_size, position, *fields + i, comm);
2152 void * buffer,
int buffer_size,
int * position,
2159 component->
fields = NULL;
2163 void * buffer,
int buffer_size,
int * position,
2168 int num_components_int;
2171 buffer, buffer_size, position, &num_components_int, 1, MPI_INT, comm),
2175 num_components_int >= 0,
2176 "ERROR(yac_couple_config_unpack_components): "
2177 "invalid number of components")
2184 buffer, buffer_size, position, *
components + i, comm);
2188 void * buffer,
int buffer_size,
int * position,
2195 buffer, buffer_size, position, ints, 10, MPI_INT, comm), comm);
2199 "ERROR(yac_couple_config_unpack_field_couple): "
2200 "invalid source.component_idx")
2203 "ERROR(yac_couple_config_unpack_field_couple): "
2204 "invalid source.field_idx")
2207 "ERROR(yac_couple_config_unpack_field_couple): "
2208 "target.component_idx bigger than INT_MAX")
2211 "ERROR(yac_couple_config_unpack_field_couple): "
2212 "invalid target.field_idx")
2215 "ERROR(yac_couple_config_unpack_field_couple): "
2216 "invalid mapping_on_source")
2219 "ERROR(yac_couple_config_unpack_field_couple): "
2220 "invalid coupling_period_operation")
2223 "ERROR(yac_couple_config_unpack_field_couple): "
2224 "invalid enforce_write_weight_file")
2227 "ERROR(yac_couple_config_unpack_field_couple): "
2228 "invalid num_src_mask_names")
2250 buffer, buffer_size, position, doubles, 2, MPI_DOUBLE, comm), comm);
2266 buffer, buffer_size, position, comm);
2273 buffer, buffer_size, position, comm);
2277 void * buffer,
int buffer_size,
int * position,
2278 size_t * num_field_couples,
void * field_couples_, MPI_Comm comm) {
2282 int num_field_couples_int;
2285 buffer, buffer_size, position, &num_field_couples_int, 1,
2286 MPI_INT, comm), comm);
2289 num_field_couples_int >= 0,
2290 "ERROR(yac_couple_config_unpack_field_couples): "
2291 "invalid number of field_couples")
2293 *num_field_couples = (size_t)num_field_couples_int;
2295 xmalloc(*num_field_couples *
sizeof(**field_couples));
2297 for (
size_t i = 0; i < *num_field_couples; ++i)
2299 buffer, buffer_size, position, *field_couples + i, comm);
2303 void * buffer,
int buffer_size,
int * position,
2306 int component_indices[2];
2309 buffer, buffer_size, position, component_indices, 2, MPI_INT, comm),
2313 (component_indices[0] >= 0) && (component_indices[1] >= 0),
2314 "ERROR(yac_couple_config_unpack_couple_basic): invalid component indices")
2323 void * buffer,
int buffer_size,
int * position,
2324 size_t * num_couples,
void * couples_, MPI_Comm comm) {
2328 int num_couples_int;
2331 buffer, buffer_size, position, &num_couples_int, 1, MPI_INT, comm),
2335 num_couples_int >= 0,
2336 "ERROR(yac_couple_config_unpack_couples_basic): "
2337 "invalid number of couples")
2339 *num_couples = (size_t)num_couples_int;
2340 *couples =
xmalloc(*num_couples *
sizeof(**couples));
2342 for (
size_t i = 0; i < *num_couples; ++i)
2344 buffer, buffer_size, position, *couples + i, comm);
2349 char const * src_comp_name,
char const * src_grid_name,
char const * src_field_name,
2350 char const * tgt_comp_name,
char const * tgt_grid_name,
char const * tgt_field_name,
2351 char const * coupling_period,
int time_reduction,
2353 int src_lag,
int tgt_lag,
2354 const char* weight_file_name,
int mapping_on_source,
2355 double scale_factor,
double scale_summand,
2356 size_t num_src_mask_names,
char const *
const * src_mask_names,
2357 char const * tgt_mask_name) {
2359 YAC_ASSERT(src_comp_name && src_comp_name[0] !=
'\0',
2360 "ERROR(yac_couple_config_def_couple): invalid parameter: src_comp_name");
2361 YAC_ASSERT(src_grid_name && src_grid_name[0] !=
'\0',
2362 "ERROR(yac_couple_config_def_couple): invalid parameter: src_grid_name");
2363 YAC_ASSERT(src_field_name && src_field_name[0] !=
'\0',
2364 "ERROR(yac_couple_config_def_couple): invalid parameter: src_field_name");
2365 YAC_ASSERT(tgt_comp_name && tgt_comp_name[0] !=
'\0',
2366 "ERROR(yac_couple_config_def_couple): invalid parameter: tgt_comp_name");
2367 YAC_ASSERT(tgt_grid_name && tgt_grid_name[0] !=
'\0',
2368 "ERROR(yac_couple_config_def_couple): invalid parameter: tgt_grid_name");
2369 YAC_ASSERT(tgt_field_name && tgt_field_name[0] !=
'\0',
2370 "ERROR(yac_couple_config_def_couple): invalid parameter: tgt_field_name");
2371 YAC_ASSERT(coupling_period && coupling_period[0] !=
'\0',
2372 "ERROR(yac_couple_config_def_couple): invalid parameter: coupling_period");
2379 "ERROR(yac_couple_config_def_couple): invalid parameter: time_reduction");
2381 "ERROR(yac_couple_config_def_couple): \"%lf\" is not a valid scale factor",
2383 YAC_ASSERT_F(isnormal(scale_summand) || (scale_summand == 0.0),
2384 "ERROR(yac_couple_config_def_couple): \"%lf\" is not a valid scale summand",
2388 size_t src_comp_idx =
2390 size_t tgt_comp_idx =
2392 size_t src_grid_idx =
2394 size_t tgt_grid_idx =
2399 if(src_comp_idx < tgt_comp_idx){
2407 for(
size_t i = 0; (i < couple_config->
num_couples) && !couple; ++i)
2410 couple = &couple_config->
couples[i];
2427 size_t src_field_idx =
2429 couple_config, src_comp_idx, src_grid_idx,
2430 src_field_name, NULL, SIZE_MAX);
2431 size_t tgt_field_idx =
2433 couple_config, tgt_comp_idx, tgt_grid_idx,
2434 tgt_field_name, NULL, SIZE_MAX);
2443 "ERROR(yac_couple_config_def_couple): Coupling is already defined \n"
2444 "source (comp_name: \"%s\" grid_name: \"%s\" field_name: \"%s\")\n"
2445 "target (comp_name: \"%s\" grid_name: \"%s\" field_name: \"%s\")\n",
2446 src_comp_name, src_grid_name, src_field_name,
2447 tgt_comp_name, tgt_grid_name, tgt_field_name);
2488 "start_datetime", (
char**)&(couple_config->
start_datetime), comm);
2490 "end_datetime", (
char**)&(couple_config->
end_datetime), comm);
2495 void(*
pack)(size_t,
void*,
void *, int,
int *, MPI_Comm);
2496 void(*
unpack)(
void *, int,
int *,
size_t *,
void *, MPI_Comm);
2536static void dist_merge(
size_t* len,
void** arr,
size_t element_size, MPI_Comm comm,
2539 MPI_Comm_rank(comm, &rank);
2542 unsigned char * input = *arr;
2543 size_t input_len = *len;
2544 *idx_old_to_new =
xmalloc(input_len *
sizeof(
size_t));
2545 size_t* idx =
xmalloc(input_len *
sizeof(
size_t));
2546 for(
size_t i = 0;i<input_len;++i) idx[i] = i;
2547 unsigned char * arr_new = NULL;
2553 void * buffer = NULL;
2558 (input_len > 0)?vtable->
get_pack_size(input_len, input, comm):0;
2560 pack_size <= LONG_MAX,
"ERROR(dist_merge): packing size too big");
2566 } data_pair = {.pack_size = (long)pack_size, .rank = rank};
2569 MPI_IN_PLACE, &data_pair, 1, MPI_LONG_INT, MPI_MAXLOC, comm), comm);
2572 if (data_pair.pack_size == 0)
break;
2575 pack_size = (size_t)data_pair.pack_size;
2576 if (!buffer) buffer =
xmalloc(pack_size);
2578 if(data_pair.rank == rank)
2579 vtable->
pack(input_len, input, buffer, pack_size, &position, comm);
2583 MPI_Bcast(buffer, pack_size, MPI_PACKED, data_pair.rank, comm), comm);
2584 void * recved = NULL;
2587 vtable->
unpack(buffer, pack_size, &position, &num_recved, &recved, comm);
2590 arr_new =
xrealloc(arr_new, (len_new + num_recved)*element_size);
2592 arr_new + len_new*element_size, recved, num_recved*element_size);
2596 size_t input_idx, input_len_new, i = len_new;
2597 len_new += num_recved;
2598 for(input_idx = 0, input_len_new = 0; i < len_new; ++i) {
2599 void* recved_element = arr_new + i*element_size;
2603 void * input_element = NULL;
2604 while ((input_idx < input_len) &&
2607 ((input_element = input + input_idx * element_size)),
2608 recved_element))) < 0)) {
2610 if (input_idx != input_len_new) {
2612 input + input_len_new * element_size,
2613 input_element, element_size);
2614 idx[input_len_new] = idx[input_idx];
2621 if (input_idx == input_len)
break;
2628 vtable->
merge(recved_element, input_element, comm);
2632 (*idx_old_to_new)[idx[input_idx]] = i;
2637 }
else if (vtable->
merge) {
2640 vtable->
merge(recved_element, NULL, comm);
2645 for(; i < len_new; ++i)
2646 vtable->
merge(arr_new + i*element_size, NULL, comm);
2648 for (; input_idx < input_len; ++input_idx, ++input_len_new) {
2649 if (input_idx != input_len_new) {
2651 input + input_len_new * element_size,
2652 input + input_idx * element_size, element_size);
2653 idx[input_len_new] = idx[input_idx];
2657 input_len = input_len_new;
2669 size_t* old_to_new_idx;
2670 void * p_grids = couple_config->
grids;
2673 sizeof(couple_config->
grids[0]),
2675 couple_config->
grids = p_grids;
2678 for(
size_t comp_idx = 0; comp_idx < couple_config->
num_components;
2682 for(
size_t field_idx = 0; field_idx < component->
num_fields; ++field_idx)
2687 free(old_to_new_idx);
2696 size_t* old_to_new_idx;
2697 void * p_fields = component->
fields;
2700 sizeof(component->
fields[0]),
2702 component->
fields = p_fields;
2705 for(
size_t couple_idx = 0; couple_idx < couple_config->
num_couples;
2708 couple_config->
couples + couple_idx;
2709 for(
size_t field_couple_idx = 0;
2722 free(old_to_new_idx);
2730 size_t* old_to_new_idx;
2731 void * p_components = couple_config->
components;
2739 for(
size_t couple_idx = 0; couple_idx < couple_config->
num_couples;
2742 couple_config->
couples + couple_idx;
2745 for(
size_t field_couple_idx = 0;
2755 free(old_to_new_idx);
2758 for (
size_t comp_idx = 0; comp_idx < couple_config->
num_components; ++comp_idx)
2766 size_t* old_to_new_idx;
2771 free(old_to_new_idx);
2780 size_t* old_to_new_idx;
2781 void * p_couples = couple_config->
couples;
2784 sizeof(couple_config->
couples[0]),
2786 couple_config->
couples = p_couples;
2787 free(old_to_new_idx);
void yac_couple_config_grid_set_metadata(struct yac_couple_config *couple_config, char const *grid_name, const char *metadata)
static size_t yac_couple_config_get_field_pack_size(struct yac_couple_config_field *field, MPI_Comm comm)
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_unpack_field_couples(void *buffer, int buffer_size, int *position, size_t *num_field_couples, void *field_couples_, MPI_Comm comm)
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)
static void dist_merge(size_t *len, void **arr, size_t element_size, MPI_Comm comm, struct dist_merge_vtable *vtable, size_t **idx_old_to_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_)
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)
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 yac_couple_config_unpack_component(void *buffer, int buffer_size, int *position, struct yac_couple_config_component *component, MPI_Comm comm)
static void couple_config_sync_string(char const *string_name, char **string, MPI_Comm comm)
static void merge_fields(struct yac_couple_config *couple_config, size_t comp_idx, MPI_Comm comm)
static char const * string_dup(char const *string)
static void yac_couple_config_couple_free(void *couple_)
static void yac_couple_config_pack_components(size_t num_components, void *components_, void *buffer, int buffer_size, int *position, MPI_Comm comm)
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_pack_field_couples(size_t num_field_couples, void *field_couples_, void *buffer, int buffer_size, int *position, MPI_Comm comm)
void yac_couple_config_sync(struct yac_couple_config *couple_config, MPI_Comm comm)
void yac_couple_config_set_datetime(struct yac_couple_config *couple_config, char const *start, char const *end)
static void yac_couple_config_unpack_couple_basic(void *buffer, int buffer_size, int *position, struct yac_couple_config_couple *couple, MPI_Comm comm)
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_pack_couples_basic(size_t num_couples, void *couples_, void *buffer, int buffer_size, int *position, 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)
static void yac_couple_config_pack_couple_basic(struct yac_couple_config_couple *couple, void *buffer, int buffer_size, int *position, MPI_Comm comm)
static size_t yac_couple_config_get_field_couples_pack_size(size_t num_field_couples, void *field_couples_, 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)
struct dist_merge_vtable dist_merge_vtable_component
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)
static void yac_couple_config_unpack_grid(void *buffer, int buffer_size, int *position, struct yac_couple_config_grid *grid, MPI_Comm comm)
static size_t yac_couple_config_get_field_couple_pack_size(struct yac_couple_config_field_couple *field_couple, MPI_Comm comm)
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 size_t yac_couple_config_get_components_pack_size(size_t num_components, void *components_, MPI_Comm comm)
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)
static size_t yac_couple_config_add_grid_(struct yac_couple_config *couple_config, char const *name)
struct dist_merge_vtable dist_merge_vtable_field
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)
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 void yac_couple_config_unpack_field(void *buffer, int buffer_size, int *position, struct yac_couple_config_field *field, MPI_Comm comm)
static void yac_couple_config_unpack_couples_basic(void *buffer, int buffer_size, int *position, size_t *num_couples, void *couples_, MPI_Comm comm)
size_t yac_couple_config_get_num_couples(struct yac_couple_config *couple_config)
static size_t yac_couple_config_get_couple_pack_size_basic(struct yac_couple_config_couple *couple, MPI_Comm comm)
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)
static void yac_couple_config_pack_field_couple(struct yac_couple_config_field_couple *field_couple, void *buffer, int buffer_size, int *position, MPI_Comm comm)
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)
static size_t yac_couple_config_get_fields_pack_size(size_t num_fields, void *fields_, MPI_Comm comm)
int yac_couple_config_get_source_lag(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx)
static int yac_couple_config_couple_compare_basic(void const *a_, void const *b_)
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)
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)
static void yac_couple_config_unpack_grids(void *buffer, int buffer_size, int *position, size_t *num_grids, void *grids_, 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)
char const * yac_couple_config_get_end_datetime(struct yac_couple_config *couple_config)
static void yac_couple_config_pack_fields(size_t num_fields, void *fields_, void *buffer, int buffer_size, int *position, MPI_Comm comm)
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)
void yac_couple_config_add_grid(struct yac_couple_config *couple_config, char const *name)
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)
static void yac_couple_config_unpack_fields(void *buffer, int buffer_size, int *position, size_t *num_fields, void *fields_, MPI_Comm comm)
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_pack_grids(size_t num_grids, void *grids_, void *buffer, int buffer_size, int *position, MPI_Comm comm)
static size_t yac_couple_config_get_string_pack_size(char const *string, 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_grid_free(void *grid_)
static size_t yac_couple_config_get_couples_pack_size_basic(size_t num_couples, void *couples_, MPI_Comm comm)
static void yac_couple_config_unpack_field_couple(void *buffer, int buffer_size, int *position, struct yac_couple_config_field_couple *field_couple, MPI_Comm comm)
void yac_couple_config_def_couple(struct yac_couple_config *couple_config, char const *src_comp_name, char const *src_grid_name, char const *src_field_name, char const *tgt_comp_name, char const *tgt_grid_name, char const *tgt_field_name, char const *coupling_period, int time_reduction, struct yac_interp_stack_config *interp_stack, int src_lag, int tgt_lag, const char *weight_file_name, int 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)
static size_t yac_couple_config_get_grids_pack_size(size_t num_grids, void *grids_, MPI_Comm comm)
struct dist_merge_vtable dist_merge_vtable_grid
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)
struct yac_couple_config * yac_couple_config_new()
static size_t yac_couple_config_get_component_pack_size(struct yac_couple_config_component *component, MPI_Comm comm)
char const * yac_couple_config_get_weight_file_name(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx)
struct dist_merge_vtable dist_merge_vtable_couple
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)
static void yac_couple_config_pack_component(struct yac_couple_config_component *component, void *buffer, int buffer_size, int *position, MPI_Comm comm)
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)
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)
static void yac_couple_config_pack_grid(struct yac_couple_config_grid *grid, 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)
size_t yac_couple_config_get_num_grids(struct yac_couple_config *couple_config)
struct dist_merge_vtable dist_merge_vtable_field_couple
char const * yac_couple_config_get_field_grid_name(struct yac_couple_config *couple_config, size_t component_idx, size_t field_idx)
char const * yac_couple_config_get_start_datetime(struct yac_couple_config *couple_config)
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)
size_t yac_couple_config_get_collection_size(struct yac_couple_config *couple_config, char const *component_name, char const *grid_name, char const *field_name)
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_unpack_components(void *buffer, int buffer_size, int *position, size_t *num_components, void *components_, 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)
static void yac_couple_config_pack_field(struct yac_couple_config_field *field, void *buffer, int buffer_size, int *position, MPI_Comm comm)
size_t yac_couple_config_get_num_components(struct yac_couple_config *couple_config)
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_UNDEF
double const YAC_FRAC_MASK_NO_VALUE
#define xrealloc(ptr, size)
void yac_qsort_index(void *a_, size_t count, size_t size, int(*compare)(void const *, void const *), size_t *idx)
void(* pack)(size_t, void *, void *, int, int *, MPI_Comm)
size_t(* get_pack_size)(size_t, void *, MPI_Comm)
void(* free_data)(void *)
void(* unpack)(void *, int, int *, size_t *, void *, MPI_Comm)
int(* compare)(void const *, void const *)
void(* merge)(void *, void *, MPI_Comm)
struct yac_couple_config_field * fields
size_t component_indices[2]
struct yac_couple_config_field_couple * field_couples
char const * coupling_period
size_t num_src_mask_names
struct yac_interp_stack_config * interp_stack
enum yac_reduction_type coupling_period_operation
int enforce_write_weight_file
char const * weight_file_name
struct yac_couple_config_field_couple::@58 source
struct yac_couple_config_field_couple::@58 target
double frac_mask_fallback_value
struct yac_couple_config_couple * couples
char const * end_datetime
struct yac_couple_config_grid * grids
char const * start_datetime
struct yac_couple_config_component * components
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)
struct yac_basic_grid ** grids
#define YAC_ASSERT_F(exp, format,...)
#define YAC_ASSERT(exp, msg)
#define yac_mpi_call(call, comm)