YAC 3.17.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 <limits.h>
10#include <stdlib.h>
11#include <stdio.h>
12#include <string.h>
13
14#include <mpi.h>
15
16#include "utils_core.h"
17#include "yac.h"
18#include "instance.h"
19#include "event.h"
20#include "yac_mpi_common.h"
21#include "fields.h"
22#include "component.h"
23#include "config_yaml.h"
27
29 INSTANCE_DEFINITION = 0, // after yac_cinit
30 INSTANCE_DEFINITION_COMP = 1, // after yac_cdef_comp
31 INSTANCE_DEFINITION_SYNC = 2, // after yac_csync_def
32 INSTANCE_EXCHANGE = 3, // after yac_cenddef
34};
35
36// bit mask values to determine which field is available
38 SOURCE_FLAG = 1 << 0, // first bit (source is available)
39 TARGET_FLAG = 1 << 1, // second bit (target is available)
40 SOURCE_TARGET_FLAG = (1 << 0) | (1 << 1), // first two bits
41 // (both source and target are
42 // available)
43};
44
45static const char * yac_instance_phase_str[] =
46 {"definition phase",
47 "definition phase (after component definition)",
48 "definition phase (after synchronisation)",
49 "exchange phase",
50 "unknown phase"};
51
52#define CHECK_PHASE(FUNC_NAME, REF_PHASE, NEW_PHASE) \
53 { \
54 enum yac_instance_phase ref_phase_ = (REF_PHASE); \
55 YAC_ASSERT_F( \
56 instance->phase == (ref_phase_), \
57 "ERROR(%s): Invalid phase " \
58 "(current phase: \"%s\" expected phase: \"%s\")", \
59 #FUNC_NAME, yac_instance_phase_str[instance->phase], \
60 yac_instance_phase_str[(ref_phase_)]); \
61 instance->phase = (NEW_PHASE); \
62 }
63#define CHECK_MIN_PHASE(FUNC_NAME, MIN_REF_PHASE) \
64 { \
65 enum yac_instance_phase ref_min_phase_ = (MIN_REF_PHASE); \
66 YAC_ASSERT_F( \
67 instance->phase >= (ref_min_phase_), \
68 "ERROR(%s): Invalid phase " \
69 "(current phase: \"%s\" minimum expected phase: \"%s\")", \
70 #FUNC_NAME, yac_instance_phase_str[instance->phase], \
71 yac_instance_phase_str[(ref_min_phase_)]); \
72 }
73#define CHECK_MAX_PHASE(FUNC_NAME, MAX_REF_PHASE) \
74 { \
75 enum yac_instance_phase ref_max_phase_ = (MAX_REF_PHASE); \
76 YAC_ASSERT_F( \
77 instance->phase <= (ref_max_phase_), \
78 "ERROR(%s): Invalid phase " \
79 "(current phase: \"%s\" maximum expected phase: \"%s\")", \
80 #FUNC_NAME, \
81 yac_instance_phase_str[ \
82 MIN(instance->phase,INSTANCE_UNKNOWN)], \
83 yac_instance_phase_str[(ref_max_phase_)]); \
84 }
85
105
107 SRC = 1,
108 TGT = 2
110
112 const char * grid_name;
113 const char * comp_name;
114};
115
119
128 {.timestep = NULL,
129 .coupling_period = NULL,
130 .timelag = 0,
131 .reduction_operation = TIME_NONE,
132 .start_datetime = NULL,
133 .end_datetime = NULL};
134
149
160
173
175 char const * grid_name;
176 char const * filename;
178};
179
180struct dist_flag {
181 uint64_t * data;
182 size_t count;
183 size_t idx;
184};
185
187 const char * grid_name, struct yac_basic_grid ** grids, size_t num_grids,
188 int * delete_flag) {
189
190 struct yac_basic_grid * grid = NULL;
191 for (size_t i = 0; (i < num_grids) && (grid == NULL); ++i)
192 if (!strcmp(grid_name, yac_basic_grid_get_name(grids[i])))
193 grid = grids[i];
194
195 *delete_flag = grid == NULL;
196 return (grid == NULL)?yac_basic_grid_empty_new(grid_name):grid;
197}
198
199static
200int compare_comp_grid_config(const void * a, const void * b) {
201
202 struct comp_grid_config * a_ = (struct comp_grid_config *)a,
203 * b_ = (struct comp_grid_config *)b;
204
205 int ret = 0;
206 if (!ret) ret = strcmp(a_->comp_name, b_->comp_name);
207 if (!ret) ret = strcmp(a_->grid_name, b_->grid_name);
208 return ret;
209}
210
212 char const * component_name, const char * field_name,
213 const char * grid_name, size_t num_fields,
214 struct coupling_field ** coupling_fields) {
215
216 for (size_t i = 0; i < num_fields; ++i) {
217 struct coupling_field * curr_field = coupling_fields[i];
218 if (!strcmp(component_name, yac_get_coupling_field_comp_name(curr_field)) &&
219 !strcmp(field_name, yac_get_coupling_field_name(curr_field)) &&
220 !strcmp(grid_name,
223 return curr_field;
224 }
225
226 return NULL;
227}
228
230 struct field_config * a, struct field_config * b) {
231
232 int ret = 0;
233
234 if (!ret)
237 if (!ret)
238 ret = (a->use_raw_exchange > b->use_raw_exchange) -
240 if (!ret)
243 if (!ret)
246
247 return ret;
248}
249
251 struct yac_instance * instance, int couple_idx, int field_couple_idx,
252 enum field_type field_type) {
253
254 struct yac_couple_config * couple_config = instance->couple_config;
255
256 enum yac_reduction_type reduction_operation =
258 couple_config, couple_idx, field_couple_idx);
259
260 char const * coupling_period =
262 couple_config, couple_idx, field_couple_idx);
263 char const * timestep;
264 int timelag;
265 if ( field_type == SRC ){
266 timestep =
268 couple_config, couple_idx, field_couple_idx);
269 timelag =
271 couple_config, couple_idx, field_couple_idx);
272 }else{
273 reduction_operation = TIME_NONE;
274 timestep =
276 couple_config, couple_idx, field_couple_idx);
277 timelag =
279 couple_config, couple_idx, field_couple_idx);
280 }
281
282 return
284 {.timestep = timestep,
285 .coupling_period = coupling_period,
286 .timelag = timelag,
287 .reduction_operation = reduction_operation,
288 .start_datetime = yac_couple_config_get_start_datetime(couple_config),
289 .end_datetime = yac_couple_config_get_end_datetime(couple_config)};
290}
291
292static struct event * generate_event(
293 struct field_config_event_data event_data) {
294
295 struct event * event = yac_event_new();
297 event, event_data.timestep, event_data.coupling_period,
298 event_data.timelag, event_data.reduction_operation,
299 event_data.start_datetime, event_data.end_datetime);
300 return event;
301}
302
303
304// checks for all coupling configurations whether the associated source and
305// target field is available on any process
307 struct yac_couple_config * couple_config, MPI_Comm comm,
308 struct coupling_field ** coupling_fields, size_t num_fields) {
309
310 size_t num_couples = yac_couple_config_get_num_couples(couple_config);
311 size_t total_num_fields = 0;
312 for (size_t couple_idx = 0; couple_idx < num_couples; ++couple_idx)
313 total_num_fields +=
314 yac_couple_config_get_num_couple_fields(couple_config, couple_idx);
315
316 int * is_valid_field_configuration =
317 xcalloc(total_num_fields, sizeof(*is_valid_field_configuration));
318
319 // for all coupling configurations
320 for (size_t couple_idx = 0, i = 0; couple_idx < num_couples;
321 ++couple_idx) {
322
323 // for all field configuration of the current coupling configuration
324 size_t curr_num_fields =
325 yac_couple_config_get_num_couple_fields(couple_config, couple_idx);
326 for (size_t field_couple_idx = 0; field_couple_idx < curr_num_fields;
327 ++field_couple_idx, ++i) {
328
329 // get component, grid, and field names for the current
330 // field configuration
331 char const * src_component_name;
332 char const * tgt_component_name;
333 char const * src_grid_name;
334 char const * tgt_grid_name;
335 const char * src_field_name;
336 const char * tgt_field_name;
338 couple_config, couple_idx, field_couple_idx,
339 &src_component_name, &tgt_component_name);
341 couple_config, couple_idx, field_couple_idx,
344 couple_config, couple_idx, field_couple_idx,
345 &src_field_name, &tgt_field_name);
346
347 // check availability of respective source and target fields
349 src_component_name, src_field_name, src_grid_name,
350 num_fields, coupling_fields) != NULL)
351 is_valid_field_configuration[i] |= SOURCE_FLAG;
353 tgt_component_name, tgt_field_name, tgt_grid_name,
354 num_fields, coupling_fields) != NULL)
355 is_valid_field_configuration[i] |= TARGET_FLAG;
356 }
357 }
358
359 // check availability of source and target fields across all processes
360 // (using "bit-wise or" reduction operation)
362 MPI_Allreduce(
363 MPI_IN_PLACE, is_valid_field_configuration, total_num_fields,
364 MPI_INT, MPI_BOR, comm), comm);
365
366 int comm_rank;
367 yac_mpi_call(MPI_Comm_rank(comm, &comm_rank), comm);
368 int const is_root = comm_rank == 0;
369
370 // check for missing fields print warning or abort
371 // (depending on configuration of missing_definition_is_fatal)
372 int missing_definition_is_fatal =
374 for (size_t couple_idx = 0, i = 0; couple_idx < num_couples;
375 ++couple_idx) {
376 size_t curr_num_fields =
377 yac_couple_config_get_num_couple_fields(couple_config, couple_idx);
378 for (size_t field_couple_idx = 0; field_couple_idx < curr_num_fields;
379 ++field_couple_idx, ++i) {
380 if ((is_valid_field_configuration[i] != SOURCE_TARGET_FLAG) &&
381 is_root) {
382 char const * src_component_name;
383 char const * tgt_component_name;
384 char const * src_grid_name;
385 char const * tgt_grid_name;
386 const char * src_field_name;
387 const char * tgt_field_name;
389 couple_config, couple_idx, field_couple_idx,
390 &src_component_name, &tgt_component_name);
392 couple_config, couple_idx, field_couple_idx,
395 couple_config, couple_idx, field_couple_idx,
396 &src_field_name, &tgt_field_name);
397 fprintf(stderr, "%s: couple defined for field: \n"
398 " source (%s):\n"
399 " component name: \"%s\"\n"
400 " grid name: \"%s\"\n"
401 " field name: \"%s\"\n"
402 " target(%s):\n"
403 " component name: \"%s\"\n"
404 " grid name: \"%s\"\n"
405 " field name: \"%s\"\n",
406 missing_definition_is_fatal?"ERROR":"WARNING",
407 (is_valid_field_configuration[i] & SOURCE_FLAG)?
408 "defined":"not defined",
409 src_component_name, src_grid_name, src_field_name,
410 (is_valid_field_configuration[i] & TARGET_FLAG)?
411 "defined":"not defined",
412 tgt_component_name, tgt_grid_name, tgt_field_name);
414 !missing_definition_is_fatal,
415 "ERROR(get_field_configuration): missing definition")
416 }
417 is_valid_field_configuration[i] =
418 (SOURCE_TARGET_FLAG == is_valid_field_configuration[i]);
419 }
420 }
421
422 return is_valid_field_configuration;
423}
424
426 struct coupling_field * field, char const * const * mask_names,
427 size_t num_mask_names, struct yac_interp_field ** interp_fields,
428 size_t * num_fields, MPI_Comm comm) {
429
430 struct yac_interp_field * interp_fields_;
431 size_t num_fields_;
432
433 if (field != NULL) {
434
435 num_fields_ = yac_coupling_field_get_num_interp_fields(field);
436
438 (num_mask_names == 0) || (num_fields_ == num_mask_names),
439 "ERROR(get_interp_fields_from_coupling_field): "
440 "missmatch in number of interpolation fields of coupling field \"%s\" "
441 "and number of provided mask names (%zu != %zu)",
442 yac_get_coupling_field_name(field), num_fields_, num_mask_names)
443
444 uint64_t local_counts[2] =
445 {(uint64_t)num_fields_, (uint64_t)num_mask_names};
446 uint64_t global_counts[2];
447
449 MPI_Allreduce(
450 local_counts, global_counts, 2, MPI_UINT64_T, MPI_MAX, comm), comm);
451
453 local_counts[0] == global_counts[0],
454 "ERROR(get_interp_fields_from_coupling_field): missmatch in number of"
455 "local interpolation fields for coupling field \"%s\" and global "
456 "(%zu != %zu)",
457 yac_get_coupling_field_name(field), num_fields_, (size_t)(global_counts[0]))
458
460 (num_mask_names != 0) || (global_counts[1] == 0),
461 "ERROR(get_interp_fields_from_coupling_field): local process did "
462 "not provide mask names for coupling field \"%s\" while others did",
464
465 // make a copy of the interpolation fields of the coupling field
466 interp_fields_ = xmalloc(num_fields_ * sizeof(*interp_fields_));
467 memcpy(
468 interp_fields_, yac_coupling_field_get_interp_fields(field),
469 num_fields_ * sizeof(*interp_fields_));
470
471 // if mask names are provided, overwrite already existing masks
473 for (size_t i = 0; i < num_mask_names; ++i) {
474 char const * mask_name = mask_names[i];
476 mask_name != NULL,
477 "ERROR(get_interp_fields_from_coupling_field): "
478 "make_names[%zu] is NULL", i);
479 interp_fields_[i].masks_idx =
481 grid, interp_fields_[i].location, mask_name);
482 }
483
484 uint64_t (*data)[3] = xmalloc(num_fields_ * sizeof(*data));
485
486 for (size_t i = 0; i < num_fields_; ++i) {
487 data[i][0] = (uint64_t)interp_fields_[i].location;
488 data[i][1] = (uint64_t)interp_fields_[i].coordinates_idx;
489 data[i][2] = (uint64_t)interp_fields_[i].masks_idx;
490 }
491
493 MPI_Allreduce(
494 MPI_IN_PLACE, data, 3 * (int)num_fields_,
495 MPI_UINT64_T, MPI_MIN, comm), comm);
496
497 for (size_t i = 0; i < num_fields_; ++i) {
499 data[i][0] == (uint64_t)(interp_fields_[i].location),
500 "ERROR(get_interp_fields_from_coupling_field): location mismatch")
502 data[i][1] == (uint64_t)(interp_fields_[i].coordinates_idx),
503 "ERROR(get_interp_fields_from_coupling_field): "
504 "coordinates index mismatch")
506 data[i][2] == (uint64_t)(interp_fields_[i].masks_idx),
507 "ERROR(get_interp_fields_from_coupling_field): "
508 "masks index mismatch")
509 }
510
511 free(data);
512
513 } else {
514
515 uint64_t zero_counts[2] = {0,0};
516 uint64_t counts[2];
517
519 MPI_Allreduce(
520 zero_counts, counts, 2,
521 MPI_UINT64_T, MPI_MAX, comm), comm);
522
523 num_fields_ = (size_t)(counts[0]);
524 interp_fields_ = xmalloc(num_fields_ * sizeof(*interp_fields_));
525
526 uint64_t (*data)[3] = xmalloc(num_fields_ * sizeof(*data));
527
528 for (size_t i = 0; i < num_fields_; ++i) {
529 data[i][0] = (uint64_t)YAC_LOC_UNDEFINED;
530 data[i][1] = (uint64_t)UINT64_MAX;
531 data[i][2] = (uint64_t)UINT64_MAX;
532 }
533
535 MPI_Allreduce(
536 MPI_IN_PLACE, data, 3 * (int)num_fields_,
537 MPI_UINT64_T, MPI_MIN, comm), comm);
538
539 for (size_t i = 0; i < num_fields_; ++i) {
540 interp_fields_[i].location = (enum yac_location)data[i][0];
541 interp_fields_[i].coordinates_idx = (size_t)data[i][1];
542 interp_fields_[i].masks_idx = (size_t)data[i][2];
543 }
544
545 free(data);
546 }
547
548 *interp_fields = interp_fields_;
549 *num_fields = num_fields_;
550}
551
553 struct yac_couple_config * couple_config,
554 size_t couple_idx, size_t field_couple_idx,
555 struct coupling_field * field, MPI_Comm comm) {
556
557 char const * const * src_mask_names;
558 size_t num_src_mask_names;
560 couple_config, couple_idx, field_couple_idx,
561 &src_mask_names, &num_src_mask_names);
562
563 struct yac_interp_field * interp_fields;
564 size_t num_interp_fields;
566 field, src_mask_names, num_src_mask_names,
567 &interp_fields, &num_interp_fields, comm);
568
569 return
570 (struct src_field_config) {
571 .field = field,
572 .name = NULL,
573 .interp_fields = interp_fields,
574 .num_interp_fields = num_interp_fields,
575 .interp_stack =
577 couple_config, couple_idx, field_couple_idx),
578 .weight_file_name =
580 couple_config, couple_idx, field_couple_idx))?
582 couple_config, couple_idx, field_couple_idx):NULL,
583 .weight_file_on_existing =
585 couple_config, couple_idx, field_couple_idx))?
587 couple_config, couple_idx, field_couple_idx):
589 .event_data = empty_event_data,
590 };
591}
592
594 struct yac_couple_config * couple_config,
595 size_t couple_idx, size_t field_couple_idx,
596 struct coupling_field * field, MPI_Comm comm) {
597
598 char const * mask_name =
600 couple_config, couple_idx, field_couple_idx);
601
602 struct yac_interp_field * interp_field;
603 size_t num_interp_field;
605 field, &mask_name, mask_name != NULL,
606 &interp_field, &num_interp_field, comm);
607
609 num_interp_field == 1,
610 "ERROR(get_tgt_interp_config): "
611 "only one point set per target field supported")
612
613 return
614 (struct tgt_field_config) {
615 .field = field,
616 .name = NULL,
617 .interp_field = interp_field,
618 .event_data = empty_event_data,
619 };
620}
621
622static int compare_dist_flags(const void * a_, const void * b_) {
623
624 struct dist_flag const * a = a_;
625 struct dist_flag const * b = b_;
626
627 return memcmp(a->data, b->data, a->count * sizeof(a->data[0]));
628}
629
631 uint64_t * local_flags, size_t flag_count,
632 uint64_t * global_flags_buffer, struct dist_flag * dist_flags,
633 int * dist_flag_ids, MPI_Comm comm) {
634
635 int comm_size;
636 yac_mpi_call(MPI_Comm_size(comm, &comm_size), comm);
637
638 // number of 64-bit blocks required to store all flags
639 size_t flags_num_blocks = (flag_count + 63) / 64;
640 // number of 64-bit blocks required to store the value of all ranks for
641 // one flag
642 size_t ranks_num_blocks = (size_t)((comm_size + 63) / 64);
643
644 // all-gather the flags from all ranks
646 MPI_Allgather(
647 local_flags, (int)flags_num_blocks, MPI_UINT64_T,
648 global_flags_buffer, (int)flags_num_blocks, MPI_UINT64_T,
649 comm), comm);
650
651 // initialise per-flag storage of all data
652 for (size_t flag_idx = 0; flag_idx < flag_count; ++flag_idx) {
653 memset(
654 dist_flags[flag_idx].data, 0,
655 ranks_num_blocks * sizeof(dist_flags[flag_idx].data[0]));
656 dist_flags[flag_idx].idx = flag_idx;
657 dist_flags[flag_idx].count = ranks_num_blocks;
658 }
659
660 // converte from storing flags on per-rank basis to per-flag
661 for (int rank = 0; rank < comm_size; ++rank) {
662
663 // get flags for current rank
664 uint64_t * rank_flags =
665 global_flags_buffer + (size_t)rank * flags_num_blocks;
666
667 size_t rank_block_idx = rank / 64;
668 uint64_t rank_flag_mask = ((uint64_t)1) << (rank % 64);
669
670 for (size_t flag_idx = 0; flag_idx < flag_count; ++flag_idx)
671 if (rank_flags[flag_idx/64] & (((uint64_t)1) << (flag_idx % 64)))
672 dist_flags[flag_idx].data[rank_block_idx] |= rank_flag_mask;
673 }
674
675 // sort flags based on availability of on all ranks
676 qsort(dist_flags, flag_count, sizeof(*dist_flags), compare_dist_flags);
677
678 // determine unique configurations
679 int id = 0;
680 struct dist_flag * prev_dist_flag = dist_flags;
681 for (size_t flag_idx = 0; flag_idx < flag_count; ++flag_idx) {
682
683 struct dist_flag * curr_dist_flag = dist_flags + flag_idx;
684 if (compare_dist_flags(prev_dist_flag, curr_dist_flag)) ++id;
685
686 dist_flag_ids[curr_dist_flag->idx] = id;
687 prev_dist_flag = curr_dist_flag;
688 }
689}
690
692 struct field_config * field_configs, size_t num_fields,
693 MPI_Comm comm) {
694
695 int comm_size;
696 yac_mpi_call(MPI_Comm_size(comm, &comm_size), comm);
697
698 // number of 64-bit blocks required to store the flags of all fields
699 size_t flags_num_blocks = (num_fields + 63) / 64;
700 // number of 64-bit blocks required to store the flags of all ranks for
701 // one field
702 size_t ranks_num_blocks = (size_t)((comm_size + 63) / 64);
703
704 // flags for storing the availability of source/target fields of the local
705 // process
706 uint64_t * field_is_available_flags =
707 xmalloc(flags_num_blocks * sizeof(*field_is_available_flags));
708
709 // flags for storing the availability of source/target fields af all processes
710 // (per rank)
711 uint64_t * all_field_is_available_flags =
712 xmalloc(
713 (size_t)comm_size * flags_num_blocks * sizeof(*all_field_is_available_flags));
714
715 // flags for storing the availability of source/target fields af all processes
716 // (per field)
717 struct dist_flag * dist_flags = xmalloc(num_fields * sizeof(*dist_flags));
718 uint64_t * dist_flags_data_buffer =
719 xmalloc(num_fields * ranks_num_blocks * sizeof(*dist_flags_data_buffer));
720 for (size_t i = 0; i < num_fields; ++i) {
721 dist_flags[i].data = dist_flags_data_buffer + i * ranks_num_blocks;
722 }
723
724 // individual ids for all flag configurations
725 int * field_avail_config_ids =
726 xmalloc(num_fields * sizeof(*field_avail_config_ids));
727
728 { // source field availability
729
730 // determine available of a field on the local process
731 memset(
732 field_is_available_flags, 0,
733 flags_num_blocks * sizeof(*field_is_available_flags));
734 for (size_t field_idx = 0; field_idx < num_fields; ++field_idx)
735 if (field_configs[field_idx].src_interp_config.field != NULL)
736 field_is_available_flags[field_idx/64] |=
737 (((uint64_t)1) << (field_idx % 64));
738
740 field_is_available_flags, num_fields, all_field_is_available_flags,
741 dist_flags, field_avail_config_ids, comm);
742
743 for (size_t field_idx = 0; field_idx < num_fields; ++field_idx)
744 field_configs[field_idx].src_interp_config.avail_config_id =
745 field_avail_config_ids[field_idx];
746 }
747
748 { // target field availability
749
750 // determine available of a field on the local process
751 memset(
752 field_is_available_flags, 0,
753 flags_num_blocks * sizeof(*field_is_available_flags));
754 for (size_t field_idx = 0; field_idx < num_fields; ++field_idx)
755 if (field_configs[field_idx].tgt_interp_config.field != NULL)
756 field_is_available_flags[field_idx/64] |=
757 (((uint64_t)1) << (field_idx % 64));
758
760 field_is_available_flags, num_fields, all_field_is_available_flags,
761 dist_flags, field_avail_config_ids, comm);
762
763 for (size_t field_idx = 0; field_idx < num_fields; ++field_idx)
764 field_configs[field_idx].tgt_interp_config.avail_config_id =
765 field_avail_config_ids[field_idx];
766 }
767
768 free(field_avail_config_ids);
769 free(dist_flags_data_buffer);
770 free(dist_flags);
771 free(all_field_is_available_flags);
772 free(field_is_available_flags);
773}
774
776 struct yac_instance * instance,
777 struct field_config ** field_configs_, size_t * count) {
778
779 struct yac_couple_config * couple_config = instance->couple_config;
780 MPI_Comm comm = instance->comm;
781 size_t num_fields = instance->num_cpl_fields;
782 struct coupling_field ** coupling_fields = instance->cpl_fields;
783
784 size_t num_couples = yac_couple_config_get_num_couples(couple_config);
785
786 // determines for which coupling configurations the source and target fields
787 // are available
788 int * is_valid_field_configuration =
790 couple_config, comm, coupling_fields, num_fields);
791
792 size_t total_num_fields = 0;
793 for (size_t couple_idx = 0, i = 0; couple_idx < num_couples; ++couple_idx) {
794 size_t curr_num_fields =
795 yac_couple_config_get_num_couple_fields(couple_config, couple_idx);
796 for (size_t field_couple_idx = 0; field_couple_idx < curr_num_fields;
797 ++field_couple_idx, ++i)
798 if (is_valid_field_configuration[i]) ++total_num_fields;
799 }
800
801 // get all field coupling configurations
802 // * due to the synchronisation of couple_config beforehand the ordering
803 // of the field coupling configurations on all processes is identical
804 // * all information extracted from the coupling configuration is identical
805 // on all processes
806 // * only valid configurations (source and target field are defined somewhere)
807 size_t field_config_idx = 0;
808 struct field_config * field_configs =
809 xmalloc(total_num_fields * sizeof(*field_configs));
810 for (size_t couple_idx = 0, i = 0; couple_idx < num_couples; ++couple_idx) {
811
812 size_t curr_num_fields =
813 yac_couple_config_get_num_couple_fields(couple_config, couple_idx);
814
815 for (size_t field_couple_idx = 0; field_couple_idx < curr_num_fields;
816 ++field_couple_idx, ++i) {
817
818 if (!is_valid_field_configuration[i]) continue;
819
820 struct comp_grid_config src_config, tgt_config;
821
823 couple_config, couple_idx, field_couple_idx,
824 &(src_config.comp_name), &(tgt_config.comp_name));
825
827 couple_config, couple_idx, field_couple_idx,
828 &(src_config.grid_name), &(tgt_config.grid_name));
829
830 int src_comp_idx =
831 compare_comp_grid_config(&src_config, &tgt_config) > 0;
832
833 const char * src_field_name;
834 const char * tgt_field_name;
836 couple_config, couple_idx, field_couple_idx,
837 &src_field_name, &tgt_field_name);
838 struct coupling_field * src_field =
840 src_config.comp_name, src_field_name, src_config.grid_name,
841 num_fields, coupling_fields);
842 struct coupling_field * tgt_field =
844 tgt_config.comp_name, tgt_field_name, tgt_config.grid_name,
845 num_fields, coupling_fields);
846
847 int use_raw_exchange =
849 couple_config, couple_idx, field_couple_idx);
850
851 field_configs[field_config_idx].comp_grid_pair.config[src_comp_idx] =
852 src_config;
853 field_configs[field_config_idx].comp_grid_pair.config[src_comp_idx^1] =
854 tgt_config;
855 field_configs[field_config_idx].src_comp_idx = src_comp_idx;
856 field_configs[field_config_idx].src_interp_config =
858 couple_config, couple_idx, field_couple_idx, src_field, comm);
859 field_configs[field_config_idx].src_interp_config.event_data =
860 get_event_data(instance, couple_idx, field_couple_idx, SRC);
861 field_configs[field_config_idx].src_interp_config.name = src_field_name;
862 field_configs[field_config_idx].tgt_interp_config =
864 couple_config, couple_idx, field_couple_idx, tgt_field, comm);
865 field_configs[field_config_idx].tgt_interp_config.event_data =
866 get_event_data(instance, couple_idx, field_couple_idx, TGT);
867 field_configs[field_config_idx].tgt_interp_config.name = tgt_field_name;
868 field_configs[field_config_idx].interp_gen_config =
870 couple_config, couple_idx, field_couple_idx);
871 field_configs[field_config_idx].use_raw_exchange = use_raw_exchange;
872 ++field_config_idx;
873 }
874 }
875
876 // computes unique ids for availability configuration of source and target
877 // coupling fields
879 field_configs, total_num_fields, comm);
880
881 free(is_valid_field_configuration);
882
883 *field_configs_ = field_configs;
884 *count = total_num_fields;
885}
886
888 struct yac_interp_field * a, struct yac_interp_field * b) {
889
890 int ret = 0;
891 if (!ret)
892 ret = (a->location > b->location) - (a->location < b->location);
893 if (!ret)
894 ret = (a->coordinates_idx > b->coordinates_idx) -
896 if (!ret)
897 ret = (a->masks_idx > b->masks_idx) - (a->masks_idx < b->masks_idx);
898 return ret;
899}
900
902 struct field_config * a, struct field_config * b) {
903
904 int ret = 0;
905 if (!ret)
906 ret = strcmp(a->comp_grid_pair.config[a->src_comp_idx].grid_name,
908 if (!ret)
909 ret = strcmp(a->comp_grid_pair.config[a->src_comp_idx^1].grid_name,
911 if (!ret)
912 ret =
917 for (size_t i = 0; (i < a->src_interp_config.num_interp_fields) && !ret;
918 ++i)
922 if (!ret)
925 return ret;
926}
927
928static
929int compare_field_config(const void * a, const void * b) {
930
931 struct field_config * a_ = (struct field_config *)a,
932 * b_ = (struct field_config *)b;
933
934 int ret = 0;
935 if (!ret)
936 ret = strcmp(a_->comp_grid_pair.config[0].grid_name,
937 b_->comp_grid_pair.config[0].grid_name);
938 if (!ret)
939 ret = strcmp(a_->comp_grid_pair.config[1].grid_name,
940 b_->comp_grid_pair.config[1].grid_name);
941 if (!ret)
943 if (!ret)
946 b_->src_interp_config.interp_stack);
947 if (!ret)
948 ret = (int)(a_->src_interp_config.weight_file_name == NULL) -
949 (int)(b_->src_interp_config.weight_file_name == NULL);
950 if (!ret && (a_->src_interp_config.weight_file_name != NULL))
951 ret = strcmp(a_->src_interp_config.weight_file_name,
952 b_->src_interp_config.weight_file_name);
953 if (!ret && (a_->src_interp_config.weight_file_name != NULL))
955 (int)(b_->src_interp_config.weight_file_on_existing);
956 if (!ret)
958 if (!ret)
959 ret = strcmp(a_->comp_grid_pair.config[0].comp_name,
960 b_->comp_grid_pair.config[0].comp_name);
961 if (!ret)
962 ret = strcmp(a_->comp_grid_pair.config[1].comp_name,
963 b_->comp_grid_pair.config[1].comp_name);
964 if (!ret)
965 ret = strcmp(a_->src_interp_config.name,
966 b_->src_interp_config.name);
967 if (!ret)
968 ret = strcmp(a_->tgt_interp_config.name,
969 b_->tgt_interp_config.name);
971 ret, "ERROR(compare_field_config): "
972 "duplicated coupling field configuration detected:\n"
973 "\tcomponent name: \n"
974 "\t source:\"%s\"\n"
975 "\t target:\"%s\"\n"
976 "\t grid name:\n"
977 "\t source:\"%s\"\n"
978 "\t target:\"%s\"\n"
979 "\t field name:\n"
980 "\t source:\"%s\"\n"
981 "\t target:\"%s\"\n",
988
989 return ret;
990}
991
993 struct src_field_config src_interp_config,
994 struct yac_interp_grid * interp_grid) {
995
996 struct interp_method ** method_stack =
998 struct yac_interp_weights * weights =
999 yac_interp_method_do_search(method_stack, interp_grid);
1000
1001 yac_interp_method_delete(method_stack);
1002 free(method_stack);
1003
1004 return weights;
1005}
1006
1008 struct yac_instance * instance, struct yac_basic_grid ** local_grids,
1009 size_t num_local_grids, struct output_grid ** output_grids,
1010 size_t * output_grid_count) {
1011
1012 struct yac_couple_config * couple_config = instance->couple_config;
1013
1014 // count number of output grids
1015 size_t num_grids = yac_couple_config_get_num_grids(couple_config);
1016 *output_grid_count = 0;
1017 for (size_t grid_idx = 0; grid_idx < num_grids; ++grid_idx)
1019 couple_config,
1020 yac_couple_config_get_grid_name(couple_config, grid_idx)) != NULL)
1021 ++*output_grid_count;
1022
1023 *output_grids = xmalloc(*output_grid_count * sizeof(**output_grids));
1024
1025 // extract output grids and check whether the respective grids are
1026 // locally available
1027 for (size_t grid_idx = 0, output_grid_idx = 0; grid_idx < num_grids; ++grid_idx) {
1028 char const * grid_name =
1030 char const * filename =
1031 yac_couple_config_get_grid_output_filename(couple_config, grid_name);
1032 if (filename != NULL) {
1033 struct yac_basic_grid * local_grid = NULL;
1034 for (size_t i = 0; (i < num_local_grids) && (local_grid == NULL); ++i)
1035 if (!strcmp(grid_name, yac_basic_grid_get_name(local_grids[i])))
1036 local_grid = local_grids[i];
1037 (*output_grids)[output_grid_idx].grid_name = grid_name;
1038 (*output_grids)[output_grid_idx].filename = filename;
1039 (*output_grids)[output_grid_idx].grid = local_grid;
1040 ++output_grid_idx;
1041 }
1042 }
1043}
1044
1045static int compare_output_grids(const void * a, const void * b) {
1046
1047 return
1048 strcmp(
1049 ((struct output_grid*)a)->grid_name,
1050 ((struct output_grid*)b)->grid_name);
1051}
1052
1054 struct yac_instance * instance, struct yac_basic_grid ** grids, size_t num_grids) {
1055
1056 MPI_Comm comm = instance->comm;
1057
1058 // get information about all grids that have to be written to file
1059 struct output_grid * output_grids;
1060 size_t output_grid_count;
1062 instance, grids, num_grids, &output_grids, &output_grid_count);
1063
1064 // sort output grids
1065 qsort(
1066 output_grids, output_grid_count, sizeof(*output_grids),
1068
1069 // for all grids that have to be written to file
1070 for (size_t i = 0; i < output_grid_count; ++i) {
1071
1072 struct yac_basic_grid * grid = output_grids[i].grid;
1073 int split_key = (grid != NULL)?1:MPI_UNDEFINED;
1074
1075 // generate a communicator containing all processes that
1076 // have parts of the current grid locally available
1077 MPI_Comm output_comm;
1078 yac_mpi_call(MPI_Comm_split(comm, split_key, 0, &output_comm), comm);
1079
1080 // if the local process has some data of the grid locally available
1081 if (grid != NULL) {
1082
1083 // write grid to file in parallel
1085 grid, output_grids[i].filename, output_comm);
1086
1087 yac_mpi_call(MPI_Comm_free(&output_comm), comm);
1088 }
1089 }
1090
1091 free(output_grids);
1092
1093 // wait until all grids have been written
1094 yac_mpi_call(MPI_Barrier(comm), comm);
1095}
1096
1098 struct yac_instance * instance, struct yac_basic_grid ** grids,
1099 size_t num_grids) {
1100
1101 MPI_Comm comm = instance->comm;
1102
1103 // get information about all fields
1104 struct field_config * field_configs;
1105 size_t field_count;
1107 instance, &field_configs, &field_count);
1108
1109 // sort field configurations
1110 qsort(
1111 field_configs, field_count, sizeof(*field_configs), compare_field_config);
1112
1113 struct yac_dist_grid_pair * dist_grid_pair = NULL;
1114 struct yac_interp_grid * interp_grid = NULL;
1115 struct yac_interp_weights * interp_weights = NULL;
1116 struct yac_interpolation * interp = NULL;
1117 struct yac_interpolation_exchange * interp_exch = NULL;
1119 struct comp_grid_pair_config * prev_comp_grid_pair = NULL;
1120 struct field_config * prev_field_config = NULL;
1121
1123
1124 // loop over all fields to build interpolations
1125 for (size_t i = 0; i < field_count; ++i) {
1126
1127 struct field_config * curr_field_config = field_configs + i;
1128 struct comp_grid_pair_config * curr_comp_grid_pair =
1129 &(curr_field_config->comp_grid_pair);
1130
1131 int is_source = curr_field_config->src_interp_config.field != NULL;
1132 int is_target = curr_field_config->tgt_interp_config.field != NULL;
1133
1134 int build_flag = 0;
1135
1136 // if the current configuration differs from the previous one and the local
1137 // process is involved in this configuration
1138 if ((prev_comp_grid_pair == NULL) ||
1139 (build_flag ||
1140 strcmp(prev_comp_grid_pair->config[0].grid_name,
1141 curr_comp_grid_pair->config[0].grid_name) ||
1142 strcmp(prev_comp_grid_pair->config[1].grid_name,
1143 curr_comp_grid_pair->config[1].grid_name))) {
1144
1145 build_flag = 1;
1146
1147 if (dist_grid_pair != NULL) yac_dist_grid_pair_delete(dist_grid_pair);
1148
1149 char const * grid_names[2] =
1150 {curr_comp_grid_pair->config[0].grid_name,
1151 curr_comp_grid_pair->config[1].grid_name};
1152
1153 int delete_flags[2];
1154 struct yac_basic_grid * basic_grid[2] =
1155 {get_basic_grid(grid_names[0], grids, num_grids, &delete_flags[0]),
1156 get_basic_grid(grid_names[1], grids, num_grids, &delete_flags[1])};
1157
1158 dist_grid_pair =
1159 yac_dist_grid_pair_new(basic_grid[0], basic_grid[1], comm);
1160
1161 for (int i = 0; i < 2; ++i)
1162 if (delete_flags[i]) yac_basic_grid_delete(basic_grid[i]);
1163 }
1164
1165 // if the current source or target field data differes from the previous
1166 // one
1167 if (build_flag ||
1169 prev_field_config, curr_field_config)) {
1170
1171 build_flag = 1;
1172
1173 struct yac_interp_field * src_fields =
1174 curr_field_config->src_interp_config.interp_fields;
1175 size_t num_src_fields =
1176 curr_field_config->src_interp_config.num_interp_fields;
1177 struct yac_interp_field * tgt_fields =
1178 curr_field_config->tgt_interp_config.interp_field;
1179
1180 if (interp_grid != NULL) yac_interp_grid_delete(interp_grid);
1181
1182 int src_comp_idx = field_configs[i].src_comp_idx;
1183 interp_grid = yac_interp_grid_new(
1184 dist_grid_pair,
1185 curr_comp_grid_pair->config[src_comp_idx].grid_name,
1186 curr_comp_grid_pair->config[src_comp_idx^1].grid_name,
1187 num_src_fields, src_fields, *tgt_fields);
1188 }
1189
1190 // if the current interpolation method stack differes from the previous
1191 // configuration
1192 if (build_flag ||
1194 prev_field_config->src_interp_config.interp_stack,
1195 curr_field_config->src_interp_config.interp_stack)) {
1196
1197 build_flag = 1;
1198
1199 if (interp_weights != NULL) yac_interp_weights_delete(interp_weights);
1200
1201 // generate interp weights
1202 interp_weights = generate_interp_weights(
1203 curr_field_config->src_interp_config, interp_grid);
1204 }
1205
1206 if (curr_field_config->src_interp_config.weight_file_name != NULL) {
1207
1208 int src_comp_idx = field_configs[i].src_comp_idx;
1209
1211 interp_weights,
1212 curr_field_config->src_interp_config.weight_file_name,
1213 curr_comp_grid_pair->config[src_comp_idx].grid_name,
1214 curr_comp_grid_pair->config[src_comp_idx^1].grid_name,
1215 0, 0, curr_field_config->src_interp_config.weight_file_on_existing);
1216 }
1217
1218 // if the current weight reorder method differs from the previous
1219 // configuration
1220 // (use memcmp to compare frac_mask_fallback_value, because they can be nan)
1221 if (build_flag ||
1223 prev_field_config, curr_field_config)) {
1224
1226 interp = NULL;
1227 yac_interpolation_exchange_delete(interp_exch, "generate_interpolations");
1228 interp_exch = NULL;
1231
1232 // generate interpolation
1233 if (curr_field_config->use_raw_exchange) {
1235 interp_weights, curr_field_config->interp_gen_config,
1236 &interp_exch, &interp_weights_data, is_source, is_target);
1237 } else {
1238 interp =
1240 interp_weights, curr_field_config->interp_gen_config,
1241 is_source, is_target);
1242 }
1243 }
1244
1245 if (curr_field_config->use_raw_exchange) {
1246
1247 struct yac_interpolation_exchange * interp_exch_copy =
1249
1250 if (is_source) {
1252 curr_field_config->src_interp_config.field,
1254 curr_field_config->src_interp_config.event_data),
1255 interp_exch_copy);
1257 }
1258
1259 if (is_target) {
1260 struct yac_interp_weights_data interp_weights_data_copy =
1263 curr_field_config->tgt_interp_config.field,
1265 curr_field_config->tgt_interp_config.event_data),
1266 interp_exch_copy, interp_weights_data_copy);
1268 }
1269
1271 interp_exch_copy, "generate_interpolations");
1272
1273 } else {
1274
1275 struct yac_interpolation * interp_copy = yac_interpolation_copy(interp);
1276
1277 if (is_source) {
1279 curr_field_config->src_interp_config.field,
1281 curr_field_config->src_interp_config.event_data),
1282 interp_copy);
1284 }
1285
1286 if (is_target) {
1288 curr_field_config->tgt_interp_config.field,
1290 curr_field_config->tgt_interp_config.event_data),
1291 interp_copy);
1293 }
1294
1295 yac_interpolation_delete(interp_copy);
1296 }
1297
1298 prev_comp_grid_pair = curr_comp_grid_pair;
1299 prev_field_config = curr_field_config;
1300 }
1301
1302 for (size_t i = 0; i < field_count; ++i) {
1303 free(field_configs[i].src_interp_config.interp_fields);
1304 free(field_configs[i].tgt_interp_config.interp_field);
1305 yac_interpolation_gen_config_delete(field_configs[i].interp_gen_config);
1306 }
1307
1309 yac_interpolation_exchange_delete(interp_exch, "generate_interpolations");
1311 yac_interp_weights_delete(interp_weights);
1312 yac_interp_grid_delete(interp_grid);
1313 yac_dist_grid_pair_delete(dist_grid_pair);
1314 for (size_t i = 0; i < field_count; ++i) {
1315 free((void*)(field_configs[i].src_interp_config.event_data.start_datetime));
1316 free((void*)(field_configs[i].src_interp_config.event_data.end_datetime));
1317 free((void*)(field_configs[i].tgt_interp_config.event_data.start_datetime));
1318 free((void*)(field_configs[i].tgt_interp_config.event_data.end_datetime));
1319 }
1320 free(field_configs);
1321}
1322
1323void yac_instance_sync_def(struct yac_instance * instance) {
1326 YAC_ASSERT(instance->comp_config,
1327 "ERROR(yac_instance_sync_def): no components have been defined");
1329 instance->couple_config, instance->comm,
1331}
1332
1334 struct yac_instance * instance,
1335 char const ** comp_names, size_t num_comp_names) {
1338 YAC_ASSERT(instance->comp_config,
1339 "ERROR(yac_instance_sync_def_comps): no components have been defined");
1340
1341 // Create communicator for the provided components
1342 MPI_Comm comps_comm = yac_instance_get_comps_comm(
1343 instance, comp_names, num_comp_names);
1344
1345 YAC_ASSERT(
1346 comps_comm != MPI_COMM_NULL,
1347 "ERROR(yac_instance_sync_def_comps): invalid list of component names");
1348
1349 // Synchronize definitions using the components communicator
1351 instance->couple_config, comps_comm, NULL);
1352
1353 // Free the communicator
1354 yac_mpi_call(MPI_Comm_free(&comps_comm), MPI_COMM_WORLD);
1355}
1356
1358 struct yac_instance * instance, struct yac_basic_grid ** grids, size_t num_grids) {
1359 // if definitions have not yet been synced
1360 int requires_def_sync = (instance->phase == INSTANCE_DEFINITION_COMP);
1361 if (requires_def_sync)
1362 yac_instance_sync_def(instance);
1364
1365 YAC_ASSERT(
1366 instance->comp_config,
1367 "ERROR(yac_instance_setup): no components have been defined");
1368
1369 // sync again, in case a process has done additional definitions
1370 // after the yac_instance_sync_def call
1372 instance->couple_config, instance->comm,
1374
1375 // write grids to file (if enabled in coupling configuration)
1376 write_grids_to_file(instance, grids, num_grids);
1377
1378 generate_interpolations(instance, grids, num_grids);
1379}
1380
1382 struct yac_instance * instance, struct yac_basic_grid ** grids,
1383 size_t num_grids, int emit_flags) {
1384
1385 yac_instance_setup(instance, grids, num_grids);
1386
1387 int include_definitions = 0;
1388 return
1390 instance->couple_config, emit_flags, include_definitions);
1391}
1392
1394 struct yac_instance * instance,
1395 char const ** comp_names, size_t num_comp_names) {
1397 return
1399 instance->comp_config, comp_names, num_comp_names);
1400}
1401
1408
1410 struct yac_instance * instance,
1411 const char* comp_name){
1413 return
1415 instance->comp_config, comp_name);
1416}
1417
1419 struct yac_instance * instance,
1420 const char* comp_name){
1422 return
1424 instance->comp_config, comp_name);
1425}
1426
1428
1429 struct yac_instance * instance = xmalloc(1 * sizeof(*instance));
1430
1432
1433 instance->comp_config = NULL;
1434
1435 instance->cpl_fields = NULL;
1436 instance->num_cpl_fields = 0;
1437
1438 yac_mpi_call(MPI_Comm_split(comm, 0, 0, &(instance->comm)), comm);
1439
1440 instance->phase = INSTANCE_DEFINITION;
1441
1442 return instance;
1443}
1444
1445
1447
1448 MPI_Comm dummy_comm;
1449 yac_mpi_call(MPI_Comm_split(comm, MPI_UNDEFINED, 0, &dummy_comm), comm);
1450}
1451
1452void yac_instance_delete(struct yac_instance * instance) {
1453
1454 if (instance == NULL) return;
1455
1457
1458 for (size_t i = 0; i < instance->num_cpl_fields; ++i)
1460 free(instance->cpl_fields);
1461
1463
1464 yac_mpi_call(MPI_Comm_free(&(instance->comm)), MPI_COMM_WORLD);
1465
1466 free(instance);
1467}
1468
1469MPI_Comm yac_instance_get_comm(struct yac_instance * instance) {
1470
1471 if (instance == NULL) return MPI_COMM_NULL;
1472
1473 return instance->comm;
1474}
1475
1477 struct yac_instance * instance) {
1478
1479 return instance->couple_config;
1480}
1481
1483 struct yac_instance * instance,
1484 struct yac_couple_config * couple_config) {
1485 CHECK_MAX_PHASE("yac_instance_set_couple_config", INSTANCE_DEFINITION);
1486 if (instance->couple_config == couple_config) return;
1488 instance->couple_config = couple_config;
1489}
1490
1492 struct yac_instance * instance, const char * start_datetime,
1493 const char * end_datetime ) {
1494 CHECK_MAX_PHASE("yac_instance_def_datetime", INSTANCE_DEFINITION_COMP);
1497}
1498
1500 CHECK_MIN_PHASE("yac_instance_get_start_datetime", INSTANCE_DEFINITION_COMP);
1501 return (char*)yac_couple_config_get_start_datetime(instance->couple_config);
1502}
1503
1505 CHECK_MIN_PHASE("yac_instance_get_end_datetime", INSTANCE_DEFINITION_COMP);
1506 return (char*)yac_couple_config_get_end_datetime(instance->couple_config);
1507}
1508
1510 struct yac_instance * instance,
1511 char const ** comp_names, size_t num_comps) {
1514
1515 YAC_ASSERT(
1516 !instance->comp_config,
1517 "ERROR(yac_instance_def_components): components have already been defined")
1518
1519 // add components to coupling configuration
1520 for (size_t i = 0; i < num_comps; ++i)
1521 yac_couple_config_add_component(instance->couple_config, comp_names[i]);
1522
1523 // synchronise coupling configuration
1525 instance->couple_config, instance->comm,
1527
1528 instance->comp_config =
1530 instance->couple_config, comp_names, num_comps, instance->comm);
1531}
1532
1534 struct yac_instance * instance) {
1535 return instance->phase > INSTANCE_DEFINITION_COMP;
1536}
1537
1538static bool check_timedelta_positive(const char* timestep){
1539 struct _timedelta *zero = newTimeDelta("PT0S"), *dt = newTimeDelta(timestep);
1540 bool result = (compareTimeDelta(zero, dt) == less_than);
1541 deallocateTimeDelta(zero);
1542 deallocateTimeDelta(dt);
1543 return result;
1544}
1545
1547 struct yac_instance * instance, char const * field_name,
1548 char const * comp_name, struct yac_basic_grid * grid,
1550 int collection_size, char const * timestep) {
1553
1554 struct yac_couple_config * couple_config = instance->couple_config;
1555 char const * grid_name = yac_basic_grid_get_name(grid);
1556 if(!yac_couple_config_contains_grid_name(couple_config, grid_name))
1557 yac_couple_config_add_grid(couple_config, grid_name);
1558
1559 YAC_ASSERT(
1560 field_name, "ERROR(yac_instance_add_field): "
1561 "\"NULL\" is not a valid field name")
1562 YAC_ASSERT(
1563 strlen(field_name) <= YAC_MAX_CHARLEN,
1564 "ERROR(yac_instance_add_field): field name is too long "
1565 "(maximum is YAC_MAX_CHARLEN)")
1567 (collection_size > 0) && (collection_size < INT_MAX),
1568 "ERROR(yac_instance_add_field): \"%d\" is not a valid collection size "
1569 "(component \"%s\" grid \"%s\" field \"%s\")",
1570 collection_size, comp_name, grid_name, field_name)
1571
1573 check_timedelta_positive(timestep),
1574 "ERROR(yac_instance_add_field): timestep must be positive. Got \"%s\" "
1575 "(component \"%s\" grid \"%s\" field \"%s\")",
1576 timestep, comp_name, grid_name, field_name);
1577
1578 // add field to coupling configuration
1580 couple_config, comp_name, grid_name, field_name,
1581 timestep, collection_size);
1582
1583 // check whether the field is already defined
1584 for (size_t i = 0; i < instance->num_cpl_fields; ++i) {
1585 struct coupling_field * cpl_field = instance->cpl_fields[i];
1587 strcmp(yac_get_coupling_field_name(cpl_field), field_name) ||
1588 (strcmp(
1589 yac_get_coupling_field_comp_name(cpl_field), comp_name)) ||
1591 "ERROR(yac_instance_add_field): "
1592 "field with the name \"%s\" has already been defined",
1593 field_name);
1594 }
1595
1596 struct coupling_field * cpl_field =
1598 field_name, comp_name, grid, interp_fields, num_interp_fields,
1600
1601 instance->cpl_fields =
1602 xrealloc(
1603 instance->cpl_fields,
1604 (instance->num_cpl_fields + 1) * sizeof(*(instance->cpl_fields)));
1605 instance->cpl_fields[instance->num_cpl_fields] = cpl_field;
1606 instance->num_cpl_fields++;
1607
1608 return cpl_field;
1609}
1610
1612 struct yac_instance * instance,
1613 char const * src_comp_name, char const * src_grid_name, char const * src_field_name,
1614 char const * tgt_comp_name, char const * tgt_grid_name, char const * tgt_field_name,
1615 char const * coupling_period, int time_reduction,
1616 struct yac_interp_stack_config * interp_stack_config, int src_lag, int tgt_lag,
1617 const char* weight_file_name, int weight_file_on_existing,
1618 int mapping_on_source, double scale_factor, double scale_summand,
1619 size_t num_src_mask_names,
1620 char const * const * src_mask_names, char const * tgt_mask_name,
1621 char const * yaxt_exchanger_name,
1622 struct yac_collection_selection const * collection_selection,
1623 int use_raw_exchange) {
1624
1627
1629 instance->couple_config, src_comp_name, src_grid_name, src_field_name,
1630 tgt_comp_name, tgt_grid_name, tgt_field_name, coupling_period,
1631 time_reduction, interp_stack_config, src_lag, tgt_lag, weight_file_name,
1632 weight_file_on_existing, mapping_on_source, scale_factor, scale_summand,
1633 num_src_mask_names, src_mask_names, tgt_mask_name,
1634 yaxt_exchanger_name, collection_selection, use_raw_exchange);
1635}
1636
1638 const char * comp_name, const char* grid_name, const char * field_name){
1639 CHECK_MIN_PHASE("yac_instance_get_field", INSTANCE_DEFINITION_COMP);
1640 return get_coupling_field(comp_name, field_name,
1641 grid_name, instance->num_cpl_fields, instance->cpl_fields);
1642}
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:180
void yac_basic_grid_to_file_parallel(struct yac_basic_grid *grid, char const *filename, MPI_Comm comm)
Definition basic_grid.c:775
char const * yac_basic_grid_get_name(struct yac_basic_grid *grid)
Definition basic_grid.c:131
struct yac_basic_grid * yac_basic_grid_empty_new(char const *name)
Definition basic_grid.c:66
void yac_basic_grid_delete(struct yac_basic_grid *grid)
Definition basic_grid.c:73
int yac_component_config_comp_size(struct yac_component_config *comp_config, char const *comp_name)
Definition component.c:275
int yac_component_config_comp_rank(struct yac_component_config *comp_config, char const *comp_name)
Definition component.c:285
void yac_component_config_delete(struct yac_component_config *comp_config)
Definition component.c:295
MPI_Comm yac_component_config_get_comps_comm(struct yac_component_config *comp_config, const char **names, size_t num_names)
Definition component.c:146
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:42
char * yac_yaml_emit_coupling(struct yac_couple_config *couple_config, int emit_flags, int include_definitions)
int yac_couple_config_get_enforce_write_weight_file(struct yac_couple_config const *couple_config, size_t couple_idx, size_t field_couple_idx)
void yac_couple_config_get_field_couple_component_names(struct yac_couple_config const *couple_config, size_t couple_idx, size_t field_couple_idx, char const **src_component_name, char const **tgt_component_name)
struct yac_interp_stack_config * yac_couple_config_get_interp_stack(struct yac_couple_config const *couple_config, size_t couple_idx, size_t field_couple_idx)
int yac_couple_config_get_missing_definition_is_fatal(struct yac_couple_config const *couple_config)
int yac_couple_config_get_use_raw_exchange(struct yac_couple_config const *couple_config, size_t couple_idx, size_t field_couple_idx)
void yac_couple_config_get_field_names(struct yac_couple_config const *couple_config, size_t couple_idx, size_t field_couple_idx, char const **src_field_name, const char **tgt_field_name)
char * yac_couple_config_get_end_datetime(struct yac_couple_config const *couple_config)
void yac_couple_config_sync(struct yac_couple_config *couple_config, MPI_Comm comm, char const *output_ref)
const char * yac_couple_config_get_grid_output_filename(struct yac_couple_config const *couple_config, const char *grid_name)
char const * yac_couple_config_get_source_timestep(struct yac_couple_config const *couple_config, size_t couple_idx, size_t field_couple_idx)
void yac_couple_config_set_datetime(struct yac_couple_config *couple_config, char const *start, char const *end)
size_t yac_couple_config_get_num_grids(struct yac_couple_config const *couple_config)
char const * yac_couple_config_get_target_timestep(struct yac_couple_config const *couple_config, size_t couple_idx, size_t field_couple_idx)
char const * yac_couple_config_get_weight_file_name(struct yac_couple_config const *couple_config, size_t couple_idx, size_t field_couple_idx)
struct yac_interpolation_gen_config * yac_couple_config_get_interpolation_gen_config(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx)
void yac_couple_config_get_src_mask_names(struct yac_couple_config const *couple_config, size_t couple_idx, size_t field_couple_idx, char const *const **mask_names, size_t *num_mask_names)
char const * yac_couple_config_get_grid_name(struct yac_couple_config const *couple_config, size_t grid_idx)
size_t yac_couple_config_get_num_couples(struct yac_couple_config const *couple_config)
char const * yac_couple_config_get_tgt_mask_name(struct yac_couple_config const *couple_config, size_t couple_idx, size_t field_couple_idx)
int yac_couple_config_get_source_lag(struct yac_couple_config const *couple_config, size_t couple_idx, size_t field_couple_idx)
char * yac_couple_config_get_start_datetime(struct yac_couple_config const *couple_config)
size_t yac_couple_config_get_num_components(struct yac_couple_config const *couple_config)
size_t yac_couple_config_get_num_couple_fields(struct yac_couple_config const *couple_config, size_t couple_idx)
void yac_couple_config_add_grid(struct yac_couple_config *couple_config, char const *name)
int yac_couple_config_contains_grid_name(struct yac_couple_config const *couple_config, char const *grid_name)
int yac_couple_config_get_target_lag(struct yac_couple_config const *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 const *couple_config, size_t couple_idx, size_t field_couple_idx)
struct yac_couple_config * yac_couple_config_new()
void yac_couple_config_add_component_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_get_field_grid_names(struct yac_couple_config const *couple_config, size_t couple_idx, size_t field_couple_idx, char const **src_grid_name, char const **tgt_grid_name)
void yac_couple_config_add_component(struct yac_couple_config *couple_config, char const *name)
char const * yac_couple_config_get_coupling_period(struct yac_couple_config const *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 weight_file_on_existing, int mapping_on_source, double scale_factor, double scale_summand, size_t num_src_mask_names, char const *const *src_mask_names, char const *tgt_mask_name, char const *yaxt_exchanger_name, struct yac_collection_selection const *collection_selection, int use_raw_exchange)
enum yac_reduction_type yac_couple_config_get_coupling_period_operation(struct yac_couple_config const *couple_config, size_t couple_idx, size_t field_couple_idx)
void yac_couple_config_delete(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:2348
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:2071
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:667
void yac_set_coupling_field_get_op(struct coupling_field *field, struct event *event, struct yac_interpolation *interpolation)
Definition fields.c:704
char const * yac_get_coupling_field_comp_name(struct coupling_field *field)
Definition fields.c:127
struct yac_basic_grid * yac_coupling_field_get_basic_grid(struct coupling_field *field)
Definition fields.c:121
size_t yac_coupling_field_get_num_interp_fields(struct coupling_field *field)
Definition fields.c:104
void yac_set_coupling_field_put_op_raw(struct coupling_field *field, struct event *event, struct yac_interpolation_exchange *interpolation_exchange)
Definition fields.c:675
struct yac_interp_field const * yac_coupling_field_get_interp_fields(struct coupling_field *cpl_field)
Definition fields.c:741
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:62
const char * yac_get_coupling_field_name(struct coupling_field *field)
Definition fields.c:116
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:732
void yac_coupling_field_delete(struct coupling_field *cpl_field)
Definition fields.c:764
void yac_instance_delete(struct yac_instance *instance)
Definition instance.c:1452
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:1381
int yac_instance_get_comp_rank(struct yac_instance *instance, const char *comp_name)
Definition instance.c:1418
char * yac_instance_get_start_datetime(struct yac_instance *instance)
Definition instance.c:1499
static int compare_dist_flags(const void *a_, const void *b_)
Definition instance.c:622
char * yac_instance_get_end_datetime(struct yac_instance *instance)
Definition instance.c:1504
void yac_instance_def_datetime(struct yac_instance *instance, const char *start_datetime, const char *end_datetime)
Definition instance.c:1491
void yac_instance_setup(struct yac_instance *instance, struct yac_basic_grid **grids, size_t num_grids)
Definition instance.c:1357
void yac_instance_sync_def(struct yac_instance *instance)
Definition instance.c:1323
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:1007
static int compare_field_config_interp_fields(struct field_config *a, struct field_config *b)
Definition instance.c:901
struct yac_instance * yac_instance_new(MPI_Comm comm)
Definition instance.c:1427
int yac_instance_get_nbr_comps(struct yac_instance *instance)
Definition instance.c:1402
int yac_instance_components_are_defined(struct yac_instance *instance)
Definition instance.c:1533
static bool check_timedelta_positive(const char *timestep)
Definition instance.c:1538
MPI_Comm yac_instance_get_comm(struct yac_instance *instance)
Definition instance.c:1469
static int compare_output_grids(const void *a, const void *b)
Definition instance.c:1045
static void generate_interpolations(struct yac_instance *instance, struct yac_basic_grid **grids, size_t num_grids)
Definition instance.c:1097
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:630
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:1546
static void generate_coupling_field_avail_config_ids(struct field_config *field_configs, size_t num_fields, MPI_Comm comm)
Definition instance.c:691
void yac_instance_set_couple_config(struct yac_instance *instance, struct yac_couple_config *couple_config)
Definition instance.c:1482
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:211
void yac_instance_dummy_new(MPI_Comm comm)
Definition instance.c:1446
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:186
void yac_instance_def_components(struct yac_instance *instance, char const **comp_names, size_t num_comps)
Definition instance.c:1509
#define CHECK_MIN_PHASE(FUNC_NAME, MIN_REF_PHASE)
Definition instance.c:63
static void get_field_configuration(struct yac_instance *instance, struct field_config **field_configs_, size_t *count)
Definition instance.c:775
struct yac_couple_config * yac_instance_get_couple_config(struct yac_instance *instance)
Definition instance.c:1476
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, struct yac_collection_selection const *collection_selection, int use_raw_exchange)
Definition instance.c:1611
static int compare_comp_grid_config(const void *a, const void *b)
Definition instance.c:200
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:306
static const char * yac_instance_phase_str[]
Definition instance.c:45
static struct event * generate_event(struct field_config_event_data event_data)
Definition instance.c:292
static 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:250
static int compare_field_config_interpolation_build_config(struct field_config *a, struct field_config *b)
Definition instance.c:229
#define CHECK_PHASE(FUNC_NAME, REF_PHASE, NEW_PHASE)
Definition instance.c:52
field_availability_type
Definition instance.c:37
@ TARGET_FLAG
Definition instance.c:39
@ SOURCE_TARGET_FLAG
Definition instance.c:40
@ SOURCE_FLAG
Definition instance.c:38
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:593
void yac_instance_sync_def_comps(struct yac_instance *instance, char const **comp_names, size_t num_comp_names)
Definition instance.c:1333
static void write_grids_to_file(struct yac_instance *instance, struct yac_basic_grid **grids, size_t num_grids)
Definition instance.c:1053
#define CHECK_MAX_PHASE(FUNC_NAME, MAX_REF_PHASE)
Definition instance.c:73
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:425
yac_instance_phase
Definition instance.c:28
@ INSTANCE_EXCHANGE
Definition instance.c:32
@ INSTANCE_DEFINITION_COMP
Definition instance.c:30
@ INSTANCE_DEFINITION_SYNC
Definition instance.c:31
@ INSTANCE_DEFINITION
Definition instance.c:29
@ INSTANCE_UNKNOWN
Definition instance.c:33
static int compare_field_config(const void *a, const void *b)
Definition instance.c:929
int yac_instance_get_comp_size(struct yac_instance *instance, const char *comp_name)
Definition instance.c:1409
field_type
Definition instance.c:106
@ TGT
Definition instance.c:108
@ SRC
Definition instance.c:107
MPI_Comm yac_instance_get_comps_comm(struct yac_instance *instance, char const **comp_names, size_t num_comp_names)
Definition instance.c:1393
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:552
static struct yac_interp_weights * generate_interp_weights(struct src_field_config src_interp_config, struct yac_interp_grid *interp_grid)
Definition instance.c:992
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:1637
static int compare_interp_field(struct yac_interp_field *a, struct yac_interp_field *b)
Definition instance.c:887
#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)
Delete an interpolation stack and free its resources (but not the pointer array).
struct yac_interp_weights * yac_interp_method_do_search(struct interp_method **method, struct yac_interp_grid *interp_grid)
Perform weight computation using given interpolation stack and grid.
int yac_interp_stack_config_compare(void const *a_, void const *b_)
Compare two interpolation stack configurations.
struct interp_method ** yac_interp_stack_config_generate(struct yac_interp_stack_config *interp_stack)
Generate a NULL-terminated array of interpolation methods from the stack configuration.
struct yac_interp_weights_data yac_interp_weights_data_copy(struct yac_interp_weights_data interp_weights_data)
void yac_interp_weights_data_init(struct yac_interp_weights_data *interp_weights_data)
struct yac_interpolation * yac_interp_weights_get_interpolation_ext(struct yac_interp_weights const *weights, struct yac_interpolation_gen_config const *config, int is_source, int is_target)
void yac_interp_weights_delete(struct yac_interp_weights *weights)
void yac_interp_weights_data_free(struct yac_interp_weights_data interp_weights_data)
void yac_interp_weights_get_interpolation_raw_ext(struct yac_interp_weights const *weights, struct yac_interpolation_gen_config const *config, struct yac_interpolation_exchange **interpolation_exchange, struct yac_interp_weights_data *interp_weights_data, int is_source, int is_target)
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_weight_file_on_existing
struct yac_interpolation * yac_interpolation_copy(struct yac_interpolation *interp)
Create a deep copy of an interpolation object.
void yac_interpolation_inc_ref_count(struct yac_interpolation *interpolation)
Increase the reference count of an interpolation.
void yac_interpolation_delete(struct yac_interpolation *interp)
Free an interpolation object and release all resources.
void yac_interpolation_exchange_inc_ref_count(struct yac_interpolation_exchange *exchange)
Increase the reference count of an exchange object.
struct yac_interpolation_exchange * yac_interpolation_exchange_copy(struct yac_interpolation_exchange *exchange)
Create a deep copy of an interpolation exchange.
void yac_interpolation_exchange_delete(struct yac_interpolation_exchange *exchange, char const *routine_name)
Delete an interpolation exchange and release resources.
Interpolation exchange object for temporary buffers and MPI exchanges.
int yac_interpolation_gen_config_compare(struct yac_interpolation_gen_config const *a, struct yac_interpolation_gen_config const *b)
Compare two interpolation configuration structures.
void yac_interpolation_gen_config_delete(struct yac_interpolation_gen_config *config)
Release a interpolation generation configuration structure allocated by yac_interpolation_gen_config_...
Defines internal basic interpolation definitions.
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:113
const char * grid_name
Definition instance.c:112
struct comp_grid_config config[2]
Definition instance.c:117
int use_raw_exchange
Definition fields.c:45
struct yac_basic_grid * grid
Definition fields.c:23
struct yac_interp_field * interp_fields
Definition fields.c:25
size_t num_interp_fields
Definition fields.c:26
char * timestep
Definition fields.c:28
char * component_name
Definition fields.c:21
size_t idx
Definition instance.c:183
size_t count
Definition instance.c:182
uint64_t * data
Definition instance.c:181
Definition event.c:18
char const * end_datetime
Definition instance.c:126
char const * start_datetime
Definition instance.c:125
enum yac_reduction_type reduction_operation
Definition instance.c:124
char const * timestep
Definition instance.c:121
char const * coupling_period
Definition instance.c:122
struct comp_grid_pair_config comp_grid_pair
Definition instance.c:163
struct tgt_field_config tgt_interp_config
Definition instance.c:167
struct yac_interpolation_gen_config * interp_gen_config
Definition instance.c:169
int use_raw_exchange
Definition instance.c:171
struct src_field_config src_interp_config
Definition instance.c:166
int src_comp_idx
Definition instance.c:164
char const * filename
Definition instance.c:176
struct yac_basic_grid * grid
Definition instance.c:177
char const * grid_name
Definition instance.c:175
const char * weight_file_name
Definition instance.c:143
enum yac_weight_file_on_existing weight_file_on_existing
Definition instance.c:144
size_t num_interp_fields
Definition instance.c:140
struct field_config_event_data event_data
Definition instance.c:145
struct yac_interp_stack_config * interp_stack
Definition instance.c:142
struct coupling_field * field
Definition instance.c:136
char const * name
Definition instance.c:137
struct yac_interp_field * interp_fields
Definition instance.c:139
struct field_config_event_data event_data
Definition instance.c:156
char const * name
Definition instance.c:152
struct coupling_field * field
Definition instance.c:151
struct yac_interp_field * interp_field
Definition instance.c:154
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:94
enum yac_instance_phase phase
Current phase of this YAC instance.
Definition instance.c:103
MPI_Comm comm
MPI communicator that contains the processes of this YAC instance.
Definition instance.c:100
struct yac_component_config * comp_config
Component configuration data of this YAC instance.
Definition instance.c:91
size_t num_cpl_fields
Number of elements in coupling_field ** cpl_fields.
Definition instance.c:97
struct yac_couple_config * couple_config
Coupling configuration data of this YAC instance.
Definition instance.c:88
enum yac_location location
Definition basic_grid.h:16
size_t coordinates_idx
Definition basic_grid.h:17
Configuration structure for interpolation generation.
struct @94 field[]
int collection_size
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
#define YAC_MAX_CHARLEN
Definition yac.h:106
#define YAC_ASSERT_F(exp, format,...)
Definition yac_assert.h:30
#define yac_mpi_call(call, comm)