42 "definition phase (after component definition)",
43 "definition phase (after synchronisation)",
47#define CHECK_PHASE(FUNC_NAME, REF_PHASE, NEW_PHASE) \
49 enum yac_instance_phase ref_phase_ = (REF_PHASE); \
51 instance->phase == (ref_phase_), \
52 "ERROR(%s): Invalid phase " \
53 "(current phase: \"%s\" expected phase: \"%s\")", \
54 #FUNC_NAME, yac_instance_phase_str[instance->phase], \
55 yac_instance_phase_str[(ref_phase_)]); \
56 instance->phase = (NEW_PHASE); \
58#define CHECK_MIN_PHASE(FUNC_NAME, MIN_REF_PHASE) \
60 enum yac_instance_phase ref_min_phase_ = (MIN_REF_PHASE); \
62 instance->phase >= (ref_min_phase_), \
63 "ERROR(%s): Invalid phase " \
64 "(current phase: \"%s\" minimum expected phase: \"%s\")", \
65 #FUNC_NAME, yac_instance_phase_str[instance->phase], \
66 yac_instance_phase_str[(ref_min_phase_)]); \
68#define CHECK_MAX_PHASE(FUNC_NAME, MAX_REF_PHASE) \
70 enum yac_instance_phase ref_max_phase_ = (MAX_REF_PHASE); \
72 instance->phase <= (ref_max_phase_), \
73 "ERROR(%s): Invalid phase " \
74 "(current phase: \"%s\" maximum expected phase: \"%s\")", \
76 yac_instance_phase_str[ \
77 MIN(instance->phase,INSTANCE_UNKNOWN)], \
78 yac_instance_phase_str[(ref_max_phase_)]); \
124 .coupling_period = NULL,
127 .start_datetime = NULL,
128 .end_datetime = NULL};
194 for (
size_t i = 0; (i <
num_grids) && (grid == NULL); ++i)
198 *delete_flag = grid == NULL;
209 if ((ret = strcmp(a_->
comp_name, b_->comp_name)))
return ret;
210 else return strcmp(a_->
grid_name, b_->grid_name);
253 sizeof(
double))))
return ret;
263 struct
yac_instance * instance,
int couple_idx,
int field_couple_idx,
270 couple_config, couple_idx, field_couple_idx);
272 char const * coupling_period =
274 couple_config, couple_idx, field_couple_idx);
275 char const * timestep;
280 couple_config, couple_idx, field_couple_idx);
283 couple_config, couple_idx, field_couple_idx);
288 couple_config, couple_idx, field_couple_idx);
291 couple_config, couple_idx, field_couple_idx);
296 {.timestep = timestep,
297 .coupling_period = coupling_period,
299 .reduction_operation = reduction_operation,
323 size_t total_num_fields = 0;
324 for (
size_t couple_idx = 0; couple_idx < num_couples; ++couple_idx)
328 int * is_valid_field_configuration =
329 xcalloc(total_num_fields,
sizeof(*is_valid_field_configuration));
332 for (
size_t couple_idx = 0, i = 0; couple_idx < num_couples;
336 size_t curr_num_fields =
338 for (
size_t field_couple_idx = 0; field_couple_idx < curr_num_fields;
339 ++field_couple_idx, ++i) {
343 char const * src_component_name;
344 char const * tgt_component_name;
347 const char * src_field_name;
348 const char * tgt_field_name;
350 couple_config, couple_idx, field_couple_idx,
351 &src_component_name, &tgt_component_name);
353 couple_config, couple_idx, field_couple_idx,
356 couple_config, couple_idx, field_couple_idx,
357 &src_field_name, &tgt_field_name);
375 MPI_IN_PLACE, is_valid_field_configuration, total_num_fields,
376 MPI_INT, MPI_BOR, comm), comm);
380 int const is_root = comm_rank == 0;
384 int missing_definition_is_fatal =
386 for (
size_t couple_idx = 0, i = 0; couple_idx < num_couples;
388 size_t curr_num_fields =
390 for (
size_t field_couple_idx = 0; field_couple_idx < curr_num_fields;
391 ++field_couple_idx, ++i) {
394 char const * src_component_name;
395 char const * tgt_component_name;
398 const char * src_field_name;
399 const char * tgt_field_name;
401 couple_config, couple_idx, field_couple_idx,
402 &src_component_name, &tgt_component_name);
404 couple_config, couple_idx, field_couple_idx,
407 couple_config, couple_idx, field_couple_idx,
408 &src_field_name, &tgt_field_name);
409 fprintf(stderr,
"%s: couple defined for field: \n"
411 " component name: \"%s\"\n"
412 " grid name: \"%s\"\n"
413 " field name: \"%s\"\n"
415 " component name: \"%s\"\n"
416 " grid name: \"%s\"\n"
417 " field name: \"%s\"\n",
418 missing_definition_is_fatal?
"ERROR":
"WARNING",
420 "defined":
"not defined",
423 "defined":
"not defined",
426 !missing_definition_is_fatal,
427 "ERROR(get_field_configuration): missing definition")
429 is_valid_field_configuration[i] =
434 return is_valid_field_configuration;
450 (num_mask_names == 0) || (num_fields_ == num_mask_names),
451 "ERROR(get_interp_fields_from_coupling_field): "
452 "missmatch in number of interpolation fields of coupling field \"%s\" "
453 "and number of provided mask names (%zu != %zu)",
456 uint64_t local_counts[2] =
457 {(uint64_t)num_fields_, (uint64_t)num_mask_names};
458 uint64_t global_counts[2];
462 local_counts, global_counts, 2, MPI_UINT64_T, MPI_MAX, comm), comm);
465 local_counts[0] == global_counts[0],
466 "ERROR(get_interp_fields_from_coupling_field): missmatch in number of"
467 "local interpolation fields for coupling field \"%s\" and global "
472 (num_mask_names != 0) || (global_counts[1] == 0),
473 "ERROR(get_interp_fields_from_coupling_field): local process did "
474 "not provide mask names for coupling field \"%s\" while others did",
478 interp_fields_ =
xmalloc(num_fields_ *
sizeof(*interp_fields_));
481 num_fields_ *
sizeof(*interp_fields_));
485 for (
size_t i = 0; i < num_mask_names; ++i) {
486 char const * mask_name = mask_names[i];
489 "ERROR(get_interp_fields_from_coupling_field): "
490 "make_names[%zu] is NULL", i);
493 grid, interp_fields_[i].
location, mask_name);
496 uint64_t
data[num_fields_][3];
498 for (
size_t i = 0; i < num_fields_; ++i) {
500 data[i][1] = (uint64_t)interp_fields_[i].coordinates_idx;
501 data[i][2] = (uint64_t)interp_fields_[i].masks_idx;
506 MPI_IN_PLACE,
data, 3 * (
int)num_fields_,
507 MPI_UINT64_T, MPI_MIN, comm), comm);
509 for (
size_t i = 0; i < num_fields_; ++i) {
512 "ERROR(get_interp_fields_from_coupling_field): location mismatch")
514 data[i][1] == (uint64_t)(interp_fields_[i].coordinates_idx),
515 "ERROR(get_interp_fields_from_coupling_field): "
516 "coordinates index mismatch")
518 data[i][2] == (uint64_t)(interp_fields_[i].masks_idx),
519 "ERROR(get_interp_fields_from_coupling_field): "
520 "masks index mismatch")
525 uint64_t zero_counts[2] = {0,0};
530 zero_counts, counts, 2,
531 MPI_UINT64_T, MPI_MAX, comm), comm);
533 num_fields_ = (size_t)(counts[0]);
534 interp_fields_ =
xmalloc(num_fields_ *
sizeof(*interp_fields_));
536 uint64_t
data[num_fields_][3];
538 for (
size_t i = 0; i < num_fields_; ++i) {
540 data[i][1] = (uint64_t)UINT64_MAX;
541 data[i][2] = (uint64_t)UINT64_MAX;
546 MPI_IN_PLACE,
data, 3 * (
int)num_fields_,
547 MPI_UINT64_T, MPI_MIN, comm), comm);
549 for (
size_t i = 0; i < num_fields_; ++i) {
556 *interp_fields = interp_fields_;
562 size_t couple_idx,
size_t field_couple_idx,
565 char const *
const * src_mask_names;
566 size_t num_src_mask_names;
568 couple_config, couple_idx, field_couple_idx,
569 &src_mask_names, &num_src_mask_names);
572 size_t num_interp_fields;
574 field, src_mask_names, num_src_mask_names,
575 &interp_fields, &num_interp_fields, comm);
581 .interp_fields = interp_fields,
582 .num_interp_fields = num_interp_fields,
585 couple_config, couple_idx, field_couple_idx),
588 couple_config, couple_idx, field_couple_idx))?
590 couple_config, couple_idx, field_couple_idx):NULL,
591 .weight_file_on_existing =
593 couple_config, couple_idx, field_couple_idx))?
595 couple_config, couple_idx, field_couple_idx):
603 size_t couple_idx,
size_t field_couple_idx,
606 char const * mask_name =
608 couple_config, couple_idx, field_couple_idx);
611 size_t num_interp_field;
613 field, &mask_name, mask_name != NULL,
614 &interp_field, &num_interp_field, comm);
617 num_interp_field == 1,
618 "ERROR(get_tgt_interp_config): "
619 "only one point set per target field supported")
625 .interp_field = interp_field,
639 uint64_t * local_flags,
size_t flag_count,
640 uint64_t * global_flags_buffer,
struct dist_flag * dist_flags,
641 int * dist_flag_ids, MPI_Comm comm) {
647 size_t flags_num_blocks = (flag_count + 63) / 64;
650 size_t ranks_num_blocks = (size_t)((comm_size + 63) / 64);
655 local_flags, (
int)flags_num_blocks, MPI_UINT64_T,
656 global_flags_buffer, (
int)flags_num_blocks, MPI_UINT64_T,
660 for (
size_t flag_idx = 0; flag_idx < flag_count; ++flag_idx) {
662 dist_flags[flag_idx].
data, 0,
663 ranks_num_blocks *
sizeof(dist_flags[flag_idx].
data[0]));
664 dist_flags[flag_idx].
idx = flag_idx;
665 dist_flags[flag_idx].
count = ranks_num_blocks;
669 for (
int rank = 0; rank < comm_size; ++rank) {
672 uint64_t * rank_flags =
673 global_flags_buffer + (size_t)rank * flags_num_blocks;
675 size_t rank_block_idx = rank / 64;
676 uint64_t rank_flag_mask = ((uint64_t)1) << (rank % 64);
678 for (
size_t flag_idx = 0; flag_idx < flag_count; ++flag_idx)
679 if (rank_flags[flag_idx/64] & (((uint64_t)1) << (flag_idx % 64)))
680 dist_flags[flag_idx].
data[rank_block_idx] |= rank_flag_mask;
688 struct dist_flag * prev_dist_flag = dist_flags;
689 for (
size_t flag_idx = 0; flag_idx < flag_count; ++flag_idx) {
691 struct dist_flag * curr_dist_flag = dist_flags + flag_idx;
694 dist_flag_ids[curr_dist_flag->
idx] =
id;
695 prev_dist_flag = curr_dist_flag;
701 int * is_valid_field_configuration, MPI_Comm comm) {
707 size_t flags_num_blocks = (
num_fields + 63) / 64;
710 size_t ranks_num_blocks = (size_t)((comm_size + 63) / 64);
714 uint64_t * field_is_available_flags =
715 xmalloc(flags_num_blocks *
sizeof(*field_is_available_flags));
719 uint64_t * all_field_is_available_flags =
721 (
size_t)comm_size * flags_num_blocks *
sizeof(*all_field_is_available_flags));
726 uint64_t * dist_flags_data_buffer =
729 dist_flags[i].
data = dist_flags_data_buffer + i * ranks_num_blocks;
733 int * field_avail_config_ids =
740 field_is_available_flags, 0,
741 flags_num_blocks *
sizeof(*field_is_available_flags));
742 for (
size_t field_idx = 0; field_idx <
num_fields; ++field_idx)
743 if (is_valid_field_configuration[field_idx] &&
744 (field_configs[field_idx].src_interp_config.field != NULL))
745 field_is_available_flags[field_idx/64] |= (1 << (field_idx%64));
748 field_is_available_flags,
num_fields, all_field_is_available_flags,
749 dist_flags, field_avail_config_ids, comm);
751 for (
size_t field_idx = 0; field_idx <
num_fields; ++field_idx)
752 field_configs[field_idx].src_interp_config.avail_config_id =
753 field_avail_config_ids[field_idx];
760 field_is_available_flags, 0,
761 flags_num_blocks *
sizeof(*field_is_available_flags));
762 for (
size_t field_idx = 0; field_idx <
num_fields; ++field_idx)
763 if (is_valid_field_configuration[field_idx] &&
764 (field_configs[field_idx].tgt_interp_config.field != NULL))
765 field_is_available_flags[field_idx/64] |= (1 << (field_idx%64));
768 field_is_available_flags,
num_fields, all_field_is_available_flags,
769 dist_flags, field_avail_config_ids, comm);
771 for (
size_t field_idx = 0; field_idx <
num_fields; ++field_idx)
772 field_configs[field_idx].tgt_interp_config.avail_config_id =
773 field_avail_config_ids[field_idx];
776 free(field_avail_config_ids);
777 free(dist_flags_data_buffer);
779 free(all_field_is_available_flags);
780 free(field_is_available_flags);
788 MPI_Comm comm = instance->
comm;
796 int * is_valid_field_configuration =
798 couple_config, comm, coupling_fields,
num_fields);
800 size_t total_num_fields = 0;
801 for (
size_t couple_idx = 0, i = 0; couple_idx < num_couples; ++couple_idx) {
802 size_t curr_num_fields =
804 for (
size_t field_couple_idx = 0; field_couple_idx < curr_num_fields;
805 ++field_couple_idx, ++i)
806 if (is_valid_field_configuration[i]) ++total_num_fields;
815 size_t field_config_idx = 0;
817 xmalloc(total_num_fields *
sizeof(*field_configs));
818 for (
size_t couple_idx = 0, i = 0; couple_idx < num_couples; ++couple_idx) {
820 size_t curr_num_fields =
823 for (
size_t field_couple_idx = 0; field_couple_idx < curr_num_fields;
824 ++field_couple_idx, ++i) {
826 if (!is_valid_field_configuration[i])
continue;
831 couple_config, couple_idx, field_couple_idx,
835 couple_config, couple_idx, field_couple_idx,
841 const char * src_field_name;
842 const char * tgt_field_name;
844 couple_config, couple_idx, field_couple_idx,
845 &src_field_name, &tgt_field_name);
855 double frac_mask_fallback_value =
859 double scale_factor =
861 couple_config, couple_idx, field_couple_idx);
862 double scale_summand =
864 couple_config, couple_idx, field_couple_idx);
865 char const * yaxt_exchanger_name =
867 couple_config, couple_idx, field_couple_idx);
870 couple_config, couple_idx, field_couple_idx);
881 "ERROR: collection sizes do not match for coupled fields (%zu != %zu): \n"
883 " component name: \"%s\"\n"
884 " grid name: \"%s\"\n"
885 " field name: \"%s\"\n"
887 " component name: \"%s\"\n"
888 " grid name: \"%s\"\n"
889 " field name: \"%s\"\n",
901 field_configs[field_config_idx].
src_comp_idx = src_comp_idx;
904 couple_config, couple_idx, field_couple_idx, src_field, comm);
907 couple_config, couple_idx, field_couple_idx, tgt_field, comm);
910 couple_config, couple_idx, field_couple_idx))?
917 frac_mask_fallback_value;
918 field_configs[field_config_idx].
scale_factor = scale_factor;
919 field_configs[field_config_idx].
scale_summand = scale_summand;
932 field_configs, total_num_fields, is_valid_field_configuration, comm);
934 free(is_valid_field_configuration);
936 *field_configs_ = field_configs;
937 *count = total_num_fields;
986 b_->comp_grid_pair.config[0].grid_name)))
return ret;
988 b_->comp_grid_pair.config[1].grid_name)))
return ret;
992 b_->src_interp_config.interp_stack)))
return ret;
994 (
int)(b_->src_interp_config.weight_file_name == NULL)))
return ret;
997 b_->src_interp_config.weight_file_name)))
return ret;
1000 (int)(b_->src_interp_config.weight_file_on_existing)))
return ret;
1003 b_->comp_grid_pair.config[0].comp_name)))
return ret;
1005 b_->src_interp_config.name)))
return ret;
1007 b_->tgt_interp_config.name)))
return ret;
1009 ret,
"ERROR(compare_field_config): "
1010 "duplicated coupling field configuration detected:\n"
1011 "\tcomponent name: \n"
1012 "\t source:\"%s\"\n"
1013 "\t target:\"%s\"\n"
1015 "\t source:\"%s\"\n"
1016 "\t target:\"%s\"\n"
1018 "\t source:\"%s\"\n"
1019 "\t target:\"%s\"\n",
1047 size_t num_local_grids,
struct output_grid ** output_grids,
1048 size_t * output_grid_count) {
1054 *output_grid_count = 0;
1059 ++*output_grid_count;
1061 *output_grids =
xmalloc(*output_grid_count *
sizeof(**output_grids));
1066 char const * grid_name =
1068 char const * filename =
1070 if (filename != NULL) {
1072 for (
size_t i = 0; (i < num_local_grids) && (local_grid == NULL); ++i)
1074 local_grid = local_grids[i];
1075 (*output_grids)[output_grid_idx].grid_name = grid_name;
1076 (*output_grids)[output_grid_idx].filename = filename;
1077 (*output_grids)[output_grid_idx].grid = local_grid;
1094 MPI_Comm comm = instance->
comm;
1098 size_t output_grid_count;
1104 output_grids, output_grid_count,
sizeof(*output_grids),
1108 for (
size_t i = 0; i < output_grid_count; ++i) {
1111 int split_key = (grid != NULL)?1:MPI_UNDEFINED;
1115 MPI_Comm output_comm;
1116 yac_mpi_call(MPI_Comm_split(comm, split_key, 0, &output_comm), comm);
1123 grid, output_grids[i].filename, output_comm);
1139 MPI_Comm comm = instance->
comm;
1145 instance, &field_configs, &field_count);
1163 for (
size_t i = 0; i < field_count; ++i) {
1165 struct field_config * curr_field_config = field_configs + i;
1176 if ((prev_comp_grid_pair == NULL) ||
1191 int delete_flags[2];
1199 for (
int i = 0; i < 2; ++i)
1207 prev_field_config, curr_field_config)) {
1213 size_t num_src_fields =
1225 num_src_fields, src_fields, *tgt_fields);
1261 prev_field_config, curr_field_config)) {
1280 is_source, is_target);
1290 is_source, is_target);
1315 interp_exch_copy, interp_weights_data_copy);
1320 interp_exch_copy,
"generate_interpolations");
1347 prev_comp_grid_pair = curr_comp_grid_pair;
1348 prev_field_config = curr_field_config;
1351 for (
size_t i = 0; i < field_count; ++i) {
1352 free(field_configs[i].src_interp_config.interp_fields);
1353 free(field_configs[i].tgt_interp_config.interp_field);
1362 for (
size_t i = 0; i < field_count; ++i) {
1363 free((
void*)(field_configs[i].src_interp_config.event_data.start_datetime));
1364 free((
void*)(field_configs[i].src_interp_config.event_data.end_datetime));
1365 free((
void*)(field_configs[i].tgt_interp_config.event_data.start_datetime));
1366 free((
void*)(field_configs[i].tgt_interp_config.event_data.end_datetime));
1368 free(field_configs);
1375 "ERROR(yac_instance_sync_def): no components have been defined");
1385 if (requires_def_sync)
1391 "ERROR(yac_instance_setup): no components have been defined");
1411 int include_definitions = 0;
1419 char const ** comp_names,
size_t num_comp_names) {
1423 instance->
comp_config, comp_names, num_comp_names);
1435 const char* comp_name){
1444 const char* comp_name){
1472 MPI_Comm dummy_comm;
1478 if (instance == NULL)
return;
1495 if (instance == NULL)
return MPI_COMM_NULL;
1497 return instance->
comm;
1535 char const ** comp_names,
size_t num_comps) {
1541 "ERROR(yac_instance_def_components): components have already been defined")
1544 for (
size_t i = 0; i < num_comps; ++i)
1563 struct yac_instance * instance,
char const * field_name,
1576 field_name,
"ERROR(yac_instance_add_field): "
1577 "\"NULL\" is not a valid field name")
1580 "ERROR(yac_instance_add_field): field name is too long "
1581 "(maximum is YAC_MAX_CHARLEN)")
1584 "ERROR(yac_instance_add_field): \"%d\" is not a valid collection size "
1585 "(component \"%s\" grid \"%s\" field \"%s\")",
1590 couple_config, comp_name, grid_name, field_name,
1601 "ERROR(yac_instance_add_field): "
1602 "field with the name \"%s\" has already been defined",
1623 char const * src_comp_name,
char const *
src_grid_name,
char const * src_field_name,
1624 char const * tgt_comp_name,
char const *
tgt_grid_name,
char const * tgt_field_name,
1625 char const * coupling_period,
int time_reduction,
1628 int mapping_on_source,
double scale_factor,
double scale_summand,
1629 size_t num_src_mask_names,
1630 char const *
const * src_mask_names,
char const * tgt_mask_name,
1638 tgt_comp_name,
tgt_grid_name, tgt_field_name, coupling_period,
1640 weight_file_on_existing, mapping_on_source, scale_factor, scale_summand,
1641 num_src_mask_names, src_mask_names, tgt_mask_name,
1646 const char * comp_name,
const char* grid_name,
const char * field_name){
char const * grid_names[]
#define YAC_ASSERT(exp, msg)
size_t yac_basic_grid_get_named_mask_idx(struct yac_basic_grid *grid, enum yac_location location, char const *mask_name)
void yac_basic_grid_to_file_parallel(struct yac_basic_grid *grid, char const *filename, MPI_Comm comm)
char const * yac_basic_grid_get_name(struct yac_basic_grid *grid)
struct yac_basic_grid * yac_basic_grid_empty_new(char const *name)
void yac_basic_grid_delete(struct yac_basic_grid *grid)
int yac_component_config_comp_size(struct yac_component_config *comp_config, char const *comp_name)
int yac_component_config_comp_rank(struct yac_component_config *comp_config, char const *comp_name)
void yac_component_config_delete(struct yac_component_config *comp_config)
MPI_Comm yac_component_config_get_comps_comm(struct yac_component_config *comp_config, const char **names, size_t num_names)
struct yac_component_config * yac_component_config_new(struct yac_couple_config *couple_config, char const **names, size_t num_names, MPI_Comm comm_)
char * yac_yaml_emit_coupling(struct yac_couple_config *couple_config, int emit_flags, int include_definitions)
char const * yac_couple_config_get_yaxt_exchanger_name(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx)
void yac_couple_config_sync(struct yac_couple_config *couple_config, MPI_Comm comm, char const *output_ref)
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)
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)
void yac_couple_config_def_couple(struct yac_couple_config *couple_config, char const *src_comp_name, char const *src_grid_name, char const *src_field_name, char const *tgt_comp_name, char const *tgt_grid_name, char const *tgt_field_name, char const *coupling_period, int time_reduction, struct yac_interp_stack_config *interp_stack, int src_lag, int tgt_lag, const char *weight_file_name, int weight_file_on_existing, int mapping_on_source, double scale_factor, double scale_summand, size_t num_src_mask_names, char const *const *src_mask_names, char const *tgt_mask_name, char const *yaxt_exchanger_name, int use_raw_exchange)
int yac_couple_config_mapping_on_source(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx)
char const * yac_couple_config_get_coupling_period(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx)
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)
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)
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)
int yac_couple_config_get_use_raw_exchange(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx)
size_t yac_couple_config_get_num_couples(struct yac_couple_config *couple_config)
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)
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_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)
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)
int yac_couple_config_enforce_write_weight_file(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx)
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()
char const * yac_couple_config_get_weight_file_name(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx)
int yac_couple_config_get_missing_definition_is_fatal(struct yac_couple_config *couple_config)
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)
char const * yac_couple_config_get_source_timestep(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx)
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)
char * yac_couple_config_get_end_datetime(struct yac_couple_config *couple_config)
char const * yac_couple_config_get_target_timestep(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx)
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)
void yac_dist_grid_pair_delete(struct yac_dist_grid_pair *grid_pair)
struct yac_dist_grid_pair * yac_dist_grid_pair_new(struct yac_basic_grid *grid_a, struct yac_basic_grid *grid_b, MPI_Comm comm)
struct event * yac_event_new()
void yac_event_add(struct event *event, char const *delta_model_time, char const *delta_coupling_time, int lag, enum yac_reduction_type time_operation, const char *startdate, const char *stopdate)
void yac_set_coupling_field_put_op(struct coupling_field *field, struct event *event, struct yac_interpolation *interpolation)
void yac_set_coupling_field_get_op(struct coupling_field *field, struct event *event, struct yac_interpolation *interpolation)
char const * yac_get_coupling_field_comp_name(struct coupling_field *field)
struct yac_basic_grid * yac_coupling_field_get_basic_grid(struct coupling_field *field)
size_t yac_coupling_field_get_num_interp_fields(struct coupling_field *field)
void yac_set_coupling_field_put_op_raw(struct coupling_field *field, struct event *event, struct yac_interpolation_exchange *interpolation_exchange)
struct yac_interp_field const * yac_coupling_field_get_interp_fields(struct coupling_field *cpl_field)
struct coupling_field * yac_coupling_field_new(char const *field_name, char const *component_name, struct yac_basic_grid *grid, struct yac_interp_field *interp_fields, unsigned num_interp_fields, size_t collection_size, const char *timestep)
const char * yac_get_coupling_field_name(struct coupling_field *field)
void yac_set_coupling_field_get_op_raw(struct coupling_field *field, struct event *event, struct yac_interpolation_exchange *interpolation_exchange, struct yac_interp_weights_data interp_weights_data)
void yac_coupling_field_delete(struct coupling_field *cpl_field)
void yac_instance_delete(struct yac_instance *instance)
char * yac_instance_setup_and_emit_config(struct yac_instance *instance, struct yac_basic_grid **grids, size_t num_grids, int emit_flags)
int yac_instance_get_comp_rank(struct yac_instance *instance, const char *comp_name)
char * yac_instance_get_start_datetime(struct yac_instance *instance)
static int compare_dist_flags(const void *a_, const void *b_)
char * yac_instance_get_end_datetime(struct yac_instance *instance)
void yac_instance_def_datetime(struct yac_instance *instance, const char *start_datetime, const char *end_datetime)
void yac_instance_setup(struct yac_instance *instance, struct yac_basic_grid **grids, size_t num_grids)
void yac_instance_sync_def(struct yac_instance *instance)
static void get_output_grids(struct yac_instance *instance, struct yac_basic_grid **local_grids, size_t num_local_grids, struct output_grid **output_grids, size_t *output_grid_count)
static int compare_field_config_interp_fields(struct field_config *a, struct field_config *b)
struct yac_instance * yac_instance_new(MPI_Comm comm)
int yac_instance_get_nbr_comps(struct yac_instance *instance)
int yac_instance_components_are_defined(struct yac_instance *instance)
void yac_instance_def_couple(struct yac_instance *instance, 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_config, int src_lag, int tgt_lag, const char *weight_file_name, int weight_file_on_existing, int mapping_on_source, double scale_factor, double scale_summand, size_t num_src_mask_names, char const *const *src_mask_names, char const *tgt_mask_name, char const *yaxt_exchanger_name, int use_raw_exchange)
MPI_Comm yac_instance_get_comm(struct yac_instance *instance)
static int compare_output_grids(const void *a, const void *b)
static void generate_interpolations(struct yac_instance *instance, struct yac_basic_grid **grids, size_t num_grids)
static void generate_dist_flag_config_ids(uint64_t *local_flags, size_t flag_count, uint64_t *global_flags_buffer, struct dist_flag *dist_flags, int *dist_flag_ids, MPI_Comm comm)
struct coupling_field * yac_instance_add_field(struct yac_instance *instance, char const *field_name, char const *comp_name, struct yac_basic_grid *grid, struct yac_interp_field *interp_fields, size_t num_interp_fields, int collection_size, char const *timestep)
void yac_instance_set_couple_config(struct yac_instance *instance, struct yac_couple_config *couple_config)
static struct coupling_field * get_coupling_field(char const *component_name, const char *field_name, const char *grid_name, size_t num_fields, struct coupling_field **coupling_fields)
void yac_instance_dummy_new(MPI_Comm comm)
static struct yac_basic_grid * get_basic_grid(const char *grid_name, struct yac_basic_grid **grids, size_t num_grids, int *delete_flag)
void yac_instance_def_components(struct yac_instance *instance, char const **comp_names, size_t num_comps)
#define CHECK_MIN_PHASE(FUNC_NAME, MIN_REF_PHASE)
static void get_field_configuration(struct yac_instance *instance, struct field_config **field_configs_, size_t *count)
struct yac_couple_config * yac_instance_get_couple_config(struct yac_instance *instance)
struct field_config_event_data get_event_data(struct yac_instance *instance, int couple_idx, int field_couple_idx, enum field_type field_type)
static int compare_comp_grid_config(const void *a, const void *b)
static struct field_config_event_data empty_event_data
static int * determine_valid_field_configurations(struct yac_couple_config *couple_config, MPI_Comm comm, struct coupling_field **coupling_fields, size_t num_fields)
static const char * yac_instance_phase_str[]
static struct event * generate_event(struct field_config_event_data event_data)
static int compare_field_config_interpolation_build_config(struct field_config *a, struct field_config *b)
#define CHECK_PHASE(FUNC_NAME, REF_PHASE, NEW_PHASE)
static struct tgt_field_config get_tgt_interp_config(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx, struct coupling_field *field, MPI_Comm comm)
static void write_grids_to_file(struct yac_instance *instance, struct yac_basic_grid **grids, size_t num_grids)
#define CHECK_MAX_PHASE(FUNC_NAME, MAX_REF_PHASE)
static void generate_coupling_field_avail_config_ids(struct field_config *field_configs, size_t num_fields, int *is_valid_field_configuration, MPI_Comm comm)
static void get_interp_fields_from_coupling_field(struct coupling_field *field, char const *const *mask_names, size_t num_mask_names, struct yac_interp_field **interp_fields, size_t *num_fields, MPI_Comm comm)
@ INSTANCE_DEFINITION_COMP
@ INSTANCE_DEFINITION_SYNC
static int compare_field_config(const void *a, const void *b)
int yac_instance_get_comp_size(struct yac_instance *instance, const char *comp_name)
MPI_Comm yac_instance_get_comps_comm(struct yac_instance *instance, char const **comp_names, size_t num_comp_names)
static struct src_field_config get_src_interp_config(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx, struct coupling_field *field, MPI_Comm comm)
static struct yac_interp_weights * generate_interp_weights(struct src_field_config src_interp_config, struct yac_interp_grid *interp_grid)
struct coupling_field * yac_instance_get_field(struct yac_instance *instance, const char *comp_name, const char *grid_name, const char *field_name)
static int compare_interp_field(struct yac_interp_field *a, struct yac_interp_field *b)
#define YAC_INSTANCE_CONFIG_OUTPUT_REF_ENDDEF
#define YAC_INSTANCE_CONFIG_OUTPUT_REF_COMP
#define YAC_INSTANCE_CONFIG_OUTPUT_REF_SYNC
void yac_interp_grid_delete(struct yac_interp_grid *interp_grid)
struct yac_interp_grid * yac_interp_grid_new(struct yac_dist_grid_pair *grid_pair, char const *src_grid_name, char const *tgt_grid_name, size_t num_src_fields, struct yac_interp_field const *src_fields, struct yac_interp_field const tgt_field)
void yac_interp_method_delete(struct interp_method **method)
struct yac_interp_weights * yac_interp_method_do_search(struct interp_method **method, struct yac_interp_grid *interp_grid)
int yac_interp_stack_config_compare(void const *a_, void const *b_)
struct interp_method ** yac_interp_stack_config_generate(struct yac_interp_stack_config *interp_stack)
struct yac_interp_weights_data yac_interp_weights_data_copy(struct yac_interp_weights_data interp_weights_data)
struct yac_interpolation * yac_interp_weights_get_interpolation(struct yac_interp_weights *weights, enum yac_interp_weights_reorder_type reorder, size_t collection_size, double frac_mask_fallback_value, double scaling_factor, double scaling_summand, char const *yaxt_exchanger_name, int is_source, int is_target)
void yac_interp_weights_data_init(struct yac_interp_weights_data *interp_weights_data)
void yac_interp_weights_delete(struct yac_interp_weights *weights)
void yac_interp_weights_get_interpolation_raw(struct yac_interp_weights *weights, size_t collection_size, double frac_mask_fallback_value, double scaling_factor, double scaling_summand, char const *yaxt_exchanger_name, struct yac_interpolation_exchange **interpolation_exchange, struct yac_interp_weights_data *interp_weights_data, int is_source, int is_target)
void yac_interp_weights_data_free(struct yac_interp_weights_data interp_weights_data)
void yac_interp_weights_write_to_file(struct yac_interp_weights *weights, char const *filename, char const *src_grid_name, char const *tgt_grid_name, size_t src_grid_size, size_t tgt_grid_size, enum yac_weight_file_on_existing on_existing)
#define YAC_WEIGHT_FILE_ON_EXISTING_DEFAULT_VALUE
yac_interp_weights_reorder_type
@ 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
struct yac_interpolation * yac_interpolation_copy(struct yac_interpolation *interp)
void yac_interpolation_inc_ref_count(struct yac_interpolation *interpolation)
void yac_interpolation_delete(struct yac_interpolation *interp)
void yac_interpolation_exchange_inc_ref_count(struct yac_interpolation_exchange *exchange)
struct yac_interpolation_exchange * yac_interpolation_exchange_copy(struct yac_interpolation_exchange *exchange)
void yac_interpolation_exchange_delete(struct yac_interpolation_exchange *exchange, char const *routine_name)
#define xrealloc(ptr, size)
#define xcalloc(nmemb, size)
struct comp_grid_config config[2]
struct yac_basic_grid * grid
struct yac_interp_field * interp_fields
char const * end_datetime
char const * start_datetime
enum yac_reduction_type reduction_operation
char const * coupling_period
char const * yaxt_exchanger_name
struct comp_grid_pair_config comp_grid_pair
enum yac_interp_weights_reorder_type reorder_type
struct tgt_field_config tgt_interp_config
struct src_field_config src_interp_config
double frac_mask_fallback_value
struct yac_basic_grid * grid
const char * weight_file_name
enum yac_weight_file_on_existing weight_file_on_existing
struct field_config_event_data event_data
struct yac_interp_stack_config * interp_stack
struct coupling_field * field
struct yac_interp_field * interp_fields
struct field_config_event_data event_data
struct coupling_field * field
struct yac_interp_field * interp_field
struct _datetime * end_datetime
struct _datetime * start_datetime
struct coupling_field ** cpl_fields
Coupling fields added to this YAC instance via yac_instance_add_field.
enum yac_instance_phase phase
Current phase of this YAC instance.
MPI_Comm comm
MPI communicator that contains the processes of this YAC instance.
struct yac_component_config * comp_config
Component configuration data of this YAC instance.
size_t num_cpl_fields
Number of elements in coupling_field ** cpl_fields.
struct yac_couple_config * couple_config
Coupling configuration data of this YAC instance.
enum yac_location location
char const * weight_file_name
char const src_grid_name[]
char const tgt_grid_name[]
struct yac_basic_grid ** grids
#define YAC_ASSERT_F(exp, format,...)
#define yac_mpi_call(call, comm)