31 "definition phase (after component definition)",
32 "definition phase (after synchronisation)",
36#define CHECK_PHASE(FUNC_NAME, REF_PHASE, NEW_PHASE) \
38 enum yac_instance_phase ref_phase_ = (REF_PHASE); \
40 instance->phase == (ref_phase_), \
41 "ERROR(%s): Invalid phase " \
42 "(current phase: \"%s\" expected phase: \"%s\")", \
43 #FUNC_NAME, yac_instance_phase_str[instance->phase], \
44 yac_instance_phase_str[(ref_phase_)]); \
45 instance->phase = (NEW_PHASE); \
47#define CHECK_MIN_PHASE(FUNC_NAME, MIN_REF_PHASE) \
49 enum yac_instance_phase ref_min_phase_ = (MIN_REF_PHASE); \
51 instance->phase >= (ref_min_phase_), \
52 "ERROR(%s): Invalid phase " \
53 "(current phase: \"%s\" minimum expected phase: \"%s\")", \
54 #FUNC_NAME, yac_instance_phase_str[instance->phase], \
55 yac_instance_phase_str[(ref_min_phase_)]); \
57#define CHECK_MAX_PHASE(FUNC_NAME, MAX_REF_PHASE) \
59 enum yac_instance_phase ref_max_phase_ = (MAX_REF_PHASE); \
61 instance->phase <= (ref_max_phase_), \
62 "ERROR(%s): Invalid phase " \
63 "(current phase: \"%s\" maximum expected phase: \"%s\")", \
65 yac_instance_phase_str[ \
66 MIN(instance->phase,INSTANCE_UNKNOWN)], \
67 yac_instance_phase_str[(ref_max_phase_)]); \
107 .coupling_period = NULL,
110 .start_datetime = NULL,
111 .end_datetime = NULL};
161 for (
size_t i = 0; i < num_fields; ++i) {
185 if ((ret = strcmp(a_->
comp_name, b_->comp_name)))
return ret;
186 else return strcmp(a_->
grid_name, b_->grid_name);
191 const char * grid_name,
size_t num_fields,
194 for (
size_t i = 0; i < num_fields; ++i) {
209 size_t couple_idx,
size_t field_couple_idx) {
211 char const *
const * src_mask_names;
212 size_t num_src_mask_names;
214 couple_config, couple_idx, field_couple_idx,
215 &src_mask_names, &num_src_mask_names);
222 .mask_names = src_mask_names,
223 .num_mask_names = num_src_mask_names,
226 couple_config, couple_idx, field_couple_idx),
229 couple_config, couple_idx, field_couple_idx))?
231 couple_config, couple_idx, field_couple_idx):NULL,
238 size_t couple_idx,
size_t field_couple_idx) {
247 couple_config, couple_idx, field_couple_idx),
254 size_t num_mask_names_a,
char const *
const * mask_names_a,
256 size_t num_mask_names_b,
char const *
const * mask_names_b) {
258 if ((a == NULL) || (b == NULL))
return (a == NULL) - (b == NULL);
260 size_t num_interp_fields[2] =
265 (num_mask_names_a == 0) ||
266 (num_mask_names_a == num_interp_fields[0]),
267 "ERROR(compare_field_config_fields): inconsistent mask names defined")
269 (num_mask_names_b == 0) ||
270 (num_mask_names_b == num_interp_fields[1]),
271 "ERROR(compare_field_config_fields): inconsistent mask names defined")
274 if (num_interp_fields[0] != num_interp_fields[1])
275 return (
int)num_interp_fields[0] - (int)num_interp_fields[1];
285 for (
size_t i = 0; i < num_interp_fields[0]; ++i) {
303 char const *
const * mask_names[2] =
306 int const *
masks[2];
308 for (
int j = 0;
j < 2; ++
j) {
310 if (mask_names[
j] !=
NULL)
342 (
int)(b_->src_interp_config.weight_file_name == NULL)))
return ret;
345 b_->src_interp_config.weight_file_name)))
return ret;
350 b_->src_interp_config.interp_stack);
361 b_->comp_grid_pair.config[0].comp_name)))
return ret;
363 b_->comp_grid_pair.config[1].comp_name)))
return ret;
365 b_->comp_grid_pair.config[0].grid_name)))
return ret;
367 b_->comp_grid_pair.config[1].grid_name)))
return ret;
370 if ((ret = (
int)(a_->
reorder_type) - (
int)(b_->reorder_type)))
return ret;
380 &(b_->frac_mask_fallback_value),
sizeof(
double));
384 struct
yac_instance * instance,
int couple_idx,
int field_couple_idx,
391 couple_config, couple_idx, field_couple_idx);
393 char const * coupling_period =
395 couple_config, couple_idx, field_couple_idx);
396 char const * timestep;
401 couple_config, couple_idx, field_couple_idx);
404 couple_config, couple_idx, field_couple_idx);
409 couple_config, couple_idx, field_couple_idx);
412 couple_config, couple_idx, field_couple_idx);
417 {.timestep = timestep,
418 .coupling_period = coupling_period,
420 .reduction_operation = reduction_operation,
438 struct field_config ** field_configs_,
size_t * count) {
441 MPI_Comm comm = instance->
comm;
446 size_t total_num_fields = 0;
447 for (
size_t couple_idx = 0; couple_idx < num_couples; ++couple_idx)
453 int (*fields_available)[2] =
454 xmalloc(total_num_fields *
sizeof(*fields_available));
455 for (
size_t couple_idx = 0, i = 0; couple_idx < num_couples;
457 size_t curr_num_fields =
459 for (
size_t field_couple_idx = 0; field_couple_idx < curr_num_fields;
460 ++field_couple_idx, ++i) {
461 char const * src_component_name;
462 char const * tgt_component_name;
463 char const * src_grid_name;
464 char const * tgt_grid_name;
465 const char * src_field_name;
466 const char * tgt_field_name;
468 couple_config, couple_idx, field_couple_idx,
469 &src_component_name, &tgt_component_name);
471 couple_config, couple_idx, field_couple_idx,
472 &src_grid_name, &tgt_grid_name);
474 couple_config, couple_idx, field_couple_idx,
475 &src_field_name, &tgt_field_name);
476 fields_available[i][0] =
478 src_component_name, src_field_name, src_grid_name,
479 num_fields, coupling_fields) != NULL;
480 fields_available[i][1] =
482 tgt_component_name, tgt_field_name, tgt_grid_name,
483 num_fields, coupling_fields) != NULL;
487 MPI_Allreduce(MPI_IN_PLACE, fields_available,
488 2 * total_num_fields,
489 MPI_INT, MPI_MAX, comm), comm);
492 size_t new_total_num_fields = 0;
493 for (
size_t couple_idx = 0, i = 0; couple_idx < num_couples;
495 size_t curr_num_fields =
497 for (
size_t field_couple_idx = 0; field_couple_idx < curr_num_fields;
498 ++field_couple_idx, ++i) {
499 if (fields_available[i][0] && fields_available[i][1]) {
500 ++new_total_num_fields;
501 }
else if (comm_rank == 0) {
502 char const * src_component_name;
503 char const * tgt_component_name;
504 char const * src_grid_name;
505 char const * tgt_grid_name;
506 const char * src_field_name;
507 const char * tgt_field_name;
509 couple_config, couple_idx, field_couple_idx,
510 &src_component_name, &tgt_component_name);
512 couple_config, couple_idx, field_couple_idx,
513 &src_grid_name, &tgt_grid_name);
515 couple_config, couple_idx, field_couple_idx,
516 &src_field_name, &tgt_field_name);
517 fprintf(stderr,
"WARNING: couple defined for field: \n"
519 " component name: %s\n"
523 " component name: %s\n"
526 (fields_available[i][0])?
"defined":
"not defined",
527 src_component_name, src_grid_name, src_field_name,
528 (fields_available[i][1])?
"defined":
"not defined",
529 tgt_component_name, tgt_grid_name, tgt_field_name);
533 total_num_fields = new_total_num_fields;
536 xmalloc(total_num_fields *
sizeof(*field_configs));
538 size_t field_config_idx = 0;
542 for (
size_t couple_idx = 0, i = 0; couple_idx < num_couples; ++couple_idx) {
544 size_t curr_num_fields =
547 for (
size_t field_couple_idx = 0; field_couple_idx < curr_num_fields;
548 ++field_couple_idx, ++i) {
550 if (!fields_available[i][0] || !fields_available[i][1])
continue;
555 couple_config, couple_idx, field_couple_idx,
559 couple_config, couple_idx, field_couple_idx,
565 const char * src_field_name;
566 const char * tgt_field_name;
568 couple_config, couple_idx, field_couple_idx,
569 &src_field_name, &tgt_field_name);
573 num_fields, coupling_fields);
577 num_fields, coupling_fields);
579 double frac_mask_fallback_value =
583 double scale_factor =
585 couple_config, couple_idx, field_couple_idx);
586 double scale_summand =
588 couple_config, couple_idx, field_couple_idx);
599 "ERROR: collection sizes do not match for coupled fields (%zu != %zu): \n"
601 " component name: %s\n"
605 " component name: %s\n"
619 field_configs[field_config_idx].
src_comp_idx = src_comp_idx;
628 couple_config, couple_idx, field_couple_idx))?
635 frac_mask_fallback_value;
636 field_configs[field_config_idx].
scale_factor = scale_factor;
637 field_configs[field_config_idx].
scale_summand = scale_summand;
645 free(fields_available);
648 int * field_src_field_config_compare_matrix =
649 xmalloc((
size_t)(total_num_fields * (total_num_fields - 1)) *
650 sizeof(*field_src_field_config_compare_matrix));
651 int * field_tgt_field_config_compare_matrix =
652 field_src_field_config_compare_matrix +
653 (size_t)(total_num_fields * (total_num_fields - 1)) / 2;
655 for (
unsigned i = 0, k = 0; i < total_num_fields; ++i) {
656 for (
unsigned j = i + 1; j < total_num_fields; ++j, ++k) {
657 field_src_field_config_compare_matrix[k] =
659 field_configs[i].src_interp_config.field,
665 field_tgt_field_config_compare_matrix[k] =
667 field_configs[i].tgt_interp_config.field,
677 MPI_Allreduce(MPI_IN_PLACE, field_src_field_config_compare_matrix,
678 total_num_fields * (total_num_fields - 1),
679 MPI_INT, MPI_LOR, comm), comm);
681 int * field_src_field_config_ids =
682 xcalloc(2 * (
size_t)total_num_fields,
683 sizeof(*field_src_field_config_ids));
684 int * field_tgt_field_config_ids =
685 field_src_field_config_ids + (size_t)total_num_fields;
687 for (
unsigned i = 0, k = 0,
id = 1; i < total_num_fields; ++i) {
688 if (field_src_field_config_ids[i] != 0) {
689 k += total_num_fields - i - 1;
692 field_src_field_config_ids[i] = (int)
id;
693 for (
unsigned j = i + 1; j < total_num_fields; ++j, ++k)
694 if (!field_src_field_config_compare_matrix[k])
695 field_src_field_config_ids[j] = (int)
id;
699 for (
unsigned i = 0, k = 0,
id = 1; i < total_num_fields; ++i) {
700 if (field_tgt_field_config_ids[i] != 0) {
701 k += total_num_fields - i - 1;
704 field_tgt_field_config_ids[i] = (int)
id;
705 for (
unsigned j = i + 1; j < total_num_fields; ++j, ++k)
706 if (!field_tgt_field_config_compare_matrix[k])
707 field_tgt_field_config_ids[j] = (int)
id;
711 free(field_src_field_config_compare_matrix);
713 for (
unsigned i = 0; i < total_num_fields; ++i) {
715 field_src_field_config_ids[i];
717 field_tgt_field_config_ids[i];
719 free(field_src_field_config_ids);
723 int * field_config_compare_matrix =
724 xmalloc((
size_t)(total_num_fields * (total_num_fields - 1)) / 2 *
725 sizeof(*field_config_compare_matrix));
726 for (
unsigned i = 0, k = 0; i < total_num_fields; ++i)
727 for (
unsigned j = i + 1; j < total_num_fields; ++j, ++k)
728 field_config_compare_matrix[k] =
730 &(field_configs[i]), &(field_configs[j])) != 0;
733 MPI_Allreduce(MPI_IN_PLACE, field_config_compare_matrix,
734 (total_num_fields * (total_num_fields - 1)) / 2,
735 MPI_INT, MPI_LOR, comm), comm);
737 int * field_config_ids =
738 xcalloc((
size_t)total_num_fields,
sizeof(*field_config_ids));
740 for (
unsigned i = 0, k = 0,
id = 1; i < total_num_fields; ++i) {
741 if (field_config_ids[i] != 0) {
742 k += total_num_fields - i - 1;
745 field_config_ids[i] = (int)
id;
746 for (
unsigned j = i + 1; j < total_num_fields; ++j, ++k)
747 if (!field_config_compare_matrix[k])
748 field_config_ids[j] = (int)
id;
752 free(field_config_compare_matrix);
754 for (
unsigned i = 0; i < total_num_fields; ++i)
755 field_configs[i].
id = field_config_ids[i];
756 free(field_config_ids);
759 *field_configs_ = field_configs;
760 *count = total_num_fields;
769 return a_->
id - b_->id;
790 size_t * num_fields, MPI_Comm
comm) {
800 (num_mask_names == 0) || (
num_fields_ == num_mask_names),
801 "ERROR(get_interp_fields_from_coupling_field): "
802 "missmatch in number of interpolation fields of coupling field \"%s\" "
803 "and number of provided mask names (%zu != %zu)",
816 "ERROR(get_interp_fields_from_coupling_field): missmatch in number of"
817 "local interpolation fields for coupling field \"%s\" and global "
823 "ERROR(get_interp_fields_from_coupling_field): local process did "
824 "not provide mask names for coupling field \"%s\" while others did",
835 for (
size_t i = 0; i < num_mask_names; ++i) {
836 char const * mask_name = mask_names[i];
839 "ERROR(get_interp_fields_from_coupling_field): "
840 "make_names[%zu] is NULL", i);
843 grid, interp_fields_[i].location, mask_name);
846 uint64_t
data[num_fields_][3];
848 for (
size_t i = 0; i < num_fields_; ++i) {
849 data[i][0] = (uint64_t)interp_fields_[i].location;
850 data[i][1] = (uint64_t)interp_fields_[i].coordinates_idx;
851 data[i][2] = (uint64_t)interp_fields_[i].masks_idx;
856 MPI_IN_PLACE,
data, 3 * (
int)num_fields_,
857 MPI_UINT64_T, MPI_MIN, comm), comm);
859 for (
size_t i = 0; i < num_fields_; ++i) {
861 data[i][0] == (uint64_t)(interp_fields_[i].location),
862 "ERROR(get_interp_fields_from_coupling_field): location mismatch")
864 data[i][1] == (uint64_t)(interp_fields_[i].coordinates_idx),
865 "ERROR(get_interp_fields_from_coupling_field): "
866 "coordinates index mismatch")
868 data[i][2] == (uint64_t)(interp_fields_[i].masks_idx),
869 "ERROR(get_interp_fields_from_coupling_field): "
870 "masks index mismatch")
875 uint64_t zero_counts[2] = {0,0};
880 zero_counts, counts, 2,
881 MPI_UINT64_T, MPI_MAX, comm), comm);
883 num_fields_ = (size_t)(counts[0]);
884 interp_fields_ =
xmalloc(num_fields_ *
sizeof(*interp_fields_));
886 uint64_t
data[num_fields_][3];
888 for (
size_t i = 0; i < num_fields_; ++i) {
890 data[i][1] = (uint64_t)UINT64_MAX;
891 data[i][2] = (uint64_t)UINT64_MAX;
896 MPI_IN_PLACE,
data, 3 * (
int)num_fields_,
897 MPI_UINT64_T, MPI_MIN, comm), comm);
899 for (
size_t i = 0; i < num_fields_; ++i) {
906 *interp_fields = interp_fields_;
907 *num_fields = num_fields_;
912 MPI_Comm comm = instance->
comm;
918 instance, &field_configs, &field_count);
921 qsort(field_configs, field_count,
sizeof(*field_configs),
929 MPI_Comm comp_pair_comm = MPI_COMM_NULL;
933 for (
size_t i = 0; i < field_count; ++i) {
935 struct field_config * curr_field_config = field_configs + i;
942 if ((prev_comp_grid_pair == NULL) ||
950 if (comp_pair_comm != MPI_COMM_NULL)
953 int comp_is_available[2] =
961 is_active = comp_is_available[0] || comp_is_available[1];
964 &comp_pair_comm), comm);
967 yac_mpi_call(MPI_Allreduce(MPI_IN_PLACE, comp_is_available, 2,
968 MPI_INT, MPI_LOR, comp_pair_comm), comm);
969 is_active = comp_is_available[0] && comp_is_available[1];
985 char const * grid_names[2] =
988 char const * component_names[2] =
1004 for (
int i = 0; i < 2; ++i)
1013 curr_field_config - 1, curr_field_config))) {
1018 size_t num_src_fields;
1034 "ERROR(generate_interpolations): "
1035 "only one point set per target field supported")
1137 prev_comp_grid_pair = curr_comp_grid_pair;
1144 if (comp_pair_comm != MPI_COMM_NULL)
1146 free(field_configs);
1153 "ERROR(yac_instance_sync_def): no components have been defined");
1160 if (requires_def_sync)
1166 "ERROR(yac_instance_setup): no components have been defined");
1172 MPI_IN_PLACE, &requires_def_sync, 1, MPI_INT, MPI_MIN, instance->
comm),
1174 if(requires_def_sync == 0)
1190 char const ** comp_names,
size_t num_comp_names) {
1194 instance->
comp_config, comp_names, num_comp_names);
1199 const char* comp_name){
1208 const char* comp_name){
1236 MPI_Comm dummy_comm;
1242 if (instance == NULL)
return;
1292 char const ** comp_names,
size_t num_comps) {
1298 "ERROR(yac_instance_def_components): components have already been defined")
1301 for (
size_t i = 0; i < num_comps; ++i)
1318 struct yac_instance * instance,
char const * field_name,
1331 field_name,
"ERROR(yac_instance_add_field): "
1332 "\"NULL\" is not a valid field name")
1335 "ERROR(yac_instance_add_field): field name is too long "
1336 "(maximum is YAC_MAX_CHARLEN)")
1338 (collection_size > 0) && (collection_size < INT_MAX),
1339 "ERROR(yac_instance_add_field): \"%d\" is not a valid collection size "
1340 "(component \"%s\" grid \"%s\" field \"%s\")",
1341 collection_size, comp_name, grid_name, field_name)
1345 couple_config, comp_name, grid_name, field_name,
1346 timestep, collection_size);
1356 "ERROR(yac_instance_add_field): "
1357 "field with the name \"%s\" has already been defined",
1378 char const * src_comp_name,
char const * src_grid_name,
char const * src_field_name,
1379 char const * tgt_comp_name,
char const * tgt_grid_name,
char const * tgt_field_name,
1380 char const * coupling_period,
int time_reduction,
1382 const char* weight_file_name,
int mapping_on_source,
1383 double scale_factor,
double scale_summand,
size_t num_src_mask_names,
1384 char const *
const * src_mask_names,
char const * tgt_mask_name) {
1390 instance->
couple_config, src_comp_name, src_grid_name, src_field_name,
1391 tgt_comp_name, tgt_grid_name, tgt_field_name, coupling_period,
1392 time_reduction, interp_stack_config, src_lag, tgt_lag, weight_file_name,
1393 mapping_on_source, scale_factor, scale_summand, num_src_mask_names,
1394 src_mask_names, tgt_mask_name);
1398 const char * comp_name,
const char* grid_name,
const char * field_name){
size_t yac_basic_grid_get_named_mask_idx(struct yac_basic_grid *grid, enum yac_location location, char const *mask_name)
int const * yac_basic_grid_get_field_mask(struct yac_basic_grid *grid, struct yac_interp_field field)
yac_const_coordinate_pointer yac_basic_grid_get_field_coordinates(struct yac_basic_grid *grid, struct yac_interp_field field)
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)
int yac_component_config_contains_component(struct yac_component_config *comp_config, char const *comp_name)
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)
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)
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)
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)
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)
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)
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_end_datetime(struct yac_couple_config *couple_config)
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)
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_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)
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)
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)
char const * yac_couple_config_get_start_datetime(struct yac_couple_config *couple_config)
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)
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)
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)
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_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, 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)
char * yac_instance_get_end_datetime(struct yac_instance *instance)
static struct yac_basic_grid * get_basic_grid(const char *grid_name, char const *component_name, size_t num_fields, struct coupling_field **coupling_fields, int *delete_flag)
void yac_instance_def_datetime(struct yac_instance *instance, const char *start_datetime, const char *end_datetime)
void yac_instance_sync_def(struct yac_instance *instance)
struct yac_instance * yac_instance_new(MPI_Comm comm)
int yac_instance_components_are_defined(struct yac_instance *instance)
static void generate_interpolations(struct yac_instance *instance)
void yac_instance_setup(struct yac_instance *instance)
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)
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)
static int compare_field_config_ids(const void *a, const void *b)
static int compare_field_config_fields(struct coupling_field *a, size_t num_mask_names_a, char const *const *mask_names_a, struct coupling_field *b, size_t num_mask_names_b, char const *const *mask_names_b)
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 tgt_field_config get_tgt_interp_config(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx)
static struct field_config_event_data empty_event_data
static struct src_field_config get_src_interp_config(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx)
static const char * yac_instance_phase_str[]
static struct event * generate_event(struct field_config_event_data event_data)
static int compare_field_config_field_ids(const void *a, const void *b)
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 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)
#define CHECK_PHASE(FUNC_NAME, REF_PHASE, NEW_PHASE)
#define CHECK_MAX_PHASE(FUNC_NAME, MAX_REF_PHASE)
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 int compare_field_config_interp_method(const void *a, const void *b)
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)
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_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)
void yac_interp_weights_delete(struct yac_interp_weights *weights)
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)
yac_interp_weights_reorder_type
@ YAC_MAPPING_ON_TGT
weights will be applied at target processes
@ YAC_MAPPING_ON_SRC
weights will be appied at source processes
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)
#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
size_t collection_size
number of vertical levels or bundles
char const * end_datetime
char const * start_datetime
enum yac_reduction_type reduction_operation
char const * coupling_period
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
const char * weight_file_name
char const *const * mask_names
struct field_config_event_data event_data
struct yac_interp_stack_config * interp_stack
struct coupling_field * field
struct field_config_event_data event_data
struct coupling_field * field
struct yac_basic_grid_data data
char const * end_datetime
char const * start_datetime
struct coupling_field ** cpl_fields
enum yac_instance_phase phase
struct yac_component_config * comp_config
struct yac_couple_config * couple_config
enum yac_location location
static struct user_input_data_masks ** masks
#define YAC_ASSERT_F(exp, format,...)
#define YAC_ASSERT(exp, msg)
#define yac_mpi_call(call, comm)
double const (*const yac_const_coordinate_pointer)[3]