YAC 3.8.0
Yet Another Coupler
Loading...
Searching...
No Matches
instance.c
Go to the documentation of this file.
1// Copyright (c) 2024 The YAC Authors
2//
3// SPDX-License-Identifier: BSD-3-Clause
4
5#ifdef HAVE_CONFIG_H
6#include "config.h"
7#endif
8
9#include <stdlib.h>
10#include <stdio.h>
11#include <string.h>
12
13#include "utils_core.h"
14#include "yac.h"
15#include "instance.h"
16#include "event.h"
17#include "yac_mpi_common.h"
18#include "fields.h"
19#include "component.h"
20#include "config_yaml.h"
22
24 INSTANCE_DEFINITION = 0, // after yac_cinit
25 INSTANCE_DEFINITION_COMP = 1, // after yac_cdef_comp
26 INSTANCE_DEFINITION_SYNC = 2, // after yac_csync_def
27 INSTANCE_EXCHANGE = 3, // after yac_cenddef
29};
30
31// bit mask values to determine which field is available
33 SOURCE_FLAG = 1 << 0, // first bit (source is available)
34 TARGET_FLAG = 1 << 1, // second bit (target is available)
35 SOURCE_TARGET_FLAG = (1 << 0) | (1 << 1), // first two bits
36 // (both source and target are
37 // available)
38};
39
40static const char * yac_instance_phase_str[] =
41 {"definition phase",
42 "definition phase (after component definition)",
43 "definition phase (after synchronisation)",
44 "exchange phase",
45 "unknown phase"};
46
47#define CHECK_PHASE(FUNC_NAME, REF_PHASE, NEW_PHASE) \
48 { \
49 enum yac_instance_phase ref_phase_ = (REF_PHASE); \
50 YAC_ASSERT_F( \
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); \
57 }
58#define CHECK_MIN_PHASE(FUNC_NAME, MIN_REF_PHASE) \
59 { \
60 enum yac_instance_phase ref_min_phase_ = (MIN_REF_PHASE); \
61 YAC_ASSERT_F( \
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_)]); \
67 }
68#define CHECK_MAX_PHASE(FUNC_NAME, MAX_REF_PHASE) \
69 { \
70 enum yac_instance_phase ref_max_phase_ = (MAX_REF_PHASE); \
71 YAC_ASSERT_F( \
72 instance->phase <= (ref_max_phase_), \
73 "ERROR(%s): Invalid phase " \
74 "(current phase: \"%s\" maximum expected phase: \"%s\")", \
75 #FUNC_NAME, \
76 yac_instance_phase_str[ \
77 MIN(instance->phase,INSTANCE_UNKNOWN)], \
78 yac_instance_phase_str[(ref_max_phase_)]); \
79 }
80
100
102 SRC = 1,
103 TGT = 2
105
107 const char * grid_name;
108 const char * comp_name;
109};
110
114
123 {.timestep = NULL,
124 .coupling_period = NULL,
125 .timelag = 0,
126 .reduction_operation = TIME_NONE,
127 .start_datetime = NULL,
128 .end_datetime = NULL};
129
144
155
176
178 char const * grid_name;
179 char const * filename;
181};
182
183struct dist_flag {
184 uint64_t * data;
185 size_t count;
186 size_t idx;
187};
188
190 const char * grid_name, struct yac_basic_grid ** grids, size_t num_grids,
191 int * delete_flag) {
192
193 struct yac_basic_grid * grid = NULL;
194 for (size_t i = 0; (i < num_grids) && (grid == NULL); ++i)
195 if (!strcmp(grid_name, yac_basic_grid_get_name(grids[i])))
196 grid = grids[i];
197
198 *delete_flag = grid == NULL;
199 return (grid == NULL)?yac_basic_grid_empty_new(grid_name):grid;
200}
201
202static
203int compare_comp_grid_config(const void * a, const void * b) {
204
205 struct comp_grid_config * a_ = (struct comp_grid_config *)a,
206 * b_ = (struct comp_grid_config *)b;
207
208 int ret;
209 if ((ret = strcmp(a_->comp_name, b_->comp_name))) return ret;
210 else return strcmp(a_->grid_name, b_->grid_name);
211}
212
214 char const * component_name, const char * field_name,
215 const char * grid_name, size_t num_fields,
216 struct coupling_field ** coupling_fields) {
217
218 for (size_t i = 0; i < num_fields; ++i) {
219 struct coupling_field * curr_field = coupling_fields[i];
220 if (!strcmp(component_name, yac_get_coupling_field_comp_name(curr_field)) &&
221 !strcmp(field_name, yac_get_coupling_field_name(curr_field)) &&
222 !strcmp(grid_name,
225 return curr_field;
226 }
227
228 return NULL;
229}
230
232 struct field_config * a, struct field_config * b) {
233
234 int ret;
235
236 if ((ret = (a->reorder_type > b->reorder_type) -
237 (a->reorder_type < b->reorder_type))) return ret;
238 if ((ret = (a->collection_size > b->collection_size) -
239 (a->collection_size < b->collection_size))) return ret;
240 if ((ret = (a->scale_factor > b->scale_factor) -
241 (a->scale_factor < b->scale_factor))) return ret;
242 if ((ret = (a->scale_summand > b->scale_summand) -
243 (a->scale_summand < b->scale_summand))) return ret;
244 if ((ret = (int)(a->yaxt_exchanger_name == NULL) -
245 (int)(b->yaxt_exchanger_name == NULL))) return ret;
246 if ((ret = (a->yaxt_exchanger_name != NULL) &&
248 return ret;
249 if ((ret = (a->use_raw_exchange > b->use_raw_exchange) -
250 (a->use_raw_exchange < b->use_raw_exchange))) return ret;
251 if ((ret = memcmp(
253 sizeof(double)))) return ret;
254 if ((ret = (a->src_interp_config.avail_config_id -
255 b->src_interp_config.avail_config_id))) return ret;
256 if ((ret = (a->tgt_interp_config.avail_config_id -
257 b->tgt_interp_config.avail_config_id))) return ret;
258
259 return 0;
260}
261
263 struct yac_instance * instance, int couple_idx, int field_couple_idx,
264 enum field_type field_type) {
265
266 struct yac_couple_config * couple_config = instance->couple_config;
267
268 enum yac_reduction_type reduction_operation =
270 couple_config, couple_idx, field_couple_idx);
271
272 char const * coupling_period =
274 couple_config, couple_idx, field_couple_idx);
275 char const * timestep;
276 int timelag;
277 if ( field_type == SRC ){
278 timestep =
280 couple_config, couple_idx, field_couple_idx);
281 timelag =
283 couple_config, couple_idx, field_couple_idx);
284 }else{
285 reduction_operation = TIME_NONE;
286 timestep =
288 couple_config, couple_idx, field_couple_idx);
289 timelag =
291 couple_config, couple_idx, field_couple_idx);
292 }
293
294 return
296 {.timestep = timestep,
297 .coupling_period = coupling_period,
298 .timelag = timelag,
299 .reduction_operation = reduction_operation,
300 .start_datetime = yac_couple_config_get_start_datetime(couple_config),
301 .end_datetime = yac_couple_config_get_end_datetime(couple_config)};
302}
303
304static struct event * generate_event(
305 struct field_config_event_data event_data) {
306
307 struct event * event = yac_event_new();
309 event, event_data.timestep, event_data.coupling_period,
310 event_data.timelag, event_data.reduction_operation,
311 event_data.start_datetime, event_data.end_datetime);
312 return event;
313}
314
315
316// checks for all coupling configurations whether the associated source and
317// target field is available on any process
319 struct yac_couple_config * couple_config, MPI_Comm comm,
320 struct coupling_field ** coupling_fields, size_t num_fields) {
321
322 size_t num_couples = yac_couple_config_get_num_couples(couple_config);
323 size_t total_num_fields = 0;
324 for (size_t couple_idx = 0; couple_idx < num_couples; ++couple_idx)
325 total_num_fields +=
326 yac_couple_config_get_num_couple_fields(couple_config, couple_idx);
327
328 int * is_valid_field_configuration =
329 xcalloc(total_num_fields, sizeof(*is_valid_field_configuration));
330
331 // for all coupling configurations
332 for (size_t couple_idx = 0, i = 0; couple_idx < num_couples;
333 ++couple_idx) {
334
335 // for all field configuration of the current coupling configuration
336 size_t curr_num_fields =
337 yac_couple_config_get_num_couple_fields(couple_config, couple_idx);
338 for (size_t field_couple_idx = 0; field_couple_idx < curr_num_fields;
339 ++field_couple_idx, ++i) {
340
341 // get component, grid, and field names for the current
342 // field configuration
343 char const * src_component_name;
344 char const * tgt_component_name;
345 char const * src_grid_name;
346 char const * tgt_grid_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);
358
359 // check availability of respective source and target fields
361 src_component_name, src_field_name, src_grid_name,
362 num_fields, coupling_fields) != NULL)
363 is_valid_field_configuration[i] |= SOURCE_FLAG;
365 tgt_component_name, tgt_field_name, tgt_grid_name,
366 num_fields, coupling_fields) != NULL)
367 is_valid_field_configuration[i] |= TARGET_FLAG;
368 }
369 }
370
371 // check availability of source and target fields across all processes
372 // (using "bit-wise or" reduction operation)
374 MPI_Allreduce(
375 MPI_IN_PLACE, is_valid_field_configuration, total_num_fields,
376 MPI_INT, MPI_BOR, comm), comm);
377
378 int comm_rank;
379 yac_mpi_call(MPI_Comm_rank(comm, &comm_rank), comm);
380 int const is_root = comm_rank == 0;
381
382 // check for missing fields print warning or abort
383 // (depending on configuration of missing_definition_is_fatal)
384 int missing_definition_is_fatal =
386 for (size_t couple_idx = 0, i = 0; couple_idx < num_couples;
387 ++couple_idx) {
388 size_t curr_num_fields =
389 yac_couple_config_get_num_couple_fields(couple_config, couple_idx);
390 for (size_t field_couple_idx = 0; field_couple_idx < curr_num_fields;
391 ++field_couple_idx, ++i) {
392 if ((is_valid_field_configuration[i] != SOURCE_TARGET_FLAG) &&
393 is_root) {
394 char const * src_component_name;
395 char const * tgt_component_name;
396 char const * src_grid_name;
397 char const * tgt_grid_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"
410 " source (%s):\n"
411 " component name: \"%s\"\n"
412 " grid name: \"%s\"\n"
413 " field name: \"%s\"\n"
414 " target(%s):\n"
415 " component name: \"%s\"\n"
416 " grid name: \"%s\"\n"
417 " field name: \"%s\"\n",
418 missing_definition_is_fatal?"ERROR":"WARNING",
419 (is_valid_field_configuration[i] & SOURCE_FLAG)?
420 "defined":"not defined",
421 src_component_name, src_grid_name, src_field_name,
422 (is_valid_field_configuration[i] & TARGET_FLAG)?
423 "defined":"not defined",
424 tgt_component_name, tgt_grid_name, tgt_field_name);
426 !missing_definition_is_fatal,
427 "ERROR(get_field_configuration): missing definition")
428 }
429 is_valid_field_configuration[i] =
430 (SOURCE_TARGET_FLAG == is_valid_field_configuration[i]);
431 }
432 }
433
434 return is_valid_field_configuration;
435}
436
438 struct coupling_field * field, char const * const * mask_names,
439 size_t num_mask_names, struct yac_interp_field ** interp_fields,
440 size_t * num_fields, MPI_Comm comm) {
441
442 struct yac_interp_field * interp_fields_;
443 size_t num_fields_;
444
445 if (field != NULL) {
446
447 num_fields_ = yac_coupling_field_get_num_interp_fields(field);
448
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)",
454 yac_get_coupling_field_name(field), num_fields_, num_mask_names)
455
456 uint64_t local_counts[2] =
457 {(uint64_t)num_fields_, (uint64_t)num_mask_names};
458 uint64_t global_counts[2];
459
461 MPI_Allreduce(
462 local_counts, global_counts, 2, MPI_UINT64_T, MPI_MAX, comm), comm);
463
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 "
468 "(%zu != %zu)",
469 yac_get_coupling_field_name(field), num_fields_, (size_t)(global_counts[0]))
470
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",
476
477 // make a copy of the interpolation fields of the coupling field
478 interp_fields_ = xmalloc(num_fields_ * sizeof(*interp_fields_));
479 memcpy(
480 interp_fields_, yac_coupling_field_get_interp_fields(field),
481 num_fields_ * sizeof(*interp_fields_));
482
483 // if mask names are provided, overwrite already existing masks
485 for (size_t i = 0; i < num_mask_names; ++i) {
486 char const * mask_name = mask_names[i];
488 mask_name != NULL,
489 "ERROR(get_interp_fields_from_coupling_field): "
490 "make_names[%zu] is NULL", i);
491 interp_fields_[i].masks_idx =
493 grid, interp_fields_[i].location, mask_name);
494 }
495
496 uint64_t data[num_fields_][3];
497
498 for (size_t i = 0; i < num_fields_; ++i) {
499 data[i][0] = (uint64_t)interp_fields_[i].location;
500 data[i][1] = (uint64_t)interp_fields_[i].coordinates_idx;
501 data[i][2] = (uint64_t)interp_fields_[i].masks_idx;
502 }
503
505 MPI_Allreduce(
506 MPI_IN_PLACE, data, 3 * (int)num_fields_,
507 MPI_UINT64_T, MPI_MIN, comm), comm);
508
509 for (size_t i = 0; i < num_fields_; ++i) {
511 data[i][0] == (uint64_t)(interp_fields_[i].location),
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")
521 }
522
523 } else {
524
525 uint64_t zero_counts[2] = {0,0};
526 uint64_t counts[2];
527
529 MPI_Allreduce(
530 zero_counts, counts, 2,
531 MPI_UINT64_T, MPI_MAX, comm), comm);
532
533 num_fields_ = (size_t)(counts[0]);
534 interp_fields_ = xmalloc(num_fields_ * sizeof(*interp_fields_));
535
536 uint64_t data[num_fields_][3];
537
538 for (size_t i = 0; i < num_fields_; ++i) {
539 data[i][0] = (uint64_t)YAC_LOC_UNDEFINED;
540 data[i][1] = (uint64_t)UINT64_MAX;
541 data[i][2] = (uint64_t)UINT64_MAX;
542 }
543
545 MPI_Allreduce(
546 MPI_IN_PLACE, data, 3 * (int)num_fields_,
547 MPI_UINT64_T, MPI_MIN, comm), comm);
548
549 for (size_t i = 0; i < num_fields_; ++i) {
550 interp_fields_[i].location = (enum yac_location)data[i][0];
551 interp_fields_[i].coordinates_idx = (size_t)data[i][1];
552 interp_fields_[i].masks_idx = (size_t)data[i][2];
553 }
554 }
555
556 *interp_fields = interp_fields_;
557 *num_fields = num_fields_;
558}
559
561 struct yac_couple_config * couple_config,
562 size_t couple_idx, size_t field_couple_idx,
563 struct coupling_field * field, MPI_Comm comm) {
564
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);
570
571 struct yac_interp_field * interp_fields;
572 size_t num_interp_fields;
574 field, src_mask_names, num_src_mask_names,
575 &interp_fields, &num_interp_fields, comm);
576
577 return
578 (struct src_field_config) {
579 .field = field,
580 .name = NULL,
581 .interp_fields = interp_fields,
582 .num_interp_fields = num_interp_fields,
583 .interp_stack =
585 couple_config, couple_idx, field_couple_idx),
586 .weight_file_name =
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):
597 .event_data = empty_event_data,
598 };
599}
600
602 struct yac_couple_config * couple_config,
603 size_t couple_idx, size_t field_couple_idx,
604 struct coupling_field * field, MPI_Comm comm) {
605
606 char const * mask_name =
608 couple_config, couple_idx, field_couple_idx);
609
610 struct yac_interp_field * interp_field;
611 size_t num_interp_field;
613 field, &mask_name, mask_name != NULL,
614 &interp_field, &num_interp_field, comm);
615
617 num_interp_field == 1,
618 "ERROR(get_tgt_interp_config): "
619 "only one point set per target field supported")
620
621 return
622 (struct tgt_field_config) {
623 .field = field,
624 .name = NULL,
625 .interp_field = interp_field,
626 .event_data = empty_event_data,
627 };
628}
629
630static int compare_dist_flags(const void * a_, const void * b_) {
631
632 struct dist_flag const * a = a_;
633 struct dist_flag const * b = b_;
634
635 return memcmp(a->data, b->data, a->count * sizeof(a->data[0]));
636}
637
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) {
642
643 int comm_size;
644 yac_mpi_call(MPI_Comm_size(comm, &comm_size), comm);
645
646 // number of 64-bit blocks required to store all flags
647 size_t flags_num_blocks = (flag_count + 63) / 64;
648 // number of 64-bit blocks required to store the value of all ranks for
649 // one flag
650 size_t ranks_num_blocks = (size_t)((comm_size + 63) / 64);
651
652 // all-gather the flags from all ranks
654 MPI_Allgather(
655 local_flags, (int)flags_num_blocks, MPI_UINT64_T,
656 global_flags_buffer, (int)flags_num_blocks, MPI_UINT64_T,
657 comm), comm);
658
659 // initialise per-flag storage of all data
660 for (size_t flag_idx = 0; flag_idx < flag_count; ++flag_idx) {
661 memset(
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;
666 }
667
668 // converte from storing flags on per-rank basis to per-flag
669 for (int rank = 0; rank < comm_size; ++rank) {
670
671 // get flags for current rank
672 uint64_t * rank_flags =
673 global_flags_buffer + (size_t)rank * flags_num_blocks;
674
675 size_t rank_block_idx = rank / 64;
676 uint64_t rank_flag_mask = ((uint64_t)1) << (rank % 64);
677
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;
681 }
682
683 // sort flags based on availability of on all ranks
684 qsort(dist_flags, flag_count, sizeof(*dist_flags), compare_dist_flags);
685
686 // determine unique configurations
687 int id = 0;
688 struct dist_flag * prev_dist_flag = dist_flags;
689 for (size_t flag_idx = 0; flag_idx < flag_count; ++flag_idx) {
690
691 struct dist_flag * curr_dist_flag = dist_flags + flag_idx;
692 if (compare_dist_flags(prev_dist_flag, curr_dist_flag)) ++id;
693
694 dist_flag_ids[curr_dist_flag->idx] = id;
695 prev_dist_flag = curr_dist_flag;
696 }
697}
698
700 struct field_config * field_configs, size_t num_fields,
701 int * is_valid_field_configuration, MPI_Comm comm) {
702
703 int comm_size;
704 yac_mpi_call(MPI_Comm_size(comm, &comm_size), comm);
705
706 // number of 64-bit blocks required to store the flags of all fields
707 size_t flags_num_blocks = (num_fields + 63) / 64;
708 // number of 64-bit blocks required to store the flags of all ranks for
709 // one field
710 size_t ranks_num_blocks = (size_t)((comm_size + 63) / 64);
711
712 // flags for storing the availability of source/target fields of the local
713 // process
714 uint64_t * field_is_available_flags =
715 xmalloc(flags_num_blocks * sizeof(*field_is_available_flags));
716
717 // flags for storing the availability of source/target fields af all processes
718 // (per rank)
719 uint64_t * all_field_is_available_flags =
720 xmalloc(
721 (size_t)comm_size * flags_num_blocks * sizeof(*all_field_is_available_flags));
722
723 // flags for storing the availability of source/target fields af all processes
724 // (per field)
725 struct dist_flag * dist_flags = xmalloc(num_fields * sizeof(*dist_flags));
726 uint64_t * dist_flags_data_buffer =
727 xmalloc(num_fields * ranks_num_blocks * sizeof(*dist_flags_data_buffer));
728 for (size_t i = 0; i < num_fields; ++i) {
729 dist_flags[i].data = dist_flags_data_buffer + i * ranks_num_blocks;
730 }
731
732 // individual ids for all flag configurations
733 int * field_avail_config_ids =
734 xmalloc(num_fields * sizeof(*field_avail_config_ids));
735
736 { // source field availability
737
738 // determine available of a field on the local process
739 memset(
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));
746
748 field_is_available_flags, num_fields, all_field_is_available_flags,
749 dist_flags, field_avail_config_ids, comm);
750
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];
754 }
755
756 { // target field availability
757
758 // determine available of a field on the local process
759 memset(
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));
766
768 field_is_available_flags, num_fields, all_field_is_available_flags,
769 dist_flags, field_avail_config_ids, comm);
770
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];
774 }
775
776 free(field_avail_config_ids);
777 free(dist_flags_data_buffer);
778 free(dist_flags);
779 free(all_field_is_available_flags);
780 free(field_is_available_flags);
781}
782
784 struct yac_instance * instance,
785 struct field_config ** field_configs_, size_t * count) {
786
787 struct yac_couple_config * couple_config = instance->couple_config;
788 MPI_Comm comm = instance->comm;
789 size_t num_fields = instance->num_cpl_fields;
790 struct coupling_field ** coupling_fields = instance->cpl_fields;
791
792 size_t num_couples = yac_couple_config_get_num_couples(couple_config);
793
794 // determines for which coupling configurations the source and target fields
795 // are available
796 int * is_valid_field_configuration =
798 couple_config, comm, coupling_fields, num_fields);
799
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 =
803 yac_couple_config_get_num_couple_fields(couple_config, couple_idx);
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;
807 }
808
809 // get all field coupling configurations
810 // * due to the synchronisation of couple_config beforehand the ordering
811 // of the field coupling configurations on all processes is identical
812 // * all information extracted from the coupling configuration is identical
813 // on all processes
814 // * only valid configurations (source and target field are defined somewhere)
815 size_t field_config_idx = 0;
816 struct field_config * field_configs =
817 xmalloc(total_num_fields * sizeof(*field_configs));
818 for (size_t couple_idx = 0, i = 0; couple_idx < num_couples; ++couple_idx) {
819
820 size_t curr_num_fields =
821 yac_couple_config_get_num_couple_fields(couple_config, couple_idx);
822
823 for (size_t field_couple_idx = 0; field_couple_idx < curr_num_fields;
824 ++field_couple_idx, ++i) {
825
826 if (!is_valid_field_configuration[i]) continue;
827
828 struct comp_grid_config src_config, tgt_config;
829
831 couple_config, couple_idx, field_couple_idx,
832 &(src_config.comp_name), &(tgt_config.comp_name));
833
835 couple_config, couple_idx, field_couple_idx,
836 &(src_config.grid_name), &(tgt_config.grid_name));
837
838 int src_comp_idx =
839 compare_comp_grid_config(&src_config, &tgt_config) > 0;
840
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);
846 struct coupling_field * src_field =
848 src_config.comp_name, src_field_name, src_config.grid_name,
849 num_fields, coupling_fields);
850 struct coupling_field * tgt_field =
852 tgt_config.comp_name, tgt_field_name, tgt_config.grid_name,
853 num_fields, coupling_fields);
854
855 double frac_mask_fallback_value =
857 couple_config, src_config.comp_name, src_config.grid_name,
858 src_field_name);
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);
868 int use_raw_exchange =
870 couple_config, couple_idx, field_couple_idx);
871 size_t collection_size =
873 couple_config, src_config.comp_name, src_config.grid_name,
874 src_field_name);
875
879 couple_config, tgt_config.comp_name, tgt_config.grid_name,
880 tgt_field_name),
881 "ERROR: collection sizes do not match for coupled fields (%zu != %zu): \n"
882 " source:\n"
883 " component name: \"%s\"\n"
884 " grid name: \"%s\"\n"
885 " field name: \"%s\"\n"
886 " target:\n"
887 " component name: \"%s\"\n"
888 " grid name: \"%s\"\n"
889 " field name: \"%s\"\n",
892 couple_config, tgt_config.comp_name, tgt_config.grid_name,
893 tgt_field_name),
894 src_config.comp_name, src_config.grid_name, src_field_name,
895 tgt_config.comp_name, tgt_config.grid_name, tgt_field_name);
896
897 field_configs[field_config_idx].comp_grid_pair.config[src_comp_idx] =
898 src_config;
899 field_configs[field_config_idx].comp_grid_pair.config[src_comp_idx^1] =
900 tgt_config;
901 field_configs[field_config_idx].src_comp_idx = src_comp_idx;
902 field_configs[field_config_idx].src_interp_config =
904 couple_config, couple_idx, field_couple_idx, src_field, comm);
905 field_configs[field_config_idx].tgt_interp_config =
907 couple_config, couple_idx, field_couple_idx, tgt_field, comm);
908 field_configs[field_config_idx].reorder_type =
910 couple_config, couple_idx, field_couple_idx))?
912 field_configs[field_config_idx].src_interp_config.event_data =
913 get_event_data(instance, couple_idx, field_couple_idx, SRC);
914 field_configs[field_config_idx].tgt_interp_config.event_data =
915 get_event_data(instance, couple_idx, field_couple_idx, TGT);
916 field_configs[field_config_idx].frac_mask_fallback_value =
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;
920 field_configs[field_config_idx].yaxt_exchanger_name = yaxt_exchanger_name;
921 field_configs[field_config_idx].use_raw_exchange = use_raw_exchange;
922 field_configs[field_config_idx].collection_size = collection_size;
923 field_configs[field_config_idx].src_interp_config.name = src_field_name;
924 field_configs[field_config_idx].tgt_interp_config.name = tgt_field_name;
925 ++field_config_idx;
926 }
927 }
928
929 // computes unique ids for availability configuration of source and target
930 // coupling fields
932 field_configs, total_num_fields, is_valid_field_configuration, comm);
933
934 free(is_valid_field_configuration);
935
936 *field_configs_ = field_configs;
937 *count = total_num_fields;
938}
939
941 struct yac_interp_field * a, struct yac_interp_field * b) {
942
943 int ret;
944 if ((ret = (a->location > b->location) - (a->location < b->location)))
945 return ret;
946 if ((ret =
949 return ret;
950 return (a->masks_idx > b->masks_idx) - (a->masks_idx < b->masks_idx);
951}
952
954 struct field_config * a, struct field_config * b) {
955
956 int ret;
957 if ((ret = strcmp(a->comp_grid_pair.config[a->src_comp_idx].grid_name,
959 return ret;
960 if ((ret = strcmp(a->comp_grid_pair.config[a->src_comp_idx^1].grid_name,
962 return ret;
963 if ((ret =
967 b->src_interp_config.num_interp_fields))) return ret;
968 for (size_t i = 0; i < a->src_interp_config.num_interp_fields; ++i)
969 if ((ret =
972 b->src_interp_config.interp_fields + i))) return ret;
973 return
976}
977
978static
979int compare_field_config(const void * a, const void * b) {
980
981 struct field_config * a_ = (struct field_config *)a,
982 * b_ = (struct field_config *)b;
983
984 int ret;
985 if ((ret = strcmp(a_->comp_grid_pair.config[0].grid_name,
986 b_->comp_grid_pair.config[0].grid_name))) return ret;
987 if ((ret = strcmp(a_->comp_grid_pair.config[1].grid_name,
988 b_->comp_grid_pair.config[1].grid_name))) return ret;
989 if ((ret = compare_field_config_interp_fields(a_, b_))) return ret;
992 b_->src_interp_config.interp_stack))) return ret;
993 if ((ret = (int)(a_->src_interp_config.weight_file_name == NULL) -
994 (int)(b_->src_interp_config.weight_file_name == NULL))) return ret;
995 if ((a_->src_interp_config.weight_file_name != NULL) &&
996 (ret = strcmp(a_->src_interp_config.weight_file_name,
997 b_->src_interp_config.weight_file_name))) return ret;
998 if ((a_->src_interp_config.weight_file_name != NULL) &&
1000 (int)(b_->src_interp_config.weight_file_on_existing))) return ret;
1001 if ((ret = compare_field_config_interpolation_build_config(a_, b_))) return ret;
1002 if ((ret = strcmp(a_->comp_grid_pair.config[0].comp_name,
1003 b_->comp_grid_pair.config[0].comp_name))) return ret;
1004 if ((ret = strcmp(a_->src_interp_config.name,
1005 b_->src_interp_config.name))) return ret;
1006 if ((ret = strcmp(a_->tgt_interp_config.name,
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"
1014 "\t grid name:\n"
1015 "\t source:\"%s\"\n"
1016 "\t target:\"%s\"\n"
1017 "\t field name:\n"
1018 "\t source:\"%s\"\n"
1019 "\t target:\"%s\"\n",
1026
1027 return 0;
1028}
1029
1031 struct src_field_config src_interp_config,
1032 struct yac_interp_grid * interp_grid) {
1033
1034 struct interp_method ** method_stack =
1036 struct yac_interp_weights * weights =
1037 yac_interp_method_do_search(method_stack, interp_grid);
1038
1039 yac_interp_method_delete(method_stack);
1040 free(method_stack);
1041
1042 return weights;
1043}
1044
1046 struct yac_instance * instance, struct yac_basic_grid ** local_grids,
1047 size_t num_local_grids, struct output_grid ** output_grids,
1048 size_t * output_grid_count) {
1049
1050 struct yac_couple_config * couple_config = instance->couple_config;
1051
1052 // count number of output grids
1053 size_t num_grids = yac_couple_config_get_num_grids(couple_config);
1054 *output_grid_count = 0;
1055 for (size_t grid_idx = 0; grid_idx < num_grids; ++grid_idx)
1057 couple_config,
1058 yac_couple_config_get_grid_name(couple_config, grid_idx)) != NULL)
1059 ++*output_grid_count;
1060
1061 *output_grids = xmalloc(*output_grid_count * sizeof(**output_grids));
1062
1063 // extract output grids and check whether the respective grids are
1064 // locally available
1065 for (size_t grid_idx = 0, output_grid_idx = 0; grid_idx < num_grids; ++grid_idx) {
1066 char const * grid_name =
1068 char const * filename =
1069 yac_couple_config_grid_get_output_filename(couple_config, grid_name);
1070 if (filename != NULL) {
1071 struct yac_basic_grid * local_grid = NULL;
1072 for (size_t i = 0; (i < num_local_grids) && (local_grid == NULL); ++i)
1073 if (!strcmp(grid_name, yac_basic_grid_get_name(local_grids[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;
1078 ++output_grid_idx;
1079 }
1080 }
1081}
1082
1083static int compare_output_grids(const void * a, const void * b) {
1084
1085 return
1086 strcmp(
1087 ((struct output_grid*)a)->grid_name,
1088 ((struct output_grid*)b)->grid_name);
1089}
1090
1092 struct yac_instance * instance, struct yac_basic_grid ** grids, size_t num_grids) {
1093
1094 MPI_Comm comm = instance->comm;
1095
1096 // get information about all grids that have to be written to file
1097 struct output_grid * output_grids;
1098 size_t output_grid_count;
1100 instance, grids, num_grids, &output_grids, &output_grid_count);
1101
1102 // sort output grids
1103 qsort(
1104 output_grids, output_grid_count, sizeof(*output_grids),
1106
1107 // for all grids that have to be written to file
1108 for (size_t i = 0; i < output_grid_count; ++i) {
1109
1110 struct yac_basic_grid * grid = output_grids[i].grid;
1111 int split_key = (grid != NULL)?1:MPI_UNDEFINED;
1112
1113 // generate a communicator containing all processes that
1114 // have parts of the current grid locally available
1115 MPI_Comm output_comm;
1116 yac_mpi_call(MPI_Comm_split(comm, split_key, 0, &output_comm), comm);
1117
1118 // if the local process has some data of the grid locally available
1119 if (grid != NULL) {
1120
1121 // write grid to file in parallel
1123 grid, output_grids[i].filename, output_comm);
1124
1125 yac_mpi_call(MPI_Comm_free(&output_comm), comm);
1126 }
1127 }
1128
1129 free(output_grids);
1130
1131 // wait until all grids have been written
1132 yac_mpi_call(MPI_Barrier(comm), comm);
1133}
1134
1136 struct yac_instance * instance, struct yac_basic_grid ** grids,
1137 size_t num_grids) {
1138
1139 MPI_Comm comm = instance->comm;
1140
1141 // get information about all fields
1142 struct field_config * field_configs;
1143 size_t field_count;
1145 instance, &field_configs, &field_count);
1146
1147 // sort field configurations
1148 qsort(
1149 field_configs, field_count, sizeof(*field_configs), compare_field_config);
1150
1151 struct yac_dist_grid_pair * dist_grid_pair = NULL;
1152 struct yac_interp_grid * interp_grid = NULL;
1153 struct yac_interp_weights * interp_weights = NULL;
1154 struct yac_interpolation * interp = NULL;
1155 struct yac_interpolation_exchange * interp_exch = NULL;
1157 struct comp_grid_pair_config * prev_comp_grid_pair = NULL;
1158 struct field_config * prev_field_config = NULL;
1159
1161
1162 // loop over all fields to build interpolations
1163 for (size_t i = 0; i < field_count; ++i) {
1164
1165 struct field_config * curr_field_config = field_configs + i;
1166 struct comp_grid_pair_config * curr_comp_grid_pair =
1167 &(curr_field_config->comp_grid_pair);
1168
1169 int is_source = curr_field_config->src_interp_config.field != NULL;
1170 int is_target = curr_field_config->tgt_interp_config.field != NULL;
1171
1172 int build_flag = 0;
1173
1174 // if the current configuration differs from the previous one and the local
1175 // process is involved in this configuration
1176 if ((prev_comp_grid_pair == NULL) ||
1177 (build_flag ||
1178 strcmp(prev_comp_grid_pair->config[0].grid_name,
1179 curr_comp_grid_pair->config[0].grid_name) ||
1180 strcmp(prev_comp_grid_pair->config[1].grid_name,
1181 curr_comp_grid_pair->config[1].grid_name))) {
1182
1183 build_flag = 1;
1184
1185 if (dist_grid_pair != NULL) yac_dist_grid_pair_delete(dist_grid_pair);
1186
1187 char const * grid_names[2] =
1188 {curr_comp_grid_pair->config[0].grid_name,
1189 curr_comp_grid_pair->config[1].grid_name};
1190
1191 int delete_flags[2];
1192 struct yac_basic_grid * basic_grid[2] =
1193 {get_basic_grid(grid_names[0], grids, num_grids, &delete_flags[0]),
1194 get_basic_grid(grid_names[1], grids, num_grids, &delete_flags[1])};
1195
1196 dist_grid_pair =
1197 yac_dist_grid_pair_new(basic_grid[0], basic_grid[1], comm);
1198
1199 for (int i = 0; i < 2; ++i)
1200 if (delete_flags[i]) yac_basic_grid_delete(basic_grid[i]);
1201 }
1202
1203 // if the current source or target field data differes from the previous
1204 // one
1205 if (build_flag ||
1207 prev_field_config, curr_field_config)) {
1208
1209 build_flag = 1;
1210
1211 struct yac_interp_field * src_fields =
1212 curr_field_config->src_interp_config.interp_fields;
1213 size_t num_src_fields =
1214 curr_field_config->src_interp_config.num_interp_fields;
1215 struct yac_interp_field * tgt_fields =
1216 curr_field_config->tgt_interp_config.interp_field;
1217
1218 if (interp_grid != NULL) yac_interp_grid_delete(interp_grid);
1219
1220 int src_comp_idx = field_configs[i].src_comp_idx;
1221 interp_grid = yac_interp_grid_new(
1222 dist_grid_pair,
1223 curr_comp_grid_pair->config[src_comp_idx].grid_name,
1224 curr_comp_grid_pair->config[src_comp_idx^1].grid_name,
1225 num_src_fields, src_fields, *tgt_fields);
1226 }
1227
1228 // if the current interpolation method stack differes from the previous
1229 // configuration
1230 if (build_flag ||
1232 prev_field_config->src_interp_config.interp_stack,
1233 curr_field_config->src_interp_config.interp_stack)) {
1234
1235 build_flag = 1;
1236
1237 if (interp_weights != NULL) yac_interp_weights_delete(interp_weights);
1238
1239 // generate interp weights
1240 interp_weights = generate_interp_weights(
1241 curr_field_config->src_interp_config, interp_grid);
1242 }
1243
1244 if (curr_field_config->src_interp_config.weight_file_name != NULL) {
1245
1246 int src_comp_idx = field_configs[i].src_comp_idx;
1247
1249 interp_weights,
1250 curr_field_config->src_interp_config.weight_file_name,
1251 curr_comp_grid_pair->config[src_comp_idx].grid_name,
1252 curr_comp_grid_pair->config[src_comp_idx^1].grid_name,
1253 0, 0, curr_field_config->src_interp_config.weight_file_on_existing);
1254 }
1255
1256 // if the current weight reorder method differs from the previous
1257 // configuration
1258 // (use memcmp to compare frac_mask_fallback_value, because they can be nan)
1259 if (build_flag ||
1261 prev_field_config, curr_field_config)) {
1262
1264 interp = NULL;
1265 yac_interpolation_exchange_delete(interp_exch, "generate_interpolations");
1266 interp_exch = NULL;
1269
1270 // generate interpolation
1271 if (curr_field_config->use_raw_exchange) {
1273 interp_weights,
1274 curr_field_config->collection_size,
1275 curr_field_config->frac_mask_fallback_value,
1276 curr_field_config->scale_factor,
1277 curr_field_config->scale_summand,
1278 curr_field_config->yaxt_exchanger_name,
1279 &interp_exch, &interp_weights_data,
1280 is_source, is_target);
1281 } else {
1282 interp =
1284 interp_weights, curr_field_config->reorder_type,
1285 curr_field_config->collection_size,
1286 curr_field_config->frac_mask_fallback_value,
1287 curr_field_config->scale_factor,
1288 curr_field_config->scale_summand,
1289 curr_field_config->yaxt_exchanger_name,
1290 is_source, is_target);
1291 }
1292 }
1293
1294 if (curr_field_config->use_raw_exchange) {
1295
1296 struct yac_interpolation_exchange * interp_exch_copy =
1298
1299 if (is_source) {
1301 curr_field_config->src_interp_config.field,
1303 curr_field_config->src_interp_config.event_data),
1304 interp_exch_copy);
1306 }
1307
1308 if (is_target) {
1309 struct yac_interp_weights_data interp_weights_data_copy =
1312 curr_field_config->tgt_interp_config.field,
1314 curr_field_config->tgt_interp_config.event_data),
1315 interp_exch_copy, interp_weights_data_copy);
1317 }
1318
1320 interp_exch_copy, "generate_interpolations");
1321
1322 } else {
1323
1324 struct yac_interpolation * interp_copy = yac_interpolation_copy(interp);
1325
1326 if (is_source) {
1328 curr_field_config->src_interp_config.field,
1330 curr_field_config->src_interp_config.event_data),
1331 interp_copy);
1333 }
1334
1335 if (is_target) {
1337 curr_field_config->tgt_interp_config.field,
1339 curr_field_config->tgt_interp_config.event_data),
1340 interp_copy);
1342 }
1343
1344 yac_interpolation_delete(interp_copy);
1345 }
1346
1347 prev_comp_grid_pair = curr_comp_grid_pair;
1348 prev_field_config = curr_field_config;
1349 }
1350
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);
1354 }
1355
1357 yac_interpolation_exchange_delete(interp_exch, "generate_interpolations");
1359 yac_interp_weights_delete(interp_weights);
1360 yac_interp_grid_delete(interp_grid);
1361 yac_dist_grid_pair_delete(dist_grid_pair);
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));
1367 }
1368 free(field_configs);
1369}
1370
1371void yac_instance_sync_def(struct yac_instance * instance) {
1374 YAC_ASSERT(instance->comp_config,
1375 "ERROR(yac_instance_sync_def): no components have been defined");
1377 instance->couple_config, instance->comm,
1379}
1380
1382 struct yac_instance * instance, struct yac_basic_grid ** grids, size_t num_grids) {
1383 // if definitions have not yet been synced
1384 int requires_def_sync = (instance->phase == INSTANCE_DEFINITION_COMP);
1385 if (requires_def_sync)
1386 yac_instance_sync_def(instance);
1388
1389 YAC_ASSERT(
1390 instance->comp_config,
1391 "ERROR(yac_instance_setup): no components have been defined");
1392
1393 // sync again, in case a process has done additional definitions
1394 // after the yac_instance_sync_def call
1396 instance->couple_config, instance->comm,
1398
1399 // write grids to file (if enabled in coupling configuration)
1401
1403}
1404
1406 struct yac_instance * instance, struct yac_basic_grid ** grids,
1407 size_t num_grids, int emit_flags) {
1408
1410
1411 int include_definitions = 0;
1412 return
1414 instance->couple_config, emit_flags, include_definitions);
1415}
1416
1418 struct yac_instance * instance,
1419 char const ** comp_names, size_t num_comp_names) {
1421 return
1423 instance->comp_config, comp_names, num_comp_names);
1424}
1425
1432
1434 struct yac_instance * instance,
1435 const char* comp_name){
1437 return
1439 instance->comp_config, comp_name);
1440}
1441
1443 struct yac_instance * instance,
1444 const char* comp_name){
1446 return
1448 instance->comp_config, comp_name);
1449}
1450
1452
1453 struct yac_instance * instance = xmalloc(1 * sizeof(*instance));
1454
1456
1457 instance->comp_config = NULL;
1458
1459 instance->cpl_fields = NULL;
1460 instance->num_cpl_fields = 0;
1461
1462 yac_mpi_call(MPI_Comm_split(comm, 0, 0, &(instance->comm)), comm);
1463
1464 instance->phase = INSTANCE_DEFINITION;
1465
1466 return instance;
1467}
1468
1469
1471
1472 MPI_Comm dummy_comm;
1473 yac_mpi_call(MPI_Comm_split(comm, MPI_UNDEFINED, 0, &dummy_comm), comm);
1474}
1475
1476void yac_instance_delete(struct yac_instance * instance) {
1477
1478 if (instance == NULL) return;
1479
1481
1482 for (size_t i = 0; i < instance->num_cpl_fields; ++i)
1484 free(instance->cpl_fields);
1485
1487
1488 yac_mpi_call(MPI_Comm_free(&(instance->comm)), MPI_COMM_WORLD);
1489
1490 free(instance);
1491}
1492
1493MPI_Comm yac_instance_get_comm(struct yac_instance * instance) {
1494
1495 if (instance == NULL) return MPI_COMM_NULL;
1496
1497 return instance->comm;
1498}
1499
1501 struct yac_instance * instance) {
1502
1503 return instance->couple_config;
1504}
1505
1507 struct yac_instance * instance,
1508 struct yac_couple_config * couple_config) {
1509 CHECK_MAX_PHASE("yac_instance_set_couple_config", INSTANCE_DEFINITION);
1510 if (instance->couple_config == couple_config) return;
1512 instance->couple_config = couple_config;
1513}
1514
1516 struct yac_instance * instance, const char * start_datetime,
1517 const char * end_datetime ) {
1518 CHECK_MAX_PHASE("yac_instance_def_datetime", INSTANCE_DEFINITION_COMP);
1521}
1522
1524 CHECK_MIN_PHASE("yac_instance_get_start_datetime", INSTANCE_DEFINITION_COMP);
1525 return (char*)yac_couple_config_get_start_datetime(instance->couple_config);
1526}
1527
1529 CHECK_MIN_PHASE("yac_instance_get_end_datetime", INSTANCE_DEFINITION_COMP);
1530 return (char*)yac_couple_config_get_end_datetime(instance->couple_config);
1531}
1532
1534 struct yac_instance * instance,
1535 char const ** comp_names, size_t num_comps) {
1538
1539 YAC_ASSERT(
1540 !instance->comp_config,
1541 "ERROR(yac_instance_def_components): components have already been defined")
1542
1543 // add components to coupling configuration
1544 for (size_t i = 0; i < num_comps; ++i)
1545 yac_couple_config_add_component(instance->couple_config, comp_names[i]);
1546
1547 // synchronise coupling configuration
1549 instance->couple_config, instance->comm,
1551
1552 instance->comp_config =
1554 instance->couple_config, comp_names, num_comps, instance->comm);
1555}
1556
1558 struct yac_instance * instance) {
1559 return instance->phase > INSTANCE_DEFINITION_COMP;
1560}
1561
1563 struct yac_instance * instance, char const * field_name,
1564 char const * comp_name, struct yac_basic_grid * grid,
1566 int collection_size, char const * timestep) {
1569
1570 struct yac_couple_config * couple_config = instance->couple_config;
1571 char const * grid_name = yac_basic_grid_get_name(grid);
1572 if(!yac_couple_config_contains_grid_name(couple_config, grid_name))
1573 yac_couple_config_add_grid(couple_config, grid_name);
1574
1575 YAC_ASSERT(
1576 field_name, "ERROR(yac_instance_add_field): "
1577 "\"NULL\" is not a valid field name")
1578 YAC_ASSERT(
1579 strlen(field_name) <= YAC_MAX_CHARLEN,
1580 "ERROR(yac_instance_add_field): field name is too long "
1581 "(maximum is YAC_MAX_CHARLEN)")
1583 (collection_size > 0) && (collection_size < INT_MAX),
1584 "ERROR(yac_instance_add_field): \"%d\" is not a valid collection size "
1585 "(component \"%s\" grid \"%s\" field \"%s\")",
1586 collection_size, comp_name, grid_name, field_name)
1587
1588 // add field to coupling configuration
1590 couple_config, comp_name, grid_name, field_name,
1591 timestep, collection_size);
1592
1593 // check whether the field is already defined
1594 for (size_t i = 0; i < instance->num_cpl_fields; ++i) {
1595 struct coupling_field * cpl_field = instance->cpl_fields[i];
1597 strcmp(yac_get_coupling_field_name(cpl_field), field_name) ||
1598 (strcmp(
1599 yac_get_coupling_field_comp_name(cpl_field), comp_name)) ||
1601 "ERROR(yac_instance_add_field): "
1602 "field with the name \"%s\" has already been defined",
1603 field_name);
1604 }
1605
1606 struct coupling_field * cpl_field =
1608 field_name, comp_name, grid, interp_fields, num_interp_fields,
1610
1611 instance->cpl_fields =
1612 xrealloc(
1613 instance->cpl_fields,
1614 (instance->num_cpl_fields + 1) * sizeof(*(instance->cpl_fields)));
1615 instance->cpl_fields[instance->num_cpl_fields] = cpl_field;
1616 instance->num_cpl_fields++;
1617
1618 return cpl_field;
1619}
1620
1622 struct yac_instance * instance,
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,
1626 struct yac_interp_stack_config * interp_stack_config, int src_lag, int tgt_lag,
1627 const char* weight_file_name, int weight_file_on_existing,
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,
1631 char const * yaxt_exchanger_name, int use_raw_exchange) {
1632
1635
1637 instance->couple_config, src_comp_name, src_grid_name, src_field_name,
1638 tgt_comp_name, tgt_grid_name, tgt_field_name, coupling_period,
1639 time_reduction, interp_stack_config, src_lag, tgt_lag, weight_file_name,
1640 weight_file_on_existing, mapping_on_source, scale_factor, scale_summand,
1641 num_src_mask_names, src_mask_names, tgt_mask_name,
1642 yaxt_exchanger_name, use_raw_exchange);
1643}
1644
1646 const char * comp_name, const char* grid_name, const char * field_name){
1647 CHECK_MIN_PHASE("yac_instance_get_field", INSTANCE_DEFINITION_COMP);
1648 return get_coupling_field(comp_name, field_name,
1649 grid_name, instance->num_cpl_fields, instance->cpl_fields);
1650}
char const * grid_names[]
unsigned num_fields
unsigned grid_idx[3]
#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)
Definition basic_grid.c:177
void yac_basic_grid_to_file_parallel(struct yac_basic_grid *grid, char const *filename, MPI_Comm comm)
Definition basic_grid.c:768
char const * yac_basic_grid_get_name(struct yac_basic_grid *grid)
Definition basic_grid.c:128
struct yac_basic_grid * yac_basic_grid_empty_new(char const *name)
Definition basic_grid.c:63
void yac_basic_grid_delete(struct yac_basic_grid *grid)
Definition basic_grid.c:70
int yac_component_config_comp_size(struct yac_component_config *comp_config, char const *comp_name)
Definition component.c:271
int yac_component_config_comp_rank(struct yac_component_config *comp_config, char const *comp_name)
Definition component.c:281
void yac_component_config_delete(struct yac_component_config *comp_config)
Definition component.c:291
MPI_Comm yac_component_config_get_comps_comm(struct yac_component_config *comp_config, const char **names, size_t num_names)
Definition component.c:142
struct yac_component_config * yac_component_config_new(struct yac_couple_config *couple_config, char const **names, size_t num_names, MPI_Comm comm_)
Definition component.c:38
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)
yac_reduction_type
@ TIME_NONE
void yac_dist_grid_pair_delete(struct yac_dist_grid_pair *grid_pair)
Definition dist_grid.c:2313
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)
Definition dist_grid.c:2061
struct event * yac_event_new()
Definition event.c:36
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)
Definition event.c:55
void yac_set_coupling_field_put_op(struct coupling_field *field, struct event *event, struct yac_interpolation *interpolation)
Definition fields.c:666
void yac_set_coupling_field_get_op(struct coupling_field *field, struct event *event, struct yac_interpolation *interpolation)
Definition fields.c:703
char const * yac_get_coupling_field_comp_name(struct coupling_field *field)
Definition fields.c:126
struct yac_basic_grid * yac_coupling_field_get_basic_grid(struct coupling_field *field)
Definition fields.c:120
size_t yac_coupling_field_get_num_interp_fields(struct coupling_field *field)
Definition fields.c:103
void yac_set_coupling_field_put_op_raw(struct coupling_field *field, struct event *event, struct yac_interpolation_exchange *interpolation_exchange)
Definition fields.c:674
struct yac_interp_field const * yac_coupling_field_get_interp_fields(struct coupling_field *cpl_field)
Definition fields.c:740
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)
Definition fields.c:61
const char * yac_get_coupling_field_name(struct coupling_field *field)
Definition fields.c:115
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)
Definition fields.c:731
void yac_coupling_field_delete(struct coupling_field *cpl_field)
Definition fields.c:763
void yac_instance_delete(struct yac_instance *instance)
Definition instance.c:1476
char * yac_instance_setup_and_emit_config(struct yac_instance *instance, struct yac_basic_grid **grids, size_t num_grids, int emit_flags)
Definition instance.c:1405
int yac_instance_get_comp_rank(struct yac_instance *instance, const char *comp_name)
Definition instance.c:1442
char * yac_instance_get_start_datetime(struct yac_instance *instance)
Definition instance.c:1523
static int compare_dist_flags(const void *a_, const void *b_)
Definition instance.c:630
char * yac_instance_get_end_datetime(struct yac_instance *instance)
Definition instance.c:1528
void yac_instance_def_datetime(struct yac_instance *instance, const char *start_datetime, const char *end_datetime)
Definition instance.c:1515
void yac_instance_setup(struct yac_instance *instance, struct yac_basic_grid **grids, size_t num_grids)
Definition instance.c:1381
void yac_instance_sync_def(struct yac_instance *instance)
Definition instance.c:1371
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)
Definition instance.c:1045
static int compare_field_config_interp_fields(struct field_config *a, struct field_config *b)
Definition instance.c:953
struct yac_instance * yac_instance_new(MPI_Comm comm)
Definition instance.c:1451
int yac_instance_get_nbr_comps(struct yac_instance *instance)
Definition instance.c:1426
int yac_instance_components_are_defined(struct yac_instance *instance)
Definition instance.c:1557
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)
Definition instance.c:1621
MPI_Comm yac_instance_get_comm(struct yac_instance *instance)
Definition instance.c:1493
static int compare_output_grids(const void *a, const void *b)
Definition instance.c:1083
static void generate_interpolations(struct yac_instance *instance, struct yac_basic_grid **grids, size_t num_grids)
Definition instance.c:1135
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)
Definition instance.c:638
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)
Definition instance.c:1562
void yac_instance_set_couple_config(struct yac_instance *instance, struct yac_couple_config *couple_config)
Definition instance.c:1506
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)
Definition instance.c:213
void yac_instance_dummy_new(MPI_Comm comm)
Definition instance.c:1470
static struct yac_basic_grid * get_basic_grid(const char *grid_name, struct yac_basic_grid **grids, size_t num_grids, int *delete_flag)
Definition instance.c:189
void yac_instance_def_components(struct yac_instance *instance, char const **comp_names, size_t num_comps)
Definition instance.c:1533
#define CHECK_MIN_PHASE(FUNC_NAME, MIN_REF_PHASE)
Definition instance.c:58
static void get_field_configuration(struct yac_instance *instance, struct field_config **field_configs_, size_t *count)
Definition instance.c:783
struct yac_couple_config * yac_instance_get_couple_config(struct yac_instance *instance)
Definition instance.c:1500
struct field_config_event_data get_event_data(struct yac_instance *instance, int couple_idx, int field_couple_idx, enum field_type field_type)
Definition instance.c:262
static int compare_comp_grid_config(const void *a, const void *b)
Definition instance.c:203
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)
Definition instance.c:318
static const char * yac_instance_phase_str[]
Definition instance.c:40
static struct event * generate_event(struct field_config_event_data event_data)
Definition instance.c:304
static int compare_field_config_interpolation_build_config(struct field_config *a, struct field_config *b)
Definition instance.c:231
#define CHECK_PHASE(FUNC_NAME, REF_PHASE, NEW_PHASE)
Definition instance.c:47
field_availability_type
Definition instance.c:32
@ TARGET_FLAG
Definition instance.c:34
@ SOURCE_TARGET_FLAG
Definition instance.c:35
@ SOURCE_FLAG
Definition instance.c:33
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)
Definition instance.c:601
static void write_grids_to_file(struct yac_instance *instance, struct yac_basic_grid **grids, size_t num_grids)
Definition instance.c:1091
#define CHECK_MAX_PHASE(FUNC_NAME, MAX_REF_PHASE)
Definition instance.c:68
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)
Definition instance.c:699
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)
Definition instance.c:437
yac_instance_phase
Definition instance.c:23
@ INSTANCE_EXCHANGE
Definition instance.c:27
@ INSTANCE_DEFINITION_COMP
Definition instance.c:25
@ INSTANCE_DEFINITION_SYNC
Definition instance.c:26
@ INSTANCE_DEFINITION
Definition instance.c:24
@ INSTANCE_UNKNOWN
Definition instance.c:28
static int compare_field_config(const void *a, const void *b)
Definition instance.c:979
int yac_instance_get_comp_size(struct yac_instance *instance, const char *comp_name)
Definition instance.c:1433
field_type
Definition instance.c:101
@ TGT
Definition instance.c:103
@ SRC
Definition instance.c:102
MPI_Comm yac_instance_get_comps_comm(struct yac_instance *instance, char const **comp_names, size_t num_comp_names)
Definition instance.c:1417
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)
Definition instance.c:560
static struct yac_interp_weights * generate_interp_weights(struct src_field_config src_interp_config, struct yac_interp_grid *interp_grid)
Definition instance.c:1030
struct coupling_field * yac_instance_get_field(struct yac_instance *instance, const char *comp_name, const char *grid_name, const char *field_name)
Definition instance.c:1645
static int compare_interp_field(struct yac_interp_field *a, struct yac_interp_field *b)
Definition instance.c:940
#define YAC_INSTANCE_CONFIG_OUTPUT_REF_ENDDEF
Definition instance.h:15
#define YAC_INSTANCE_CONFIG_OUTPUT_REF_COMP
Definition instance.h:13
#define YAC_INSTANCE_CONFIG_OUTPUT_REF_SYNC
Definition instance.h:14
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)
Definition interp_grid.c:31
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)
yac_location
Definition location.h:12
@ YAC_LOC_UNDEFINED
Definition location.h:17
#define xrealloc(ptr, size)
Definition ppm_xfuncs.h:67
#define xcalloc(nmemb, size)
Definition ppm_xfuncs.h:64
#define xmalloc(size)
Definition ppm_xfuncs.h:66
const char * comp_name
Definition instance.c:108
const char * grid_name
Definition instance.c:107
struct comp_grid_config config[2]
Definition instance.c:112
int use_raw_exchange
Definition fields.c:44
struct yac_basic_grid * grid
Definition fields.c:22
struct yac_interp_field * interp_fields
Definition fields.c:24
size_t num_interp_fields
Definition fields.c:25
char * timestep
Definition fields.c:27
char * component_name
Definition fields.c:20
size_t idx
Definition instance.c:186
size_t count
Definition instance.c:185
uint64_t * data
Definition instance.c:184
Definition event.c:18
char const * end_datetime
Definition instance.c:121
char const * start_datetime
Definition instance.c:120
enum yac_reduction_type reduction_operation
Definition instance.c:119
char const * timestep
Definition instance.c:116
char const * coupling_period
Definition instance.c:117
double scale_summand
Definition instance.c:168
char const * yaxt_exchanger_name
Definition instance.c:170
double scale_factor
Definition instance.c:168
struct comp_grid_pair_config comp_grid_pair
Definition instance.c:158
enum yac_interp_weights_reorder_type reorder_type
Definition instance.c:164
struct tgt_field_config tgt_interp_config
Definition instance.c:162
int use_raw_exchange
Definition instance.c:172
size_t collection_size
Definition instance.c:174
struct src_field_config src_interp_config
Definition instance.c:161
double frac_mask_fallback_value
Definition instance.c:166
int src_comp_idx
Definition instance.c:159
char const * filename
Definition instance.c:179
struct yac_basic_grid * grid
Definition instance.c:180
char const * grid_name
Definition instance.c:178
const char * weight_file_name
Definition instance.c:138
enum yac_weight_file_on_existing weight_file_on_existing
Definition instance.c:139
size_t num_interp_fields
Definition instance.c:135
struct field_config_event_data event_data
Definition instance.c:140
struct yac_interp_stack_config * interp_stack
Definition instance.c:137
struct coupling_field * field
Definition instance.c:131
char const * name
Definition instance.c:132
struct yac_interp_field * interp_fields
Definition instance.c:134
struct field_config_event_data event_data
Definition instance.c:151
char const * name
Definition instance.c:147
struct coupling_field * field
Definition instance.c:146
struct yac_interp_field * interp_field
Definition instance.c:149
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.
Definition instance.c:89
enum yac_instance_phase phase
Current phase of this YAC instance.
Definition instance.c:98
MPI_Comm comm
MPI communicator that contains the processes of this YAC instance.
Definition instance.c:95
struct yac_component_config * comp_config
Component configuration data of this YAC instance.
Definition instance.c:86
size_t num_cpl_fields
Number of elements in coupling_field ** cpl_fields.
Definition instance.c:92
struct yac_couple_config * couple_config
Coupling configuration data of this YAC instance.
Definition instance.c:83
enum yac_location location
Definition basic_grid.h:15
size_t coordinates_idx
Definition basic_grid.h:16
int collection_size
struct @84 field[]
double * data
char const * weight_file_name
char const src_grid_name[]
char const tgt_grid_name[]
int const * location
int id
Definition toy_scrip.c:115
size_t num_grids
Definition yac.c:146
struct yac_basic_grid ** grids
Definition yac.c:145
#define YAC_MAX_CHARLEN
Definition yac.h:95
#define YAC_ASSERT_F(exp, format,...)
Definition yac_assert.h:19
#define yac_mpi_call(call, comm)