YAC 3.21.0
Yet Another Coupler
Loading...
Searching...
No Matches
yac.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 "yac_mpi_common.h"
17#include "ensure_array_size.h"
18#include "event.h"
19#include "yac.h"
20#include "yac_pak.h"
21#include "yac_pak_instrument.h"
22#include "mpi_handshake.h"
23#include "utils_mci.h"
24#include "version.h"
25#include "instance.h"
26#include "fields.h"
28#include "config_yaml.h"
29#include "geometry.h"
30#include "yac_mpi.h"
31#include "yac_assert.h"
32#include "utils_common.h"
37
41
46
56
62
71
72int const YAC_CALENDAR_NOT_SET = CALENDAR_NOT_SET;
73int const YAC_PROLEPTIC_GREGORIAN = PROLEPTIC_GREGORIAN;
74int const YAC_YEAR_OF_365_DAYS = YEAR_OF_365_DAYS;
75int const YAC_YEAR_OF_360_DAYS = YEAR_OF_360_DAYS;
76
80
83
89
94
97
100
103
108
111
116
119
123
124enum {
128};
129
136
142
148
157
165
170static const char* mpi_handshake_group_name = "yac";
171
172static int default_instance_id = INT_MAX;
173
174static int yac_instance_count = 0;
175
176static void ** pointer_lookup_table = NULL;
178
179static struct user_input_data_grid ** global_grids = NULL;
180static size_t num_global_grids = 0;
181
183static size_t num_global_components = 0;
184
185static struct user_input_data_points ** global_points = NULL;
186static size_t num_global_points = 0;
187
188static struct user_input_data_masks ** global_masks = NULL;
189static size_t num_global_masks = 0;
190
193
207
208typedef struct yac_cell_area_config {
209
211 union {
212 struct {
215 struct {
216 char * filename;
217 char * varname;
222
232
248
255
274
282static void * yac_unique_id_to_pointer(int id, char const * id_name) {
283
285 id < pointer_lookup_table_size && id >= 0, "invalid %s", id_name)
288 "%s has already been freed", id_name)
289 return pointer_lookup_table[id];
290}
291
299static int yac_lookup_pointer(void const * pointer) {
300
301 int ret = INT_MAX;
302 for (int i = 0; (ret == INT_MAX) && (i < pointer_lookup_table_size); ++i)
303 if (pointer_lookup_table[i] == pointer) ret = i;
304 return ret;
305}
306
320
327static void yac_invalidate_unique_id(int id) {
328
329 YAC_ASSERT_F(id >= 0 && id < pointer_lookup_table_size, "invalid id %d", id)
331}
332
333/* ----------- Tracing helper for coupling operations ----------- */
334/* -- YAC PAK tracing helpers, wrappers around yac_pak_trace_* -- */
335
337 int field_id, yac_pak_event_type_t type, int put_idx,
338 yac_pak_trace_level_t level) {
339
340 struct coupling_field *cpl_field =
342
343 struct yac_pak *pak = yac_coupling_field_get_pak(cpl_field);
344 if (!pak) return -1;
345 if (!yac_pak_trace_is_enabled(pak)) return -1;
346
347 char const *name = yac_get_coupling_field_name(cpl_field);
348 char const *comp = yac_get_coupling_field_comp_name(cpl_field);
349 char const *grid = yac_basic_grid_get_name(
351
352 char const *datetime_str = NULL;
353 int action = -1;
354
355 enum yac_field_exchange_type exchange_type =
357
358 /* Only access event if field has proper exchange type.
359 * TODO: For PUT with multiple targets (num_puts > 1), currently
360 * put_idx=0 is used. Each put_idx has its own event, which may
361 * need per-put tracing in the future.
362 */
363 if ((exchange_type == TARGET) || (exchange_type == SOURCE)) {
364
365 /* The put/get which a wait belongs to has already advanced the event
366 * clock, so the wait has to look one step back. Its action is that of the
367 * exchange it completes, which is no longer available here. */
368 char * (*get_datetime)(struct coupling_field *) =
372
373 datetime_str = get_datetime(cpl_field);
374
376 action = yac_coupling_field_get_action(cpl_field);
377 }
378
379 int const h_pak_trace =
380 yac_pak_trace_start_ex(pak, name, comp, grid, type, put_idx,
381 datetime_str, action, level);
382
383 /* Open a nested-region tracing window for this operation.
384 * No-op unless YAC_PAK_TRACE_LEVEL is high enough. An UPDATE only advances
385 * the event clock, so no instrumented core region can occur inside it. A
386 * WAIT can contain one. */
389
390 return h_pak_trace;
391}
392
395static void trace_coupling_stop(int field_id, int h_pak_trace) {
397 if (h_pak_trace < 0) return;
398 struct coupling_field *cpl_field =
400 struct yac_pak *pak = yac_coupling_field_get_pak(cpl_field);
401 yac_pak_trace_stop(pak, h_pak_trace);
402}
403
404/* ---------------------------------------------------------------------- */
405
411 char const * caller, char const * name, char const * name_type) {
412
414 (name != NULL) && (name[0] != '\0'), caller, "missing %s", name_type)
416 strlen(name) <= YAC_MAX_CHARLEN, caller,
417 "%s \"%s\" is too long (maximum is %d)",
418 name_type, name, YAC_MAX_CHARLEN)
419}
420
421/* ---------------------------------------------------------------------- */
422
428 int grid_id, char const * caller, int allow_preliminary) {
429
432
434 allow_preliminary || !grid_info->is_preliminary, caller,
435 "grid \"%s\" is only preliminarily defined", grid_info->name)
436
438 grid_info->is_preliminary || grid_info->grid != NULL, caller,
439 "internal error while accessing grid \"%s\"", grid_info->name)
440
441 return grid_info;
442}
443
444/* ---------------------------------------------------------------------- */
445
452 char const * grid_name, char const * caller, int * grid_id) {
453
454 struct user_input_data_grid * grid_info = NULL;
455
456 // try to find an existing entry with the given name
457 for (size_t i = 0; (i < num_global_grids) && (grid_info == NULL); ++i) {
458 if (!strcmp(global_grids[i]->name, grid_name)) {
460 }
461 }
462
463 // if no such entry exists, create a new preliminary one
464 if (grid_info != NULL) {
465
468 *grid_id != INT_MAX, caller,
469 "internal error while accessing grid \"%s\"", grid_name)
470
471 } else {
472
473 // create new preliminary entry
478 grid_info->name = xstrdup(grid_name);
479 grid_info->grid = NULL;
480 grid_info->is_preliminary = 1;
483 }
484
485 return grid_info;
486}
487
488/* ---------------------------------------------------------------------- */
489
495static int yac_add_grid(
496 const char * grid_name, struct yac_basic_grid_data grid_data) {
497
498 check_name_string(__func__, grid_name, "grid name");
499
500 int grid_id;
502 user_input_data_get_or_create_grid(grid_name, __func__, &grid_id);
503
504 // ensure that the grid is only preliminarily defined
506 grid_info->is_preliminary, "multiple definitions of grid with name \"%s\"",
507 grid_name)
508
509 // set grid and mark as non-preliminary
510 grid_info->grid = yac_basic_grid_new(grid_name, grid_data);
511 grid_info->is_preliminary = 0;
512
513 return grid_id;
514}
515
517
518 for (size_t i = 0; i < num_global_grids; ++i) {
519 if (global_grids[i]->grid != NULL)
521 free(global_grids[i]->name);
522 free(global_grids[i]);
523 }
524 free(global_grids);
525 global_grids = NULL;
527}
528
529/* ---------------------------------------------------------------------- */
530
532
533 for (size_t i = 0; i < num_global_points; ++i) {
534 free(global_points[i]->name);
535 free(global_points[i]);
536 }
537 free(global_points);
538 global_points = NULL;
540}
541
542/* ---------------------------------------------------------------------- */
543
545
546 for (size_t i = 0; i < num_global_masks; ++i) {
547 free(global_masks[i]->name);
548 free(global_masks[i]);
549 }
550 free(global_masks);
551 global_masks = NULL;
553}
554
555/* ---------------------------------------------------------------------- */
556
558
559 for (size_t i = 0; i < num_global_components; ++i){
560 free(global_components[i]->name);
561 free(global_components[i]);
562 }
563 free(global_components);
564 global_components = NULL;
566}
567
568/* ---------------------------------------------------------------------- */
569
579
580/* ---------------------------------------------------------------------- */
581
583 return (default_instance_id != INT_MAX);
584}
585
586static void check_default_instance_id(char const * routine_name) {
588 default_instance_id_defined(), routine_name,
589 "no default YAC instance is defined yet")
590}
591
592/* ---------------------------------------------------------------------- */
593
594static void yac_check_version(MPI_Comm comm) {
595
596 int comm_rank;
597 yac_mpi_call(MPI_Comm_rank(comm, &comm_rank), comm);
598
599 // 1) broadcast version string length from root to all processes and check for
600 // consistency
601
602 size_t recv_version_len = strlen(yac_version) + 1;
603 enum {MAX_VERSION_STRING_LENGTH = 100};
605 MPI_Bcast(&recv_version_len, 1, YAC_MPI_SIZE_T, 0, comm), comm);
606
607 // Guard against a garbage value from an older YAC that did not broadcast
608 // the version string length (protocol incompatibility between YAC versions)
610 recv_version_len <= MAX_VERSION_STRING_LENGTH,
611 "received implausible version string length (%zu); this may indicate "
612 "a protocol mismatch with a YAC version < 3.18.0 that does not broadcast "
613 "the version string length before broadcasting the version string. Please "
614 "check the YAC version of all processes used in this run.",
615 recv_version_len)
616
617 // 2) broadcast version string from root to all processes and check for
618 // consistency
619 char * recv_version = xmalloc(recv_version_len);
620 if (comm_rank == 0) strcpy(recv_version, yac_version);
621
623 MPI_Bcast(recv_version, (int)recv_version_len, MPI_CHAR, 0, comm), comm);
624
626 !strcmp(recv_version, yac_version),
627 "inconsistent YAC versions between processes "
628 "(on local process \"%s\"; on root \"%s\")", yac_version, recv_version)
629
630 free(recv_version);
631}
632
633static void yac_check_yac_int(MPI_Comm comm) {
634
635 int comm_rank;
636 yac_mpi_call(MPI_Comm_rank(comm, &comm_rank), comm);
637
638 int yac_int_size_local = (int)(sizeof(yac_int));
639 int yac_int_size_root = (int)(sizeof(yac_int));
640
642 MPI_Bcast(&yac_int_size_root, 1, MPI_INT, 0, comm), comm);
643
645 yac_int_size_local == yac_int_size_root,
646 "inconsistent size of yac_int datatype between processes "
647 "(on local process \"%d\"; on root \"%d\")",
648 yac_int_size_local, yac_int_size_root)
649}
650
651static void check_mpi_initialised(char const * routine_name) {
652
654 yac_mpi_is_initialised(), routine_name,
655 "MPI has not yet been initialised, but this call got a "
656 "communicator which is not allowed by the MPI standard "
657 "(MPI_COMM_WORLD is not to be used before the call to "
658 "MPI_Init or MPI_Init_thread)");
659}
660
661void yac_cmpi_handshake(MPI_Comm comm, size_t n, char const** group_names,
662 MPI_Comm * group_comms) {
663 check_mpi_initialised(__func__);
664 yac_mpi_handshake(comm, n, group_names, group_comms);
665}
666
667void yac_cmpi_handshake_f2c(MPI_Fint comm, int n, char const** group_names,
668 MPI_Fint * group_comms) {
669 MPI_Comm comm_c = MPI_Comm_f2c(comm);
670 MPI_Comm * group_comms_c = xmalloc(n*sizeof(*group_comms_c));
671 yac_mpi_handshake(comm_c, n, group_names, group_comms_c);
672 for(int i = 0; i<n; ++i)
673 group_comms[i] = MPI_Comm_c2f(group_comms_c[i]);
674 free(group_comms_c);
675}
676
677static int yac_init(MPI_Comm yac_comm) {
678
679 check_mpi_initialised(__func__);
680 yac_yaxt_init(yac_comm);
681 yac_check_version(yac_comm);
682 yac_check_yac_int(yac_comm);
683
685
686 struct yac_instance * instance = yac_instance_new(yac_comm);
687
688 return yac_pointer_to_unique_id(instance);
689}
690
695
699
701 MPI_Comm comm, int * yac_instance_id) {
702
703 *yac_instance_id = yac_init(comm);
704}
705
707 MPI_Fint comm, int * yac_instance_id) {
708
709 yac_cinit_comm_instance(MPI_Comm_f2c(comm), yac_instance_id);
710}
711
712void yac_cinit_comm ( MPI_Comm comm ) {
713
715 default_instance_id == INT_MAX, "default YAC instance already defined")
716
718}
719
720void yac_cinit_comm_f2c ( MPI_Fint comm_f ) {
721
722 yac_cinit_comm(MPI_Comm_f2c(comm_f));
723}
724
726 int * yac_instance_id) {
727
728 // we have to initalise MPI here in order to be able to use MPI_COMM_WORLD
729 yac_mpi_init();
730 MPI_Comm yac_comm;
731 const char* group_name = yac_cget_mpi_handshake_group_name();
732 yac_cmpi_handshake(MPI_COMM_WORLD, 1, &group_name, &yac_comm);
733 yac_cinit_comm_instance(yac_comm, yac_instance_id);
734 yac_mpi_call(MPI_Comm_free(&yac_comm), MPI_COMM_WORLD);
735}
736
737void yac_cinit ( void ) {
739 default_instance_id == INT_MAX, "default YAC instance already defined")
740
742}
743
744/* ---------------------------------------------------------------------- */
745
756
757void yac_cinit_comm_dummy_f2c ( MPI_Fint comm_f ) {
758
759 check_mpi_initialised(__func__);
760 yac_cinit_comm_dummy(MPI_Comm_f2c(comm_f));
761}
762
763void yac_cinit_dummy( void ) {
764
765 // we have to initalise MPI here in order to be able to use MPI_COMM_WORLD
766 yac_mpi_init();
767 yac_cmpi_handshake(MPI_COMM_WORLD, 0, NULL, NULL);
768}
769
770/* ---------------------------------------------------------------------- */
771
772/* internal routine to serve the Python interface
773 * (helps to avoid issue with "from mpi4py import MPI")
774 */
775
776void yac_cget_instance_rank_c2py ( int yac_instance_id, int * rank ) {
777
778 MPI_Comm instance_comm =
780 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id"));
781
782 yac_mpi_call(MPI_Comm_rank(instance_comm, rank), instance_comm);
783
784}
785
786void yac_cget_instance_size_c2py ( int yac_instance_id, int * size ) {
787
788 MPI_Comm instance_comm =
790 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id"));
791
792 yac_mpi_call(MPI_Comm_size(instance_comm, size), instance_comm);
793}
794
795/* ---------------------------------------------------------------------- */
796
800
804
805/* ---------------------------------------------------------------------- */
806
807
808void yac_cread_config_yaml_instance( int yac_instance_id,
809 const char * yaml_filename) {
810 struct yac_instance * instance
811 = yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
815}
816
821
822void yac_cread_config_json_instance( int yac_instance_id,
823 const char * yaml_filename) {
824 struct yac_instance * instance
825 = yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
829}
830
835
836/* ---------------------------------------------------------------------- */
837
839 int yac_instance_id, const char * filename, int fileformat,
840 int sync_location, int include_definitions) {
841
842 struct yac_instance * instance =
843 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
844
845 YAC_ASSERT(filename != NULL, "filename is NULL")
847 (fileformat == YAC_TEXT_FILETYPE_YAML) ||
848 (fileformat == YAC_TEXT_FILETYPE_JSON), "invalid file format")
850 (sync_location == YAC_CONFIG_OUTPUT_SYNC_LOC_DEF_COMP) ||
851 (sync_location == YAC_CONFIG_OUTPUT_SYNC_LOC_SYNC_DEF) ||
852 (sync_location == YAC_CONFIG_OUTPUT_SYNC_LOC_ENDDEF), "invalid file format")
853
854 char const * output_refs[] =
858
860 yac_instance_get_couple_config(instance), filename,
861 (enum yac_text_filetype)fileformat,
862 output_refs[sync_location], include_definitions);
863}
864
866 const char * filename, int filetype, int sync_location,
867 int include_definitions) {
868
871 default_instance_id, filename, filetype, sync_location,
872 include_definitions);
873}
874
875/* ---------------------------------------------------------------------- */
876
878 int yac_instance_id, const char * gridname, const char * filename) {
879
880 struct yac_instance * instance =
881 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
882
883 YAC_ASSERT(gridname != NULL, "gridname is NULL")
884 YAC_ASSERT(filename != NULL, "filename is NULL")
885
887 yac_instance_get_couple_config(instance), gridname, filename);
888}
889
890void yac_cset_grid_output_file(const char * gridname, const char * filename) {
891
894}
895
896/* ---------------------------------------------------------------------- */
897
899 int yac_instance_id, const char * filename) {
900
901 struct yac_instance * instance =
902 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
903
904 YAC_ASSERT(filename != NULL, "filename is NULL")
905
907 yac_instance_get_couple_config(instance), filename);
908}
909
910void yac_cset_grids_output_file(const char * filename) {
911
914}
915
917 int yac_instance_id, int apply_check) {
918
919 struct yac_instance * instance =
920 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
922 yac_instance_get_couple_config(instance), apply_check);
923}
924
930
932 int yac_instance_id, int is_fatal) {
933
934 struct yac_instance * instance =
935 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
937 yac_instance_get_couple_config(instance), is_fatal);
938}
939
946
947/* ---------------------------------------------------------------------- */
948
949static void yac_ccleanup_instance_(int yac_instance_id) {
950
951 struct yac_instance * instance
952 = yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
953
954 /* free memory */
955 yac_instance_delete(instance);
956 yac_invalidate_unique_id(yac_instance_id);
958 if(yac_instance_id == default_instance_id)
959 default_instance_id = INT_MAX;
960
961 // remove dangeling pointers from components
962 for(size_t i = 0; i<num_global_components;++i){
963 if(global_components[i]->instance == instance){
964 global_components[i]->instance = NULL;
965 }
966 }
967}
968
969void yac_ccleanup_instance (int yac_instance_id) {
970
971 yac_ccleanup_instance_(yac_instance_id);
972
973 /* cleanup mpi */
975}
976
983
984/* ---------------------------------------------------------------------- */
985
997
998void yac_cfinalize_instance(int yac_instance_id) {
999
1000 yac_ccleanup_instance_(yac_instance_id);
1001
1002 /* cleanup close MPI */
1003
1004 if (yac_instance_count == 0) cleanup();
1005}
1006
1008
1011
1012 /* cleanup close MPI */
1013
1014 if (yac_instance_count == 0) cleanup();
1015}
1016
1017/* ---------------------------------------------------------------------- */
1018
1020 int yac_instance_id, const char * start_datetime,
1021 const char * end_datetime) {
1022
1024 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id"),
1025 start_datetime, end_datetime);
1026}
1027
1028void yac_cdef_datetime ( const char * start_datetime,
1029 const char * end_datetime ) {
1030
1031 check_default_instance_id(__func__);
1033 default_instance_id, start_datetime, end_datetime);
1034}
1035
1036void yac_cdef_calendar ( int calendar ) {
1037
1038 yac_instance_def_calendar(calendar, "MCI calendar definition (def_calendar)");
1039}
1040
1042
1043 return (int)getCalendarType();
1044}
1045
1046/* ---------------------------------------------------------------------- */
1047
1048char * yac_cget_start_datetime_instance(int yac_instance_id) {
1049
1050 return
1052 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id"));
1053}
1054
1060
1061/* ---------------------------------------------------------------------- */
1062
1063char * yac_cget_end_datetime_instance(int yac_instance_id) {
1064
1065 return
1067 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id"));
1068}
1069
1075
1076/* ---------------------------------------------------------------------- */
1077
1078/* The YAC version number is provided in version.h
1079 */
1080
1081char * yac_cget_version ( void ) {
1082 YAC_ASSERT(yac_version, "yac_version undefined")
1083 return yac_version;
1084}
1085
1086/* ---------------------------------------------------------------------- */
1087
1089 YAC_ASSERT(mpi_handshake_group_name, "mpi_handshake_group_name undefined")
1091}
1092
1093/* ---------------------------------------------------------------------- */
1094
1096 int comp_id, char const * routine) {
1097
1098 struct user_input_data_component * comp_info =
1100
1102 !comp_info->is_preliminary, routine,
1103 "component \"%s\" is only preliminarily defined", comp_info->name);
1104
1106 comp_info->instance != NULL, routine,
1107 "instance of component \"%s\" is already finalized", comp_info->name);
1108
1109 return comp_info;
1110}
1111
1112/* ---------------------------------------------------------------------- */
1113
1115 int points_id, char const * routine) {
1116
1117 struct user_input_data_points * points_info =
1118 yac_unique_id_to_pointer(points_id, "points_id");
1119
1121 !points_info->is_preliminary, routine,
1122 "points \"%s\" are only preliminarily defined",
1123 points_info->name?points_info->name:"(unnamed)");
1124
1125 return points_info;
1126}
1127
1128/* ---------------------------------------------------------------------- */
1129
1130/* c interface routine */
1131
1132void yac_cget_comp_comm ( int comp_id, MPI_Comm *comp_comm ) {
1133
1134 struct user_input_data_component * comp_info =
1135 get_comp_info(comp_id, __func__);
1136
1137 *comp_comm =
1139 comp_info->instance, (char const **)&(comp_info->name), 1);
1140}
1141
1142/* internal routine to serve the Fortran interface */
1143
1144void yac_get_comp_comm_f2c ( int comp_id, MPI_Fint *comp_comm_f ) {
1145
1146 MPI_Comm comp_comm;
1147 yac_cget_comp_comm(comp_id, &comp_comm);
1148
1149 *comp_comm_f = MPI_Comm_c2f(comp_comm);
1150}
1151
1152/* internal routine to serve the Python interface */
1153
1155 struct user_input_data_component * comp_info =
1156 get_comp_info(comp_id, __func__);
1157
1158 *size = yac_instance_get_comp_size(comp_info->instance, comp_info->name);
1159}
1160
1162 struct user_input_data_component * comp_info =
1163 get_comp_info(comp_id, __func__);
1164
1165 *rank = yac_instance_get_comp_rank(comp_info->instance, comp_info->name);
1166}
1167
1168/* ---------------------------------------------------------------------- */
1169
1170/* c interface routine */
1171
1173 int yac_instance_id,
1174 char const ** comp_names, int num_comps, MPI_Comm * comps_comm) {
1175
1176 *comps_comm =
1178 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id"),
1179 comp_names, (size_t)num_comps);
1180}
1181
1183 const char ** comp_names, int num_comps, MPI_Comm * comps_comm) {
1184
1185 check_default_instance_id(__func__);
1187 default_instance_id, comp_names, num_comps, comps_comm);
1188}
1189
1190/* internal routine to serve the Fortran interface */
1191
1193 int yac_instance_id,
1194 char const ** comp_names, int num_comps, MPI_Fint * comps_comm_f) {
1195
1196 MPI_Comm comps_comm;
1198 yac_instance_id, comp_names, num_comps, &comps_comm);
1199 *comps_comm_f = MPI_Comm_c2f(comps_comm);
1200}
1201
1203 char const ** comp_names, int num_comps, MPI_Fint *comps_comm_f) {
1204
1205 MPI_Comm comps_comm;
1206 yac_cget_comps_comm(comp_names, num_comps, &comps_comm);
1207 *comps_comm_f = MPI_Comm_c2f(comps_comm);
1208}
1209
1210/* ---------------------------------------------------------------------- */
1211
1218 struct yac_instance * instance, char const * name, char const * caller,
1219 int * comp_id) {
1220
1221 struct user_input_data_component * comp_info = NULL;
1222 *comp_id = INT_MAX;
1223
1224 // search for an existing entry with matching instance and name
1225 for (size_t i = 0;
1226 (i < num_global_components) && (comp_info == NULL); ++i) {
1227
1228 if ((global_components[i]->instance == instance) &&
1229 !strcmp(global_components[i]->name, name)) {
1230
1231 comp_info = global_components[i];
1232 *comp_id = yac_lookup_pointer(comp_info);
1233
1235 *comp_id != INT_MAX, caller,
1236 "internal error while accessing component \"%s\"", name)
1237 }
1238 }
1239
1240 // if no matching definition exists, add a new preliminary one
1241 if (comp_info == NULL) {
1242
1243 // creating a new component definition is only allowed if the components
1244 // for the respective instance have not yet been defined
1247 "components have already been defined")
1248
1250 xrealloc(
1252 (num_global_components + 1) * sizeof(*global_components));
1254 xmalloc(1 * sizeof(**global_components));
1259 *comp_id = yac_pointer_to_unique_id(comp_info);
1261 }
1262
1263 return comp_info;
1264}
1265
1267 int yac_instance_id, char const * name, int * comp_id) {
1268
1269 struct yac_instance * instance =
1270 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
1271
1272 YAC_ASSERT(
1274 "components have already been defined");
1275
1276 check_name_string(__func__, name, "component name");
1277
1278 struct user_input_data_component * comp_info =
1280
1281 // ensure that the component is only preliminarily defined
1283 comp_info->is_preliminary, "component \"%s\" is already defined", name);
1284
1285 // completing a preliminary forward declaration (or new non-preliminary entry)
1286 comp_info->is_preliminary = 0;
1287}
1288
1293
1295 int yac_instance_id, char const ** comp_names, int num_comps,
1296 int * comp_ids) {
1297
1298 struct yac_instance * instance =
1299 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
1300
1301 // Registers all provided components as preliminary forward declarations.
1302 // Will cause an error if a component with the same name and instance has
1303 // already been defined (except for preliminary definitions).
1304 for(int i = 0; i < num_comps; ++i) {
1305 yac_cpredef_comp_instance(yac_instance_id, comp_names[i], comp_ids + i);
1306 }
1307
1308 // ensure all preliminary forward-declared components have been resolved
1309 for (size_t i = 0; i < num_global_components; ++i)
1311 global_components[i]->instance != instance ||
1312 !global_components[i]->is_preliminary,
1313 "unresolved preliminary component \"%s\"", global_components[i]->name)
1314
1315 // count predefined components and set their index
1316 size_t comp_counter = 0;
1317 char const ** all_comp_names =
1318 xmalloc(num_global_components * sizeof(*all_comp_names));
1319 for(size_t i = 0; i<num_global_components; ++i){
1320 if(global_components[i]->instance == instance){
1321 all_comp_names[comp_counter] = global_components[i]->name;
1322 comp_counter++;
1323 }
1324 }
1325
1326 yac_instance_def_components(instance, all_comp_names, comp_counter);
1327
1328 free(all_comp_names);
1329}
1330
1332 char const ** comp_names, int num_comps, int * comp_ids ) {
1333
1334 check_default_instance_id(__func__);
1336 default_instance_id, comp_names, num_comps, comp_ids);
1337}
1338
1340 int yac_instance_id, char const * comp_name, int * comp_id ) {
1341
1342 yac_cdef_comps_instance(yac_instance_id, &comp_name, 1, comp_id);
1343}
1344
1345void yac_cdef_comp ( char const * comp_name, int * comp_id ) {
1346
1347 yac_cdef_comps(&comp_name, 1, comp_id);
1348}
1349
1350/* ---------------------------------------------------------------------- */
1351
1359 char const * name, char const * caller, int * point_id) {
1360
1361 struct user_input_data_points * curr_points = NULL;
1362 *point_id = INT_MAX;
1363
1364 // if a name was provided, we check that it is valid and search for an
1365 // existing entry
1366 if (name != NULL) {
1367
1368 check_name_string(caller, name, "point name");
1369
1370 // for all existing points
1371 for (size_t i = 0; (i < num_global_points) && (curr_points == NULL); ++i) {
1372
1373 // if the grid, location and name match
1374 if ((global_points[i]->grid == grid_info) &&
1375 (global_points[i]->location == location) &&
1376 (global_points[i]->name != NULL) &&
1377 !strcmp(global_points[i]->name, name)) {
1378
1379 curr_points = global_points[i];
1380 *point_id = yac_lookup_pointer(curr_points);
1381
1383 *point_id != INT_MAX, caller,
1384 "internal error while accessing point \"%s\" "
1385 "for grid \"%s\" and location \"%s\"", name,
1387 }
1388 }
1389 }
1390
1391 // if no matching definition exists, add a new preliminary one
1392 if (curr_points == NULL) {
1393 curr_points = xmalloc(1 * sizeof(*curr_points));
1394 curr_points->default_mask_id = INT_MAX;
1395 curr_points->grid = grid_info;
1396 curr_points->location = location;
1397 curr_points->coordinates_idx = SIZE_MAX;
1398 curr_points->name = yac_string_dup(name);
1399 curr_points->is_preliminary = 1;
1400
1403 global_points[num_global_points] = curr_points;
1405
1406 *point_id = yac_pointer_to_unique_id(curr_points);
1407 }
1408
1409 return curr_points;
1410}
1411
1414 yac_coordinate_pointer coordinates, char const * name,
1415 char const * caller) {
1416
1417 struct yac_basic_grid * grid = grid_info->grid;
1418 int point_id;
1419 struct user_input_data_points * curr_points =
1421 grid_info, location, name, caller, &point_id);
1422
1423 // ensure that the point is only preliminarily defined
1425 curr_points->is_preliminary, caller,
1426 "duplicate point name \"%s\" for grid \"%s\" and location \"%s\"",
1428
1429 // set the coordinates and mark the point as non-preliminary
1430 curr_points->coordinates_idx =
1432 curr_points->is_preliminary = 0;
1433
1434 return point_id;
1435}
1436
1437/* ---------------------------------------------------------------------- */
1438
1440 double const * x_vertices, size_t count, char const * routine_name) {
1441
1442 for (size_t i = 0; i < count; ++i)
1444 (x_vertices[i] >= -4.0 * M_PI) && (x_vertices[i] <= 4.0 * M_PI),
1445 routine_name, "x_vertices[%zu] = %lf outside of valid range [-4*PI;4*PI]",
1446 i, x_vertices[i]);
1447}
1448
1450 double const * y_vertices, size_t count, char const * routine_name) {
1451
1452 for (size_t i = 0; i < count; ++i)
1454 (y_vertices[i] >= - (M_PI_2 + 1e-5)) &&
1455 (y_vertices[i] <= (M_PI_2 + 1e-5)), routine_name,
1456 "y_vertices[%zu] = %.10lf outside of valid range [-PI/2;PI/2]",
1457 i, y_vertices[i]);
1458}
1459
1461 int *cell_to_vertex, int *num_vertices_per_cell, int nbr_cells,
1462 int nbr_vertices, char const * routine_name) {
1463
1464 size_t count = 0;
1465 for (int i = 0; i < nbr_cells; ++i) {
1467 num_vertices_per_cell[i] >= 0, routine_name,
1468 "num_vertices_per_cell[%d] = %d ", i, num_vertices_per_cell[i]);
1469 count += num_vertices_per_cell[i];
1470 }
1471 for (size_t i = 0; i < count; ++i)
1473 (cell_to_vertex[i] >= 0) && (cell_to_vertex[i] < nbr_vertices),
1474 routine_name,
1475 "cell_to_vertex[%zu] = %d invalid value (nbr_vertices = %d)",
1476 i, cell_to_vertex[i], nbr_vertices);
1477}
1478
1480 int *cell_to_edge, int *num_edges_per_cell, int nbr_cells,
1481 int nbr_edges, char const * routine_name) {
1482
1483 size_t count = 0;
1484 for (int i = 0; i < nbr_cells; ++i) {
1486 num_edges_per_cell[i] >= 0, routine_name, "num_edges_per_cell[%d] = %d ",
1487 i, num_edges_per_cell[i]);
1488 count += num_edges_per_cell[i];
1489 }
1490 for (size_t i = 0; i < count; ++i)
1492 (cell_to_edge[i] >= 0) && (cell_to_edge[i] < nbr_edges), routine_name,
1493 "cell_to_edge[%zu] = %d invalid value (nbr_edges = %d)",
1494 i, cell_to_edge[i], nbr_edges);
1495}
1496
1497/* ---------------------------------------------------------------------- */
1498
1500 int const *nbr_points,
1501 int const located,
1502 double const *x_points,
1503 double const *y_points,
1504 char const * name,
1505 int *point_id ) {
1506
1507 enum yac_location location = yac_get_location(located);
1509 get_grid_info(grid_id, __func__, 0);
1510 struct yac_basic_grid * grid = grid_info->grid;
1511
1512 YAC_ASSERT(
1514 "edge-location is not supported, use yac_cdef_points_unstruct instead.");
1515
1516 size_t data_size = yac_basic_grid_get_data_size(grid, location);
1517
1519 ((size_t)nbr_points[0] * (size_t)nbr_points[1]) == data_size,
1520 "nbr_points does not match with grid. "
1521 "Given nbr_points[0] * nbr_points[1] != Expected (%zu*%zu != %zu)",
1522 (size_t)nbr_points[0], (size_t)nbr_points[1], data_size);
1523
1525 x_points, (size_t)(nbr_points[0]), __func__);
1527 y_points, (size_t)(nbr_points[1]), __func__);
1528
1529 yac_coordinate_pointer coordinates =
1530 xmalloc(data_size * sizeof(*coordinates));
1531 for (int i = 0, k = 0; i < nbr_points[1]; ++i)
1532 for (int j = 0; j < nbr_points[0]; ++j, ++k)
1533 LLtoXYZ(x_points[j], y_points[i], coordinates[k]);
1534
1535 *point_id =
1537 grid_info, location, coordinates, name, "yac_cdef_points_reg2d_named");
1538}
1539
1541 int const *nbr_points,
1542 int const located,
1543 double const *x_points,
1544 double const *y_points,
1545 int *point_id ) {
1546
1548 grid_id, nbr_points, located, x_points, y_points, NULL, point_id);
1549}
1550
1551/* ---------------------------------------------------------------------- */
1552
1554 int const *nbr_points,
1555 int const located,
1556 double const *x_points,
1557 double const *y_points,
1558 char const * name,
1559 int *point_id ) {
1560
1561 enum yac_location location = yac_get_location(located);
1563 get_grid_info(grid_id, __func__, 0);
1564 struct yac_basic_grid * grid = grid_info->grid;
1565
1566 YAC_ASSERT(
1568 "edge-location is not supported, use yac_cdef_points_unstruct instead.");
1569
1570 size_t data_size = yac_basic_grid_get_data_size(grid, location);
1571
1573 ((size_t)nbr_points[0] * (size_t)nbr_points[1]) == data_size,
1574 "nbr_points does not match with grid. "
1575 "Given nbr_points[0] * nbr_points[1] != Expected (%zu*%zu != %zu)",
1576 (size_t)nbr_points[0], (size_t)nbr_points[1], data_size);
1577
1579 x_points, (size_t)(nbr_points[0]), __func__);
1581 y_points, (size_t)(nbr_points[1]), __func__);
1582
1583 yac_coordinate_pointer coordinates =
1584 xmalloc(data_size * sizeof(*coordinates));
1585 for (int i = 0, k = 0; i < nbr_points[1]; ++i)
1586 for (int j = 0; j < nbr_points[0]; ++j, ++k)
1587 LLtoXYZ(x_points[k], y_points[k], coordinates[k]);
1588
1589 *point_id =
1591 grid_info, location, coordinates, name, "yac_cdef_points_curve2d_named");
1592}
1593
1595 int const *nbr_points,
1596 int const located,
1597 double const *x_points,
1598 double const *y_points,
1599 int *point_id ) {
1600
1602 grid_id, nbr_points, located, x_points, y_points, NULL, point_id);
1603}
1604
1605/* ---------------------------------------------------------------------- */
1606
1608 int const nbr_points,
1609 int const located,
1610 double const *x_points,
1611 double const *y_points,
1612 char const * name,
1613 int *point_id ) {
1614
1615 enum yac_location location = yac_get_location(located);
1617 get_grid_info(grid_id, __func__, 0);
1618 struct yac_basic_grid * grid = grid_info->grid;
1619
1621 (size_t)nbr_points == yac_basic_grid_get_data_size(grid, location),
1622 "nbr_points does not match with grid. "
1623 "Given nbr_points != Expected (%zu != %zu)",
1624 (size_t)nbr_points, yac_basic_grid_get_data_size(grid, location));
1625
1626 check_x_vertices(x_points, (size_t)nbr_points, __func__);
1627 check_y_vertices(y_points, (size_t)nbr_points, __func__);
1628
1629 yac_coordinate_pointer coordinates =
1630 xmalloc((size_t)nbr_points * sizeof(*coordinates));
1631 for (int i = 0; i < nbr_points; ++i)
1632 LLtoXYZ(x_points[i], y_points[i], coordinates[i]);
1633
1634 *point_id =
1636 grid_info, location, coordinates, name, "yac_cdef_points_unstruct_named");
1637}
1638
1640 int const nbr_points,
1641 int const located,
1642 double const *x_points,
1643 double const *y_points,
1644 int *point_id ) {
1645
1647 grid_id, nbr_points, located, x_points, y_points, NULL, point_id);
1648}
1649
1650/* ---------------------------------------------------------------------- */
1651
1653 int const *nbr_points,
1654 int const located,
1655 double const *x_points,
1656 double const *y_points,
1657 double x_north_pole,
1658 double y_north_pole,
1659 char const * name,
1660 int *point_id ) {
1661
1662 enum yac_location location = yac_get_location(located);
1664 get_grid_info(grid_id, __func__, 0);
1665 struct yac_basic_grid * grid = grid_info->grid;
1666
1667 YAC_ASSERT(
1669 "edge-location is not supported, use yac_cdef_points_unstruct instead.");
1670
1671 size_t data_size = yac_basic_grid_get_data_size(grid, location);
1672
1674 ((size_t)nbr_points[0] * (size_t)nbr_points[1]) == data_size,
1675 "nbr_points does not match with grid. "
1676 "Given nbr_points[0] * nbr_points[1] != Expected (%zu*%zu != %zu)",
1677 (size_t)nbr_points[0], (size_t)nbr_points[1], data_size);
1678
1680 x_points, (size_t)(nbr_points[0]), __func__);
1682 y_points, (size_t)(nbr_points[1]), __func__);
1683
1684 yac_coordinate_pointer coordinates =
1685 xmalloc(data_size * sizeof(*coordinates));
1686 for (int i = 0, k = 0; i < nbr_points[1]; ++i)
1687 for (int j = 0; j < nbr_points[0]; ++j, ++k)
1688 LLtoXYZ(x_points[j], y_points[i], coordinates[k]);
1689
1690 double north_pole[3];
1691 LLtoXYZ(x_north_pole, y_north_pole, north_pole);
1692 yac_rotate_coordinates(coordinates, data_size, north_pole);
1693
1694 *point_id =
1696 grid_info, location, coordinates, name,
1697 "yac_cdef_points_reg2d_rot_named");
1698}
1699
1701 int const *nbr_points,
1702 int const located,
1703 double const *x_points,
1704 double const *y_points,
1705 double x_north_pole,
1706 double y_north_pole,
1707 int *point_id ) {
1708
1710 grid_id, nbr_points, located, x_points, y_points,
1711 x_north_pole, y_north_pole, NULL, point_id);
1712}
1713
1714/* ---------------------------------------------------------------------- */
1715
1723 char const * name, char const * caller, int * mask_id) {
1724
1725 struct user_input_data_masks * curr_mask = NULL;
1726 *mask_id = INT_MAX;
1727
1728 // if a name was provided, we check that it is valid and search for an
1729 // existing entry
1730 if (name != NULL) {
1731
1732 check_name_string(caller, name, "mask name");
1733
1734 // for all existing masks
1735 for (size_t i = 0; (i < num_global_masks) && (curr_mask == NULL); ++i) {
1736
1737 // if the grid, location and name match
1738 if ((global_masks[i]->grid == grid_info) &&
1739 (global_masks[i]->location == location) &&
1740 (global_masks[i]->name != NULL) &&
1741 !strcmp(global_masks[i]->name, name)) {
1742
1743 curr_mask = global_masks[i];
1744 *mask_id = yac_lookup_pointer(curr_mask);
1745
1747 *mask_id != INT_MAX, caller,
1748 "internal error while accessing mask \"%s\" "
1749 "for grid \"%s\" and location \"%s\"", name,
1751 }
1752 }
1753 }
1754
1755 // if no matching definition exists, add a new preliminary one
1756 if (curr_mask == NULL) {
1757 curr_mask = xmalloc(1 * sizeof(*curr_mask));
1758 curr_mask->grid = grid_info;
1759 curr_mask->location = location;
1760 curr_mask->masks_idx = SIZE_MAX;
1761 curr_mask->name = yac_string_dup(name);
1762 curr_mask->is_preliminary = 1;
1763
1764 global_masks =
1766 global_masks[num_global_masks] = curr_mask;
1768
1769 *mask_id = yac_pointer_to_unique_id(curr_mask);
1770 }
1771
1772 return curr_mask;
1773}
1774
1777 int const * is_valid, size_t nbr_points, char const * name) {
1778
1779 struct yac_basic_grid * grid = grid_info->grid;
1780 int mask_id;
1781 struct user_input_data_masks * curr_mask =
1783 grid_info, location, name, __func__, &mask_id);
1784
1785 // ensure that the mask is only preliminarily defined
1787 curr_mask->is_preliminary,
1788 "duplicate mask name \"%s\" for grid \"%s\" and location \"%s\"",
1790
1791 // set the mask and mark it as non-preliminary
1792 curr_mask->masks_idx =
1793 yac_basic_grid_add_mask(grid, location, is_valid, nbr_points, name);
1794 curr_mask->is_preliminary = 0;
1795
1796 return mask_id;
1797}
1798
1799/* ---------------------------------------------------------------------- */
1800
1802 int const nbr_points,
1803 int const located,
1804 int const * is_valid,
1805 char const * name,
1806 int *mask_id ) {
1807
1808 enum yac_location location = yac_get_location(located);
1810 get_grid_info(grid_id, __func__, 0);
1811 struct yac_basic_grid * grid = grid_info->grid;
1812
1814 (size_t)nbr_points == yac_basic_grid_get_data_size(grid, location),
1815 "nbr_points does not match with grid. "
1816 "Given nbr_points != Expected (%zu != %zu)",
1817 (size_t)nbr_points, yac_basic_grid_get_data_size(grid, location));
1818
1819 *mask_id =
1821 grid_info, location, is_valid, (size_t)nbr_points, name);
1822}
1823
1824void yac_cdef_mask ( int const grid_id,
1825 int const nbr_points,
1826 int const located,
1827 int const * is_valid,
1828 int *mask_id ) {
1829
1830 yac_cdef_mask_named(grid_id, nbr_points, located, is_valid, NULL, mask_id);
1831}
1832
1833void yac_cset_mask ( int const * is_valid, int points_id ) {
1834
1835 struct user_input_data_points * curr_points =
1836 get_points_info(points_id, __func__);
1837
1839 curr_points->default_mask_id == INT_MAX,
1840 "default mask for points \"%s\" has already been set before",
1841 curr_points->name?curr_points->name:"(unnamed)");
1842
1843 struct user_input_data_grid * grid_info = curr_points->grid;
1844 struct yac_basic_grid * grid = grid_info->grid;
1845 enum yac_location location = curr_points->location;
1846 size_t nbr_points = yac_basic_grid_get_data_size(grid, location);
1847
1848 curr_points->default_mask_id =
1849 user_input_data_add_mask(grid_info, location, is_valid, nbr_points, NULL);
1850}
1851
1852/* ---------------------------------------------------------------------- */
1853
1854void yac_cdef_field_mask ( char const * name,
1855 int const comp_id,
1856 int const * point_ids,
1857 int const * mask_ids,
1858 int const num_pointsets,
1859 int collection_size,
1860 const char* timestep,
1861 int time_unit,
1862 int * field_id ) {
1863
1864 YAC_ASSERT(num_pointsets >= 1, "invalid number of pointsets")
1865
1866 YAC_ASSERT(point_ids != NULL, "no point_ids provided")
1867
1869 ((struct user_input_data_points *)
1870 yac_unique_id_to_pointer(point_ids[0], "point_ids[0]"))->grid;
1871 struct yac_basic_grid * curr_grid = grid_info->grid;
1872
1873 struct yac_interp_field interp_fields_buf;
1874 struct yac_interp_field * interp_fields =
1875 (num_pointsets == 1)?
1876 &interp_fields_buf:
1877 xmalloc((size_t)num_pointsets * sizeof(*interp_fields));
1878
1879 for (int i = 0; i < num_pointsets; ++i) {
1880
1881 struct user_input_data_points * curr_points =
1882 get_points_info(point_ids[i], __func__);
1883
1884 YAC_ASSERT(grid_info == curr_points->grid, "grid of point_ids do not match")
1885
1886 size_t masks_idx;
1887 if (mask_ids[i] != INT_MAX) {
1888
1889 struct user_input_data_masks * curr_mask =
1890 yac_unique_id_to_pointer(mask_ids[i], "mask_ids[i]");
1891
1893 !curr_mask->is_preliminary, "mask \"%s\" is only preliminarily defined",
1894 curr_mask->name?curr_mask->name:"(unnamed)");
1895
1897 curr_mask->grid == curr_points->grid,
1898 "grids of mask \"%s\" and points \"%s\" do not match",
1899 curr_mask->name?curr_mask->name:"(unnamed)",
1900 curr_points->name?curr_points->name:"(unnamed)");
1902 curr_mask->location == curr_points->location,
1903 "location of mask \"%s\" and points \"%s\" do not match",
1904 curr_mask->name?curr_mask->name:"(unnamed)",
1905 curr_points->name?curr_points->name:"(unnamed)");
1906 masks_idx = curr_mask->masks_idx;
1907 } else {
1908 masks_idx = SIZE_MAX;
1909 }
1910
1911 interp_fields[i].location = curr_points->location;
1912 interp_fields[i].coordinates_idx = curr_points->coordinates_idx;
1913 interp_fields[i].masks_idx = masks_idx;
1914 }
1915
1916 struct user_input_data_component * comp_info =
1917 get_comp_info(comp_id, __func__);
1918
1919 *field_id =
1922 comp_info->instance, name, comp_info->name,
1923 curr_grid, interp_fields, num_pointsets, collection_size,
1924 yac_time_to_ISO(timestep, (enum yac_time_unit_type)time_unit)));
1925
1926 if (num_pointsets > 1) free(interp_fields);
1927}
1928
1929void yac_cdef_field ( char const * name,
1930 int const comp_id,
1931 int const * point_ids,
1932 int const num_pointsets,
1933 int collection_size,
1934 const char* timestep,
1935 int time_unit,
1936 int * field_id ) {
1937
1938 YAC_ASSERT(num_pointsets >= 1, "invalid number of pointsets")
1939
1940 YAC_ASSERT(point_ids != NULL, "no point_ids provided")
1941
1942 int * mask_ids = xmalloc((size_t)num_pointsets * sizeof(*mask_ids));
1943
1944 for (int i = 0; i < num_pointsets; ++i)
1945 mask_ids[i] =
1946 ((struct user_input_data_points *)
1947 yac_unique_id_to_pointer(point_ids[i], "point_ids[i]"))->
1948 default_mask_id;
1949
1951 name, comp_id, point_ids, mask_ids, num_pointsets,
1952 collection_size, timestep, time_unit, field_id);
1953
1954 free(mask_ids);
1955}
1956
1958 int yac_instance_id, const char* comp_name, const char* grid_name,
1959 const char* field_name, double frac_mask_fallback_value) {
1960 struct yac_instance * instance =
1961 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
1962 struct yac_couple_config * couple_config =
1965 couple_config, comp_name, grid_name, field_name,
1966 frac_mask_fallback_value);
1967}
1968
1970 const char* comp_name, const char* grid_name, const char* field_name,
1971 double frac_mask_fallback_value) {
1972 check_default_instance_id(__func__);
1974 default_instance_id, comp_name, grid_name, field_name,
1975 frac_mask_fallback_value);
1976}
1977
1979 const char* comp_name, const char* metadata) {
1980 struct yac_instance * instance =
1981 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
1982 struct yac_couple_config * couple_config = yac_instance_get_couple_config(instance);
1983 yac_couple_config_set_component_metadata(couple_config, comp_name, metadata);
1984}
1985
1986void yac_cdef_component_metadata(const char* comp_name, const char* metadata) {
1987 check_default_instance_id(__func__);
1989}
1990
1991void yac_cdef_grid_metadata_instance(int yac_instance_id, const char* grid_name,
1992 const char* metadata) {
1993 struct yac_instance * instance =
1994 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
1995 struct yac_couple_config * couple_config
1997 yac_couple_config_set_grid_metadata(couple_config, grid_name, metadata);
1998}
1999
2000void yac_cdef_grid_metadata(const char* grid_name, const char* metadata) {
2001 check_default_instance_id(__func__);
2003}
2004
2005void yac_cdef_field_metadata_instance(int yac_instance_id, const char* comp_name,
2006 const char* grid_name, const char* field_name, const char* metadata) {
2007 struct yac_instance * instance =
2008 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
2009 struct yac_couple_config * couple_config
2011 yac_couple_config_set_field_metadata(couple_config, comp_name, grid_name, field_name, metadata);
2012}
2013
2014void yac_cdef_field_metadata(const char* comp_name, const char* grid_name,
2015 const char* field_name, const char* metadata) {
2016 check_default_instance_id(__func__);
2018 field_name, metadata);
2019}
2020
2021const char* yac_cget_component_metadata_instance(int yac_instance_id,
2022 const char* comp_name) {
2023 struct yac_instance * instance =
2024 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
2025 struct yac_couple_config * couple_config = yac_instance_get_couple_config(instance);
2026 return yac_couple_config_get_component_metadata(couple_config, comp_name);
2027}
2028
2029const char* yac_cget_component_metadata(const char* comp_name) {
2030 check_default_instance_id(__func__);
2032}
2033
2034const char* yac_cget_grid_metadata_instance(int yac_instance_id,
2035 const char* grid_name) {
2036 struct yac_instance * instance =
2037 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
2038 struct yac_couple_config * couple_config = yac_instance_get_couple_config(instance);
2039 return yac_couple_config_get_grid_metadata(couple_config, grid_name);
2040}
2041
2042const char* yac_cget_grid_metadata(const char* grid_name) {
2043 check_default_instance_id(__func__);
2045}
2046
2047const char* yac_cget_field_metadata_instance(int yac_instance_id,
2048 const char* comp_name, const char* grid_name, const char* field_name) {
2049 struct yac_instance * instance =
2050 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
2051 struct yac_couple_config * couple_config = yac_instance_get_couple_config(instance);
2052 return yac_couple_config_get_field_metadata(couple_config, comp_name, grid_name,
2053 field_name);
2054}
2055
2056const char* yac_cget_field_metadata(const char* comp_name, const char* grid_name,
2057 const char* field_name) {
2058 check_default_instance_id(__func__);
2060 grid_name, field_name);
2061}
2062
2064 struct yac_ext_couple_config * ext_couple_config) {
2065 ext_couple_config->weight_file = NULL;
2066 ext_couple_config->weight_file_on_existing =
2068 ext_couple_config->mapping_side = 1;
2069 ext_couple_config->scale_factor = 1.0;
2070 ext_couple_config->scale_summand = 0.0;
2071 ext_couple_config->num_src_mask_names = 0;
2072 ext_couple_config->src_mask_names = NULL;
2073 ext_couple_config->tgt_mask_name = NULL;
2074 ext_couple_config->yaxt_exchanger_name = NULL;
2075 ext_couple_config->collection_selection = NULL;
2076 ext_couple_config->use_raw_exchange = 0;
2077}
2078
2079void yac_cget_ext_couple_config(int * ext_couple_config_id) {
2080
2081 struct yac_ext_couple_config * ext_couple_config =
2082 xmalloc(1 * sizeof(*ext_couple_config));
2083 init_ext_couple_config(ext_couple_config);
2084 *ext_couple_config_id = yac_pointer_to_unique_id(ext_couple_config);
2085}
2086
2088 struct yac_ext_couple_config ext_couple_config) {
2089
2090 free(ext_couple_config.weight_file);
2091 for (size_t i = 0; i < ext_couple_config.num_src_mask_names; ++i)
2092 free(ext_couple_config.src_mask_names[i]);
2093 free(ext_couple_config.src_mask_names);
2094 free(ext_couple_config.tgt_mask_name);
2096 ext_couple_config.collection_selection);
2097 free(ext_couple_config.yaxt_exchanger_name);
2098}
2099
2100void yac_cfree_ext_couple_config(int ext_couple_config_id) {
2101 struct yac_ext_couple_config * ext_couple_config =
2102 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id");
2103 yac_cfree_ext_couple_config_(*ext_couple_config);
2104 free(ext_couple_config);
2105 yac_invalidate_unique_id(ext_couple_config_id);
2106}
2107
2109 struct yac_ext_couple_config * ext_couple_config,
2110 char const * weight_file) {
2111 free(ext_couple_config->weight_file);
2112 ext_couple_config->weight_file =
2113 (weight_file != NULL)?xstrdup(weight_file):NULL;
2114}
2115
2116void yac_cset_ext_couple_config_weight_file(int ext_couple_config_id,
2117 char const * weight_file) {
2119 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id"),
2120 weight_file);
2121}
2122
2123void yac_cget_ext_couple_config_weight_file(int ext_couple_config_id,
2124 char const ** weight_file) {
2125 struct yac_ext_couple_config * ext_couple_config =
2126 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id");
2127 *weight_file = ext_couple_config->weight_file;
2128}
2129
2131 struct yac_ext_couple_config * ext_couple_config,
2137 "\"%d\" is not a valid weight file on existing value "
2138 "(has to be YAC_WGT_ON_EXISTING_ERROR (%d), "
2139 "YAC_WGT_ON_EXISTING_KEEP(%d), or "
2140 "YAC_WGT_ON_EXISTING_OVERWRITE(%d))",
2144}
2145
2147 int ext_couple_config_id, int weight_file_on_existing) {
2149 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id"),
2151}
2152
2154 int ext_couple_config_id, int * weight_file_on_existing) {
2155 struct yac_ext_couple_config * ext_couple_config =
2156 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id");
2158}
2159
2161 struct yac_ext_couple_config * ext_couple_config,
2162 int mapping_side) {
2164 (mapping_side == 0) ||
2165 (mapping_side == 1),
2166 "\"%d\" is not a valid mapping side (has to be 0 or 1)",
2167 mapping_side);
2168 ext_couple_config->mapping_side = mapping_side;
2169}
2170
2171void yac_cset_ext_couple_config_mapping_side(int ext_couple_config_id,
2172 int mapping_side) {
2174 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id"),
2175 mapping_side);
2176}
2177
2178void yac_cget_ext_couple_config_mapping_side(int ext_couple_config_id,
2179 int * mapping_side) {
2180 struct yac_ext_couple_config * ext_couple_config =
2181 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id");
2182 *mapping_side = ext_couple_config->mapping_side;
2183}
2184
2186 struct yac_ext_couple_config * ext_couple_config,
2187 double scale_factor) {
2188 YAC_ASSERT_F(isnormal(scale_factor),
2189 "\"%lf\" is not a valid scale factor", scale_factor);
2190 ext_couple_config->scale_factor = scale_factor;
2191}
2192
2193void yac_cset_ext_couple_config_scale_factor(int ext_couple_config_id,
2194 double scale_factor) {
2196 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id"),
2197 scale_factor);
2198}
2199
2200void yac_cget_ext_couple_config_scale_factor(int ext_couple_config_id,
2201 double * scale_factor) {
2202 struct yac_ext_couple_config * ext_couple_config =
2203 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id");
2204 *scale_factor = ext_couple_config->scale_factor;
2205}
2206
2208 struct yac_ext_couple_config * ext_couple_config,
2209 double scale_summand) {
2210 YAC_ASSERT_F((scale_summand == 0.0) || isnormal(scale_summand),
2211 "\"%lf\" is not a valid scale summand", scale_summand);
2212 ext_couple_config->scale_summand = scale_summand;
2213}
2214
2215void yac_cset_ext_couple_config_scale_summand(int ext_couple_config_id,
2216 double scale_summand) {
2218 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id"),
2220}
2221
2222void yac_cget_ext_couple_config_scale_summand(int ext_couple_config_id,
2223 double * scale_summand) {
2224 struct yac_ext_couple_config * ext_couple_config =
2225 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id");
2226 *scale_summand = ext_couple_config->scale_summand;
2227}
2228
2230 struct yac_ext_couple_config * ext_couple_config,
2231 size_t num_src_mask_names, char const * const * src_mask_names) {
2232 if (ext_couple_config->num_src_mask_names > 0)
2233 for (size_t i = 0; i < ext_couple_config->num_src_mask_names; ++i)
2234 free(ext_couple_config->src_mask_names[i]);
2235 free(ext_couple_config->src_mask_names);
2236 ext_couple_config->num_src_mask_names = num_src_mask_names;
2237 if (num_src_mask_names > 0) {
2238 ext_couple_config->src_mask_names =
2240 for (size_t i = 0; i < num_src_mask_names; ++i)
2241 ext_couple_config->src_mask_names[i] = xstrdup(src_mask_names[i]);
2242 } else ext_couple_config->src_mask_names = NULL;
2243}
2244
2246 int ext_couple_config_id, size_t num_src_mask_names,
2247 char const * const * src_mask_names) {
2249 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id"),
2251}
2252
2254 int ext_couple_config_id, size_t * num_src_mask_names,
2255 char const * const ** src_mask_names) {
2256 struct yac_ext_couple_config * ext_couple_config =
2257 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id");
2258 *num_src_mask_names = ext_couple_config->num_src_mask_names;
2259 *src_mask_names = (char const * const *)ext_couple_config->src_mask_names;
2260}
2261
2263 struct yac_ext_couple_config * ext_couple_config,
2264 char const * tgt_mask_name) {
2265 free(ext_couple_config->tgt_mask_name);
2266 ext_couple_config->tgt_mask_name =
2267 (tgt_mask_name != NULL)?xstrdup(tgt_mask_name):NULL;
2268}
2269
2271 int ext_couple_config_id, char const * tgt_mask_name) {
2273 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id"),
2275}
2276
2278 int ext_couple_config_id, char const ** tgt_mask_name) {
2279 struct yac_ext_couple_config * ext_couple_config =
2280 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id");
2281 *tgt_mask_name = ext_couple_config->tgt_mask_name;
2282}
2283
2285 struct yac_ext_couple_config * ext_couple_config,
2286 char const * yaxt_exchanger_name) {
2287 free(ext_couple_config->yaxt_exchanger_name);
2288 ext_couple_config->yaxt_exchanger_name =
2290}
2291
2293 int ext_couple_config_id, char const * yaxt_exchanger_name) {
2295 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id"),
2297}
2298
2300 int ext_couple_config_id, char const ** yaxt_exchanger_name) {
2301 struct yac_ext_couple_config * ext_couple_config =
2302 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id");
2303 *yaxt_exchanger_name = ext_couple_config->yaxt_exchanger_name;
2304}
2305
2307 struct yac_ext_couple_config * ext_couple_config,
2308 int use_raw_exchange) {
2309 ext_couple_config->use_raw_exchange = use_raw_exchange;
2310}
2311
2313 int ext_couple_config_id, int use_raw_exchange) {
2315 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id"),
2317}
2318
2320 int ext_couple_config_id, int * use_raw_exchange) {
2321 struct yac_ext_couple_config * ext_couple_config =
2322 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id");
2323 *use_raw_exchange = ext_couple_config->use_raw_exchange;
2324}
2325
2327 struct yac_ext_couple_config * ext_couple_config, int collection_size,
2328 int const * collection_indices) {
2330 (collection_size >= 0),
2331 "collection_size has to be non-negative (%d given)",
2333 if (ext_couple_config->collection_selection != NULL) {
2335 ext_couple_config->collection_selection = NULL;
2336 }
2337 // convert collection_indices from int to size_t
2338 size_t * size_t_collection_indices = NULL;
2339 if (collection_size > 0 && collection_indices != NULL) {
2340 size_t_collection_indices =
2341 xmalloc((size_t)collection_size * sizeof(*size_t_collection_indices));
2342 for (int i = 0; i < collection_size; ++i) {
2344 collection_indices[i] >= 0,
2345 "collection_indices[%d] has to be non-negative (%d given)",
2346 i, collection_indices[i]);
2347 size_t_collection_indices[i] = (size_t)collection_indices[i];
2348 }
2349 }
2350 ext_couple_config->collection_selection =
2352 (size_t)collection_size, size_t_collection_indices);
2353 free(size_t_collection_indices);
2354}
2355
2357 int ext_couple_config_id, int collection_size,
2358 int const * collection_indices) {
2360 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id"),
2361 collection_size, collection_indices);
2362}
2363
2365 int ext_couple_config_id,
2366 int * collection_size,
2367 int ** collection_indices) {
2368 struct yac_ext_couple_config * ext_couple_config =
2369 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id");
2370 if (ext_couple_config->collection_selection != NULL) {
2373 ext_couple_config->collection_selection);
2374 size_t const * indices =
2376 ext_couple_config->collection_selection);
2377 if ((*collection_size > 0) && (indices != NULL)) {
2378 int * int_indices =
2379 xmalloc((size_t)(*collection_size) * sizeof(*int_indices));
2380 for (int i = 0; i < *collection_size; ++i) {
2382 indices[i] <= (size_t)INT_MAX,
2383 "collection_indices[%d] value %zu exceeds INT_MAX",
2384 i, indices[i]);
2385 int_indices[i] = (int)indices[i];
2386 }
2387 *collection_indices = int_indices;
2388 } else {
2389 *collection_indices = NULL;
2390 }
2391 } else {
2392 *collection_size = 0;
2393 *collection_indices = NULL;
2394 }
2395}
2396
2398 int yac_instance_id,
2399 char const * src_comp_name, char const * src_grid_name, char const * src_field_name,
2400 char const * tgt_comp_name, char const * tgt_grid_name, char const * tgt_field_name,
2401 char const * coupling_timestep, int time_unit, int time_reduction,
2402 int interp_stack_config_id, int src_lag, int tgt_lag,
2403 struct yac_ext_couple_config * ext_couple_config) {
2404 struct yac_instance * instance =
2405 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
2406 struct yac_interp_stack_config * interp_stack_config =
2408 interp_stack_config_id, "interp_stack_config_id");
2409 char const * coupling_timestep_iso8601 =
2410 yac_time_to_ISO(coupling_timestep, (enum yac_time_unit_type)time_unit);
2411 yac_instance_def_couple(instance,
2412 src_comp_name, src_grid_name, src_field_name,
2413 tgt_comp_name, tgt_grid_name, tgt_field_name,
2414 coupling_timestep_iso8601, time_reduction,
2415 interp_stack_config, src_lag, tgt_lag,
2417 ext_couple_config->mapping_side,
2418 ext_couple_config->scale_factor,
2419 ext_couple_config->scale_summand,
2420 ext_couple_config->num_src_mask_names,
2421 (char const * const *)ext_couple_config->src_mask_names,
2422 ext_couple_config->tgt_mask_name,
2423 ext_couple_config->yaxt_exchanger_name,
2424 ext_couple_config->collection_selection,
2425 ext_couple_config->use_raw_exchange);
2426}
2427
2429 int yac_instance_id,
2430 char const * src_comp_name, char const * src_grid_name, char const * src_field_name,
2431 char const * tgt_comp_name, char const * tgt_grid_name, char const * tgt_field_name,
2432 char const * coupling_timestep, int time_unit, int time_reduction,
2433 int interp_stack_config_id, int src_lag, int tgt_lag,
2434 int ext_couple_config_id) {
2435
2437 yac_instance_id, src_comp_name, src_grid_name, src_field_name,
2438 tgt_comp_name, tgt_grid_name, tgt_field_name, coupling_timestep,
2439 time_unit, time_reduction, interp_stack_config_id, src_lag, tgt_lag,
2440 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id"));
2441}
2442
2444 char const * src_comp_name, char const * src_grid_name, char const * src_field_name,
2445 char const * tgt_comp_name, char const * tgt_grid_name, char const * tgt_field_name,
2446 char const * coupling_timestep, int time_unit, int time_reduction,
2447 int interp_stack_config_id, int src_lag, int tgt_lag,
2448 int ext_couple_config_id) {
2449
2450 check_default_instance_id(__func__);
2452 src_comp_name, src_grid_name, src_field_name,
2453 tgt_comp_name, tgt_grid_name, tgt_field_name, coupling_timestep,
2454 time_unit, time_reduction, interp_stack_config_id, src_lag, tgt_lag,
2455 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id"));
2456}
2457
2459 int yac_instance_id,
2460 char const * src_comp_name, char const * src_grid_name, char const * src_field_name,
2461 char const * tgt_comp_name, char const * tgt_grid_name, char const * tgt_field_name,
2462 char const * coupling_timestep, int time_unit, int time_reduction,
2463 int interp_stack_config_id, int src_lag, int tgt_lag) {
2464
2465 struct yac_ext_couple_config ext_couple_config;
2466 init_ext_couple_config(&ext_couple_config);
2467
2469 yac_instance_id, src_comp_name, src_grid_name, src_field_name,
2470 tgt_comp_name, tgt_grid_name, tgt_field_name, coupling_timestep,
2471 time_unit, time_reduction, interp_stack_config_id, src_lag, tgt_lag,
2472 &ext_couple_config);
2473}
2474
2476 char const * src_comp_name, char const * src_grid_name, char const * src_field_name,
2477 char const * tgt_comp_name, char const * tgt_grid_name, char const * tgt_field_name,
2478 char const * coupling_timestep, int time_unit, int time_reduction,
2479 int interp_stack_config_id, int src_lag, int tgt_lag){
2480
2481 check_default_instance_id(__func__);
2483 src_comp_name, src_grid_name, src_field_name,
2484 tgt_comp_name, tgt_grid_name, tgt_field_name,
2485 coupling_timestep, time_unit, time_reduction, interp_stack_config_id,
2486 src_lag, tgt_lag);
2487}
2488
2490 int yac_instance_id,
2491 char const * src_comp_name, char const * src_grid_name, char const * src_field_name,
2492 char const * tgt_comp_name, char const * tgt_grid_name, char const * tgt_field_name,
2493 char const * coupling_timestep, int time_unit, int time_reduction,
2494 int interp_stack_config_id, int src_lag, int tgt_lag,
2495 char const * weight_file, int weight_file_on_existing, int mapping_side,
2496 double scale_factor, double scale_summand,
2497 int num_src_mask_names, char const * const * src_mask_names,
2498 char const * tgt_mask_name, char const * yaxt_exchanger_name,
2499 int collection_size, int const * collection_indices,
2500 int use_raw_exchange) {
2501
2503 num_src_mask_names >= 0,
2504 "\"%d\" is not a valid number of source mask names", num_src_mask_names)
2506 collection_size >= 0,
2507 "\"%d\" is not a valid collection size", collection_size);
2508
2509 struct yac_ext_couple_config ext_couple_config;
2510 init_ext_couple_config(&ext_couple_config);
2512 &ext_couple_config, weight_file);
2514 &ext_couple_config, weight_file_on_existing);
2516 &ext_couple_config, mapping_side);
2518 &ext_couple_config, scale_factor);
2520 &ext_couple_config, scale_summand);
2522 &ext_couple_config, (size_t)num_src_mask_names, src_mask_names);
2524 &ext_couple_config, tgt_mask_name);
2526 &ext_couple_config, yaxt_exchanger_name);
2527 if (collection_size > 0) {
2529 &ext_couple_config, collection_size, collection_indices);
2530 }
2532 &ext_couple_config, use_raw_exchange);
2533
2535 yac_instance_id, src_comp_name, src_grid_name, src_field_name,
2536 tgt_comp_name, tgt_grid_name, tgt_field_name, coupling_timestep,
2537 time_unit, time_reduction, interp_stack_config_id, src_lag, tgt_lag,
2538 &ext_couple_config);
2539
2540 yac_cfree_ext_couple_config_(ext_couple_config);
2541}
2542
2544 char const * src_comp_name, char const * src_grid_name, char const * src_field_name,
2545 char const * tgt_comp_name, char const * tgt_grid_name, char const * tgt_field_name,
2546 char const * coupling_timestep, int time_unit, int time_reduction,
2547 int interp_stack_config_id, int src_lag, int tgt_lag,
2548 char const * weight_file, int weight_file_on_existing, int mapping_side,
2549 double scale_factor, double scale_summand,
2550 int num_src_mask_names, char const * const * src_mask_names,
2551 char const * tgt_mask_name, char const * yaxt_exchanger_name,
2552 int collection_size, int const * collection_indices, int use_raw_exchange) {
2553
2554 check_default_instance_id(__func__);
2556 src_comp_name, src_grid_name, src_field_name,
2557 tgt_comp_name, tgt_grid_name, tgt_field_name,
2558 coupling_timestep, time_unit, time_reduction, interp_stack_config_id,
2563}
2564
2565/* ---------------------------------------------------------------------- */
2566
2568 int collection_size,
2569 int num_interp_fields,
2570 int const * interp_field_sizes ) {
2571
2572 struct coupling_field * cpl_field =
2574
2578 "mismatching collection sizes for component %s grid %s field %s (%d != %d)",
2582 yac_get_coupling_field_name(cpl_field),
2584
2585 if (num_interp_fields != -1) {
2586
2588 (size_t)num_interp_fields ==
2590 "mismatching number of interp fields "
2591 "for component %s grid %s field %s (%d != %zu)",
2595 yac_get_coupling_field_name(cpl_field),
2597
2598 if (interp_field_sizes) {
2599 for (int interp_field_idx = 0; interp_field_idx < num_interp_fields;
2600 ++interp_field_idx) {
2601
2603 (size_t)interp_field_sizes[interp_field_idx] ==
2605 cpl_field,
2607 cpl_field, (size_t)interp_field_idx)),
2608 "mismatching interp field size "
2609 "for component %s grid %s field %s interp_field_idx %d (%d != %zu)",
2613 yac_get_coupling_field_name(cpl_field),
2614 interp_field_idx,
2615 interp_field_sizes[interp_field_idx],
2617 cpl_field,
2619 cpl_field, (size_t)interp_field_idx)));
2620 }
2621 }
2622 }
2623}
2624
2625/* ---------------------------------------------------------------------- */
2626
2628 int collection_size,
2629 int src_field_buffer_size_ ) {
2630
2631 struct coupling_field * cpl_field =
2633
2637 "mismatching collection sizes for component %s grid %s field %s (%d != %d)",
2641 yac_get_coupling_field_name(cpl_field),
2643
2644 size_t num_src_fields;
2645 size_t const * src_field_buffer_sizes;
2646 size_t src_field_buffer_size = 0;
2648 cpl_field, &num_src_fields, &src_field_buffer_sizes);
2649 for (size_t i = 0; i < num_src_fields; ++i)
2650 src_field_buffer_size += src_field_buffer_sizes[i];
2651
2653 (size_t)src_field_buffer_size_ == src_field_buffer_size,
2654 "mismatching source buffer size "
2655 "for component %s grid %s field %s (%d != %zu)",
2659 yac_get_coupling_field_name(cpl_field),
2660 src_field_buffer_size_, src_field_buffer_size);
2661}
2662
2664 int num_src_fields_,
2665 int collection_size,
2666 int * src_field_buffer_sizes_ ) {
2667
2668 struct coupling_field * cpl_field =
2670
2674 "mismatching collection sizes for component %s grid %s field %s (%d != %d)",
2678 yac_get_coupling_field_name(cpl_field),
2680
2681 size_t num_src_fields;
2682 size_t const * src_field_buffer_sizes;
2684 cpl_field, &num_src_fields, &src_field_buffer_sizes);
2685
2687 (size_t)num_src_fields_ == num_src_fields,
2688 "mismatching number of source fields "
2689 "for component %s grid %s field %s (%d != %zu)",
2693 yac_get_coupling_field_name(cpl_field), num_src_fields_, num_src_fields);
2694
2695 for (size_t i = 0; i < num_src_fields; ++i)
2697 (size_t)src_field_buffer_sizes_[i] == src_field_buffer_sizes[i],
2698 "mismatching source buffer size "
2699 "for component %s grid %s field %s field_idx %zu (%d != %zu)",
2703 yac_get_coupling_field_name(cpl_field),
2704 i, src_field_buffer_sizes_[i], src_field_buffer_sizes[i]);
2705}
2706
2707/* ---------------------------------------------------------------------- */
2708
2710 double * frac_mask_fallback_value,
2711 double * scaling_factor,
2712 double * scaling_summand,
2713 size_t * num_fixed_values,
2714 double ** fixed_values,
2715 size_t ** num_tgt_per_fixed_value,
2716 size_t ** tgt_idx_fixed,
2717 size_t * num_wgt_tgt,
2718 size_t ** wgt_tgt_idx,
2719 size_t ** num_src_per_tgt,
2720 double ** weights,
2721 size_t ** src_field_idx,
2722 size_t ** src_idx,
2723 size_t * num_src_fields,
2724 size_t ** src_field_buffer_size ) {
2725
2726 struct coupling_field * cpl_field =
2728
2731
2746 *src_field_buffer_size = interp_weights_data.src_field_buffer_size;
2747}
2748
2750 double * frac_mask_fallback_value,
2751 double * scaling_factor,
2752 double * scaling_summand,
2753 size_t * num_fixed_values,
2754 double ** fixed_values,
2755 size_t ** num_tgt_per_fixed_value,
2756 size_t ** tgt_idx_fixed,
2757 size_t ** src_indptr_,
2758 double ** weights,
2759 size_t ** src_field_idx,
2760 size_t ** src_idx,
2761 size_t * num_src_fields,
2762 size_t ** src_field_buffer_sizes ) {
2763
2764 size_t num_wgt_tgt;
2765 size_t * num_src_per_tgt;
2766 size_t * wgt_tgt_idx;
2771 src_field_idx, src_idx, num_src_fields, src_field_buffer_sizes);
2772
2773 struct coupling_field * cpl_field =
2775
2778 "target field \"%s\" has more than one interpolation field",
2779 yac_get_coupling_field_name(cpl_field));
2780
2781 size_t field_data_size =
2783 cpl_field,
2785
2786 size_t * src_indptr =
2787 xcalloc((field_data_size + 1), sizeof(*src_indptr));
2788 for (size_t i = 0; i < num_wgt_tgt; ++i)
2789 src_indptr[wgt_tgt_idx[i]] = num_src_per_tgt[i];
2790 size_t total_num_weights = 0;
2791 for (size_t i = 0; i < field_data_size; ++i) {
2792 size_t curr_count = src_indptr[i];
2793 src_indptr[i] = total_num_weights;
2794 total_num_weights += curr_count;
2795 }
2796 src_indptr[field_data_size] = total_num_weights;
2797
2798 // check whether weighted target indices are already in sorted order
2799 int tgt_sorted = 1;
2800 for (size_t i = 1; (i < num_wgt_tgt) && tgt_sorted; ++i)
2801 tgt_sorted = wgt_tgt_idx[i] > wgt_tgt_idx[i-1];
2802
2804 tgt_sorted,
2805 "target indices for field \"%s\" are unsorted, which is unexpected, "
2806 "please contact the author!", yac_get_coupling_field_name(cpl_field));
2807
2808 // The following could should be able to handle the case of unsorted
2809 // target indices. However since I currently not able to write an
2810 // appropriate test, it is commented out.
2811
2812 /*
2813 // sort weight information based on target indices
2814 if (!tgt_sorted) {
2815
2816 double * weights_ = xmalloc(total_num_weights * sizeof(*weights_));
2817 size_t * src_idx_ = xmalloc(total_num_weights * sizeof(*src_idx_));
2818 size_t * src_field_idx_ =
2819 xmalloc(total_num_weights * sizeof(*src_field_idx_));
2820
2821 double * from_weights = *weights;
2822 size_t * from_src_idx = *src_idx;
2823 size_t * from_src_field_idx = *src_field_idx;
2824
2825 for (size_t i = 0; i < num_wgt_tgt; ++i) {
2826
2827 size_t tgt_idx = wgt_tgt_idx[i];
2828 size_t num_src = num_src_per_tgt[i];
2829 size_t offset = src_indptr[tgt_idx];
2830 memcpy(weights_ + offset, from_weights, num_src * sizeof(*weights_));
2831 memcpy(src_idx_ + offset, from_src_idx, num_src * sizeof(*src_idx_));
2832 memcpy(
2833 src_field_idx_ + offset, from_src_field_idx,
2834 num_src * sizeof(*src_field_idx_));
2835 from_weights += num_src;
2836 from_src_idx += num_src;
2837 from_src_field_idx += num_src;
2838 }
2839 free(*weights);
2840 free(*src_idx);
2841 free(*src_field_idx);
2842 *weights = weights_;
2843 *src_idx = src_idx_;
2844 *src_field_idx = src_field_idx_;
2845 }
2846 */
2847
2848 free(num_src_per_tgt);
2849 free(wgt_tgt_idx);
2850
2851 *src_indptr_ = src_indptr;
2852}
2853
2855 int const field_id,
2856 double * frac_mask_fallback_value,
2857 double * scaling_factor,
2858 double * scaling_summand,
2859 size_t * num_fixed_values,
2860 double ** fixed_values,
2861 size_t ** num_tgt_per_fixed_value,
2862 size_t ** tgt_idx_fixed,
2863 size_t ** src_indptr,
2864 double ** weights,
2865 size_t ** src_field_idx,
2866 size_t ** src_idx,
2867 size_t * num_src_fields,
2868 size_t ** src_field_buffer_sizes,
2869 size_t * tgt_field_data_size) {
2870
2871 struct coupling_field * cpl_field =
2873
2876 "target field \"%s\" has more than one interpolation field",
2877 yac_get_coupling_field_name(cpl_field));
2878
2879 *tgt_field_data_size =
2881 cpl_field,
2883
2885 field_id, frac_mask_fallback_value, scaling_factor, scaling_summand,
2886 num_fixed_values, fixed_values, num_tgt_per_fixed_value, tgt_idx_fixed,
2887 src_indptr, weights, src_field_idx, src_idx, num_src_fields,
2888 src_field_buffer_sizes);
2889}
2890
2891/* ---------------------------------------------------------------------- */
2892
2893void yac_cget_action(int field_id, int * action) {
2894
2895 struct coupling_field * cpl_field =
2899
2900 YAC_ASSERT(
2901 (exchange_type == NOTHING) ||
2902 (exchange_type == SOURCE) ||
2903 (exchange_type == TARGET), "invalid field exchange type")
2904
2905 switch(exchange_type) {
2906 default:
2907 case(NOTHING): {
2908
2909 *action = YAC_ACTION_NONE;
2910 break;
2911 }
2912 case(TARGET): {
2913
2914 const enum yac_action_type event_action =
2916 *action = (int)((event_action == RESTART)?GET_FOR_RESTART:event_action);
2917 break;
2918 }
2919 case(SOURCE): {
2920
2921 enum yac_action_type event_action = NONE;
2922 unsigned num_puts = yac_get_coupling_field_num_puts(cpl_field);
2923 for (unsigned put_idx = 0; put_idx < num_puts; ++put_idx)
2924 event_action =
2925 MAX(
2926 event_action,
2928 yac_get_coupling_field_put_op_event(cpl_field, put_idx)));
2929 *action = (int)((event_action == RESTART)?PUT_FOR_RESTART:event_action);
2930 break;
2931 }
2932 }
2933}
2934
2936 struct coupling_field * cpl_field =
2938 return yac_coupling_field_get_datetime(cpl_field);
2939}
2940
2941/* ---------------------------------------------------------------------- */
2942
2943static inline void yac_cupdate_(
2944 struct coupling_field * cpl_field, struct event * event, int is_source) {
2945
2946 const enum yac_action_type action = yac_event_check(event);
2947
2949 (action == NONE) || (action == OUT_OF_BOUND),
2950 "current action of %s field \"%s\" of "
2951 "componente \"%s\" is not YAC_ACTION_NONE or YAC_ACTION_OUT_OF_BOUND",
2952 ((is_source)?"source":"target"), yac_get_coupling_field_name(cpl_field),
2955
2956 if ( action == OUT_OF_BOUND ) {
2957 fputs("WARNING: YAC update action is beyond end of run date!\n", stderr);
2958 fputs("WARNING: YAC update action is beyond end of run date!\n", stdout);
2959 }
2960}
2961
2963
2964 struct coupling_field * cpl_field =
2968
2969 YAC_ASSERT(
2970 (exchange_type == NOTHING) ||
2971 (exchange_type == SOURCE) ||
2972 (exchange_type == TARGET), "invalid field exchange type")
2973
2974 int h_pak_trace =
2977
2978 switch(exchange_type) {
2979 default:
2980 case(NOTHING): {
2981 break;
2982 }
2983 case(TARGET): {
2984
2986 cpl_field, yac_get_coupling_field_get_op_event(cpl_field), 0);
2987 break;
2988 }
2989 case(SOURCE): {
2990
2991 unsigned num_puts = yac_get_coupling_field_num_puts(cpl_field);
2992 for (unsigned put_idx = 0; put_idx < num_puts; ++put_idx)
2994 cpl_field,
2995 yac_get_coupling_field_put_op_event(cpl_field, put_idx), 1);
2996 break;
2997 }
2998 }
2999
3000 trace_coupling_stop(field_id, h_pak_trace);
3001}
3002
3003/* ---------------------------------------------------------------------- */
3004
3006 int const field_id,
3007 int const collection_size,
3008 double *recv_field) { // recv_field[collection_size][Points]
3009
3010 struct coupling_field * cpl_field =
3012
3013 YAC_ASSERT(
3015 "invalid number of interpolation fields (should be one)")
3016
3017 enum yac_location location =
3019 size_t data_size =
3021
3022 double ** recv_field_ = xmalloc(collection_size * sizeof(*recv_field_));
3023
3024 for (int i = 0; i < collection_size; ++i) {
3025 recv_field_[i] = recv_field;
3026 recv_field += data_size;
3027 }
3028
3029 return recv_field_;
3030}
3031
3033 int field_id, size_t collection_size, double *src_field_buffer) {
3034 // src_field_buffer
3035 // [collection_size *
3036 // SUM(src_field_buffer_sizes[0:num_src_fields-1])]
3037
3038 struct coupling_field * cpl_field =
3040
3041 size_t num_src_fields;
3042 size_t const * src_field_buffer_sizes;
3044 cpl_field, &num_src_fields, &src_field_buffer_sizes);
3045
3046 double *** src_field_buffer_ =
3047 xmalloc(collection_size * sizeof(*src_field_buffer_));
3048 double ** src_field_buffer__ =
3049 xmalloc(collection_size * num_src_fields * sizeof(*src_field_buffer__));
3050
3051 for (size_t i = 0; i < collection_size; ++i) {
3052 src_field_buffer_[i] =
3053 src_field_buffer__ + i * num_src_fields;
3054 for (size_t j = 0; j < num_src_fields; ++j) {
3055 src_field_buffer_[i][j] = src_field_buffer;
3056 src_field_buffer += src_field_buffer_sizes[j];
3057 }
3058 }
3059
3060 return src_field_buffer_;
3061}
3062
3064 int field_id,
3065 size_t collection_size,
3066 double **src_field_buffer) { // src_field_buffer
3067 // [collection_size*num_src_points]
3068 // [src_field_buffer_sizes[src_field_idx]]
3069
3070 struct coupling_field * cpl_field =
3072
3073 size_t num_src_fields;
3074 size_t const * src_field_buffer_sizes;
3076 cpl_field, &num_src_fields, &src_field_buffer_sizes);
3077
3078 double *** src_field_buffer_ =
3079 xmalloc(collection_size * sizeof(*src_field_buffer_));
3080 double ** src_field_buffer__ =
3081 xmalloc(collection_size * num_src_fields * sizeof(*src_field_buffer__));
3082
3083 for (size_t i = 0, k = 0; i < collection_size; ++i) {
3084 src_field_buffer_[i] =
3085 src_field_buffer__ + i * num_src_fields;
3086 for (size_t j = 0; j < num_src_fields; ++j, ++k)
3087 src_field_buffer_[i][j] = src_field_buffer[k];
3088 }
3089
3090 return src_field_buffer_;
3091}
3092
3094 int const field_id, int collection_size, int *info, int *ierr) {
3095
3096 *info = (int)NONE;
3097 *ierr = 0;
3098
3099 struct coupling_field * cpl_field =
3101
3104
3106 exchange_type != SOURCE, "get was called for field \"%s\" which "
3107 "is configured as source", yac_get_coupling_field_name(cpl_field));
3108
3109 if (exchange_type != TARGET) return NULL;
3110
3111 /* --------------------------------------------------------------------
3112 Check for restart and coupling events
3113 -------------------------------------------------------------------- */
3114
3115 struct event * event = yac_get_coupling_field_get_op_event(cpl_field);
3117 *info = (int)((action == RESTART)?GET_FOR_RESTART:action);
3118
3119 /* --------------------------------------------------------------------
3120 add one model time step (as provided in coupling configuration) to
3121 the current event date
3122 -------------------------------------------------------------------- */
3123
3125
3126 /* ------------------------------------------------------------------
3127 return in case we are already beyond the end of the run
3128 ------------------------------------------------------------------ */
3129
3130 if ( action == OUT_OF_BOUND ) {
3131
3132 fputs("WARNING: YAC get action is beyond end of run date!\n", stderr);
3133 fputs("WARNING: YAC get action is beyond end of run date!\n", stdout);
3134
3135 return NULL;
3136 }
3137
3138 /* --------------------------------------------------------------------
3139 start actions
3140 -------------------------------------------------------------------- */
3141
3142 if ( action == NONE ) return NULL;
3143
3144 YAC_ASSERT(
3145 (size_t)collection_size ==
3147 "collection size does not match with coupling configuration.")
3148
3149 return
3153}
3154
3155// basic internal routine for get operation
3156static void yac_get ( int const field_id,
3157 int collection_size,
3158 double ** recv_field,
3159 int is_async,
3160 int *info,
3161 int *ierr ) {
3162
3163 int h_pak_trace =
3165 field_id,
3168
3170
3171 struct yac_interpolation * interpolation =
3173
3174 if ((*ierr == 0) && (interpolation != NULL)) {
3175 if (is_async)
3176 yac_interpolation_execute_get_async(interpolation, recv_field);
3177 else
3178 yac_interpolation_execute_get(interpolation, recv_field);
3179 }
3180
3181 trace_coupling_stop(field_id, h_pak_trace);
3182}
3183
3184// basic internal routine for get operation with raw data exchange
3186 int const collection_size,
3187 double ***src_field_buffer,
3188 double ***src_frac_mask_buffer,
3189 int is_async,
3190 int *info,
3191 int *ierror ) {
3192
3193
3195
3196 struct coupling_field * cpl_field =
3198 enum yac_field_exchange_type field_role =
3200
3202 field_role != INVALID, "invalid field exchange type for field \"%s\"",
3204 )
3205
3206 if (field_role == NOTHING) return;
3207
3209 field_role != SOURCE, "field \"%s\" is source",
3210 yac_get_coupling_field_name(cpl_field));
3211
3212 int h_pak_trace =
3214 field_id,
3217
3218 struct yac_interpolation_exchange * interpolation_exchange =
3220
3222 size_t num_src_fields;
3224 cpl_field, &num_src_fields, NULL);
3225
3227 with_frac_mask == (src_frac_mask_buffer != NULL),
3228 "target field \"%s\" was configured %s support for fractional masking, "
3229 "but %s source fractional mask buffer was provided to this call",
3230 yac_get_coupling_field_name(cpl_field), with_frac_mask?"with":"without",
3231 with_frac_mask?"no":"a")
3232
3233 double ** src_field_buffer_ =
3234 xmalloc(
3235 (size_t)(1 + with_frac_mask) * (size_t)collection_size * num_src_fields *
3236 sizeof(*src_field_buffer_));
3237
3238 size_t k = 0;
3239 for (int i = 0; i < collection_size; ++i)
3240 for (size_t j = 0; j < num_src_fields; ++j, ++k)
3241 src_field_buffer_[k] = src_field_buffer[i][j];
3242 if (with_frac_mask)
3243 for (int i = 0; i < collection_size; ++i)
3244 for (size_t j = 0; j < num_src_fields; ++j, ++k)
3245 src_field_buffer_[k] = src_frac_mask_buffer[i][j];
3246
3247 if ((*ierror == 0) && (interpolation_exchange != NULL)) {
3248 if (is_async)
3250 interpolation_exchange, src_field_buffer_, "yac_get_raw_frac");
3251 else
3253 interpolation_exchange, src_field_buffer_, "yac_get_raw_frac");
3254 }
3255 free(src_field_buffer_);
3256
3257 trace_coupling_stop(field_id, h_pak_trace);
3258}
3259
3260/* --------------- user interface routines for get operation --------------- */
3261
3262void yac_get_ ( int const field_id,
3263 int const collection_size,
3264 double *recv_field,
3265 int is_async,
3266 int *info,
3267 int *ierr ) {
3268
3270
3271 /* Needed to transfer from Fortran data structure to C */
3272 double ** recv_field_ =
3274
3275 yac_get(field_id, collection_size, recv_field_, is_async, info, ierr);
3276
3277 free(recv_field_);
3278}
3279
3280void yac_cget_ ( int const field_id,
3281 int const collection_size,
3282 double *recv_field, // recv_field[collection_size*Points]
3283 int *info,
3284 int *ierr ) {
3285
3286 yac_get_(field_id, collection_size, recv_field, 0, info, ierr);
3287}
3288
3289void yac_cget_async_ ( int const field_id,
3290 int const collection_size,
3291 double *recv_field, // recv_field[collection_size*Points]
3292 int *info,
3293 int *ierr ) {
3294
3295 yac_get_(field_id, collection_size, recv_field, 1, info, ierr);
3296}
3297
3298void yac_cget ( int const field_id,
3299 int collection_size,
3300 double ** recv_field, // recv_field[collection_size][Points]
3301 int *info,
3302 int *ierr ) {
3303
3304 yac_get(field_id, collection_size, recv_field, 0, info, ierr);
3305}
3306
3307void yac_cget_async ( int const field_id,
3308 int collection_size,
3309 double ** recv_field, // recv_field[collection_size][Points]
3310 int *info,
3311 int *ierr ) {
3312
3313 yac_get(field_id, collection_size, recv_field, 1, info, ierr);
3314}
3315
3316/* ------- user interface routines for get operation with raw exchange ----- */
3317
3319 int const collection_size,
3320 double *src_field_buffer, // src_field_buffer
3321 // [collection_size *
3322 // SUM(src_field_buffer_sizes[0:num_src_fields-1])]
3323 double *src_frac_mask_buffer, // src_frac_mask_buffer
3324 // [collection_size *
3325 // SUM(src_field_buffer_sizes[0:num_src_fields-1])]
3326 int is_async,
3327 int *info,
3328 int *ierr ) {
3329
3331
3332 /* Needed to transfer from Fortran data structure to C */
3333 double *** src_field_buffer_ =
3335 field_id, collection_size, src_field_buffer);
3336 double *** src_frac_mask_buffer_ =
3337 src_frac_mask_buffer?
3339 field_id, collection_size, src_frac_mask_buffer):NULL;
3340
3342 field_id, collection_size, src_field_buffer_, src_frac_mask_buffer_,
3343 is_async, info, ierr);
3344
3345 if (src_frac_mask_buffer) {
3346 free(src_frac_mask_buffer_[0]);
3347 free(src_frac_mask_buffer_);
3348 }
3349 free(src_field_buffer_[0]);
3350 free(src_field_buffer_);
3351}
3352
3353static void yac_get_raw_frac_ptr_ ( int const field_id,
3354 int const collection_size,
3355 double **src_field_buffer, // src_field_buffer
3356 // [collection_size*num_src_fields]
3357 // [src_field_buffer_size[src_field_idx]]
3358 double **src_frac_mask_buffer, // src_frac_mask_buffer
3359 // [collection_size*num_src_fields]
3360 // [src_field_buffer_size[src_field_idx]]
3361 int is_async,
3362 int *info,
3363 int *ierr ) {
3364
3366
3367 /* Needed to transfer from Fortran data structure to C */
3368 double *** src_field_buffer_ =
3370 field_id, (size_t)collection_size, src_field_buffer);
3371 double *** src_frac_mask_buffer_ =
3372 src_frac_mask_buffer?
3374 field_id, (size_t)collection_size, src_frac_mask_buffer):NULL;
3375
3377 field_id, collection_size, src_field_buffer_, src_frac_mask_buffer_,
3378 is_async, info, ierr);
3379
3380 if (src_frac_mask_buffer) {
3381 free(src_frac_mask_buffer_[0]);
3382 free(src_frac_mask_buffer_);
3383 }
3384 free(src_field_buffer_[0]);
3385 free(src_field_buffer_);
3386}
3387
3388void yac_cget_raw_ ( int const field_id,
3389 int const collection_size,
3390 double *src_field_buffer, // src_field_buffer
3391 // [collection_size *
3392 // SUM(src_field_buffer_size[src_field_idx]]
3393 int *info,
3394 int *ierr ) {
3395
3397 field_id, collection_size, src_field_buffer, NULL, 0, info, ierr);
3398}
3399
3401 int const collection_size,
3402 double *src_field_buffer, // src_field_buffer
3403 // [collection_size *
3404 // SUM(src_field_buffer_size[src_field_idx]]
3405 double *src_frac_mask_buffer, // src_frac_mask_buffer
3406 // [collection_size *
3407 // SUM(src_field_buffer_size[src_field_idx]]
3408 int *info,
3409 int *ierr ) {
3410
3412 field_id, collection_size, src_field_buffer, src_frac_mask_buffer,
3413 0, info, ierr);
3414}
3415
3417 int const collection_size,
3418 double **src_field_buffer, // src_field_buffer
3419 // [collection_size*num_src_fields]
3420 // [src_field_buffer_size[src_field_idx]]
3421 int *info,
3422 int *ierr ) {
3423
3425 field_id, collection_size, src_field_buffer, NULL, 0, info, ierr);
3426}
3427
3429 int const collection_size,
3430 double **src_field_buffer, // src_field_buffer
3431 // [collection_size*num_src_fields]
3432 // [src_field_buffer_size[src_field_idx]]
3433 double **src_frac_mask_buffer, // src_frac_mask_buffer
3434 // [collection_size]
3435 // [num_src_fields]
3436 // [src_field_buffer_size[src_field_idx]]
3437 int *info,
3438 int *ierr ) {
3439
3441 field_id, collection_size, src_field_buffer, src_frac_mask_buffer,
3442 0, info, ierr);
3443}
3444
3446 int const collection_size,
3447 double *src_field_buffer, // src_field_buffer
3448 // [collection_size *
3449 // SUM(src_field_buffer_sizes[0:num_src_fields-1])]
3450 int *info,
3451 int *ierr ) {
3452
3454 field_id, collection_size, src_field_buffer, NULL, 1, info, ierr);
3455}
3456
3458 int const collection_size,
3459 double *src_field_buffer, // src_field_buffer
3460 // [collection_size *
3461 // SUM(src_field_buffer_sizes[0:num_src_fields-1])]
3462 double *src_frac_mask_buffer, // src_frac_mask_buffer
3463 // [collection_size *
3464 // SUM(src_field_buffer_sizes[0:num_src_fields-1])]
3465 int *info,
3466 int *ierr ) {
3467
3469 field_id, collection_size, src_field_buffer, src_frac_mask_buffer,
3470 1, info, ierr);
3471}
3472
3474 int const collection_size,
3475 double **src_field_buffer, // src_field_buffer
3476 // [collection_size*num_src_fields]
3477 // [src_field_buffer_size[src_field_idx]]
3478 int *info,
3479 int *ierr ) {
3480
3482 field_id, collection_size, src_field_buffer, NULL, 1, info, ierr);
3483}
3484
3486 int const collection_size,
3487 double **src_field_buffer, // src_field_buffer
3488 // [collection_size*num_src_fields]
3489 // [src_field_buffer_size[src_field_idx]]
3490 double **src_frac_mask_buffer, // src_frac_mask_buffer
3491 // [collection_size*num_src_fields]
3492 // [src_field_buffer_size[src_field_idx]]
3493 int *info,
3494 int *ierr ) {
3495
3497 field_id, collection_size, src_field_buffer, src_frac_mask_buffer,
3498 1, info, ierr);
3499}
3500
3501void yac_cget_raw ( int const field_id,
3502 int collection_size,
3503 double ***src_field_buffer, // src_field_buffer
3504 // [collection_size]
3505 // [num_src_fields]
3506 // [src_field_buffer_size[src_field_idx]]
3507 int *info,
3508 int *ierr ) {
3509
3511 field_id, collection_size, src_field_buffer, NULL, 0, info, ierr);
3512}
3513
3515 int collection_size,
3516 double ***src_field_buffer, // src_field_buffer
3517 // [collection_size]
3518 // [num_src_fields]
3519 // [src_field_buffer_size[src_field_idx]]
3520 int *info,
3521 int *ierr ) {
3522
3523
3525 field_id, collection_size, src_field_buffer, NULL, 1, info, ierr);
3526}
3527
3529 int collection_size,
3530 double ***src_field_buffer, // src_field_buffer
3531 // [collection_size]
3532 // [num_src_fields]
3533 // [src_field_buffer_size[src_field_idx]]
3534 double ***src_frac_mask_buffer, // src_frac_mask_buffer
3535 // [collection_size]
3536 // [num_src_fields]
3537 // [src_field_buffer_size[src_field_idx]]
3538 int *info,
3539 int *ierr ) {
3540
3542 field_id, collection_size, src_field_buffer, src_frac_mask_buffer,
3543 0, info, ierr);
3544}
3545
3547 int collection_size,
3548 double ***src_field_buffer, // src_field_buffer
3549 // [collection_size]
3550 // [num_src_fields]
3551 // [src_field_buffer_size[src_field_idx]]
3552 double ***src_frac_mask_buffer, // src_frac_mask_buffer
3553 // [collection_size]
3554 // [num_src_fields]
3555 // [src_field_buffer_size[src_field_idx]]
3556 int *info,
3557 int *ierr ) {
3558
3560 field_id, collection_size, src_field_buffer, src_frac_mask_buffer,
3561 1, info, ierr);
3562}
3563
3564/* ---------------------------------------------------------------------- */
3565
3566static double *** get_send_field_pointers(
3567 int field_id, size_t collection_size, double * send_field) {
3568 // send_field[collection_size][nPointSets][Points]
3569
3570 struct coupling_field * cpl_field =
3572
3573 size_t num_interp_fields =
3575
3576 size_t * data_sizes = xmalloc(num_interp_fields * sizeof(*data_sizes));
3577
3578 for (size_t i = 0; i < num_interp_fields; i++) {
3579
3580 enum yac_location location =
3582 data_sizes[i] = yac_coupling_field_get_data_size(cpl_field, location);
3583 }
3584
3585 double ***send_field_ =
3586 xmalloc(collection_size * sizeof(*send_field_));
3587 double **send_field__ =
3588 xmalloc(collection_size * num_interp_fields * sizeof(*send_field__));
3589
3590 for (size_t i = 0; i < collection_size; ++i) {
3591 send_field_[i] = send_field__ + i * num_interp_fields;
3592 for (size_t j = 0; j < num_interp_fields; ++j) {
3593 send_field_[i][j] = send_field;
3594 send_field += data_sizes[j];
3595 }
3596 }
3597 free(data_sizes);
3598 return send_field_;
3599}
3600
3601void yac_cput_ ( int const field_id,
3602 int const collection_size,
3603 double *send_field, // send_field[collection_size *
3604 // nPointSets *
3605 // Points]
3606 int *info,
3607 int *ierr ) {
3608
3610
3611 /* Needed to transfer from Fortran data structure to C */
3612 double *** send_field_ =
3614
3615 yac_cput ( field_id, collection_size, send_field_, info, ierr );
3616
3617 free(send_field_[0]);
3618 free(send_field_);
3619}
3620
3621void yac_cput_frac_ ( int const field_id,
3622 int const collection_size,
3623 double *send_field, // send_field[collection_size *
3624 // nPointSets *
3625 // Points]
3626 double *send_frac_mask, // send_frac_mask[collection_size *
3627 // nPointSets *
3628 // Points]
3629 int *info,
3630 int *ierr ) {
3631
3633
3634 /* Needed to transfer from Fortran data structure to C */
3635 double *** send_field_ =
3637 double *** send_frac_mask_ =
3639
3641 field_id, collection_size, send_field_, send_frac_mask_, info, ierr);
3642
3643 free(send_field_[0]);
3644 free(send_field_);
3645 free(send_frac_mask_[0]);
3646 free(send_frac_mask_);
3647}
3648
3649/* ---------------------------------------------------------------------- */
3650
3652 int const field_id,
3653 int const collection_size,
3654 double **send_field, // send_field[collection_size*nPointSets][Points]
3655 double **send_frac_mask,
3656 double ****send_field_,
3657 double ****send_frac_mask_) {
3658
3659 struct coupling_field * cpl_field =
3661
3662 size_t num_interp_fields =
3664
3665 size_t * data_sizes = xmalloc(num_interp_fields * sizeof(*data_sizes));
3666
3667 for (size_t i = 0; i < num_interp_fields; i++) {
3668
3669 enum yac_location location =
3671 data_sizes[i] = yac_coupling_field_get_data_size(cpl_field, location);
3672 }
3673
3674 *send_field_ = xmalloc(collection_size * sizeof(**send_field_));
3675 for (int i = 0, k = 0; i < collection_size; ++i) {
3676
3677 (*send_field_)[i] = xmalloc(num_interp_fields * sizeof(***send_field_));
3678 for (size_t j = 0; j < num_interp_fields; ++j, ++k)
3679 (*send_field_)[i][j] = send_field[k];
3680 }
3681 if (send_frac_mask != NULL) {
3682 *send_frac_mask_ = xmalloc(collection_size * sizeof(**send_frac_mask_));
3683 for (int i = 0, k = 0; i < collection_size; ++i) {
3684
3685 (*send_frac_mask_)[i] =
3686 xmalloc(num_interp_fields * sizeof(***send_frac_mask_));
3687 for (size_t j = 0; j < num_interp_fields; ++j, ++k)
3688 (*send_frac_mask_)[i][j] = send_frac_mask[k];
3689 }
3690 }
3691
3692 free(data_sizes);
3693}
3694
3695void yac_cput_ptr_ ( int const field_id,
3696 int const collection_size,
3697 double ** send_field, // send_field
3698 // [collection_size * nPointSets]
3699 // [Points]
3700 int *info,
3701 int *ierr ) {
3702
3704
3705 /* Needed to transfer from Fortran data structure to C */
3706 double *** send_field_;
3708 field_id, collection_size, send_field, NULL, &send_field_, NULL);
3709
3710 yac_cput ( field_id, collection_size, send_field_, info, ierr );
3711
3712 for (int i = 0; i < collection_size; ++i) free(send_field_[i]);
3713 free(send_field_);
3714}
3715
3717 int const collection_size,
3718 double ** send_field, // send_field
3719 // [collection_size * nPointSets]
3720 // [Points]
3721 double ** send_frac_mask, // send_frac_mask
3722 // [collection_size * nPointSets]
3723 // [Points]
3724 int *info,
3725 int *ierr ) {
3726
3728
3729 /* Needed to transfer from Fortran data structure to C */
3730 double *** send_field_;
3731 double *** send_frac_mask_;
3733 field_id, collection_size, send_field, send_frac_mask,
3734 &send_field_, &send_frac_mask_);
3735
3737 field_id, collection_size, send_field_, send_frac_mask_, info, ierr);
3738
3739 for (int i = 0; i < collection_size; ++i) {
3740 free(send_field_[i]);
3741 free(send_frac_mask_[i]);
3742 }
3743 free(send_field_);
3744 free(send_frac_mask_);
3745}
3746
3747/* ---------------------------------------------------------------------- */
3748
3749void yac_ctest(int field_id, int * flag) {
3750
3751 struct coupling_field * cpl_field =
3753
3754 *flag = 1;
3755 if (yac_get_coupling_field_exchange_type(cpl_field) == SOURCE) {
3756 for (
3757 unsigned put_idx = 0;
3758 (put_idx < yac_get_coupling_field_num_puts(cpl_field)) && *flag;
3759 ++put_idx)
3760 *flag &=
3763 }
3764
3765 if (*flag && yac_get_coupling_field_exchange_type(cpl_field) == TARGET)
3766 *flag =
3769}
3770
3771/* ---------------------------------------------------------------------- */
3772
3774
3775 struct coupling_field * cpl_field =
3777
3778 int h_pak_trace =
3781
3782 if (yac_get_coupling_field_exchange_type(cpl_field) == SOURCE) {
3783 for (
3784 unsigned put_idx = 0;
3785 (put_idx < yac_get_coupling_field_num_puts(cpl_field)); ++put_idx) {
3786 if (yac_get_coupling_field_put_op_use_raw_exchange(cpl_field, put_idx))
3789 cpl_field, put_idx), "yac_cwait");
3790 else
3793 }
3794 }
3795
3796 if (yac_get_coupling_field_exchange_type(cpl_field) == TARGET) {
3800 "yac_cwait");
3801 else
3804 }
3805
3806 trace_coupling_stop(field_id, h_pak_trace);
3807}
3808
3809/* ---------------------------------------------------------------------- */
3810
3812
3813 struct coupling_field * cpl_field =
3815
3816 return (void*)yac_get_coupling_field_put_mask(cpl_field);
3817}
3818
3820
3821 struct coupling_field * cpl_field =
3823
3824 return (void*)yac_get_coupling_field_get_mask(cpl_field);
3825}
3826
3827/* ---------------------------------------------------------------------- */
3828
3830 struct coupling_field * cpl_field, unsigned put_idx,
3831 int const collection_size, double *** send_field,
3832 double **** send_field_acc_, double *** send_frac_mask,
3833 double **** send_frac_mask_acc_, int * with_frac_mask_,
3834 int * use_raw_exchange_, int *info, int *ierr) {
3835
3836 *ierr = 0;
3837 void * interpolation =
3840 cpl_field, put_idx):
3842 cpl_field, put_idx);
3843
3844 int use_raw_exchange =
3846 int with_frac_mask =
3850
3851 *with_frac_mask_ = with_frac_mask;
3852 *use_raw_exchange_ = use_raw_exchange;
3853
3854 /* ------------------------------------------------------------------
3855 Check for restart and coupling events
3856 ------------------------------------------------------------------ */
3857
3858 struct event * event =
3859 yac_get_coupling_field_put_op_event(cpl_field, put_idx);
3861 *info = (int)((action == RESTART)?PUT_FOR_RESTART:action);
3862
3863 /* ------------------------------------------------------------------
3864 add one model time step (as provided in coupling configuration) to
3865 the current event date
3866 ------------------------------------------------------------------ */
3867
3869
3870 /* ------------------------------------------------------------------
3871 return in case we are already beyond the end of the run
3872 ------------------------------------------------------------------ */
3873
3874 if (action == OUT_OF_BOUND) {
3875
3876 fputs("WARNING: YAC put action is beyond end of run date!\n", stderr);
3877 fputs("WARNING: YAC put action is beyond end of run date!\n", stdout);
3878
3879 *send_field_acc_ = NULL;
3880 *send_frac_mask_acc_ = NULL;
3881 return NULL;
3882 }
3883
3884 /* ------------------------------------------------------------------
3885 start actions
3886 ------------------------------------------------------------------ */
3887
3888 if ( action == NONE ) return NULL;
3889
3890 /* ------------------------------------------------------------------
3891 If it is time for restart, set appropriate flags and continue
3892 ------------------------------------------------------------------ */
3893
3894 /* ------------------------------------------------------------------
3895 First deal with instant sends
3896 ------------------------------------------------------------------ */
3897
3898 int ** put_mask = yac_get_coupling_field_put_mask(cpl_field);
3899 size_t num_interp_fields =
3901
3903 if ( time_operation == TIME_NONE ) {
3904
3905 *info = MAX((int)COUPLING, *info);
3906
3907 if (with_frac_mask) {
3908
3909 // apply fractional mask to send field
3910 double *** send_field_acc =
3912 *send_field_acc_ = send_field_acc;
3913 *send_frac_mask_acc_ = send_frac_mask;
3914
3915 for (int h = 0; h < collection_size; h++) {
3916 for (size_t i = 0; i < num_interp_fields; i++) {
3917 size_t data_size =
3919 cpl_field,
3921 if (put_mask) {
3922 for (size_t j = 0; j < data_size; ++j) {
3923 if (put_mask[i][j]) {
3924 double frac_mask = send_frac_mask[h][i][j];
3925 send_field_acc[h][i][j] =
3926 (frac_mask != 0.0)?(send_field[h][i][j] * frac_mask):0.0;
3927 }
3928 }
3929 } else {
3930 for (size_t j = 0; j < data_size; ++j) {
3931 double frac_mask = send_frac_mask[h][i][j];
3932 send_field_acc[h][i][j] =
3933 (frac_mask != 0.0)?(send_field[h][i][j] * frac_mask):0.0;
3934 }
3935 }
3936 }
3937 }
3938 } else {
3939 *send_field_acc_ = send_field;
3940 *send_frac_mask_acc_ = send_frac_mask;
3941 }
3942 return interpolation;
3943 }
3944
3945 /* ------------------------------------------------------------------
3946 Accumulation & Averaging
3947 ------------------------------------------------------------------ */
3948
3949 YAC_ASSERT(
3953 (time_operation == TIME_MAXIMUM), "invalid time operation type")
3954
3955 int time_accumulation_count =
3957
3958 time_accumulation_count++;
3959
3960 // if this is the first accumulation step
3961 if (time_accumulation_count == 1) {
3962
3963 double send_field_acc_init_value;
3964 switch (time_operation) {
3965 default:
3966 case(TIME_ACCUMULATE):
3967 case(TIME_AVERAGE):
3968 send_field_acc_init_value = 0.0;
3969 break;
3970 case(TIME_MINIMUM):
3971 send_field_acc_init_value = DBL_MAX;
3972 break;
3973 case(TIME_MAXIMUM):
3974 send_field_acc_init_value = -DBL_MAX;
3975 break;
3976 }
3977
3978 /* initalise memory */
3979
3981 cpl_field, put_idx, send_field_acc_init_value);
3982 if (with_frac_mask)
3984 cpl_field, put_idx, 0.0);
3985 }
3986
3987 /* accumulate data */
3988
3989 double *** send_field_acc =
3991 *send_field_acc_ = send_field_acc;
3992 double *** send_frac_mask_acc;
3993 if (with_frac_mask) {
3994 send_frac_mask_acc =
3996 *send_frac_mask_acc_ = send_frac_mask_acc;
3997 } else {
3998 send_frac_mask_acc = NULL;
3999 *send_frac_mask_acc_ = NULL;
4000 }
4001
4002#define NO_CHECK (1)
4003#define PUT_CHECK (put_mask[i][j])
4004#define SUM +=
4005#define ASSIGN =
4006#define AGGREGATE_FRAC(CHECK, EXTRA_CHECK, ACCU_OP) \
4007 { \
4008 YAC_OMP_PARALLEL \
4009 { \
4010 YAC_OMP_FOR \
4011 for (size_t j = 0; j < data_size; ++j) { \
4012 double frac_mask = send_frac_mask[h][i][j]; \
4013 double send_field_value = send_field[h][i][j] * frac_mask; \
4014 if (CHECK && (EXTRA_CHECK)) { \
4015 if (frac_mask != 0.0) { \
4016 send_field_acc[h][i][j] ACCU_OP send_field_value; \
4017 send_frac_mask_acc[h][i][j] ACCU_OP frac_mask; \
4018 } \
4019 } \
4020 } \
4021 } \
4022 }
4023#define AGGREATE_NOFRAC(CHECK, EXTRA_CHECK, ACCU_OP) \
4024 { \
4025 YAC_OMP_PARALLEL \
4026 { \
4027 YAC_OMP_FOR \
4028 for (size_t j = 0; j < data_size; ++j) {\
4029 double send_field_value = send_field[h][i][j]; \
4030 if (CHECK && (EXTRA_CHECK)) \
4031 send_field_acc[h][i][j] ACCU_OP send_field_value; \
4032 } \
4033 } \
4034 }
4035#define AGGREGATE(EXTRA_CHECK, ACCU_OP) \
4036 { \
4037 for (int h = 0; h < collection_size; h++) { \
4038 for (size_t i = 0; i < num_interp_fields; i++) { \
4039 size_t data_size = \
4040 yac_coupling_field_get_data_size( \
4041 cpl_field, \
4042 yac_coupling_field_get_interp_fields(cpl_field)[i].location); \
4043 if (with_frac_mask) { \
4044 if (put_mask) AGGREGATE_FRAC(PUT_CHECK, EXTRA_CHECK, ACCU_OP) \
4045 else AGGREGATE_FRAC(NO_CHECK, EXTRA_CHECK, ACCU_OP) \
4046 } else { \
4047 if (put_mask) AGGREATE_NOFRAC(PUT_CHECK, EXTRA_CHECK, ACCU_OP) \
4048 else AGGREATE_NOFRAC(NO_CHECK, EXTRA_CHECK, ACCU_OP) \
4049 } \
4050 } \
4051 } \
4052 break; \
4053 }
4054
4055 switch (time_operation) {
4056 default:
4057 case(TIME_ACCUMULATE):
4058 case(TIME_AVERAGE):
4060 case(TIME_MINIMUM):
4061 AGGREGATE(send_field_acc[h][i][j] > send_field_value, ASSIGN)
4062 case(TIME_MAXIMUM):
4063 AGGREGATE(send_field_acc[h][i][j] < send_field_value, ASSIGN)
4064 }
4065
4066#undef AGGREGATE
4067#undef AGGREATE_NOFRAC
4068#undef AGGREGATE_FRAC
4069#undef ASSIGN
4070#undef SUM
4071#undef PUT_CHECK
4072#undef NO_CHECK
4073
4074/* --------------------------------------------------------------------
4075 Check whether we have to perform the coupling in this call
4076 -------------------------------------------------------------------- */
4077
4078 if (action == REDUCTION) {
4080 cpl_field, put_idx, time_accumulation_count);
4081 return NULL;
4082 }
4083
4084/* --------------------------------------------------------------------
4085 Average data if required
4086 -------------------------------------------------------------------- */
4087
4088 if (( time_operation == TIME_AVERAGE ) ||
4090
4091 double weight = 1.0 / (double)time_accumulation_count;
4092
4093#define NO_CHECK (1)
4094#define PUT_CHECK (put_mask[i][j])
4095#define WEIGHT_ACC_(ACC, CHECK, EXTRA_CHECK) \
4096 { \
4097 for (size_t j = 0; j < data_size; j++) \
4098 if (CHECK && (EXTRA_CHECK)) ACC[h][i][j] *= weight; \
4099 }
4100#define WEIGHT_ACC(ACC, EXTRA_CHECK) \
4101 { \
4102 if (put_mask) WEIGHT_ACC_(ACC, PUT_CHECK, EXTRA_CHECK) \
4103 else WEIGHT_ACC_(ACC, NO_CHECK, EXTRA_CHECK) \
4104 }
4105
4106 for (int h = 0; h < collection_size; ++h) {
4107 for (size_t i = 0; i < num_interp_fields; i++) {
4108 size_t data_size =
4110 cpl_field,
4112 if (with_frac_mask)
4113 WEIGHT_ACC(send_frac_mask_acc, NO_CHECK)
4115 if (with_frac_mask)
4116 WEIGHT_ACC(send_field_acc, send_frac_mask_acc[h][i][j] != 0.0)
4117 else
4118 WEIGHT_ACC(send_field_acc, NO_CHECK)
4119 }
4120 }
4121 }
4122 }
4123
4124#undef NO_CHECK
4125#undef PUT_CHECK
4126#undef WEIGHT_ACC_
4127#undef WEIGHT_ACC
4128
4129 // reset time_accumulation_count
4131 cpl_field, put_idx, 0);
4132
4133/* --------------------------------------------------------------------
4134 return interpolation
4135 -------------------------------------------------------------------- */
4136
4137 *info = MAX((int)COUPLING, *info);
4138 return interpolation;
4139}
4140
4141void yac_cput_frac ( int const field_id,
4142 int const collection_size,
4143 double *** const send_field, // send_field[collection_size]
4144 // [nPointSets][Points]
4145 double *** const send_frac_mask, // send_frac_mask[collection_size]
4146 // [nPointSets][Points]
4147 int *info,
4148 int *ierr ) {
4149
4151
4152 *info = NONE;
4153 *ierr = 0;
4154
4155 struct coupling_field * cpl_field =
4157
4160
4163 "put was called for field \"%s\" which is configured as target",
4164 yac_get_coupling_field_name(cpl_field));
4165
4166 if (exchange_type != SOURCE) return;
4167
4168 int h_pak_trace =
4171
4173 (size_t)collection_size ==
4175 "collection size of field \"%s\" does not match with "
4176 "coupling configuration.", yac_get_coupling_field_name(cpl_field));
4177
4178 for (unsigned put_idx = 0;
4179 put_idx < yac_get_coupling_field_num_puts(cpl_field); ++put_idx) {
4180
4181 int curr_action;
4182 int curr_ierr;
4183 double *** send_field_acc;
4184 double *** send_frac_mask_acc;
4185
4186 int with_frac_mask;
4187 int use_raw_exchange;
4188 void * interpolation =
4190 cpl_field, put_idx, collection_size,
4191 send_field, &send_field_acc,
4192 send_frac_mask, &send_frac_mask_acc,
4193 &with_frac_mask, &use_raw_exchange,
4194 &curr_action, &curr_ierr);
4195
4196 *info = MAX(*info, curr_action);
4197 *ierr = MAX(*ierr, curr_ierr);
4198
4199 /* ------------------------------------------------------------------
4200 return in case we are already beyond the end of the run
4201 ------------------------------------------------------------------ */
4202 if (curr_action == OUT_OF_BOUND) {
4203 *info = OUT_OF_BOUND;
4204 trace_coupling_stop(field_id, h_pak_trace);
4205 return;
4206 }
4207
4208 /* ------------------------------------------------------------------
4209 in case there is nothing to be done for the current put
4210 ------------------------------------------------------------------ */
4211 if ((curr_action == NONE) || (curr_action == REDUCTION)) continue;
4212
4213 /* ------------------------------------------------------------------
4214 in case we are supposed to couple
4215 ------------------------------------------------------------------ */
4216 if ((*ierr == 0) && (interpolation != NULL)) {
4217
4219 (with_frac_mask && (send_frac_mask != NULL)) ||
4220 !with_frac_mask,
4221 "interpolation for field \"%s\" was built for "
4222 "dynamic fractional masking, but no mask was provided",
4223 yac_get_coupling_field_name(cpl_field));
4225 (!with_frac_mask && (send_frac_mask == NULL)) ||
4226 with_frac_mask,
4227 "interpolation for field \"%s\" was not built "
4228 "for dynamic fractional masking, but a mask was provided",
4229 yac_get_coupling_field_name(cpl_field));
4230
4231 double *** send_field_ptr =
4232 (send_field_acc == NULL)?send_field:send_field_acc;
4233 double *** send_frac_mask_ptr =
4234 (send_frac_mask_acc == NULL)?send_frac_mask:send_frac_mask_acc;
4235
4236 if (use_raw_exchange) {
4237
4238 size_t num_src_fields =
4240 double const ** send_field_ptr_ =
4241 xmalloc(
4242 (size_t)(1 + with_frac_mask) * (size_t)collection_size *
4243 num_src_fields * sizeof(*send_field_ptr_));
4244
4245 size_t k = 0;
4246 for (int i = 0; i < collection_size; ++i)
4247 for (size_t j = 0; j < num_src_fields; ++j, ++k)
4248 send_field_ptr_[k] = send_field_ptr[i][j];
4249 if (with_frac_mask)
4250 for (int i = 0; i < collection_size; ++i)
4251 for (size_t j = 0; j < num_src_fields; ++j, ++k)
4252 send_field_ptr_[k] = send_frac_mask_ptr[i][j];
4254 interpolation, send_field_ptr_, "yac_cput_frac");
4255
4256 free(send_field_ptr_);
4257
4258 } else {
4259 if (with_frac_mask)
4261 interpolation, send_field_ptr, send_frac_mask_ptr);
4262 else
4264 }
4265 }
4266 }
4267
4268 trace_coupling_stop(field_id, h_pak_trace);
4269}
4270
4271void yac_cput ( int const field_id,
4272 int const collection_size,
4273 double *** const send_field, // send_field[collection_size]
4274 // [nPointSets][Points]
4275 int *info,
4276 int *ierr ) {
4278 field_id, collection_size, send_field, NULL, info, ierr);
4279}
4280
4281/* ---------------------------------------------------------------------- */
4282
4283
4284void yac_cexchange_ ( int const send_field_id,
4285 int const recv_field_id,
4286 int const collection_size,
4287 double *send_field, // send_field[collection_size *
4288 // nPointSets *
4289 // Points]
4290 double *recv_field, // recv_field[collection_size * Points]
4291 int *send_info,
4292 int *recv_info,
4293 int *ierr ) {
4294
4295 yac_ccheck_field_dimensions(send_field_id, collection_size, 1, NULL);
4296 yac_ccheck_field_dimensions(recv_field_id, collection_size, -1, NULL);
4297
4298 /* Needed to transfer from Fortran data structure to C */
4299 double *** send_field_ =
4300 get_send_field_pointers(send_field_id, collection_size, send_field);
4301 double ** recv_field_ =
4302 get_recv_field_pointers(recv_field_id, collection_size, recv_field);
4303
4305 send_field_id, recv_field_id, collection_size, send_field_, recv_field_,
4306 send_info, recv_info, ierr);
4307
4308 free(recv_field_);
4309 free(send_field_[0]);
4310 free(send_field_);
4311}
4312
4313/* ---------------------------------------------------------------------- */
4314
4315
4316void yac_cexchange_raw_frac_ ( int const send_field_id,
4317 int const recv_field_id,
4318 int const collection_size,
4319 double *send_field, // send_field[collection_size *
4320 // nPointSets *
4321 // Points]
4322 double *send_frac_mask, // send_frac_mask[collection_size *
4323 // nPointSets *
4324 // Points]
4325 double *src_field_buffer, // src_field_buffer
4326 // [collection_size *
4327 // SUM(src_field_buffer_sizes[0:num_src_fields-1])]
4328 double *src_frac_mask_buffer, // src_frac_mask_buffer
4329 // [collection_size *
4330 // SUM(src_field_buffer_sizes[0:num_src_fields-1])]
4331 int *send_info,
4332 int *recv_info,
4333 int *ierr ) {
4334
4335 yac_ccheck_field_dimensions(send_field_id, collection_size, 1, NULL);
4336 yac_ccheck_field_dimensions(recv_field_id, collection_size, -1, NULL);
4337
4338 /* Needed to transfer from Fortran data structure to C */
4339 double *** send_field_ =
4340 get_send_field_pointers(send_field_id, collection_size, send_field);
4341 double *** send_frac_mask_ =
4342 send_frac_mask?
4344 send_field_id, collection_size, send_frac_mask):NULL;
4345 double *** src_field_buffer_ =
4347 recv_field_id, collection_size, src_field_buffer);
4348 double *** src_frac_mask_buffer_ =
4349 src_frac_mask_buffer?
4351 recv_field_id, collection_size, src_frac_mask_buffer):NULL;
4352
4354 send_field_id, recv_field_id, collection_size,
4355 send_field_, send_frac_mask_,
4356 src_field_buffer_, src_frac_mask_buffer_,
4357 send_info, recv_info, ierr);
4358
4359 if (src_frac_mask_buffer) {
4360 free(src_frac_mask_buffer_[0]);
4361 free(src_frac_mask_buffer_);
4362 }
4363 free(src_field_buffer_[0]);
4364 free(src_field_buffer_);
4365 if (send_frac_mask_) {
4366 free(send_frac_mask_[0]);
4367 free(send_frac_mask_);
4368 }
4369 free(send_field_[0]);
4370 free(send_field_);
4371}
4372
4373
4374void yac_cexchange_raw_ ( int const send_field_id,
4375 int const recv_field_id,
4376 int const collection_size,
4377 double *send_field, // send_field[collection_size *
4378 // nPointSets *
4379 // Points]
4380 double *src_field_buffer, // src_field_buffer
4381 // [collection_size *
4382 // SUM(src_field_buffer_sizes[0:num_src_fields-1])]
4383 int *send_info,
4384 int *recv_info,
4385 int *ierr ) {
4386
4388 send_field_id, recv_field_id, collection_size,
4389 send_field, NULL, src_field_buffer, NULL, send_info, recv_info, ierr);
4390}
4391
4392/* ---------------------------------------------------------------------- */
4393
4394
4395void yac_cexchange_frac_ ( int const send_field_id,
4396 int const recv_field_id,
4397 int const collection_size,
4398 double *send_field, // send_field[collection_size *
4399 // nPointSets *
4400 // Points]
4401 double *send_frac_mask, // send_frac_mask[collection_size *
4402 // nPointSets *
4403 // Points]
4404 double *recv_field, // recv_field[collection_size * Points]
4405 int *send_info,
4406 int *recv_info,
4407 int *ierr ) {
4408
4409 yac_ccheck_field_dimensions(send_field_id, collection_size, 1, NULL);
4410 yac_ccheck_field_dimensions(recv_field_id, collection_size, -1, NULL);
4411
4412 /* Needed to transfer from Fortran data structure to C */
4413 double *** send_field_ =
4414 get_send_field_pointers(send_field_id, collection_size, send_field);
4415 double *** send_frac_mask_ =
4416 get_send_field_pointers(send_field_id, collection_size, send_frac_mask);
4417 double ** recv_field_ =
4418 get_recv_field_pointers(recv_field_id, collection_size, recv_field);
4419
4421 send_field_id, recv_field_id, collection_size, send_field_, send_frac_mask_,
4422 recv_field_, send_info, recv_info, ierr);
4423
4424 free(recv_field_);
4425 free(send_field_[0]);
4426 free(send_field_);
4427 free(send_frac_mask_[0]);
4428 free(send_frac_mask_);
4429}
4430
4431/* ---------------------------------------------------------------------- */
4432
4433
4434void yac_cexchange_ptr_ ( int const send_field_id,
4435 int const recv_field_id,
4436 int const collection_size,
4437 double ** send_field, // send_field[collection_size *
4438 // nPointSets][Points]
4439 double ** recv_field, // recv_field[collection_size][Points]
4440 int *send_info,
4441 int *recv_info,
4442 int *ierr ) {
4443
4444 yac_ccheck_field_dimensions(send_field_id, collection_size, 1, NULL);
4445 yac_ccheck_field_dimensions(recv_field_id, collection_size, -1, NULL);
4446
4447
4448 /* Needed to transfer from Fortran data structure to C */
4449 double *** send_field_;
4451 send_field_id, collection_size, send_field, NULL, &send_field_, NULL);
4452
4454 send_field_id, recv_field_id, collection_size, send_field_, recv_field,
4455 send_info, recv_info, ierr);
4456
4457 free(send_field_[0]);
4458 free(send_field_);
4459}
4460
4461
4462void yac_cexchange_raw_ptr_ ( int const send_field_id,
4463 int const recv_field_id,
4464 int const collection_size,
4465 double ** send_field, // send_field[collection_size *
4466 // nPointSets][Points]
4467 double **src_field_buffer, // src_field_buffer
4468 // [collection_size*num_src_fields]
4469 // [src_field_buffer_size[src_field_idx]]
4470 int *send_info,
4471 int *recv_info,
4472 int *ierr ) {
4473
4474 yac_ccheck_field_dimensions(send_field_id, collection_size, 1, NULL);
4475 yac_ccheck_field_dimensions(recv_field_id, collection_size, -1, NULL);
4476
4477
4478 /* Needed to transfer from Fortran data structure to C */
4479 double *** send_field_;
4481 send_field_id, collection_size, send_field, NULL, &send_field_, NULL);
4482 double *** src_field_buffer_ =
4484 recv_field_id, (size_t)collection_size, src_field_buffer);
4485
4487 send_field_id, recv_field_id, collection_size, send_field_,
4488 src_field_buffer_, send_info, recv_info, ierr);
4489
4490 free(src_field_buffer_[0]);
4491 free(src_field_buffer_);
4492 free(send_field_[0]);
4493 free(send_field_);
4494}
4495
4496/* ---------------------------------------------------------------------- */
4497
4498
4499void yac_cexchange_frac_ptr_ ( int const send_field_id,
4500 int const recv_field_id,
4501 int const collection_size,
4502 double ** send_field, // send_field[collection_size *
4503 // nPointSets][Points]
4504 double ** send_frac_mask, // send_frac_mask[collection_size *
4505 // nPointSets][Points]
4506 double ** recv_field, // recv_field[collection_size][Points]
4507 int *send_info,
4508 int *recv_info,
4509 int *ierr ) {
4510
4511 yac_ccheck_field_dimensions(send_field_id, collection_size, 1, NULL);
4512 yac_ccheck_field_dimensions(recv_field_id, collection_size, -1, NULL);
4513
4514 /* Needed to transfer from Fortran data structure to C */
4515 double *** send_field_;
4516 double *** send_frac_mask_;
4518 send_field_id, collection_size, send_field, send_frac_mask,
4519 &send_field_, &send_frac_mask_);
4520
4522 send_field_id, recv_field_id, collection_size, send_field_, send_frac_mask_,
4523 recv_field, send_info, recv_info, ierr);
4524
4525 free(send_field_[0]);
4526 free(send_field_);
4527 free(send_frac_mask_[0]);
4528 free(send_frac_mask_);
4529}
4530
4531
4532void yac_cexchange_raw_frac_ptr_ ( int const send_field_id,
4533 int const recv_field_id,
4534 int const collection_size,
4535 double ** send_field, // send_field[collection_size *
4536 // nPointSets][Points]
4537 double ** send_frac_mask, // send_frac_mask[collection_size *
4538 // nPointSets][Points]
4539 double ** src_field_buffer, // src_field_buffer
4540 // [collection_size*num_src_fields]
4541 // [src_field_buffer_size[src_field_idx]]
4542 double ** src_frac_mask_buffer, // src_frac_mask_buffer
4543 // [collection_size*num_src_fields]
4544 // [src_field_buffer_size[src_field_idx]]
4545 int *send_info,
4546 int *recv_info,
4547 int *ierr ) {
4548
4549 yac_ccheck_field_dimensions(send_field_id, collection_size, 1, NULL);
4550 yac_ccheck_field_dimensions(recv_field_id, collection_size, -1, NULL);
4551
4552 /* Needed to transfer from Fortran data structure to C */
4553 double *** send_field_;
4554 double *** send_frac_mask_;
4556 send_field_id, collection_size, send_field, send_frac_mask,
4557 &send_field_, &send_frac_mask_);
4558 double *** src_field_buffer_ =
4560 recv_field_id, (size_t)collection_size, src_field_buffer);
4561 double *** src_frac_mask_buffer_ =
4562 src_frac_mask_buffer?
4564 recv_field_id, (size_t)collection_size, src_frac_mask_buffer):NULL;
4565
4567 send_field_id, recv_field_id, collection_size, send_field_, send_frac_mask_,
4568 src_field_buffer_, src_frac_mask_buffer_, send_info, recv_info, ierr);
4569
4570 free(src_frac_mask_buffer_[0]);
4571 free(src_frac_mask_buffer_);
4572 free(src_field_buffer_[0]);
4573 free(src_field_buffer_);
4574 free(send_field_[0]);
4575 free(send_field_);
4576 free(send_frac_mask_[0]);
4577 free(send_frac_mask_);
4578}
4579
4580/* ---------------------------------------------------------------------- */
4581
4582void yac_cexchange_frac ( int const send_field_id,
4583 int const recv_field_id,
4584 int const collection_size,
4585 double *** const send_field, // send_field[collection_size]
4586 // [nPointSets][Points]
4587 double *** const send_frac_mask, // send_frac_mask[collection_size]
4588 // [nPointSets][Points]
4589 double ** recv_field, // recv_field[collection_size][Points]
4590 int *send_info,
4591 int *recv_info,
4592 int *ierr ) {
4593
4594 yac_ccheck_field_dimensions(send_field_id, collection_size, 1, NULL);
4595 yac_ccheck_field_dimensions(recv_field_id, collection_size, -1, NULL);
4596
4597 *send_info = NONE;
4598 *ierr = -1;
4599
4600 struct coupling_field * send_cpl_field =
4601 yac_unique_id_to_pointer(send_field_id, "send_field_id");
4602
4603 if (yac_get_coupling_field_exchange_type(send_cpl_field) != SOURCE) {
4604 yac_cget(recv_field_id, collection_size, recv_field, recv_info, ierr);
4605 return;
4606 }
4607
4608 YAC_ASSERT(
4609 (size_t)collection_size ==
4611 "collection size does not match with coupling configuration.")
4612
4613 YAC_ASSERT(
4614 yac_get_coupling_field_num_puts(send_cpl_field) == 1,
4615 "more than one put per field is not supported for yac_cexchange_frac.")
4616
4617 int send_action;
4618 int send_ierr;
4619 double *** send_field_acc;
4620 double *** send_frac_mask_acc;
4621 int send_with_frac_mask;
4622 int use_raw_exchange;
4623 struct yac_interpolation * put_interpolation =
4625 send_cpl_field, 0, collection_size, send_field,
4626 &send_field_acc, send_frac_mask, &send_frac_mask_acc,
4627 &send_with_frac_mask, &use_raw_exchange,
4628 &send_action, &send_ierr);
4629
4631 send_with_frac_mask == (send_frac_mask != NULL),
4632 "source field \"%s\" was configured %s support for fractional masking, "
4633 "but %s fractional mask was provided to this call",
4634 yac_get_coupling_field_name(send_cpl_field),
4635 (send_with_frac_mask?"with":"without"), (send_with_frac_mask?"no":"a"))
4636
4637 *send_info = MAX(*send_info, send_action);
4638 *ierr = MAX(*ierr, send_ierr);
4639
4640 /* ------------------------------------------------------------------
4641 return in case we are already beyond the end of the run for the puts
4642 or there is nothing to be done for the current put
4643 ------------------------------------------------------------------ */
4644 if ((send_action == OUT_OF_BOUND) ||
4645 (send_action == NONE) ||
4646 (send_action == REDUCTION)) {
4647 yac_cget(recv_field_id, collection_size, recv_field, recv_info, ierr);
4648 return;
4649 }
4650
4651 /* ------------------------------------------------------------------
4652 check the get
4653 ------------------------------------------------------------------ */
4654
4655 struct yac_interpolation * get_interpolation =
4656 yac_cget_pre_processing(recv_field_id, collection_size, recv_info, ierr);
4657
4658 /* ------------------------------------------------------------------
4659 do the required exchanges
4660 ------------------------------------------------------------------ */
4661
4662 if (*ierr == 0) {
4663
4664 double *** send_field_ptr =
4665 (send_field_acc == NULL)?send_field:send_field_acc;
4666 double *** send_frac_mask_ptr =
4667 (send_frac_mask_acc == NULL)?send_frac_mask:send_frac_mask_acc;
4668
4669 // if the get is active
4670 if (get_interpolation != NULL) {
4671
4672 YAC_ASSERT(
4673 get_interpolation == put_interpolation,
4674 "send_field_id and recv_field_id do not match")
4675
4676 if (send_with_frac_mask)
4678 put_interpolation, send_field_ptr, send_frac_mask_ptr, recv_field);
4679 else
4681 put_interpolation, send_field_ptr, recv_field);
4682
4683 } else {
4684
4685 // just execute the put
4686 if (send_with_frac_mask)
4688 put_interpolation, send_field_ptr, send_frac_mask_ptr);
4689 else
4690 yac_interpolation_execute_put(put_interpolation, send_field_ptr);
4691 }
4692 }
4693}
4694
4695void yac_cexchange_raw_frac ( int const send_field_id,
4696 int const recv_field_id,
4697 int const collection_size,
4698 double *** const send_field, // send_field[collection_size]
4699 // [nPointSets][Points]
4700 double *** const send_frac_mask, // send_frac_mask[collection_size]
4701 // [nPointSets][Points]
4702 double ***src_field_buffer, // source field buffer
4703 // [collection_size]
4704 // [num_src_fields]
4705 // [src_field_buffer_size[src_field_idx]]
4706 double ***src_frac_mask_buffer, // source fractional mask buffer
4707 // [collection_size]
4708 // [num_src_fields]
4709 // [src_field_buffer_size[src_field_idx]]
4710 int *send_info,
4711 int *recv_info,
4712 int *ierr ) {
4713
4714 yac_ccheck_field_dimensions(send_field_id, collection_size, -1, NULL);
4715 yac_ccheck_field_dimensions(recv_field_id, collection_size, 1, NULL);
4716
4717 *send_info = NONE;
4718 *ierr = -1;
4719
4720 struct coupling_field * send_cpl_field =
4721 yac_unique_id_to_pointer(send_field_id, "send_field_id");
4722 struct coupling_field * recv_cpl_field =
4723 yac_unique_id_to_pointer(recv_field_id, "recv_field_id");
4724
4725 if (yac_get_coupling_field_exchange_type(recv_cpl_field) != TARGET) {
4727 send_field_id, collection_size, send_field, send_frac_mask,
4728 send_info, ierr);
4729 *recv_info = NONE;
4730 return;
4731 }
4732
4733 int recv_with_frac_mask =
4735
4736 if (yac_get_coupling_field_exchange_type(send_cpl_field) != SOURCE) {
4737 if (recv_with_frac_mask)
4739 recv_field_id, collection_size, src_field_buffer, src_frac_mask_buffer,
4740 recv_info, ierr);
4741 else
4743 recv_field_id, collection_size, src_field_buffer, recv_info, ierr);
4744 *send_info = NONE;
4745 return;
4746 }
4747
4749 recv_with_frac_mask == (src_frac_mask_buffer != NULL),
4750 "target field \"%s\" was configured %s support for fractional masking, "
4751 "but %s source fractional mask buffer was provided to this call",
4752 yac_get_coupling_field_name(recv_cpl_field),
4753 (recv_with_frac_mask?"with":"without"), (recv_with_frac_mask?"no":"a"))
4754
4755 YAC_ASSERT(
4756 (size_t)collection_size ==
4758 "collection size does not match with coupling configuration.")
4759
4760 YAC_ASSERT(
4761 yac_get_coupling_field_num_puts(send_cpl_field) == 1,
4762 "more than one put per field is not supported for yac_cexchange_frac.")
4763
4766 "source field \"%s\" is not configured for raw data exchange",
4767 yac_get_coupling_field_name(send_cpl_field))
4768
4769 int send_action;
4770 int send_ierr;
4771 double *** send_field_acc;
4772 double *** send_frac_mask_acc;
4773 int send_with_frac_mask;
4774 int use_raw_exchange;
4775 struct yac_interpolation_exchange * put_interpolation_exchange =
4777 send_cpl_field, 0, collection_size, send_field,
4778 &send_field_acc, send_frac_mask, &send_frac_mask_acc,
4779 &send_with_frac_mask, &use_raw_exchange,
4780 &send_action, &send_ierr);
4781
4783 (put_interpolation_exchange == NULL) ||
4784 (send_with_frac_mask == recv_with_frac_mask),
4785 "fractional mask configuration for source field \"%s\" and target field "
4786 "\"%s\" does not match",
4787 yac_get_coupling_field_name(send_cpl_field),
4788 yac_get_coupling_field_name(recv_cpl_field));
4789
4791 send_with_frac_mask == (send_frac_mask != NULL), "source field \"%s\" "
4792 "was configured %s support for fractional masking, but %s fractional mask "
4793 "was provided to this call", yac_get_coupling_field_name(send_cpl_field),
4794 (send_with_frac_mask?"with":"without"), (send_with_frac_mask?"no":"a"))
4795
4796 *send_info = MAX(*send_info, send_action);
4797 *ierr = MAX(*ierr, send_ierr);
4798
4799 /* ------------------------------------------------------------------
4800 return in case we are already beyond the end of the run for the puts
4801 or there is nothing to be done for the current put
4802 ------------------------------------------------------------------ */
4803 if ((send_action == OUT_OF_BOUND) ||
4804 (send_action == NONE) ||
4805 (send_action == REDUCTION)) {
4806 if (recv_with_frac_mask)
4808 recv_field_id, collection_size, src_field_buffer, src_frac_mask_buffer,
4809 recv_info, ierr);
4810 else
4812 recv_field_id, collection_size, src_field_buffer, recv_info, ierr);
4813 return;
4814 }
4815
4816 /* ------------------------------------------------------------------
4817 check the get
4818 ------------------------------------------------------------------ */
4819
4820 struct yac_interpolation_exchange * get_interpolation_exchange =
4821 yac_cget_pre_processing(recv_field_id, collection_size, recv_info, ierr);
4822
4823 /* ------------------------------------------------------------------
4824 do the required exchanges
4825 ------------------------------------------------------------------ */
4826
4827 if (*ierr == 0) {
4828
4829 size_t num_src_fields;
4831 recv_cpl_field, &num_src_fields, NULL);
4832
4833 double const ** send_field_ptr_ =
4834 xmalloc(
4835 (size_t)(1 + send_with_frac_mask) * (size_t)collection_size *
4836 num_src_fields * sizeof(*send_field_ptr_));
4837 {
4838 size_t k = 0;
4839 for (int i = 0; i < collection_size; ++i)
4840 for (size_t j = 0; j < num_src_fields; ++j, ++k)
4841 send_field_ptr_[k] = send_field_acc[i][j];
4842 if (send_with_frac_mask)
4843 for (int i = 0; i < collection_size; ++i)
4844 for (size_t j = 0; j < num_src_fields; ++j, ++k)
4845 send_field_ptr_[k] = send_frac_mask_acc[i][j];
4846 }
4847
4848 YAC_ASSERT(
4849 get_interpolation_exchange == put_interpolation_exchange,
4850 "send_field_id and recv_field_id do not match")
4851
4853 recv_with_frac_mask == (src_frac_mask_buffer != NULL),
4854 "target field \"%s\" was configured %s support for fractional masking, "
4855 "but %s fractional mask bufferwas provided to this call",
4856 yac_get_coupling_field_name(recv_cpl_field),
4857 (recv_with_frac_mask?"with":"without"), (recv_with_frac_mask?"no":"a"))
4858
4859 double ** src_field_buffer_ =
4860 xmalloc(
4861 (size_t)(1 + send_with_frac_mask) * (size_t)collection_size *
4862 num_src_fields * sizeof(*src_field_buffer_));
4863 {
4864 size_t k = 0;
4865 for (int i = 0; i < collection_size; ++i)
4866 for (size_t j = 0; j < num_src_fields; ++j, ++k)
4867 src_field_buffer_[k] = src_field_buffer[i][j];
4868 if (recv_with_frac_mask)
4869 for (int i = 0; i < collection_size; ++i)
4870 for (size_t j = 0; j < num_src_fields; ++j, ++k)
4871 src_field_buffer_[k] = src_frac_mask_buffer[i][j];
4872 }
4873
4875 put_interpolation_exchange, send_field_ptr_, src_field_buffer_,
4876 "yac_cexchange_raw_frac");
4877
4878 free(src_field_buffer_);
4879 free(send_field_ptr_);
4880 }
4881}
4882
4883void yac_cexchange ( int const send_field_id,
4884 int const recv_field_id,
4885 int const collection_size,
4886 double *** const send_field, // send_field[collection_size]
4887 // [nPointSets][Points]
4888 double ** recv_field, // recv_field[collection_size][Points]
4889 int *send_info,
4890 int *recv_info,
4891 int *ierr ) {
4892
4894 send_field_id, recv_field_id, collection_size,
4895 send_field, NULL, recv_field, send_info, recv_info, ierr);
4896}
4897
4898void yac_cexchange_raw ( int const send_field_id,
4899 int const recv_field_id,
4900 int const collection_size,
4901 double *** const send_field, // send_field[collection_size]
4902 // [nPointSets][Points]
4903 double ***src_field_buffer, // src_field_buffer
4904 // [collection_size]
4905 // [num_src_fields]
4906 // [src_field_buffer_size[src_field_idx]]
4907 int *send_info,
4908 int *recv_info,
4909 int *ierr ) {
4910
4912 send_field_id, recv_field_id, collection_size,
4913 send_field, NULL, src_field_buffer, NULL, send_info, recv_info, ierr);
4914}
4915
4916/* ---------------------------------------------------------------------- */
4917
4918void yac_csync_def_instance ( int yac_instance_id ){
4920 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id"));
4921}
4922
4927
4929 int yac_instance_id, char const ** comp_names, int num_comp_names ){
4931 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id"),
4932 comp_names, (size_t)num_comp_names);
4933}
4934
4936 char const ** comp_names, int num_comp_names ){
4937 check_default_instance_id(__func__);
4939 default_instance_id, comp_names, (size_t)num_comp_names);
4940}
4941
4942
4943/* ---------------------------------------------------------------------- */
4944
4951 struct yac_instance * instance, char const * caller) {
4952
4953 for (size_t i = 0; i < num_global_components; ++i)
4955 (global_components[i]->instance != instance) ||
4956 !global_components[i]->is_preliminary, caller,
4957 "unresolved preliminary component \"%s\"", global_components[i]->name)
4958
4959 // Actually only grids, points, and masks used in a field definition in the
4960 // current instance need to be checked. However, currently there is no easy
4961 // way to track which grids, points, and masks are used in the field
4962 // definitions of the instance, so we check all of them.
4963
4964 for (size_t i = 0; i < num_global_grids; ++i)
4966 !global_grids[i]->is_preliminary, caller,
4967 "unresolved preliminary grid \"%s\"", global_grids[i]->name)
4968
4969 for (size_t i = 0; i < num_global_points; ++i)
4971 !global_points[i]->is_preliminary, caller,
4972 "unresolved preliminary points \"%s\"",
4973 (global_points[i]->name != NULL)?global_points[i]->name:"<unnamed>")
4974
4975 for (size_t i = 0; i < num_global_masks; ++i)
4977 !global_masks[i]->is_preliminary, caller,
4978 "unresolved preliminary mask \"%s\"",
4979 (global_masks[i]->name != NULL)?global_masks[i]->name:"<unnamed>")
4980}
4981
4982/* ---------------------------------------------------------------------- */
4983
4984void yac_cenddef_instance(int yac_instance_id) {
4985
4986 struct yac_instance * instance =
4987 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
4988
4989 // ensure that there are no unresolved preliminary entries
4990 check_preliminary_entries(instance, __func__);
4991
4992 size_t num_basic_grids = 0;
4993 struct yac_basic_grid ** basic_grids =
4994 xmalloc(num_global_grids * sizeof(*basic_grids));
4995 for (size_t i = 0; i < num_global_grids; ++i) {
4996 if (global_grids[i]->grid != NULL) {
4997 basic_grids[num_basic_grids++] = global_grids[i]->grid;
4998 }
4999 }
5000
5001 yac_instance_setup(instance, basic_grids, num_basic_grids);
5002
5003 free(basic_grids);
5004}
5005
5011
5013 int yac_instance_id, int emit_flags, char ** config) {
5014
5015 struct yac_instance * instance =
5016 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
5017
5018 // ensure that there are no unresolved preliminary entries
5019 check_preliminary_entries(instance, __func__);
5020
5021 size_t num_basic_grids = 0;
5022 struct yac_basic_grid ** basic_grids =
5023 xmalloc(num_global_grids * sizeof(*basic_grids));
5024 for (size_t i = 0; i < num_global_grids; ++i) {
5025 if (global_grids[i]->grid != NULL) {
5026 basic_grids[num_basic_grids++] = global_grids[i]->grid;
5027 }
5028 }
5029 *config =
5031 instance, basic_grids, num_basic_grids, emit_flags);
5032
5033 free(basic_grids);
5034}
5035
5036void yac_cenddef_and_emit_config ( int emit_flags, char ** config ) {
5037
5038 check_default_instance_id(__func__);
5040 default_instance_id, emit_flags, config);
5041}
5042
5043/* ----------------------------------------------------------------------
5044 query functions
5045 ----------------------------------------------------------------------*/
5046
5047int yac_cget_comp_id_instance(int yac_instance_id, const char* comp_name) {
5048
5049 struct yac_instance * instance =
5050 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
5051
5052 check_name_string(comp_name, "comp_name", __func__);
5053
5054 int comp_id;
5056 instance, comp_name, __func__, &comp_id);
5057 return comp_id;
5058}
5059
5060int yac_cget_comp_id(const char* comp_name) {
5061
5062 check_default_instance_id(__func__);
5064}
5065
5066int yac_cget_grid_id(const char* grid_name) {
5067
5068 check_name_string(grid_name, "grid_name", __func__);
5069
5070 int grid_id;
5071 user_input_data_get_or_create_grid(grid_name, __func__, &grid_id);
5072
5073 return grid_id;
5074}
5075
5076int yac_cget_points_id(int grid_id, int location, const char* point_name) {
5077
5078 check_name_string(point_name, "point_name", __func__);
5079
5082 get_grid_info(grid_id, __func__, 1);
5083
5084 int points_id;
5086 grid_info, loc, point_name, __func__, &points_id);
5087 return points_id;
5088}
5089
5090int yac_cget_mask_id(int grid_id, int location, const char* mask_name) {
5091
5092 check_name_string(mask_name, "mask_name", __func__);
5093
5096 get_grid_info(grid_id, __func__, 1);
5097
5098 int mask_id;
5100 grid_info, loc, mask_name, __func__, &mask_id);
5101 return mask_id;
5102}
5103
5104int yac_cget_field_is_defined_instance(int yac_instance_id, const char* comp_name,
5105 const char* grid_name, const char* field_name){
5106 struct yac_instance* instance =
5107 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
5108 struct coupling_field* cpl_field =
5109 yac_instance_get_field(instance, comp_name, grid_name, field_name);
5110 return cpl_field != NULL;
5111}
5112
5114 const char* comp_name, const char* grid_name, const char* field_name){
5115 check_default_instance_id(__func__);
5116 return
5118 default_instance_id, comp_name, grid_name, field_name);
5119}
5120
5121int yac_cget_field_id_instance(int yac_instance_id, const char* comp_name,
5122 const char* grid_name, const char* field_name){
5123 struct yac_instance * instance =
5124 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
5125 struct coupling_field* cpl_field =
5126 yac_instance_get_field(instance, comp_name, grid_name, field_name);
5127 YAC_ASSERT_F(cpl_field != NULL,
5128 "no field '%s' defined on the local process for "
5129 "component '%s' and grid '%s'", field_name, comp_name, grid_name);
5130 return yac_lookup_pointer(cpl_field);
5131}
5132
5133int yac_cget_field_id(const char* comp_name, const char* grid_name, const char* field_name){
5134 check_default_instance_id(__func__);
5136 grid_name, field_name);
5137}
5138
5139/* ---------------------------------------------------------------------- */
5140
5141int yac_cget_nbr_comps_instance ( int yac_instance_id ) {
5142 struct yac_instance * instance =
5143 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
5144 return yac_instance_get_nbr_comps(instance);
5145}
5146
5151
5152int yac_cget_nbr_grids_instance ( int yac_instance_id ) {
5153 struct yac_instance * instance =
5154 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
5155 struct yac_couple_config * couple_config =
5157 return yac_couple_config_get_num_grids(couple_config);
5158}
5159
5164
5166 int yac_instance_id, const char* comp_name ) {
5167
5168 struct yac_instance * instance =
5169 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
5170 struct yac_couple_config * couple_config =
5172 size_t nbr_couple_config_grids =
5173 yac_couple_config_get_num_grids(couple_config);
5174
5175 YAC_ASSERT(comp_name != NULL, "Invalid comp_name. (NULL is not allowed)");
5176
5177 int nbr_comp_grids = 0;
5178 for(size_t i = 0; i < nbr_couple_config_grids; ++i)
5180 yac_instance_id, comp_name,
5181 yac_couple_config_get_grid_name(couple_config, i)) > 0)
5182 nbr_comp_grids++;
5183 return nbr_comp_grids;
5184}
5185
5186int yac_cget_comp_nbr_grids ( const char* comp_name ){
5187 check_default_instance_id(__func__);
5189}
5190
5191int yac_cget_nbr_fields_instance ( int yac_instance_id, const char* comp_name,
5192 const char* grid_name) {
5193 struct yac_instance * instance =
5194 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
5195 struct yac_couple_config * couple_config =
5197 size_t comp_idx = yac_couple_config_get_component_idx(couple_config, comp_name);
5198 int nbr_fields = 0;
5199 size_t nbr_comp_fields =
5200 yac_couple_config_get_num_fields(couple_config, comp_idx);
5201 for(size_t field_idx=0; field_idx<nbr_comp_fields; ++field_idx)
5202 if(yac_couple_config_is_valid_field(couple_config, comp_idx, field_idx) &&
5203 !strcmp(
5204 grid_name,
5206 couple_config, comp_idx, field_idx)))
5207 nbr_fields++;
5208 return nbr_fields;
5209}
5210
5211int yac_cget_nbr_fields ( const char* comp_name, const char* grid_name ) {
5212 check_default_instance_id(__func__);
5213 return yac_cget_nbr_fields_instance(default_instance_id, comp_name, grid_name);
5214}
5215
5217 int yac_instance_id, int nbr_comps, const char ** comp_names) {
5218
5219 struct yac_instance * instance =
5220 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
5221 struct yac_couple_config * couple_config =
5223 size_t nbr_couple_config_comps =
5225
5227 (size_t)nbr_comps == nbr_couple_config_comps,
5228 "invalid array size (nbr_comps = %d; nbr_couple_config_comps = %zu)",
5229 nbr_comps, nbr_couple_config_comps);
5230
5231 for(size_t i = 0; i < nbr_couple_config_comps; ++i)
5232 comp_names[i] = yac_couple_config_get_component_name(couple_config, i);
5233}
5234
5235void yac_cget_comp_names ( int nbr_comps, const char ** comp_names ) {
5236 check_default_instance_id(__func__);
5238 comp_names );
5239}
5240
5242 int yac_instance_id, int nbr_grids, const char ** grid_names ) {
5243
5244 struct yac_instance * instance =
5245 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
5246 struct yac_couple_config * couple_config =
5248 size_t nbr_couple_config_grids =
5249 yac_couple_config_get_num_grids(couple_config);
5250
5252 (size_t)nbr_grids == nbr_couple_config_grids,
5253 "invalid array size (nbr_grids = %d, nbr_couple_config_grids = %zu)",
5254 nbr_grids, nbr_couple_config_grids);
5255
5256 for(size_t i = 0; i < nbr_couple_config_grids; ++i)
5257 grid_names[i] = yac_couple_config_get_grid_name(couple_config, i);
5258}
5259
5260void yac_cget_grid_names ( int nbr_grids, const char ** grid_names ) {
5261 check_default_instance_id(__func__);
5263}
5264
5266 int yac_instance_id, const char* comp_name,
5267 int nbr_grids, const char ** grid_names ) {
5268
5269 struct yac_instance * instance =
5270 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
5271 struct yac_couple_config * couple_config =
5273 size_t nbr_couple_config_grids =
5274 yac_couple_config_get_num_grids(couple_config);
5275
5276 YAC_ASSERT(
5277 comp_name != NULL, "Invalid comp_name. (NULL is not allowed)");
5278
5279 size_t nbr_comp_grid = 0;
5280 for(size_t i = 0; i < nbr_couple_config_grids; ++i) {
5281
5282 const char* curr_grid_name =
5283 yac_couple_config_get_grid_name(couple_config, i);
5284
5286 yac_instance_id, comp_name, curr_grid_name) > 0) {
5287
5289 nbr_comp_grid < (size_t)nbr_grids,
5290 "invalid array size (nbr_grids = %d; nbr_comp_grid > %zu)",
5291 nbr_grids, nbr_comp_grid);
5292
5293 grid_names[nbr_comp_grid] = curr_grid_name;
5294 nbr_comp_grid++;
5295 }
5296 }
5297
5299 nbr_comp_grid == (size_t)nbr_grids,
5300 "invalid array size (nbr_grids = %d; nbr_comp_grid = %zu)",
5301 nbr_grids, nbr_comp_grid);
5302}
5303
5304void yac_cget_comp_grid_names ( const char* comp_name, int nbr_grids,
5305 const char ** grid_names ) {
5306 check_default_instance_id(__func__);
5308 default_instance_id, comp_name, nbr_grids, grid_names);
5309}
5310
5311void yac_cget_field_names_instance ( int yac_instance_id,
5312 const char * comp_name, const char* grid_name,
5313 int nbr_fields, const char ** field_names ) {
5314
5315 struct yac_instance * instance =
5316 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
5317 struct yac_couple_config * couple_config =
5319 size_t comp_idx = yac_couple_config_get_component_idx(couple_config, comp_name);
5320 size_t nbr_comp_fields =
5321 yac_couple_config_get_num_fields(couple_config, comp_idx);
5322
5323 size_t nbr_comp_grid_fields = 0;
5324 for(size_t field_idx = 0; field_idx < nbr_comp_fields; ++field_idx) {
5325 if(yac_couple_config_is_valid_field(couple_config, comp_idx, field_idx) &&
5326 !strcmp(
5327 grid_name,
5329 couple_config, comp_idx, field_idx))) {
5330
5332 (size_t)nbr_fields > nbr_comp_grid_fields,
5333 "invalid array size (nbr_fields = %d; nbr_comp_grid_fields > %zu",
5334 nbr_fields, nbr_comp_fields);
5335
5336 field_names[nbr_comp_grid_fields] =
5337 yac_couple_config_get_field_name(couple_config, comp_idx, field_idx);
5338 nbr_comp_grid_fields++;
5339 }
5340 }
5341
5343 (size_t)nbr_fields == nbr_comp_grid_fields,
5344 "invalid array size (nbr_fields = %d; nbr_comp_grid_fields = %zu",
5345 nbr_fields, nbr_comp_fields);
5346}
5347
5348void yac_cget_field_names ( const char* comp_name, const char* grid_name,
5349 int nbr_fields, const char ** field_names ) {
5350 check_default_instance_id(__func__);
5352 comp_name, grid_name, nbr_fields, field_names );
5353}
5354
5356 struct coupling_field * field =
5358 YAC_ASSERT(field != NULL, "field ID not defined!");
5360}
5361
5363 struct coupling_field * field =
5365 YAC_ASSERT(field != NULL, "field ID not defined!");
5367 return yac_basic_grid_get_name(grid);
5368}
5369
5371 struct coupling_field * field =
5373 YAC_ASSERT(field != NULL, "field ID not defined!");
5374 return yac_get_coupling_field_name(field);
5375}
5376
5378 struct coupling_field * field =
5380 YAC_ASSERT(field != NULL, "field ID not defined!");
5381 return yac_get_coupling_field_timestep(field);
5382}
5383
5385 struct coupling_field * field =
5387 YAC_ASSERT(field != NULL, "field ID not defined!");
5389}
5390
5392 struct coupling_field * field =
5394 YAC_ASSERT(field != NULL, "field ID not defined!");
5396}
5397
5398/* ---------------------------------------------------------------------- */
5399
5401 int yac_instance_id, const char* comp_name, const char* grid_name,
5402 const char* field_name ) {
5403 struct yac_instance * instance =
5404 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
5405 struct yac_couple_config * couple_config =
5407 return
5409 couple_config, comp_name, grid_name, field_name);
5410}
5411
5412const char* yac_cget_field_timestep ( const char* comp_name, const char* grid_name,
5413 const char* field_name ) {
5414 check_default_instance_id(__func__);
5416 grid_name, field_name);
5417}
5418
5420 int yac_instance_id, const char* comp_name, const char* grid_name,
5421 const char* field_name) {
5422 struct yac_instance * instance =
5423 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
5424 return
5427 comp_name, grid_name, field_name);
5428}
5429
5431 const char* comp_name, const char* grid_name, const char* field_name ) {
5432 struct yac_instance * instance =
5433 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
5434
5435 size_t collection_size =
5438 comp_name, grid_name, field_name);
5439
5441 (collection_size == SIZE_MAX) ||
5442 (collection_size <= (size_t)INT_MAX),
5443 "collection size for field \"%s\" on component \"%s\" and grid \"%s\" is "
5444 "too large to be represented as an int (collection_size = %zu)",
5445 field_name, comp_name, grid_name, collection_size);
5446
5447 return (collection_size == SIZE_MAX)?-1:(int)collection_size;
5448}
5449
5451 const char* comp_name, const char* grid_name, const char* field_name) {
5452 check_default_instance_id(__func__);
5453 return
5455 default_instance_id, comp_name, grid_name, field_name);
5456}
5457
5458int yac_cget_field_collection_size ( const char* comp_name,
5459 const char* grid_name, const char* field_name ) {
5460 check_default_instance_id(__func__);
5461 return
5463 default_instance_id, comp_name, grid_name, field_name);
5464}
5465
5466int yac_cget_field_role_instance ( int yac_instance_id, const char* comp_name,
5467 const char* grid_name, const char* field_name ) {
5468 struct yac_instance * instance =
5469 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
5470 struct yac_couple_config * couple_config =
5472 return
5474 couple_config, comp_name, grid_name, field_name);
5475}
5476
5477int yac_cget_field_role ( const char* comp_name, const char* grid_name,
5478 const char* field_name ) {
5479 check_default_instance_id(__func__);
5481 grid_name, field_name);
5482}
5483
5484void yac_cget_field_source_instance ( int yac_instance_id,
5485 const char* tgt_comp_name, const char* tgt_grid_name,
5486 const char* tgt_field_name, const char** src_comp_name,
5487 const char** src_grid_name, const char** src_field_name ) {
5488 struct yac_instance * instance =
5489 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
5490 struct yac_couple_config * couple_config =
5493 couple_config,
5494 tgt_comp_name, tgt_grid_name, tgt_field_name,
5495 src_comp_name, src_grid_name, src_field_name);
5496}
5497
5499 const char* tgt_comp_name, const char* tgt_grid_name,
5500 const char* tgt_field_name, const char** src_comp_name,
5501 const char** src_grid_name, const char** src_field_name ) {
5502 check_default_instance_id(__func__);
5505 tgt_comp_name, tgt_grid_name, tgt_field_name,
5506 src_comp_name, src_grid_name, src_field_name);
5507}
5508
5509/* ---------------------------------------------------------------------- */
5510
5512 const char * grid_name, int nbr_vertices[2], int cyclic[2],
5513 double *x_vertices, double *y_vertices, int *grid_id) {
5514
5515 size_t nbr_vertices_size_t[2] =
5516 {(size_t)nbr_vertices[0], (size_t)nbr_vertices[1]};
5517
5518 check_x_vertices(x_vertices, nbr_vertices[0], __func__);
5519 check_y_vertices(y_vertices, nbr_vertices[1], __func__);
5520
5521 *grid_id =
5524 nbr_vertices_size_t, cyclic, x_vertices, y_vertices));
5525}
5526
5527/* ---------------------------------------------------------------------- */
5528
5530 const char * grid_name, int nbr_vertices[2], int cyclic[2],
5531 double *x_vertices, double *y_vertices, int *grid_id) {
5532
5533 size_t nbr_vertices_size_t[2] =
5534 {(size_t)nbr_vertices[0], (size_t)nbr_vertices[1]};
5535
5536 check_x_vertices(x_vertices, nbr_vertices[0], __func__);
5537 check_y_vertices(y_vertices, nbr_vertices[1], __func__);
5538
5539 *grid_id =
5542 nbr_vertices_size_t, cyclic, x_vertices, y_vertices));
5543}
5544
5545/* ---------------------------------------------------------------------- */
5546
5548 const char * grid_name, int nbr_vertices,
5549 int nbr_cells, int *num_vertices_per_cell, double *x_vertices,
5550 double *y_vertices, int *cell_to_vertex, int *grid_id) {
5551
5552 check_x_vertices(x_vertices, nbr_vertices, __func__);
5553 check_y_vertices(y_vertices, nbr_vertices, __func__);
5555 cell_to_vertex, num_vertices_per_cell, nbr_cells, nbr_vertices, __func__);
5556
5557 *grid_id =
5559 grid_name,
5561 (size_t)nbr_vertices, (size_t)nbr_cells, num_vertices_per_cell,
5562 x_vertices, y_vertices, cell_to_vertex));
5563}
5564
5565/* ---------------------------------------------------------------------- */
5566
5568 const char * grid_name, int nbr_vertices,
5569 int nbr_cells, int *num_vertices_per_cell, double *x_vertices,
5570 double *y_vertices, int *cell_to_vertex, int *grid_id) {
5571
5572 check_x_vertices(x_vertices, nbr_vertices, __func__);
5573 check_y_vertices(y_vertices, nbr_vertices, __func__);
5575 cell_to_vertex, num_vertices_per_cell, nbr_cells, nbr_vertices, __func__);
5576
5577 *grid_id =
5579 grid_name,
5581 (size_t)nbr_vertices, (size_t)nbr_cells, num_vertices_per_cell,
5582 x_vertices, y_vertices, cell_to_vertex));
5583}
5584
5585/* ---------------------------------------------------------------------- */
5586
5588 const char * grid_name, int nbr_vertices, int nbr_cells, int nbr_edges,
5589 int *num_edges_per_cell, double *x_vertices, double *y_vertices,
5590 int *cell_to_edge, int *edge_to_vertex, int *grid_id) {
5591
5592 check_x_vertices(x_vertices, nbr_vertices, __func__);
5593 check_y_vertices(y_vertices, nbr_vertices, __func__);
5595 cell_to_edge, num_edges_per_cell, nbr_cells, nbr_edges, __func__);
5596
5597 *grid_id =
5599 grid_name,
5601 (size_t)nbr_vertices, (size_t)nbr_cells, (size_t)nbr_edges,
5602 num_edges_per_cell, x_vertices, y_vertices,
5603 cell_to_edge, edge_to_vertex));
5604}
5605
5606/* ---------------------------------------------------------------------- */
5607
5609 const char * grid_name, int nbr_vertices, int nbr_cells, int nbr_edges,
5610 int *num_edges_per_cell, double *x_vertices, double *y_vertices,
5611 int *cell_to_edge, int *edge_to_vertex, int *grid_id) {
5612
5613 check_x_vertices(x_vertices, nbr_vertices, __func__);
5614 check_y_vertices(y_vertices, nbr_vertices, __func__);
5616 cell_to_edge, num_edges_per_cell, nbr_cells, nbr_edges, __func__);
5617
5618 *grid_id =
5620 grid_name,
5622 (size_t)nbr_vertices, (size_t)nbr_cells, (size_t)nbr_edges,
5623 num_edges_per_cell, x_vertices, y_vertices,
5624 cell_to_edge, edge_to_vertex));
5625}
5626
5627/* ---------------------------------------------------------------------- */
5628
5630 const char * grid_name, int nbr_points,
5631 double *x_points, double *y_points, int *grid_id) {
5632
5633 check_x_vertices(x_points, nbr_points, __func__);
5634 check_y_vertices(y_points, nbr_points, __func__);
5635
5636 *grid_id =
5638 grid_name,
5640 (size_t)nbr_points, x_points, y_points));
5641}
5642
5643/* ---------------------------------------------------------------------- */
5644
5646 const char * grid_name, int nbr_vertices[2], int cyclic[2],
5647 double *x_vertices, double *y_vertices,
5648 double x_north_pole, double y_north_pole, int *grid_id) {
5649
5650 size_t nbr_vertices_size_t[2] =
5651 {(size_t)nbr_vertices[0], (size_t)nbr_vertices[1]};
5652
5653 check_x_vertices(x_vertices, nbr_vertices[0], __func__);
5654 check_y_vertices(y_vertices, nbr_vertices[1], __func__);
5655
5656 *grid_id =
5659 nbr_vertices_size_t, cyclic, x_vertices, y_vertices,
5660 x_north_pole, y_north_pole));
5661}
5662
5663/* ---------------------------------------------------------------------- */
5664
5677 char const * caller, int location, int grid_id,
5678 yac_int ** grid_global_ids, size_t * count) {
5679
5681 get_grid_info(grid_id, caller, 0);
5682
5685
5686 yac_int ** temp_grid_global_ids;
5687
5688 switch (location) {
5689 YAC_UNREACHABLE_DEFAULT_F_FUNC(caller, "invalid location (%d)", location);
5690 case (YAC_LOC_CELL): {
5691 temp_grid_global_ids = &(grid_data->cell_ids);
5692 *count = grid_data->num_cells;
5693 break;
5694 }
5695 case (YAC_LOC_CORNER): {
5696 temp_grid_global_ids = &(grid_data->vertex_ids);
5697 *count = grid_data->num_vertices;
5698 break;
5699 }
5700 case (YAC_LOC_EDGE): {
5701 temp_grid_global_ids = &(grid_data->edge_ids);
5702 *count = grid_data->num_edges;
5703 break;
5704 }
5705 }
5706
5707 if (*temp_grid_global_ids == NULL) {
5708 *temp_grid_global_ids = xmalloc(*count * sizeof(**temp_grid_global_ids));
5709 }
5710
5711 *grid_global_ids = *temp_grid_global_ids;
5712}
5713
5715 yac_int const * global_index, int location, int grid_id) {
5716
5717 yac_int * grid_global_ids;
5718 size_t count;
5719
5721 __func__, location, grid_id, &grid_global_ids, &count);
5722
5723 memcpy(grid_global_ids, global_index, count * sizeof(*global_index));
5724}
5725
5727 int const * global_index, int location, int grid_id) {
5728
5729 yac_int * grid_global_ids;
5730 size_t count;
5731
5733 __func__, location, grid_id, &grid_global_ids, &count);
5734
5735 for (size_t i = 0; i < count; ++i) {
5736 grid_global_ids[i] = (yac_int)(global_index[i]);
5737 }
5738}
5739
5740/* ---------------------------------------------------------------------- */
5741
5743 int const * is_core, int location, int grid_id) {
5744
5746 get_grid_info(grid_id, __func__, 0);
5747
5750
5751 int ** grid_core_mask;
5752 size_t count;
5753
5754 YAC_ASSERT(
5755 (location == YAC_LOC_CELL) ||
5756 (location == YAC_LOC_CORNER) ||
5757 (location == YAC_LOC_EDGE), "invalid location")
5758 switch (location) {
5759 case (YAC_LOC_CELL): {
5760 grid_core_mask = &(grid_data->core_cell_mask);
5761 count = grid_data->num_cells;
5762 break;
5763 }
5764 case (YAC_LOC_CORNER): {
5765 grid_core_mask = &(grid_data->core_vertex_mask);
5766 count = grid_data->num_vertices;
5767 break;
5768 }
5769 default:
5770 case (YAC_LOC_EDGE): {
5771 grid_core_mask = &(grid_data->core_edge_mask);
5772 count = grid_data->num_edges;
5773 break;
5774 }
5775 }
5776
5777 size_t core_mask_size = count * sizeof(**grid_core_mask);
5778 if (*grid_core_mask == NULL) *grid_core_mask = xmalloc(core_mask_size);
5779 memcpy(*grid_core_mask, is_core, core_mask_size);
5780}
5781
5782/* ---------------------------------------------------------------------- */
5783
5784size_t yac_cget_grid_size ( int located, int grid_id ) {
5785
5786 struct yac_basic_grid * grid =
5787 get_grid_info(grid_id, __func__, 0)->grid;
5788 enum yac_location location = yac_get_location(located);
5789
5791}
5792
5793/* ---------------------------------------------------------------------- */
5794
5795void yac_ccompute_grid_cell_areas ( int grid_id, double * cell_areas) {
5796
5797 struct yac_basic_grid * grid =
5798 get_grid_info(grid_id, __func__, 0)->grid;
5799
5800 yac_basic_grid_compute_cell_areas(grid, cell_areas);
5801}
5802
5803/* ---------------------------------------------------------------------- */
5804
5805size_t yac_cget_points_size ( int points_id ) {
5806
5807 struct user_input_data_points * curr_points =
5808 get_points_info(points_id, __func__);
5809
5810 struct yac_basic_grid * grid = curr_points->grid->grid;
5811 enum yac_location location = curr_points->location;
5812
5814}
5815
5816/* ---------------------------------------------------------------------- */
5817
5833
5834void yac_cfree_interp_stack_config(int interp_stack_config_id) {
5835
5836 struct yac_interp_stack_config * interp_stack_config =
5838 interp_stack_config_id, "interp_stack_config_id");
5839 yac_interp_stack_config_delete(interp_stack_config);
5840 yac_invalidate_unique_id(interp_stack_config_id);
5841
5842 int flag = 0;
5843 for (size_t i = 0; i < num_global_interp_stack_configs; ++i) {
5844 if (global_interp_stack_configs[i] == interp_stack_config)
5846 flag |= (global_interp_stack_configs[i] != NULL);
5847 }
5848 if (!flag) {
5852 }
5853}
5854
5856 int interp_stack_config_id,
5857 int reduction_type, int partial_coverage) {
5858
5859 struct yac_interp_stack_config * interp_stack_config =
5861 interp_stack_config_id, "interp_stack_config_id");
5862
5863 YAC_ASSERT(
5864 (reduction_type == YAC_INTERP_AVG_ARITHMETIC) ||
5865 (reduction_type == YAC_INTERP_AVG_DIST) ||
5866 (reduction_type == YAC_INTERP_AVG_BARY), "invalid reduction type")
5867
5869 interp_stack_config, (enum yac_interp_avg_weight_type)reduction_type,
5870 partial_coverage);
5871}
5872
5874 int interp_stack_config_id,
5875 int weight_type, int partial_coverage) {
5876
5877 struct yac_interp_stack_config * interp_stack_config =
5879 interp_stack_config_id, "interp_stack_config_id");
5880
5881 YAC_ASSERT(
5883 (weight_type == YAC_INTERP_NCC_DIST), "invalid reduction type")
5884
5886 interp_stack_config, (enum yac_interp_ncc_weight_type)weight_type,
5887 partial_coverage);
5888}
5889
5891 int interp_stack_config_id,
5892 int type, size_t n, double max_search_distance, double scale) {
5893
5894 struct yac_interp_stack_config * interp_stack_config =
5896 interp_stack_config_id, "interp_stack_config_id");
5897
5898 YAC_ASSERT(
5899 (type == YAC_INTERP_NNN_AVG) ||
5902 (type == YAC_INTERP_NNN_RBF) ||
5903 (type == YAC_INTERP_NNN_ZERO), "invalid weightening type")
5904
5906 interp_stack_config, (enum yac_interp_nnn_weight_type)type, n,
5907 max_search_distance, scale);
5908}
5909
5911 int interp_stack_config_id,
5912 int weight_type, int search_distance_type, double search_distance, double scale) {
5913
5914 struct yac_interp_stack_config * interp_stack_config =
5916 interp_stack_config_id, "interp_stack_config_id");
5917
5918 YAC_ASSERT(
5922 (weight_type == YAC_INTERP_DNN_WEIGHT_RBF), "invalid weight type")
5923
5924 YAC_ASSERT(
5925 (search_distance_type == YAC_INTERP_DNN_SEARCH_DISTANCE_FIXED) ||
5926 (search_distance_type == YAC_INTERP_DNN_SEARCH_DISTANCE_CELL_AREA),
5927 "invalid search distance type")
5928
5930 interp_stack_config,
5932 (enum yac_interp_dnn_search_distance_type)search_distance_type,
5933 search_distance, scale);
5934}
5935
5937 int interp_stack_config_id,
5938 size_t n, double max_search_distance, double scale) {
5939
5940 struct yac_interp_stack_config * interp_stack_config =
5942 interp_stack_config_id, "interp_stack_config_id");
5943
5945 interp_stack_config, n, max_search_distance, scale);
5946}
5947
5949 int interp_stack_config_id, int order, int enforced_conserv,
5950 int partial_coverage, int normalisation) {
5951
5952 struct yac_interp_stack_config * interp_stack_config =
5954 interp_stack_config_id, "interp_stack_config_id");
5955
5956 YAC_ASSERT(
5957 (normalisation == YAC_INTERP_CONSERV_DESTAREA) ||
5958 (normalisation == YAC_INTERP_CONSERV_FRACAREA),
5959 "invalid normalisation type")
5960
5962 interp_stack_config, order, enforced_conserv, partial_coverage,
5963 (enum yac_interp_method_conserv_normalisation)normalisation);
5964}
5965
5966void yac_cget_ext_spmap_config(int * ext_spmap_config_id) {
5967
5968 ExtSpmapConfig * ext_spmap_config =
5969 xmalloc(1 * sizeof(*ext_spmap_config));
5970
5971 ext_spmap_config->spread_distance =
5973 ext_spmap_config->max_search_distance =
5975 ext_spmap_config->weight_type =
5977 ext_spmap_config->scale_type =
5979
5980 ext_spmap_config->src_cell_area_config.type =
5982 ext_spmap_config->src_cell_area_config.data.yac.sphere_radius =
5984 ext_spmap_config->tgt_cell_area_config.type =
5986 ext_spmap_config->tgt_cell_area_config.data.yac.sphere_radius =
5988
5989 *ext_spmap_config_id = yac_pointer_to_unique_id(ext_spmap_config);
5990}
5991
5992void yac_cfree_ext_spmap_config(int ext_spmap_config_id) {
5993
5994 ExtSpmapConfig * ext_spmap_config =
5996 ext_spmap_config_id, "ext_spmap_config_id");
5997
5998 if (ext_spmap_config->src_cell_area_config.type ==
6000 free(ext_spmap_config->src_cell_area_config.data.file.filename);
6001 free(ext_spmap_config->src_cell_area_config.data.file.varname);
6002 }
6003 if (ext_spmap_config->tgt_cell_area_config.type ==
6005 free(ext_spmap_config->tgt_cell_area_config.data.file.filename);
6006 free(ext_spmap_config->tgt_cell_area_config.data.file.varname);
6007 }
6008
6009 free(ext_spmap_config);
6010 yac_invalidate_unique_id(ext_spmap_config_id);
6011}
6012
6014 int ext_spmap_config_id, double spread_distance) {
6015
6016 ExtSpmapConfig * ext_spmap_config =
6018 ext_spmap_config_id, "ext_spmap_config_id");
6019
6020 ext_spmap_config->spread_distance = spread_distance;
6021}
6022
6024 int ext_spmap_config_id, double max_search_distance) {
6025
6026 ExtSpmapConfig * ext_spmap_config =
6028 ext_spmap_config_id, "ext_spmap_config_id");
6029
6030 ext_spmap_config->max_search_distance = max_search_distance;
6031}
6032
6034 int ext_spmap_config_id, int weight_type) {
6035
6036 ExtSpmapConfig * ext_spmap_config =
6038 ext_spmap_config_id, "ext_spmap_config_id");
6039
6040 YAC_ASSERT(
6042 (weight_type == YAC_INTERP_SPMAP_DIST), "invalid weight type");
6043
6044 ext_spmap_config->weight_type =
6046}
6047
6049 int ext_spmap_config_id, int scale_type) {
6050
6051 ExtSpmapConfig * ext_spmap_config =
6053 ext_spmap_config_id, "ext_spmap_config_id");
6054
6055 YAC_ASSERT(
6056 (scale_type == YAC_INTERP_SPMAP_NONE) ||
6057 (scale_type == YAC_INTERP_SPMAP_SRCAREA) ||
6058 (scale_type == YAC_INTERP_SPMAP_INVTGTAREA) ||
6059 (scale_type == YAC_INTERP_SPMAP_FRACAREA), "invalid scaling type");
6060
6061 ext_spmap_config->scale_type =
6062 (enum yac_interp_spmap_scale_type)scale_type;
6063}
6064
6066 int ext_spmap_config_id, double sphere_radius) {
6067
6068 ExtSpmapConfig * ext_spmap_config =
6070 ext_spmap_config_id, "ext_spmap_config_id");
6071
6072 if (ext_spmap_config->src_cell_area_config.type ==
6074 free(ext_spmap_config->src_cell_area_config.data.file.filename);
6075 free(ext_spmap_config->src_cell_area_config.data.file.varname);
6076 }
6077
6078 ext_spmap_config->src_cell_area_config.type =
6080 ext_spmap_config->src_cell_area_config.data.yac.sphere_radius = sphere_radius;
6081}
6082
6084 int ext_spmap_config_id, double sphere_radius) {
6085
6086 ExtSpmapConfig * ext_spmap_config =
6088 ext_spmap_config_id, "ext_spmap_config_id");
6089
6090 if (ext_spmap_config->tgt_cell_area_config.type ==
6092 free(ext_spmap_config->tgt_cell_area_config.data.file.filename);
6093 free(ext_spmap_config->tgt_cell_area_config.data.file.varname);
6094 }
6095
6096 ext_spmap_config->tgt_cell_area_config.type =
6098 ext_spmap_config->tgt_cell_area_config.data.yac.sphere_radius = sphere_radius;
6099}
6100
6102 CellAreaConfig * cell_area_config, char const * filename,
6103 char const * varname, int min_global_id, char const * role) {
6104
6106 (filename != NULL) && (*filename != '\0'), "missing file name (%s)", role);
6108 (varname != NULL) && (*varname != '\0'), "missing variable name (%s)", role);
6109
6110 // in case cell area config is already set to file, check consistency of new
6111 // file name, variable name, and min global ID with existing ones
6113 (cell_area_config->type != YAC_INTERP_SPMAP_CELL_AREA_FILE) ||
6114 !strcmp(cell_area_config->data.file.filename, filename),
6115 "file name mismatch with existing file name in %s config "
6116 "(old \"%s\" vs new \"%s\")",
6117 role, cell_area_config->data.file.filename, filename)
6119 (cell_area_config->type != YAC_INTERP_SPMAP_CELL_AREA_FILE) ||
6120 !strcmp(cell_area_config->data.file.varname, varname),
6121 "variable name mismatch with existing variable name in %s config "
6122 "(old \"%s\" vs new \"%s\")",
6123 role, cell_area_config->data.file.varname, varname)
6125 (cell_area_config->type != YAC_INTERP_SPMAP_CELL_AREA_FILE) ||
6126 (cell_area_config->data.file.min_global_id ==
6127 min_global_id),
6128 "min global ID mismatch with existing min global ID in %s config "
6129 "(old %d vs new %d)",
6130 role, cell_area_config->data.file.min_global_id,
6131 min_global_id)
6132
6133 if (cell_area_config->type != YAC_INTERP_SPMAP_CELL_AREA_FILE) {
6134 cell_area_config->type = YAC_INTERP_SPMAP_CELL_AREA_FILE;
6135 cell_area_config->data.file.filename = xstrdup(filename);
6136 cell_area_config->data.file.varname = xstrdup(varname);
6137 cell_area_config->data.file.min_global_id = min_global_id;
6138 }
6139}
6140
6142 int ext_spmap_config_id, char const * filename,
6143 char const * varname, int min_global_id) {
6144
6145 ExtSpmapConfig * ext_spmap_config =
6146 yac_unique_id_to_pointer(ext_spmap_config_id, "ext_spmap_config_id");
6147
6149 &ext_spmap_config->src_cell_area_config, filename, varname, min_global_id,
6150 "source");
6151}
6152
6154 int ext_spmap_config_id, char const * filename,
6155 char const * varname, int min_global_id) {
6156
6157 ExtSpmapConfig * ext_spmap_config =
6158 yac_unique_id_to_pointer(ext_spmap_config_id, "ext_spmap_config_id");
6159
6161 &ext_spmap_config->tgt_cell_area_config, filename, varname, min_global_id,
6162 "target");
6163}
6164
6165void yac_cget_spmap_overwrite_config(int * spmap_overwrite_config_id) {
6166
6167 ExtSpmapConfigOverwriteConfig * spmap_overwrite_config =
6168 xmalloc(1 * sizeof(*spmap_overwrite_config));
6169
6170 spmap_overwrite_config->src_point_selection.type =
6172
6173 spmap_overwrite_config->spread_distance =
6175 spmap_overwrite_config->max_search_distance =
6177 spmap_overwrite_config->weight_type =
6179
6180 *spmap_overwrite_config_id = yac_pointer_to_unique_id(spmap_overwrite_config);
6181}
6182
6183void yac_cfree_spmap_overwrite_config(int spmap_overwrite_config_id) {
6184
6185 ExtSpmapConfigOverwriteConfig * spmap_overwrite_config =
6187 spmap_overwrite_config_id, "spmap_overwrite_config_id");
6188
6189 free(spmap_overwrite_config);
6190 yac_invalidate_unique_id(spmap_overwrite_config_id);
6191}
6192
6194 int spmap_overwrite_config_id, double center_lon, double center_lat,
6195 double inc_angle) {
6196
6197 ExtSpmapConfigOverwriteConfig * spmap_overwrite_config =
6199 spmap_overwrite_config_id, "spmap_overwrite_config_id");
6200
6201 spmap_overwrite_config->src_point_selection.type =
6203 spmap_overwrite_config->src_point_selection.data.bnd_circle.center_lon =
6204 center_lon;
6205 spmap_overwrite_config->src_point_selection.data.bnd_circle.center_lat =
6206 center_lat;
6207 spmap_overwrite_config->src_point_selection.data.bnd_circle.inc_angle =
6208 inc_angle;
6209}
6210
6212 int spmap_overwrite_config_id, double spread_distance) {
6213
6214 ExtSpmapConfigOverwriteConfig * spmap_overwrite_config =
6216 spmap_overwrite_config_id, "spmap_overwrite_config_id");
6217
6218 spmap_overwrite_config->spread_distance = spread_distance;
6219}
6220
6222 int spmap_overwrite_config_id, double max_search_distance) {
6223
6224 ExtSpmapConfigOverwriteConfig * spmap_overwrite_config =
6226 spmap_overwrite_config_id, "spmap_overwrite_config_id");
6227
6228 spmap_overwrite_config->max_search_distance = max_search_distance;
6229}
6230
6232 int spmap_overwrite_config_id, int weight_type) {
6233
6234 ExtSpmapConfigOverwriteConfig * spmap_overwrite_config =
6236 spmap_overwrite_config_id, "spmap_overwrite_config_id");
6237
6238 YAC_ASSERT(
6240 (weight_type == YAC_INTERP_SPMAP_DIST), "invalid weight type");
6241
6242 spmap_overwrite_config->weight_type =
6244}
6245
6247 int interp_stack_config_id, double spread_distance,
6248 double max_search_distance, int weight_type, int scale_type,
6249 double src_sphere_radius, char const * src_filename,
6250 char const * src_varname, int src_min_global_id,
6251 double tgt_sphere_radius, char const * tgt_filename,
6252 char const * tgt_varname, int tgt_min_global_id) {
6253
6254 struct yac_interp_stack_config * interp_stack_config =
6256 interp_stack_config_id, "interp_stack_config_id");
6257
6258 YAC_ASSERT(
6260 (weight_type == YAC_INTERP_SPMAP_DIST), "invalid weightening type")
6261
6262 YAC_ASSERT(
6263 (scale_type == YAC_INTERP_SPMAP_NONE) ||
6264 (scale_type == YAC_INTERP_SPMAP_SRCAREA) ||
6265 (scale_type == YAC_INTERP_SPMAP_INVTGTAREA) ||
6266 (scale_type == YAC_INTERP_SPMAP_FRACAREA), "invalid scaling type")
6267
6269 interp_stack_config, spread_distance, max_search_distance,
6271 (enum yac_interp_spmap_scale_type)scale_type,
6272 src_sphere_radius, src_filename, src_varname, src_min_global_id,
6273 tgt_sphere_radius, tgt_filename, tgt_varname, tgt_min_global_id);
6274}
6275
6276static struct yac_spmap_cell_area_config *
6278
6279 struct yac_spmap_cell_area_config * cell_area_config = NULL;
6280
6281 switch (config.type) {
6282 YAC_UNREACHABLE_DEFAULT("invalid cell area config type");
6284 cell_area_config =
6285 yac_spmap_cell_area_config_yac_new(config.data.yac.sphere_radius);
6286 break;
6287 };
6289 cell_area_config =
6291 config.data.file.filename, config.data.file.varname,
6292 (yac_int)config.data.file.min_global_id);
6293 break;
6294 };
6295 }
6296
6297 return cell_area_config;
6298}
6299
6301 int spmap_overwrite_config_id) {
6302
6303 ExtSpmapConfigOverwriteConfig * ext_spmap_overwrite_config =
6305 spmap_overwrite_config_id, "spmap_overwrite_config_id");
6306
6307 struct yac_point_selection * src_point_selection;
6308
6309 YAC_ASSERT(
6310 ext_spmap_overwrite_config->src_point_selection.type !=
6311 YAC_POINT_SELECTION_TYPE_EMPTY, "missing point selection type");
6312
6313 switch(ext_spmap_overwrite_config->src_point_selection.type) {
6314 YAC_UNREACHABLE_DEFAULT("invalid point selection type");
6316 src_point_selection =
6318 ext_spmap_overwrite_config->src_point_selection.data.
6320 ext_spmap_overwrite_config->src_point_selection.data.
6322 ext_spmap_overwrite_config->src_point_selection.data.
6324 break;
6325 }
6326 }
6327
6328 struct yac_interp_spmap_config * spmap_config =
6330 ext_spmap_overwrite_config->spread_distance,
6331 ext_spmap_overwrite_config->max_search_distance,
6332 ext_spmap_overwrite_config->weight_type, NULL);
6333
6334 struct yac_spmap_overwrite_config * overwrite_config =
6336
6337 yac_interp_spmap_config_delete(spmap_config);
6339
6340 return overwrite_config;
6341}
6342
6344 int interp_stack_config_id, int ext_spmap_config_id,
6345 int * spmap_overwrite_config_ids, int spmap_overwrite_config_count) {
6346
6347 struct yac_interp_stack_config * interp_stack_config =
6349 interp_stack_config_id, "interp_stack_config_id");
6350
6351 ExtSpmapConfig * ext_spmap_config =
6353 ext_spmap_config_id, "ext_spmap_config_id");
6354
6355 struct yac_spmap_cell_area_config * src_cell_area_config =
6357 struct yac_spmap_cell_area_config * tgt_cell_area_config =
6359
6360 struct yac_spmap_scale_config * scale_config =
6362 ext_spmap_config->scale_type, src_cell_area_config, tgt_cell_area_config);
6363
6364 yac_spmap_cell_area_config_delete(tgt_cell_area_config);
6365 yac_spmap_cell_area_config_delete(src_cell_area_config);
6366
6367 struct yac_interp_spmap_config * spmap_config =
6369 ext_spmap_config->spread_distance, ext_spmap_config->max_search_distance,
6370 ext_spmap_config->weight_type, scale_config);
6371
6372 struct yac_spmap_overwrite_config ** overwrite_configs =
6373 (spmap_overwrite_config_count > 0)?
6374 xcalloc(
6375 ((size_t)spmap_overwrite_config_count + 1),
6376 sizeof(*overwrite_configs)):NULL;
6377
6378 for (int i = 0; i < spmap_overwrite_config_count; ++i) {
6379 overwrite_configs[i] =
6380 generate_overwrite_config(spmap_overwrite_config_ids[i]);
6381 }
6382
6384 interp_stack_config, spmap_config, overwrite_configs);
6385
6386 for (int i = 0; i < spmap_overwrite_config_count; ++i) {
6387 yac_spmap_overwrite_config_delete(overwrite_configs[i]);
6388 }
6389 free(overwrite_configs);
6390 yac_interp_spmap_config_delete(spmap_config);
6391 yac_spmap_scale_config_delete(scale_config);
6392}
6393
6395 int interp_stack_config_id, double spread_distance,
6396 double max_search_distance, int weight_type, int scale_type,
6397 double src_sphere_radius, char const * src_filename,
6398 char const * src_varname, int src_min_global_id,
6399 double tgt_sphere_radius, char const * tgt_filename,
6400 char const * tgt_varname, int tgt_min_global_id,
6401 int * overwrite_config_ids, int overwrite_config_count) {
6402
6403 if (src_filename && (src_filename[0] == '\0')) src_filename = NULL;
6404 if (src_varname && (src_varname[0] == '\0')) src_varname = NULL;
6405 if (tgt_filename && (tgt_filename[0] == '\0')) tgt_filename = NULL;
6406 if (tgt_varname && (tgt_varname[0] == '\0')) tgt_varname = NULL;
6407
6408 if (overwrite_config_count == 0) {
6409
6411 interp_stack_config_id, spread_distance, max_search_distance,
6412 weight_type, scale_type,
6413 src_sphere_radius, src_filename, src_varname, src_min_global_id,
6414 tgt_sphere_radius, tgt_filename, tgt_varname, tgt_min_global_id);
6415
6416 } else {
6417
6418 YAC_ASSERT(
6419 overwrite_config_ids, "missing overwrite configuration ids");
6420
6421 int ext_spmap_config_id;
6422 yac_cget_ext_spmap_config(&ext_spmap_config_id);
6424 ext_spmap_config_id, spread_distance);
6426 ext_spmap_config_id, max_search_distance);
6428 yac_cset_ext_spmap_config_scale_type(ext_spmap_config_id, scale_type);
6429
6430 if (src_filename != NULL) {
6432 src_varname != NULL,
6433 "source file name \"%s\" was provided, but variable name is missing",
6434 src_filename);
6436 src_sphere_radius == YAC_INTERP_SPMAP_SPHERE_RADIUS_DEFAULT,
6437 "source file name \"%s\" was provided, but sphere radius is set as well",
6438 src_filename);
6440 ext_spmap_config_id, src_filename, src_varname, src_min_global_id);
6441 } else {
6443 ext_spmap_config_id, src_sphere_radius);
6444 }
6445
6446 if (tgt_filename != NULL) {
6448 tgt_varname != NULL,
6449 "target file name \"%s\" was provided, but variable name is missing",
6450 tgt_filename);
6452 tgt_sphere_radius == YAC_INTERP_SPMAP_SPHERE_RADIUS_DEFAULT,
6453 "target file name \"%s\" was provided, but sphere radius is set as well",
6454 tgt_filename);
6456 ext_spmap_config_id, tgt_filename, tgt_varname, tgt_min_global_id);
6457 } else {
6459 ext_spmap_config_id, tgt_sphere_radius);
6460 }
6461
6463 interp_stack_config_id, ext_spmap_config_id,
6464 overwrite_config_ids, overwrite_config_count);
6465
6466 yac_cfree_ext_spmap_config(ext_spmap_config_id);
6467 }
6468}
6469
6470void yac_cadd_interp_stack_config_hcsbb(int interp_stack_config_id) {
6471
6472 struct yac_interp_stack_config * interp_stack_config =
6474 interp_stack_config_id, "interp_stack_config_id");
6475
6476 yac_interp_stack_config_add_hcsbb(interp_stack_config);
6477}
6478
6480 int interp_stack_config_id, char const * filename,
6481 int on_missing_file, int on_succes) {
6482
6483 struct yac_interp_stack_config * interp_stack_config =
6485 interp_stack_config_id, "interp_stack_config_id");
6486
6487 YAC_ASSERT(
6488 (on_missing_file == YAC_INTERP_FILE_MISSING_ERROR) ||
6489 (on_missing_file == YAC_INTERP_FILE_MISSING_CONT),
6490 "invalid on_missing_file value")
6491
6492 YAC_ASSERT(
6493 (on_succes == YAC_INTERP_FILE_SUCCESS_STOP) ||
6494 (on_succes == YAC_INTERP_FILE_SUCCESS_CONT), "invalid on_succes value")
6495
6497 interp_stack_config, filename,
6498 (enum yac_interp_file_on_missing_file)on_missing_file,
6499 (enum yac_interp_file_on_success)on_succes);
6500}
6501
6503 int interp_stack_config_id, char const * filename) {
6504
6506 interp_stack_config_id, filename,
6509}
6510
6512 int interp_stack_config_id, double value) {
6513
6514 struct yac_interp_stack_config * interp_stack_config =
6516 interp_stack_config_id, "interp_stack_config_id");
6517
6518 yac_interp_stack_config_add_fixed(interp_stack_config, value);
6519}
6520
6522 int interp_stack_config_id, char const * constructor_key,
6523 char const * do_search_key) {
6524
6525 struct yac_interp_stack_config * interp_stack_config =
6527 interp_stack_config_id, "interp_stack_config_id");
6528
6530 interp_stack_config, constructor_key, do_search_key);
6531}
6532
6534 int interp_stack_config_id, int creep_distance) {
6535
6536 struct yac_interp_stack_config * interp_stack_config =
6538 interp_stack_config_id, "interp_stack_config_id");
6539
6540 yac_interp_stack_config_add_creep(interp_stack_config, creep_distance);
6541}
6542
6544 int interp_stack_config_id, char const * func_compute_weights_key) {
6545
6546 struct yac_interp_stack_config * interp_stack_config =
6548 interp_stack_config_id, "interp_stack_config_id");
6549
6551 interp_stack_config, func_compute_weights_key);
6552}
6553
6554/* ---------------------------------------------------------------------- */
6555
6563
6564/* ---------------------------------------------------------------------- */
6565
6567 char const * interp_stack_config, int parse_flags) {
6568
6569
6571 xrealloc(
6575
6578 interp_stack_config, parse_flags);
6579
6580 int interp_stack_config_id =
6584
6585 return interp_stack_config_id;
6586}
6587
6589 char const * interp_stack_config, int * interp_stack_config_id) {
6590
6591 *interp_stack_config_id =
6593 interp_stack_config, YAC_YAML_PARSER_DEFAULT);
6594}
6595
6597 char const * interp_stack_config, int * interp_stack_config_id) {
6598
6599 *interp_stack_config_id =
6601 interp_stack_config, YAC_YAML_PARSER_JSON_FORCE);
6602}
char const * grid_names[]
char const * field_names[8]
#define YAC_ASSERT(exp, msg)
struct yac_basic_grid * yac_basic_grid_new(char const *name, struct yac_basic_grid_data grid_data)
Definition basic_grid.c:57
struct yac_basic_grid_data * yac_basic_grid_get_data(struct yac_basic_grid *grid)
Definition basic_grid.c:137
size_t yac_basic_grid_add_mask(struct yac_basic_grid *grid, enum yac_location location, int const *mask, size_t count, char const *mask_name)
Definition basic_grid.c:266
size_t yac_basic_grid_add_coordinates_nocpy(struct yac_basic_grid *grid, enum yac_location location, yac_coordinate_pointer coordinates)
Definition basic_grid.c:202
char const * yac_basic_grid_get_name(struct yac_basic_grid *grid)
Definition basic_grid.c:130
void yac_basic_grid_compute_cell_areas(struct yac_basic_grid *grid, double *cell_areas)
size_t yac_basic_grid_get_data_size(struct yac_basic_grid *grid, enum yac_location location)
Definition basic_grid.c:145
void yac_basic_grid_delete(struct yac_basic_grid *grid)
Definition basic_grid.c:77
void yac_rotate_coordinates(yac_coordinate_pointer coordinates, size_t num_coordinates, double north_pole[3])
struct yac_basic_grid_data yac_generate_basic_grid_data_reg_2d(size_t nbr_vertices[2], int cyclic[2], double *lon_vertices, double *lat_vertices)
Definition grid_reg2d.c:62
struct yac_basic_grid_data yac_generate_basic_grid_data_unstruct_ll(size_t nbr_vertices, size_t nbr_cells, int *num_vertices_per_cell, double *x_vertices, double *y_vertices, int *cell_to_vertex)
struct yac_basic_grid_data yac_generate_basic_grid_data_unstruct_edge(size_t nbr_vertices, size_t nbr_cells, size_t nbr_edges, int *num_edges_per_cell, double *x_vertices, double *y_vertices, int *cell_to_edge, int *edge_to_vertex)
struct yac_basic_grid_data yac_generate_basic_grid_data_cloud(size_t nbr_points, double *x_points, double *y_points)
Definition grid_cloud.c:50
struct yac_basic_grid_data yac_generate_basic_grid_data_reg_2d_rot(size_t nbr_vertices[2], int cyclic[2], double *lon_vertices, double *lat_vertices, double north_pole_lon, double north_pole_lat)
struct yac_basic_grid_data yac_generate_basic_grid_data_unstruct_edge_ll(size_t nbr_vertices, size_t nbr_cells, size_t nbr_edges, int *num_edges_per_cell, double *x_vertices, double *y_vertices, int *cell_to_edge, int *edge_to_vertex)
struct yac_basic_grid_data yac_generate_basic_grid_data_curve_2d(size_t nbr_vertices[2], int cyclic[2], double *lon_vertices, double *lat_vertices)
struct yac_basic_grid_data yac_generate_basic_grid_data_unstruct(size_t nbr_vertices, size_t nbr_cells, int *num_vertices_per_cell, double *x_vertices, double *y_vertices, int *cell_to_vertex)
struct yac_interp_stack_config * yac_yaml_parse_interp_stack_config_string(char const *str_interp_stack_config, int parse_flags)
int const YAC_YAML_EMITTER_DEFAULT
emit to YAML format
Definition config_yaml.c:59
void yac_yaml_read_coupling(struct yac_couple_config *couple_config, const char *yaml_filename, int parse_flags)
int const YAC_YAML_EMITTER_JSON
emit to JSON format
Definition config_yaml.c:60
int const YAC_YAML_PARSER_DEFAULT
default parse flags (YAML format)
Definition config_yaml.c:61
char const * yac_time_to_ISO(char const *time, enum yac_time_unit_type time_unit)
Definition event.c:353
int const YAC_YAML_PARSER_JSON_FORCE
assume JSON format
Definition config_yaml.c:63
@ COUPLING
void yac_couple_config_set_grid_output_filename(struct yac_couple_config *couple_config, char const *grid_name, const char *output_filename)
void yac_couple_config_set_component_metadata(struct yac_couple_config *couple_config, char const *comp_name, const char *metadata)
void yac_couple_config_field_enable_frac_mask(struct yac_couple_config *couple_config, char const *comp_name, char const *grid_name, char const *field_name, double frac_mask_fallback_value)
const char * yac_couple_config_get_component_metadata(struct yac_couple_config const *couple_config, const char *comp_name)
char const * yac_couple_config_get_field_grid_name(struct yac_couple_config const *couple_config, size_t component_idx, size_t field_idx)
char const * yac_couple_config_get_field_timestep(struct yac_couple_config const *couple_config, char const *component_name, char const *grid_name, char const *field_name)
size_t yac_couple_config_get_num_grids(struct yac_couple_config const *couple_config)
size_t yac_couple_config_get_component_idx(struct yac_couple_config const *couple_config, char const *component_name)
void yac_couple_config_set_apply_coordinate_check(struct yac_couple_config *couple_config, int apply_coordinate_check)
char const * yac_couple_config_get_grid_name(struct yac_couple_config const *couple_config, size_t grid_idx)
double yac_couple_config_get_frac_mask_fallback_value(struct yac_couple_config const *couple_config, char const *component_name, char const *grid_name, char const *field_name)
void yac_couple_config_set_field_metadata(struct yac_couple_config *couple_config, const char *comp_name, const char *grid_name, const char *field_name, const char *metadata)
size_t yac_couple_config_get_field_collection_size(struct yac_couple_config const *couple_config, char const *component_name, char const *grid_name, char const *field_name)
int yac_couple_config_get_field_role(struct yac_couple_config const *couple_config, char const *component_name, char const *grid_name, char const *field_name)
size_t yac_couple_config_get_num_components(struct yac_couple_config const *couple_config)
void yac_couple_config_set_coordinates_mismatch_is_fatal(struct yac_couple_config *couple_config, int coordinates_mismatch_is_fatal)
char const * yac_couple_config_get_field_name(struct yac_couple_config const *couple_config, size_t component_idx, size_t field_idx)
size_t yac_couple_config_get_num_fields(struct yac_couple_config const *couple_config, size_t component_idx)
void yac_couple_config_set_grid_metadata(struct yac_couple_config *couple_config, char const *grid_name, const char *metadata)
const char * yac_couple_config_get_grid_metadata(struct yac_couple_config const *couple_config, const char *grid_name)
char const * yac_couple_config_get_component_name(struct yac_couple_config const *couple_config, size_t component_idx)
void yac_couple_config_set_all_grids_output_filename(struct yac_couple_config *couple_config, char const *output_filename)
int yac_couple_config_is_valid_field(struct yac_couple_config const *couple_config, size_t component_idx, size_t field_idx)
void yac_couple_config_get_field_source(struct yac_couple_config const *couple_config, char const *tgt_component_name, char const *tgt_grid_name, char const *tgt_field_name, char const **src_component_name, char const **src_grid_name, char const **src_field_name)
void yac_couple_config_set_config_output_filename(struct yac_couple_config *couple_config, char const *filename, enum yac_text_filetype filetype, char const *ref, int include_definitions)
const char * yac_couple_config_get_field_metadata(struct yac_couple_config const *couple_config, const char *comp_name, const char *grid_name, const char *field_name)
yac_text_filetype
@ YAC_TEXT_FILETYPE_YAML
YAML format.
@ YAC_TEXT_FILETYPE_JSON
JSON format.
@ TIME_NONE
@ TIME_ACCUMULATE
@ TIME_MAXIMUM
@ TIME_MINIMUM
@ TIME_AVERAGE
yac_time_unit_type
@ C_SECOND
@ C_HOUR
@ C_DAY
@ C_MILLISECOND
@ C_MINUTE
@ C_MONTH
@ C_ISO_FORMAT
@ C_YEAR
int yac_get_event_time_operation(struct event *event)
Definition event.c:291
enum yac_action_type yac_event_check(struct event *event)
Definition event.c:183
void yac_event_update(struct event *event)
Definition event.c:172
yac_action_type
Definition event.h:13
@ REDUCTION
Definition event.h:15
@ RESTART
Definition event.h:17
@ OUT_OF_BOUND
Definition event.h:22
@ GET_FOR_CHECKPOINT
Definition event.h:20
@ NONE
Definition event.h:14
@ PUT_FOR_RESTART
Definition event.h:19
@ GET_FOR_RESTART
Definition event.h:18
@ PUT_FOR_CHECKPOINT
Definition event.h:21
struct yac_interpolation_exchange * yac_get_coupling_field_put_op_interpolation_exchange(struct coupling_field *field, unsigned put_idx)
Definition fields.c:409
unsigned yac_get_coupling_field_collection_size(struct coupling_field *field)
Definition fields.c:100
const char * yac_get_coupling_field_timestep(struct coupling_field *field)
Definition fields.c:105
unsigned yac_get_coupling_field_num_puts(struct coupling_field *field)
Definition fields.c:448
char const * yac_get_coupling_field_comp_name(struct coupling_field *field)
Definition fields.c:133
int yac_get_coupling_field_put_op_time_accumulation_count(struct coupling_field *field, unsigned put_idx)
Definition fields.c:421
struct yac_pak * yac_coupling_field_get_pak(struct coupling_field *cpl_field)
Definition fields.c:765
int yac_coupling_field_get_action(struct coupling_field *cpl_field)
Definition fields.c:689
double *** yac_get_coupling_field_put_op_send_frac_mask_acc(struct coupling_field *field, unsigned put_idx)
Definition fields.c:224
struct yac_basic_grid * yac_coupling_field_get_basic_grid(struct coupling_field *field)
Definition fields.c:127
size_t yac_coupling_field_get_num_interp_fields(struct coupling_field *field)
Definition fields.c:110
struct yac_interpolation * yac_get_coupling_field_put_op_interpolation(struct coupling_field *field, unsigned put_idx)
Definition fields.c:396
enum yac_location yac_get_coupling_field_get_interp_field_location(struct coupling_field *field, size_t interp_field_idx)
Definition fields.c:116
struct event * yac_get_coupling_field_get_op_event(struct coupling_field *field)
Definition fields.c:455
size_t yac_coupling_field_get_data_size(struct coupling_field *field, enum yac_location location)
Definition fields.c:152
struct yac_interp_field const * yac_coupling_field_get_interp_fields(struct coupling_field *cpl_field)
Definition fields.c:654
int * yac_get_coupling_field_get_mask(struct coupling_field *field)
Definition fields.c:322
struct event * yac_get_coupling_field_put_op_event(struct coupling_field *field, unsigned put_idx)
Definition fields.c:386
char * yac_coupling_field_get_datetime(struct coupling_field *cpl_field)
Definition fields.c:673
void yac_init_coupling_field_put_op_send_field_acc(struct coupling_field *field, unsigned put_idx, double init_value)
Definition fields.c:356
struct yac_interpolation * yac_get_coupling_field_get_op_interpolation(struct coupling_field *field)
Definition fields.c:480
void yac_coupling_field_get_src_field_buffer_sizes(struct coupling_field *field, size_t *num_src_fields, size_t const **src_field_buffer_sizes)
Definition fields.c:532
void yac_set_coupling_field_put_op_time_accumulation_count(struct coupling_field *field, unsigned put_idx, int count)
Definition fields.c:439
int yac_get_coupling_field_get_op_use_raw_exchange(struct coupling_field *field)
Definition fields.c:463
char * yac_coupling_field_get_prev_datetime(struct coupling_field *cpl_field)
Definition fields.c:681
struct yac_interpolation_exchange * yac_get_coupling_field_get_op_interpolation_exchange(struct coupling_field *field)
Definition fields.c:492
int yac_get_coupling_field_get_op_with_frac_mask(struct coupling_field *field)
Definition fields.c:471
enum yac_field_exchange_type yac_get_coupling_field_exchange_type(struct coupling_field *field)
Definition fields.c:141
const char * yac_get_coupling_field_name(struct coupling_field *field)
Definition fields.c:122
int ** yac_get_coupling_field_put_mask(struct coupling_field *field)
Definition fields.c:280
struct yac_interp_weights_data yac_get_coupling_field_get_op_interp_weights_data(struct coupling_field *field)
Definition fields.c:504
void yac_init_coupling_field_put_op_send_frac_mask_acc(struct coupling_field *field, unsigned put_idx, double init_value)
Definition fields.c:371
double *** yac_get_coupling_field_put_op_send_field_acc(struct coupling_field *field, unsigned put_idx)
Definition fields.c:214
int yac_get_coupling_field_put_op_use_raw_exchange(struct coupling_field *field, unsigned put_idx)
Definition fields.c:430
yac_field_exchange_type
Definition fields.h:12
@ SOURCE
Definition fields.h:15
@ TARGET
Definition fields.h:16
@ NOTHING
Definition fields.h:14
@ INVALID
Definition fields.h:13
size_t yac_collection_selection_get_collection_size(struct yac_collection_selection const *collection_selection)
Get the size of the collection selection.
size_t const * yac_collection_selection_get_indices(struct yac_collection_selection const *collection_selection)
Get explicit selection indices if non-contiguous.
void yac_collection_selection_delete(struct yac_collection_selection *collection_selection)
Delete a collection selection object.
struct yac_collection_selection * yac_collection_selection_new(size_t collection_size, size_t const *selection_indices)
Create a new collection selection.
int yac_pak_trace_is_enabled(struct yac_pak const *pak)
Event tracing support.
Definition yac_pak.c:905
yac_pak_event_type_t
Event type for YAC PAK trace entries. Defines the type of events that can be recorded in YAC PAK trac...
Definition yac_pak.h:48
yac_pak_trace_level_t
YAC PAK coupling trace level.
Definition yac_pak.h:71
int yac_pak_trace_stop(struct yac_pak *pak, int handle)
Stop a trace event.
Definition yac_pak.c:1055
int yac_pak_trace_start_ex(struct yac_pak *pak, char const *field, char const *component, char const *grid, yac_pak_event_type_t type, int put_idx, char const *datetime, int action, yac_pak_trace_level_t level)
Start a trace event with full metadata.
Definition yac_pak.c:1017
@ YAC_PAK_EVENT_TYPE_GET
Definition yac_pak.h:54
@ YAC_PAK_EVENT_TYPE_WAIT
Definition yac_pak.h:59
@ YAC_PAK_EVENT_TYPE_PUT
Definition yac_pak.h:56
@ YAC_PAK_EVENT_TYPE_AGET
Definition yac_pak.h:55
@ YAC_PAK_EVENT_TYPE_UPDATE
Definition yac_pak.h:58
@ YAC_PAK_TRACE_LEVEL_REGIONS
Definition yac_pak.h:74
@ YAC_PAK_TRACE_LEVEL_COUPLING
PUT/GET/AGET/UPDATE/WAIT events.
Definition yac_pak.h:73
void yac_instance_delete(struct yac_instance *instance)
Definition instance.c:1509
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:1419
int yac_instance_get_comp_rank(struct yac_instance *instance, const char *comp_name)
Definition instance.c:1456
char * yac_instance_get_start_datetime(struct yac_instance *instance)
Definition instance.c:1593
char * yac_instance_get_end_datetime(struct yac_instance *instance)
Definition instance.c:1598
void yac_instance_def_datetime(struct yac_instance *instance, const char *start_datetime, const char *end_datetime)
Definition instance.c:1585
void yac_instance_setup(struct yac_instance *instance, struct yac_basic_grid **grids, size_t num_grids)
Definition instance.c:1369
void yac_instance_sync_def(struct yac_instance *instance)
Definition instance.c:1336
int yac_instance_get_nbr_comps(struct yac_instance *instance)
Definition instance.c:1440
int yac_instance_components_are_defined(struct yac_instance *instance)
Definition instance.c:1653
MPI_Comm yac_instance_get_comm(struct yac_instance *instance)
Definition instance.c:1535
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:1666
void yac_instance_dummy_new(MPI_Comm comm)
Definition instance.c:1503
void yac_instance_def_calendar(int calendar_type, char const *source)
Definition instance.c:1557
void yac_instance_def_components(struct yac_instance *instance, char const **comp_names, size_t num_comps)
Definition instance.c:1603
struct yac_couple_config * yac_instance_get_couple_config(struct yac_instance *instance)
Definition instance.c:1542
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:1729
struct yac_instance * yac_instance_new(MPI_Comm yac_comm)
Definition instance.c:1465
void yac_instance_sync_def_comps(struct yac_instance *instance, char const **comp_names, size_t num_comp_names)
Definition instance.c:1348
int yac_instance_get_comp_size(struct yac_instance *instance, const char *comp_name)
Definition instance.c:1447
MPI_Comm yac_instance_get_comps_comm(struct yac_instance *instance, char const **comp_names, size_t num_comp_names)
Definition instance.c:1431
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:1755
#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_method_cleanup()
Free static internal resources of all interpolation methods.
yac_interp_avg_weight_type
@ YAC_INTERP_AVG_DIST
@ YAC_INTERP_AVG_ARITHMETIC
@ YAC_INTERP_AVG_BARY
void * user_data
char * key
void yac_interp_method_callback_add_compute_weights_callback(yac_func_compute_weights compute_weights_callback, void *user_data, char const *key)
void(* yac_func_compute_weights)(double const tgt_coords[3], int src_cell_id, size_t src_cell_idx, int const **global_results_points, double **result_weights, size_t *result_count, void *user_data)
enum callback_type type
struct @23::@24 value
yac_interp_method_conserv_normalisation
@ YAC_INTERP_CONSERV_DESTAREA
@ YAC_INTERP_CONSERV_FRACAREA
yac_interp_dnn_weight_type
@ YAC_INTERP_DNN_WEIGHT_AVG
average of source points within search distance
@ YAC_INTERP_DNN_WEIGHT_DIST
distance weighted average of source points
@ YAC_INTERP_DNN_WEIGHT_GAUSS
Gauss weighted average of source points.
@ YAC_INTERP_DNN_WEIGHT_RBF
radial basis function weighted average
yac_interp_dnn_search_distance_type
@ YAC_INTERP_DNN_SEARCH_DISTANCE_FIXED
use a fixed search distance (in radians)
@ YAC_INTERP_DNN_SEARCH_DISTANCE_CELL_AREA
#define YAC_INTERP_FILE_ON_SUCCESS_DEFAULT
yac_interp_file_on_missing_file
@ YAC_INTERP_FILE_MISSING_CONT
continue on missing file
@ YAC_INTERP_FILE_MISSING_ERROR
abort on missing file
yac_interp_file_on_success
@ YAC_INTERP_FILE_SUCCESS_CONT
@ YAC_INTERP_FILE_SUCCESS_STOP
#define YAC_INTERP_FILE_ON_MISSING_FILE_DEFAULT
yac_interp_ncc_weight_type
@ YAC_INTERP_NCC_DIST
distance weighted average of n source points
@ YAC_INTERP_NCC_AVG
average of n source points
yac_interp_nnn_weight_type
@ YAC_INTERP_NNN_GAUSS
distance with Gauss weights of n source points
@ YAC_INTERP_NNN_RBF
radial basis functions
@ YAC_INTERP_NNN_AVG
average of n source points
@ YAC_INTERP_NNN_DIST
distance weighted average of n source points
@ YAC_INTERP_NNN_ZERO
all weights are set to zero
struct yac_spmap_cell_area_config * yac_spmap_cell_area_config_file_new(char const *filename, char const *varname, yac_int min_global_id)
struct yac_spmap_overwrite_config * yac_spmap_overwrite_config_new(struct yac_point_selection const *src_point_selection, struct yac_interp_spmap_config const *config)
struct yac_interp_spmap_config * yac_interp_spmap_config_new(double spread_distance, double max_search_distance, enum yac_interp_spmap_weight_type weight_type, struct yac_spmap_scale_config const *scale_config)
void yac_spmap_scale_config_delete(struct yac_spmap_scale_config *scale_config)
void yac_interp_spmap_config_delete(struct yac_interp_spmap_config *config)
void yac_spmap_cell_area_config_delete(struct yac_spmap_cell_area_config *cell_area_config)
struct yac_spmap_cell_area_config * yac_spmap_cell_area_config_yac_new(double sphere_radius)
void yac_spmap_overwrite_config_delete(struct yac_spmap_overwrite_config *overwrite_config)
struct yac_spmap_scale_config * yac_spmap_scale_config_new(enum yac_interp_spmap_scale_type scale_type, struct yac_spmap_cell_area_config const *source_cell_area_config, struct yac_spmap_cell_area_config const *target_cell_area_config)
#define YAC_INTERP_SPMAP_MAX_SEARCH_DISTANCE_DEFAULT
yac_interp_spmap_scale_type
@ YAC_INTERP_SPMAP_NONE
weights are not scaled
@ YAC_INTERP_SPMAP_INVTGTAREA
@ YAC_INTERP_SPMAP_SRCAREA
@ YAC_INTERP_SPMAP_FRACAREA
#define YAC_INTERP_SPMAP_WEIGHTED_DEFAULT
#define YAC_INTERP_SPMAP_SPREAD_DISTANCE_DEFAULT
yac_interp_spmap_cell_area_provider
@ YAC_INTERP_SPMAP_CELL_AREA_FILE
@ YAC_INTERP_SPMAP_CELL_AREA_YAC
#define YAC_INTERP_SPMAP_SPHERE_RADIUS_DEFAULT
#define YAC_INTERP_SPMAP_SCALE_TYPE_DEFAULT
yac_interp_spmap_weight_type
@ YAC_INTERP_SPMAP_AVG
@ YAC_INTERP_SPMAP_DIST
void yac_interp_stack_config_add_check(struct yac_interp_stack_config *interp_stack_config, char const *constructor_key, char const *do_search_key)
void yac_interp_stack_config_add_spmap(struct yac_interp_stack_config *interp_stack_config, double spread_distance, double max_search_distance, enum yac_interp_spmap_weight_type weight_type, enum yac_interp_spmap_scale_type scale_type, double src_sphere_radius, char const *src_filename, char const *src_varname, int src_min_global_id, double tgt_sphere_radius, char const *tgt_filename, char const *tgt_varname, int tgt_min_global_id)
void yac_interp_stack_config_add_fixed(struct yac_interp_stack_config *interp_stack_config, double value)
void yac_interp_stack_config_add_hcsbb(struct yac_interp_stack_config *interp_stack_config)
void yac_interp_stack_config_add_rbf(struct yac_interp_stack_config *interp_stack_config, size_t n, double max_search_distance, double scale)
void yac_interp_stack_config_add_average(struct yac_interp_stack_config *interp_stack_config, enum yac_interp_avg_weight_type reduction_type, int partial_coverage)
void yac_interp_stack_config_add_creep(struct yac_interp_stack_config *interp_stack_config, int creep_distance)
void yac_interp_stack_config_add_nnn(struct yac_interp_stack_config *interp_stack_config, enum yac_interp_nnn_weight_type type, size_t n, double max_search_distance, double scale)
void yac_interp_stack_config_delete(struct yac_interp_stack_config *interp_stack_config)
Free an interpolation stack configuration object.
void yac_interp_stack_config_add_conservative(struct yac_interp_stack_config *interp_stack_config, int order, int enforced_conserv, int partial_coverage, enum yac_interp_method_conserv_normalisation normalisation)
void yac_interp_stack_config_add_dnn(struct yac_interp_stack_config *interp_stack_config, enum yac_interp_dnn_weight_type type, enum yac_interp_dnn_search_distance_type search_distance_type, double search_distance, double scale)
void yac_interp_stack_config_add_ncc(struct yac_interp_stack_config *interp_stack_config, enum yac_interp_ncc_weight_type weight_type, int partial_coverage)
void yac_interp_stack_config_add_user_file(struct yac_interp_stack_config *interp_stack_config, char const *filename, enum yac_interp_file_on_missing_file on_missing_file, enum yac_interp_file_on_success on_success)
void yac_interp_stack_config_add_user_callback(struct yac_interp_stack_config *interp_stack_config, char const *func_compute_weights_key)
struct yac_interp_stack_config * yac_interp_stack_config_new()
Allocate a new empty interpolation stack configuration object.
void yac_interp_stack_config_add_spmap_ext(struct yac_interp_stack_config *interp_stack_config, struct yac_interp_spmap_config *default_config, struct yac_spmap_overwrite_config **overwrite_configs)
#define YAC_WEIGHT_FILE_ON_EXISTING_DEFAULT_VALUE
@ YAC_WEIGHT_FILE_KEEP
keep existing weight file
@ YAC_WEIGHT_FILE_OVERWRITE
overwrite existing weight file
@ YAC_WEIGHT_FILE_ERROR
error when weight file existis already
void yac_interpolation_execute(struct yac_interpolation *interp, double ***src_fields, double **tgt_field)
Execute interpolation synchronously and write results to the target field.
int yac_interpolation_with_frac_mask(struct yac_interpolation *interpolation)
Query whether interpolation uses fractional masks.
int yac_interpolation_execute_put_test(struct yac_interpolation *interp)
Test whether the asynchronous put phase has completed.
void yac_interpolation_execute_wait(struct yac_interpolation *interp)
Wait for completion of pending asynchronous interpolation operations.
void yac_interpolation_execute_frac(struct yac_interpolation *interp, double ***src_fields, double ***src_frac_masks, double **tgt_field)
Execute interpolation with fractional masks and write results to the target field.
void yac_interpolation_execute_get(struct yac_interpolation *interp, double **tgt_field)
Complete interpolation and write results to the target field (get phase).
void yac_interpolation_execute_get_async(struct yac_interpolation *interp, double **tgt_field)
Complete interpolation asynchronously and write results to the target field (get phase).
void yac_interpolation_execute_put_frac(struct yac_interpolation *interp, double ***src_fields, double ***src_frac_masks)
Provide source field data with fractional masks and start asynchronous execution of interpolation (pu...
void yac_interpolation_execute_put(struct yac_interpolation *interp, double ***src_fields)
Provide source field data and start asynchronous execution of interpolation (put phase).
int yac_interpolation_execute_get_test(struct yac_interpolation *interp)
Test whether the asynchronous get phase has completed.
void yac_interpolation_exchange_execute_get(struct yac_interpolation_exchange *exchange, double **recv_data, char const *routine)
Execute the get phase and receive target data synchronously.
void yac_interpolation_exchange_execute(struct yac_interpolation_exchange *exchange, double const **send_data_, double **recv_data_, char const *routine)
Execute the full exchange (put + get) synchronously.
void yac_interpolation_exchange_execute_put(struct yac_interpolation_exchange *exchange, double const **send_data, char const *routine)
Execute only the put phase asynchronously.
int yac_interpolation_exchange_with_frac_mask(struct yac_interpolation_exchange *exchange)
Query whether the exchange has fractional mask support.
void yac_interpolation_exchange_execute_get_async(struct yac_interpolation_exchange *exchange, double **recv_data, char const *routine)
Execute the get phase asynchronously.
void yac_interpolation_exchange_wait(struct yac_interpolation_exchange *exchange, char const *routine)
Wait for completion of pending put/get phases.
Interpolation exchange object for temporary buffers and MPI exchanges.
char const * yac_loc2str(enum yac_location location)
Definition location.c:33
enum yac_location yac_get_location(int const location)
Definition location.c:45
yac_location
Definition location.h:12
@ YAC_LOC_CORNER
Definition location.h:15
@ YAC_LOC_EDGE
Definition location.h:16
@ YAC_LOC_CELL
Definition location.h:14
void yac_mpi_handshake(MPI_Comm comm, size_t n, char const **group_names, MPI_Comm *group_comms)
struct yac_point_selection * yac_point_selection_bnd_circle_new(double center_lon, double center_lat, double inc_angle)
void yac_point_selection_delete(struct yac_point_selection *point_select)
yac_point_selection_type
@ YAC_POINT_SELECTION_TYPE_BND_CIRCLE
@ YAC_POINT_SELECTION_TYPE_EMPTY
#define xstrdup(s)
Definition ppm_xfuncs.h:84
#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
double *** send_field_acc
Definition fields.c:45
int use_raw_exchange
Definition fields.c:47
double *** send_frac_mask_acc
Definition fields.c:46
struct yac_basic_grid * grid
Definition fields.c:24
enum yac_field_exchange_type exchange_type
Definition fields.c:36
unsigned num_puts
Definition fields.c:49
size_t num_interp_fields
Definition fields.c:27
struct yac_interpolation * interpolation
Definition fields.c:42
struct yac_pak * pak
Borrowed pointer to the YAC PAK object from the owning instance (may be NULL)
Definition fields.c:63
Definition event.c:18
enum yac_reduction_type time_operation
Definition event.c:24
enum yac_action_type action
Definition event.c:25
struct yac_instance * instance
Definition yac.c:144
struct yac_basic_grid * grid
Definition yac.c:138
enum yac_location location
Definition yac.c:160
struct user_input_data_grid * grid
Definition yac.c:159
enum yac_location location
Definition yac.c:152
struct user_input_data_grid * grid
Definition yac.c:151
size_t coordinates_idx
Definition yac.c:153
char * filename
Definition yac.c:216
double sphere_radius
Definition yac.c:213
union yac_cell_area_config::@68 data
enum yac_interp_spmap_cell_area_provider type
Definition yac.c:210
struct yac_cell_area_config::@68::@69 yac
struct yac_cell_area_config::@68::@70 file
size_t num_src_mask_names
Definition yac.c:200
char * weight_file
Definition yac.c:195
char * tgt_mask_name
Definition yac.c:202
char ** src_mask_names
Definition yac.c:201
char * yaxt_exchanger_name
Definition yac.c:203
struct yac_collection_selection * collection_selection
Definition yac.c:205
int weight_file_on_existing
Definition yac.c:196
double scale_summand
Definition yac.c:199
double scale_factor
Definition yac.c:198
enum yac_point_selection_type type
Definition yac.c:236
struct yac_ext_spmap_config_overwrite_config::@71::@72::@73 bnd_circle
union yac_ext_spmap_config_overwrite_config::@71::@72 data
struct yac_ext_spmap_config_overwrite_config::@71 src_point_selection
enum yac_interp_spmap_weight_type weight_type
Definition yac.c:246
CellAreaConfig tgt_cell_area_config
Definition yac.c:230
enum yac_interp_spmap_scale_type scale_type
Definition yac.c:228
CellAreaConfig src_cell_area_config
Definition yac.c:230
double max_search_distance
Definition yac.c:226
enum yac_interp_spmap_weight_type weight_type
Definition yac.c:227
double spread_distance
Definition yac.c:225
MPI_Comm comm
MPI communicator that contains the processes of this YAC instance.
Definition instance.c:109
enum yac_location location
Definition basic_grid.h:16
size_t coordinates_idx
Definition basic_grid.h:17
struct yac_spmap_scale_config scale_config
struct yac_point_selection::@50::@51 bnd_circle
struct yac_point_selection * src_point_selection
int * cell_to_vertex
int collection_size
char * yaml_filename
int point_id
static struct yac_interp_method_config * config
char const src_grid_name[]
char const tgt_grid_name[]
unsigned cyclic[2]
size_t field_data_size
int info
int comp_ids[1]
int grid_id
int nbr_fields
int ierror
int * global_index
int * field_id
int comp_id
static void compute_weights_callback(double const tgt_coords[3], int src_cell_id, size_t src_cell_idx, int const **global_results_points, double **result_weights, size_t *result_count, void *user_data)
int const * location
char const * name
Definition toy_scrip.c:114
int id
Definition toy_scrip.c:115
static void LLtoXYZ(double lon, double lat, double p_out[])
Definition toy_scrip.c:587
#define MAX(a, b)
char * yac_string_dup(char const *string)
Definition utils_core.c:33
static char * yac_version
Definition version.h:7
int const YAC_YEAR_OF_365_DAYS
Definition yac.c:74
int yac_cget_points_id(int grid_id, int location, const char *point_name)
Definition yac.c:5076
static struct user_input_data_grid ** global_grids
Definition yac.c:179
void yac_cset_ext_spmap_config_src_cell_area_config_yac(int ext_spmap_config_id, double sphere_radius)
Definition yac.c:6065
void yac_cget_raw_frac_async(int const field_id, int collection_size, double ***src_field_buffer, double ***src_frac_mask_buffer, int *info, int *ierr)
Definition yac.c:3546
static size_t num_global_interp_stack_configs
Definition yac.c:192
int const YAC_ACTION_PUT_FOR_CHECKPOINT
Definition yac.c:54
void yac_cset_grids_output_file(const char *filename)
Definition yac.c:910
static const char * mpi_handshake_group_name
Name of the MPI group used by YAC in MPI handshake.
Definition yac.c:170
int const YAC_REDUCTION_TIME_AVERAGE
Definition yac.c:59
void yac_cenddef_and_emit_config(int emit_flags, char **config)
Definition yac.c:5036
static int user_input_data_add_points(struct user_input_data_grid *grid_info, enum yac_location location, yac_coordinate_pointer coordinates, char const *name, char const *caller)
Definition yac.c:1412
static double *** get_src_field_buffer_pointers(int field_id, size_t collection_size, double *src_field_buffer)
Definition yac.c:3032
void yac_cdef_couple_instance_(int yac_instance_id, 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_timestep, int time_unit, int time_reduction, int interp_stack_config_id, int src_lag, int tgt_lag, char const *weight_file, int weight_file_on_existing, int mapping_side, double scale_factor, double scale_summand, int num_src_mask_names, char const *const *src_mask_names, char const *tgt_mask_name, char const *yaxt_exchanger_name, int collection_size, int const *collection_indices, int use_raw_exchange)
Definition yac.c:2489
static int yac_lookup_pointer(void const *pointer)
Definition yac.c:299
static int trace_coupling_start(int field_id, yac_pak_event_type_t type, int put_idx, yac_pak_trace_level_t level)
Definition yac.c:336
void yac_cget_raw_async(int const field_id, int collection_size, double ***src_field_buffer, int *info, int *ierr)
Definition yac.c:3514
#define NO_CHECK
void yac_ccompute_grid_cell_areas(int grid_id, double *cell_areas)
Definition yac.c:5795
int const YAC_DNN_GAUSS
Definition yac.c:92
void yac_cinit_comm_dummy(MPI_Comm comm)
Definition yac.c:746
void yac_cget_grid_names(int nbr_grids, const char **grid_names)
Definition yac.c:5260
void yac_cadd_interp_stack_config_ncc(int interp_stack_config_id, int weight_type, int partial_coverage)
Definition yac.c:5873
void yac_cget_ext_couple_config_scale_factor(int ext_couple_config_id, double *scale_factor)
Definition yac.c:2200
const char * yac_cget_field_metadata_instance(int yac_instance_id, const char *comp_name, const char *grid_name, const char *field_name)
Definition yac.c:2047
void yac_cput_frac(int const field_id, int const collection_size, double ***const send_field, double ***const send_frac_mask, int *info, int *ierr)
Definition yac.c:4141
int const YAC_NCC_AVG
Definition yac.c:81
void yac_cadd_interp_stack_config_spmap_ext(int interp_stack_config_id, int ext_spmap_config_id, int *spmap_overwrite_config_ids, int spmap_overwrite_config_count)
Definition yac.c:6343
void yac_cget_instance_size_c2py(int yac_instance_id, int *size)
Definition yac.c:786
static void check_preliminary_entries(struct yac_instance *instance, char const *caller)
Definition yac.c:4950
#define SUM
static void yac_free_global_grids()
Definition yac.c:516
void yac_get_raw_frac_(int const field_id, int const collection_size, double *src_field_buffer, double *src_frac_mask_buffer, int is_async, int *info, int *ierr)
Definition yac.c:3318
static int user_input_data_add_mask(struct user_input_data_grid *grid_info, enum yac_location location, int const *is_valid, size_t nbr_points, char const *name)
Definition yac.c:1775
void yac_cset_global_index_yac_int(yac_int const *global_index, int location, int grid_id)
Definition yac.c:5714
void yac_cenddef(void)
Definition yac.c:5006
static struct user_input_data_masks * user_input_data_get_or_create_masks(struct user_input_data_grid *grid_info, enum yac_location location, char const *name, char const *caller, int *mask_id)
Definition yac.c:1721
static void * yac_cput_pre_processing(struct coupling_field *cpl_field, unsigned put_idx, int const collection_size, double ***send_field, double ****send_field_acc_, double ***send_frac_mask, double ****send_frac_mask_acc_, int *with_frac_mask_, int *use_raw_exchange_, int *info, int *ierr)
Definition yac.c:3829
static struct user_input_data_points * get_points_info(int points_id, char const *routine)
Definition yac.c:1114
static void get_send_field_pointers_ptr_(int const field_id, int const collection_size, double **send_field, double **send_frac_mask, double ****send_field_, double ****send_frac_mask_)
Definition yac.c:3651
void yac_cenable_field_frac_mask(const char *comp_name, const char *grid_name, const char *field_name, double frac_mask_fallback_value)
Definition yac.c:1969
int const YAC_ACTION_OUT_OF_BOUND
put/get is outside of the valid range
Definition yac.c:55
int const YAC_DNN_SEARCH_DISTANCE_CELL_AREA
Definition yac.c:96
void yac_cget_ext_couple_config_mapping_side(int ext_couple_config_id, int *mapping_side)
Definition yac.c:2178
void yac_cset_config_output_file(const char *filename, int filetype, int sync_location, int include_definitions)
Definition yac.c:865
void yac_cpredef_comp_instance(int yac_instance_id, char const *name, int *comp_id)
Definition yac.c:1266
int const YAC_SPMAP_SRCAREA
Definition yac.c:105
int const YAC_CONFIG_OUTPUT_SYNC_LOC_ENDDEF
after end of definitions
Definition yac.c:134
char * yac_cget_start_datetime_instance(int yac_instance_id)
Definition yac.c:1048
void yac_cdef_field_mask(char const *name, int const comp_id, int const *point_ids, int const *mask_ids, int const num_pointsets, int collection_size, const char *timestep, int time_unit, int *field_id)
Definition yac.c:1854
void yac_cset_global_index(int const *global_index, int location, int grid_id)
Definition yac.c:5726
void yac_cset_grid_output_file_instance(int yac_instance_id, const char *gridname, const char *filename)
Definition yac.c:877
void yac_cset_coordinates_check(int apply_check)
Definition yac.c:925
void yac_cget_raw_interp_weights_data_csr(int const field_id, double *frac_mask_fallback_value, double *scaling_factor, double *scaling_summand, size_t *num_fixed_values, double **fixed_values, size_t **num_tgt_per_fixed_value, size_t **tgt_idx_fixed, size_t **src_indptr_, double **weights, size_t **src_field_idx, size_t **src_idx, size_t *num_src_fields, size_t **src_field_buffer_sizes)
Definition yac.c:2749
int const YAC_NNN_RBF
Definition yac.c:87
void yac_cdef_datetime_instance(int yac_instance_id, const char *start_datetime, const char *end_datetime)
Definition of job start and end datetime.
Definition yac.c:1019
int yac_cget_role_from_field_id(int field_id)
Definition yac.c:5391
static int yac_invalid_pointer_sentinel
Definition yac.c:254
void yac_cget_(int const field_id, int const collection_size, double *recv_field, int *info, int *ierr)
Definition yac.c:3280
int yac_cget_nbr_grids_instance(int yac_instance_id)
Definition yac.c:5152
void yac_cfree_ext_couple_config(int ext_couple_config_id)
Definition yac.c:2100
const char * yac_cget_grid_metadata_instance(int yac_instance_id, const char *grid_name)
Definition yac.c:2034
int const YAC_FILE_SUCCESS_CONT
Definition yac.c:114
char * yac_cget_end_datetime_instance(int yac_instance_id)
Definition yac.c:1063
void yac_cadd_interp_stack_config_user_file_2(int interp_stack_config_id, char const *filename, int on_missing_file, int on_succes)
Definition yac.c:6479
void yac_cdef_datetime(const char *start_datetime, const char *end_datetime)
Definition of job start and end datetime for the default YAC instance.
Definition yac.c:1028
static void * yac_cget_pre_processing(int const field_id, int collection_size, int *info, int *ierr)
Definition yac.c:3093
int const YAC_SPMAP_INVTGTAREA
Definition yac.c:106
void yac_get_comp_comm_f2c(int comp_id, MPI_Fint *comp_comm_f)
Definition yac.c:1144
int const YAC_LOCATION_CELL
Definition yac.c:38
void yac_cfree_spmap_overwrite_config(int spmap_overwrite_config_id)
Definition yac.c:6183
int const YAC_REDUCTION_TIME_MINIMUM
Definition yac.c:60
void yac_cset_ext_couple_config_tgt_mask_name(int ext_couple_config_id, char const *tgt_mask_name)
Definition yac.c:2270
void yac_cget_ext_couple_config_weight_file_on_existing(int ext_couple_config_id, int *weight_file_on_existing)
Definition yac.c:2153
static struct user_input_data_component ** global_components
Definition yac.c:182
void yac_cdef_couple_custom_instance_(int yac_instance_id, 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_timestep, int time_unit, int time_reduction, int interp_stack_config_id, int src_lag, int tgt_lag, struct yac_ext_couple_config *ext_couple_config)
Definition yac.c:2397
static void check_cell_to_vertex(int *cell_to_vertex, int *num_vertices_per_cell, int nbr_cells, int nbr_vertices, char const *routine_name)
Definition yac.c:1460
void yac_cdef_grid_metadata(const char *grid_name, const char *metadata)
Definition yac.c:2000
int const YAC_FILE_MISSING_CONT
continue on missing file
Definition yac.c:110
int const YAC_TIME_UNIT_MINUTE
Definition yac.c:65
void yac_cdef_grid_curve2d(const char *grid_name, int nbr_vertices[2], int cyclic[2], double *x_vertices, double *y_vertices, int *grid_id)
Definition yac.c:5529
static size_t num_global_masks
Definition yac.c:189
void yac_cread_config_json(const char *yaml_filename)
Definition yac.c:831
void * yac_get_field_get_mask_c2f(int field_id)
Definition yac.c:3819
void yac_cget_grid_names_instance(int yac_instance_id, int nbr_grids, const char **grid_names)
Definition yac.c:5241
void yac_cset_ext_couple_config_scale_factor(int ext_couple_config_id, double scale_factor)
Definition yac.c:2193
int const YAC_NCC_DIST
Definition yac.c:82
int const YAC_FILE_MISSING_ERROR
abort on missing file
Definition yac.c:109
int const YAC_ACTION_GET_FOR_CHECKPOINT
Definition yac.c:53
void yac_cset_ext_couple_config_weight_file_on_existing(int ext_couple_config_id, int weight_file_on_existing)
Definition yac.c:2146
void yac_cadd_interp_stack_config_creep(int interp_stack_config_id, int creep_distance)
Definition yac.c:6533
static void check_default_instance_id(char const *routine_name)
Definition yac.c:586
void yac_cput_frac_(int const field_id, int const collection_size, double *send_field, double *send_frac_mask, int *info, int *ierr)
Definition yac.c:3621
void yac_cdef_component_metadata(const char *comp_name, const char *metadata)
Definition yac.c:1986
int const YAC_TIME_UNIT_YEAR
Definition yac.c:69
void yac_csync_def_comps(char const **comp_names, int num_comp_names)
Definition yac.c:4935
struct yac_ext_spmap_config_overwrite_config ExtSpmapConfigOverwriteConfig
void yac_cget_comps_comm_instance_f2c(int yac_instance_id, char const **comp_names, int num_comps, MPI_Fint *comps_comm_f)
Definition yac.c:1192
void yac_cget_comp_rank_c2py(int comp_id, int *rank)
Definition yac.c:1161
void * yac_get_field_put_mask_c2f(int field_id)
Definition yac.c:3811
void yac_cdef_points_curve2d_named(int const grid_id, int const *nbr_points, int const located, double const *x_points, double const *y_points, char const *name, int *point_id)
Definition yac.c:1553
int yac_cget_field_role(const char *comp_name, const char *grid_name, const char *field_name)
Definition yac.c:5477
void yac_ccleanup()
Clean-up default YAC instance (see Restarting YAC)
Definition yac.c:977
int const YAC_AVG_ARITHMETIC
Definition yac.c:77
void yac_cset_grids_output_file_instance(int yac_instance_id, const char *filename)
Definition yac.c:898
static size_t num_global_grids
Definition yac.c:180
void yac_cget_comp_size_c2py(int comp_id, int *size)
Definition yac.c:1154
void yac_cget_raw_interp_weights_data_csr_c2f(int const field_id, double *frac_mask_fallback_value, double *scaling_factor, double *scaling_summand, size_t *num_fixed_values, double **fixed_values, size_t **num_tgt_per_fixed_value, size_t **tgt_idx_fixed, size_t **src_indptr, double **weights, size_t **src_field_idx, size_t **src_idx, size_t *num_src_fields, size_t **src_field_buffer_sizes, size_t *tgt_field_data_size)
Definition yac.c:2854
int const YAC_DNN_AVG
Definition yac.c:90
void yac_cset_spmap_overwrite_config_max_search_distance(int spmap_overwrite_config_id, double max_search_distance)
Definition yac.c:6221
void yac_cadd_compute_weights_callback(yac_func_compute_weights compute_weights_callback, void *user_data, char const *key)
Definition yac.c:6556
void yac_cmpi_handshake(MPI_Comm comm, size_t n, char const **group_names, MPI_Comm *group_comms)
Definition yac.c:661
int const YAC_REDUCTION_TIME_MAXIMUM
Definition yac.c:61
void yac_cset_ext_couple_config_scale_summand_(struct yac_ext_couple_config *ext_couple_config, double scale_summand)
Definition yac.c:2207
int const YAC_WGT_ON_EXISTING_ERROR
Definition yac.c:120
int const YAC_TIME_UNIT_MILLISECOND
Definition yac.c:63
void yac_cexchange_frac(int const send_field_id, int const recv_field_id, int const collection_size, double ***const send_field, double ***const send_frac_mask, double **recv_field, int *send_info, int *recv_info, int *ierr)
Definition yac.c:4582
int yac_cget_field_id_instance(int yac_instance_id, const char *comp_name, const char *grid_name, const char *field_name)
Definition yac.c:5121
int yac_cget_comp_nbr_grids_instance(int yac_instance_id, const char *comp_name)
Definition yac.c:5165
void yac_get_raw_frac(int const field_id, int const collection_size, double ***src_field_buffer, double ***src_frac_mask_buffer, int is_async, int *info, int *ierror)
Definition yac.c:3185
int yac_cget_field_is_defined(const char *comp_name, const char *grid_name, const char *field_name)
Definition yac.c:5113
void yac_cdef_grid_unstruct_ll(const char *grid_name, int nbr_vertices, int nbr_cells, int *num_vertices_per_cell, double *x_vertices, double *y_vertices, int *cell_to_vertex, int *grid_id)
Definition yac.c:5567
const char * yac_cget_timestep_from_field_id(int field_id)
Definition yac.c:5377
int yac_cget_comp_id(const char *comp_name)
Definition yac.c:5060
int const YAC_FILE_SUCCESS_STOP
Definition yac.c:112
void yac_cget_raw(int const field_id, int collection_size, double ***src_field_buffer, int *info, int *ierr)
Definition yac.c:3501
int yac_cget_nbr_fields(const char *comp_name, const char *grid_name)
Definition yac.c:5211
int const YAC_DNN_SEARCH_DISTANCE_FIXED
Definition yac.c:95
#define ASSIGN
int const YAC_NNN_GAUSS
Definition yac.c:86
void yac_cset_ext_spmap_config_scale_type(int ext_spmap_config_id, int scale_type)
Definition yac.c:6048
void yac_cdef_points_reg2d_rot_named(int const grid_id, int const *nbr_points, int const located, double const *x_points, double const *y_points, double x_north_pole, double y_north_pole, char const *name, int *point_id)
Definition yac.c:1652
void yac_cinit_comm_dummy_f2c(MPI_Fint comm_f)
Definition yac.c:757
void yac_csync_def_instance(int yac_instance_id)
Definition yac.c:4918
void yac_cset_ext_couple_config_src_mask_names_(struct yac_ext_couple_config *ext_couple_config, size_t num_src_mask_names, char const *const *src_mask_names)
Definition yac.c:2229
void yac_cget_field_source(const char *tgt_comp_name, const char *tgt_grid_name, const char *tgt_field_name, const char **src_comp_name, const char **src_grid_name, const char **src_field_name)
Definition yac.c:5498
void yac_cexchange_raw_frac_(int const send_field_id, int const recv_field_id, int const collection_size, double *send_field, double *send_frac_mask, double *src_field_buffer, double *src_frac_mask_buffer, int *send_info, int *recv_info, int *ierr)
Definition yac.c:4316
static void cleanup()
Definition yac.c:986
void yac_cget_interp_stack_config_from_string_json(char const *interp_stack_config, int *interp_stack_config_id)
Definition yac.c:6596
void yac_cpredef_comp(char const *name, int *comp_id)
Definition yac.c:1289
int yac_cyaml_get_emitter_flag_default_c2f()
Definition yac.c:797
void yac_csync_def(void)
Definition yac.c:4923
int yac_cget_field_is_defined_instance(int yac_instance_id, const char *comp_name, const char *grid_name, const char *field_name)
Definition yac.c:5104
static double ** get_recv_field_pointers(int const field_id, int const collection_size, double *recv_field)
Definition yac.c:3005
void yac_cdef_grid_reg2d_rot(const char *grid_name, int nbr_vertices[2], int cyclic[2], double *x_vertices, double *y_vertices, double x_north_pole, double y_north_pole, int *grid_id)
Definition yac.c:5645
int const YAC_TIME_UNIT_HOUR
Definition yac.c:66
static int default_instance_id_defined()
Definition yac.c:582
void yac_cinit(void)
Definition yac.c:737
int const YAC_YEAR_OF_360_DAYS
Definition yac.c:75
void yac_cget_raw_(int const field_id, int const collection_size, double *src_field_buffer, int *info, int *ierr)
Definition yac.c:3388
void yac_cfinalize_instance(int yac_instance_id)
Finalises YAC.
Definition yac.c:998
static void init_ext_couple_config(struct yac_ext_couple_config *ext_couple_config)
Definition yac.c:2063
void yac_cget_raw_frac(int const field_id, int collection_size, double ***src_field_buffer, double ***src_frac_mask_buffer, int *info, int *ierr)
Definition yac.c:3528
int const YAC_DNN_RBF
Definition yac.c:93
void yac_cfinalize()
Finalises YAC.
Definition yac.c:1007
const char * yac_cget_field_name_from_field_id(int field_id)
Definition yac.c:5370
void yac_cget_ext_couple_config_collection_selection(int ext_couple_config_id, int *collection_size, int **collection_indices)
Definition yac.c:2364
void yac_cadd_interp_stack_config_check(int interp_stack_config_id, char const *constructor_key, char const *do_search_key)
Definition yac.c:6521
void yac_cenddef_instance(int yac_instance_id)
Definition yac.c:4984
static void yac_invalidate_unique_id(int id)
Definition yac.c:327
void yac_cexchange_raw_frac_ptr_(int const send_field_id, int const recv_field_id, int const collection_size, double **send_field, double **send_frac_mask, double **src_field_buffer, double **src_frac_mask_buffer, int *send_info, int *recv_info, int *ierr)
Definition yac.c:4532
void yac_cget_ext_couple_config_yaxt_exchanger_name(int ext_couple_config_id, char const **yaxt_exchanger_name)
Definition yac.c:2299
void yac_cset_ext_couple_config_src_mask_names(int ext_couple_config_id, size_t num_src_mask_names, char const *const *src_mask_names)
Definition yac.c:2245
void yac_cget_raw_async_(int const field_id, int const collection_size, double *src_field_buffer, int *info, int *ierr)
Definition yac.c:3445
int yac_cget_nbr_comps_instance(int yac_instance_id)
Definition yac.c:5141
void yac_cdef_points_unstruct_named(int const grid_id, int const nbr_points, int const located, double const *x_points, double const *y_points, char const *name, int *point_id)
Definition yac.c:1607
int yac_cget_nbr_fields_instance(int yac_instance_id, const char *comp_name, const char *grid_name)
Definition yac.c:5191
void yac_cget_raw_interp_weights_data(int const field_id, double *frac_mask_fallback_value, double *scaling_factor, double *scaling_summand, size_t *num_fixed_values, double **fixed_values, size_t **num_tgt_per_fixed_value, size_t **tgt_idx_fixed, size_t *num_wgt_tgt, size_t **wgt_tgt_idx, size_t **num_src_per_tgt, double **weights, size_t **src_field_idx, size_t **src_idx, size_t *num_src_fields, size_t **src_field_buffer_size)
Definition yac.c:2709
void yac_cset_coordinates_mismatch_is_fatal_instance(int yac_instance_id, int is_fatal)
Definition yac.c:931
void yac_cget_ext_couple_config(int *ext_couple_config_id)
Definition yac.c:2079
const char * yac_cget_mpi_handshake_group_name(void)
Retrieve the MPI handshake group name used by YAC.
Definition yac.c:1088
static void yac_get_raw_frac_ptr_(int const field_id, int const collection_size, double **src_field_buffer, double **src_frac_mask_buffer, int is_async, int *info, int *ierr)
Definition yac.c:3353
static size_t num_global_points
Definition yac.c:186
static void yac_get(int const field_id, int collection_size, double **recv_field, int is_async, int *info, int *ierr)
Definition yac.c:3156
void yac_cdef_grid_unstruct_edge(const char *grid_name, int nbr_vertices, int nbr_cells, int nbr_edges, int *num_edges_per_cell, double *x_vertices, double *y_vertices, int *cell_to_edge, int *edge_to_vertex, int *grid_id)
Definition yac.c:5587
void yac_cdef_points_reg2d_named(int const grid_id, int const *nbr_points, int const located, double const *x_points, double const *y_points, char const *name, int *point_id)
Definition yac.c:1499
void yac_cdef_grid_metadata_instance(int yac_instance_id, const char *grid_name, const char *metadata)
Definition yac.c:1991
static size_t num_global_components
Definition yac.c:183
void yac_cset_ext_couple_config_weight_file(int ext_couple_config_id, char const *weight_file)
Definition yac.c:2116
const char * yac_cget_component_metadata_instance(int yac_instance_id, const char *comp_name)
Definition yac.c:2021
void yac_cread_config_yaml_instance(int yac_instance_id, const char *yaml_filename)
Definition yac.c:808
static struct user_input_data_grid * user_input_data_get_or_create_grid(char const *grid_name, char const *caller, int *grid_id)
Definition yac.c:451
void yac_cset_ext_spmap_config_spread_distance(int ext_spmap_config_id, double spread_distance)
Definition yac.c:6013
void yac_cset_ext_couple_config_yaxt_exchanger_name(int ext_couple_config_id, char const *yaxt_exchanger_name)
Definition yac.c:2292
int const YAC_LOCATION_CORNER
Definition yac.c:39
void yac_cdef_couple_custom(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_timestep, int time_unit, int time_reduction, int interp_stack_config_id, int src_lag, int tgt_lag, int ext_couple_config_id)
Definition yac.c:2443
const char * yac_cget_field_timestep_instance(int yac_instance_id, const char *comp_name, const char *grid_name, const char *field_name)
Definition yac.c:5400
void yac_cset_ext_couple_config_scale_summand(int ext_couple_config_id, double scale_summand)
Definition yac.c:2215
void yac_cget_comp_comm(int comp_id, MPI_Comm *comp_comm)
Definition yac.c:1132
void yac_cset_coordinates_mismatch_is_fatal(int is_fatal)
Definition yac.c:940
void yac_cset_spmap_overwrite_config_weight_type(int spmap_overwrite_config_id, int weight_type)
Definition yac.c:6231
static struct yac_spmap_overwrite_config * generate_overwrite_config(int spmap_overwrite_config_id)
Definition yac.c:6300
static void check_mpi_initialised(char const *routine_name)
Definition yac.c:651
const char * yac_cget_field_datetime(int field_id)
Definition yac.c:2935
int const YAC_SPMAP_AVG
Definition yac.c:101
static void yac_free_global_components()
Definition yac.c:557
int const YAC_CONSERV_DESTAREA
Definition yac.c:98
void yac_cget(int const field_id, int collection_size, double **recv_field, int *info, int *ierr)
Definition yac.c:3298
int const YAC_EXCHANGE_TYPE_SOURCE
Definition yac.c:44
void yac_cdef_comp_instance(int yac_instance_id, char const *comp_name, int *comp_id)
Definition yac.c:1339
static void yac_check_yac_int(MPI_Comm comm)
Definition yac.c:633
static struct user_input_data_component * get_comp_info(int comp_id, char const *routine)
Definition yac.c:1095
void yac_cupdate(int field_id)
Definition yac.c:2962
void yac_cget_action(int field_id, int *action)
Definition yac.c:2893
void yac_cset_ext_couple_config_weight_file_on_existing_(struct yac_ext_couple_config *ext_couple_config, int weight_file_on_existing)
Definition yac.c:2130
static double *** get_src_field_buffer_pointers_ptr(int field_id, size_t collection_size, double **src_field_buffer)
Definition yac.c:3063
void yac_cset_ext_couple_config_use_raw_exchange_(struct yac_ext_couple_config *ext_couple_config, int use_raw_exchange)
Definition yac.c:2306
void yac_cexchange_(int const send_field_id, int const recv_field_id, int const collection_size, double *send_field, double *recv_field, int *send_info, int *recv_info, int *ierr)
Definition yac.c:4284
int const YAC_REDUCTION_TIME_ACCUMULATE
Definition yac.c:58
void yac_cset_ext_spmap_config_weight_type(int ext_spmap_config_id, int weight_type)
Definition yac.c:6033
void yac_cdef_points_reg2d_rot(int const grid_id, int const *nbr_points, int const located, double const *x_points, double const *y_points, double x_north_pole, double y_north_pole, int *point_id)
Definition yac.c:1700
void yac_cset_spmap_overwrite_config_src_point_selection_bnd_circle(int spmap_overwrite_config_id, double center_lon, double center_lat, double inc_angle)
Definition yac.c:6193
static void yac_free_global_points()
Definition yac.c:531
int yac_cget_field_id(const char *comp_name, const char *grid_name, const char *field_name)
Definition yac.c:5133
void yac_cget_ext_couple_config_tgt_mask_name(int ext_couple_config_id, char const **tgt_mask_name)
Definition yac.c:2277
void yac_cget_ext_couple_config_src_mask_names(int ext_couple_config_id, size_t *num_src_mask_names, char const *const **src_mask_names)
Definition yac.c:2253
const char * yac_cget_grid_name_from_field_id(int field_id)
Definition yac.c:5362
int yac_cget_collection_size_from_field_id(int field_id)
Definition yac.c:5384
void yac_cdef_grid_reg2d(const char *grid_name, int nbr_vertices[2], int cyclic[2], double *x_vertices, double *y_vertices, int *grid_id)
Definition yac.c:5511
void yac_cmpi_handshake_f2c(MPI_Fint comm, int n, char const **group_names, MPI_Fint *group_comms)
Definition yac.c:667
void yac_cget_ext_couple_config_use_raw_exchange(int ext_couple_config_id, int *use_raw_exchange)
Definition yac.c:2319
int yac_cget_comp_id_instance(int yac_instance_id, const char *comp_name)
Definition yac.c:5047
int yac_cdefault_instance_defined(void)
Definition yac.c:696
int const YAC_EXCHANGE_TYPE_NONE
Definition yac.c:43
void yac_cdef_couple_(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_timestep, int time_unit, int time_reduction, int interp_stack_config_id, int src_lag, int tgt_lag, char const *weight_file, int weight_file_on_existing, int mapping_side, double scale_factor, double scale_summand, int num_src_mask_names, char const *const *src_mask_names, char const *tgt_mask_name, char const *yaxt_exchanger_name, int collection_size, int const *collection_indices, int use_raw_exchange)
Definition yac.c:2543
void yac_cdef_couple_custom_instance(int yac_instance_id, 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_timestep, int time_unit, int time_reduction, int interp_stack_config_id, int src_lag, int tgt_lag, int ext_couple_config_id)
Definition yac.c:2428
void yac_cset_ext_couple_config_use_raw_exchange(int ext_couple_config_id, int use_raw_exchange)
Definition yac.c:2312
int yac_cget_grid_id(const char *grid_name)
Definition yac.c:5066
static int yac_pointer_to_unique_id(void *pointer)
Definition yac.c:262
void yac_cset_config_output_file_instance(int yac_instance_id, const char *filename, int fileformat, int sync_location, int include_definitions)
Definition yac.c:838
void yac_cdef_points_reg2d(int const grid_id, int const *nbr_points, int const located, double const *x_points, double const *y_points, int *point_id)
Definition yac.c:1540
void yac_cget_comps_comm(const char **comp_names, int num_comps, MPI_Comm *comps_comm)
Definition yac.c:1182
void yac_cexchange_ptr_(int const send_field_id, int const recv_field_id, int const collection_size, double **send_field, double **recv_field, int *send_info, int *recv_info, int *ierr)
Definition yac.c:4434
void yac_cinit_comm_instance(MPI_Comm comm, int *yac_instance_id)
Definition yac.c:700
void yac_cfree_ext_spmap_config(int ext_spmap_config_id)
Definition yac.c:5992
int const YAC_EXCHANGE_TYPE_TARGET
Definition yac.c:45
void yac_cread_config_json_instance(int yac_instance_id, const char *yaml_filename)
Definition yac.c:822
void yac_cget_instance_rank_c2py(int yac_instance_id, int *rank)
Definition yac.c:776
static struct yac_spmap_cell_area_config * generate_cell_area_config(CellAreaConfig config)
Definition yac.c:6277
void yac_cset_ext_couple_config_scale_factor_(struct yac_ext_couple_config *ext_couple_config, double scale_factor)
Definition yac.c:2185
const char * yac_cget_grid_metadata(const char *grid_name)
Definition yac.c:2042
void yac_cenable_field_frac_mask_instance(int yac_instance_id, const char *comp_name, const char *grid_name, const char *field_name, double frac_mask_fallback_value)
Definition yac.c:1957
char * yac_cget_start_datetime(void)
Definition yac.c:1055
void yac_cexchange_raw_frac(int const send_field_id, int const recv_field_id, int const collection_size, double ***const send_field, double ***const send_frac_mask, double ***src_field_buffer, double ***src_frac_mask_buffer, int *send_info, int *recv_info, int *ierr)
Definition yac.c:4695
void yac_ccheck_field_dimensions(int field_id, int collection_size, int num_interp_fields, int const *interp_field_sizes)
Definition yac.c:2567
void yac_cget_interp_stack_config_from_string_yaml(char const *interp_stack_config, int *interp_stack_config_id)
Definition yac.c:6588
int const YAC_TIME_UNIT_MONTH
Definition yac.c:68
void yac_cset_ext_spmap_config_max_search_distance(int ext_spmap_config_id, double max_search_distance)
Definition yac.c:6023
int const YAC_CONFIG_OUTPUT_FORMAT_YAML
Definition yac.c:117
int const YAC_TIME_UNIT_SECOND
Definition yac.c:64
int const YAC_ACTION_RESTART
Definition yac.c:50
void yac_cadd_interp_stack_config_conservative(int interp_stack_config_id, int order, int enforced_conserv, int partial_coverage, int normalisation)
Definition yac.c:5948
void yac_cput_frac_ptr_(int const field_id, int const collection_size, double **send_field, double **send_frac_mask, int *info, int *ierr)
Definition yac.c:3716
static struct yac_interp_stack_config ** global_interp_stack_configs
Definition yac.c:191
void yac_cset_ext_couple_config_mapping_side_(struct yac_ext_couple_config *ext_couple_config, int mapping_side)
Definition yac.c:2160
void yac_cdef_grid_cloud(const char *grid_name, int nbr_points, double *x_points, double *y_points, int *grid_id)
Definition yac.c:5629
static struct user_input_data_points * user_input_data_get_or_create_points(struct user_input_data_grid *grid_info, enum yac_location location, char const *name, char const *caller, int *point_id)
Definition yac.c:1357
static struct user_input_data_component * user_input_data_get_or_create_comp(struct yac_instance *instance, char const *name, char const *caller, int *comp_id)
Definition yac.c:1217
void yac_cdef_grid_unstruct(const char *grid_name, int nbr_vertices, int nbr_cells, int *num_vertices_per_cell, double *x_vertices, double *y_vertices, int *cell_to_vertex, int *grid_id)
Definition yac.c:5547
static int yac_instance_count
Definition yac.c:174
void yac_cexchange(int const send_field_id, int const recv_field_id, int const collection_size, double ***const send_field, double **recv_field, int *send_info, int *recv_info, int *ierr)
Definition yac.c:4883
void yac_cdef_points_unstruct(int const grid_id, int const nbr_points, int const located, double const *x_points, double const *y_points, int *point_id)
Definition yac.c:1639
char * yac_cget_version(void)
Definition yac.c:1081
static int pointer_lookup_table_size
Definition yac.c:177
int const YAC_LOCATION_EDGE
Definition yac.c:40
static int yac_init(MPI_Comm yac_comm)
Definition yac.c:677
void yac_cset_ext_spmap_config_tgt_cell_area_config_file(int ext_spmap_config_id, char const *filename, char const *varname, int min_global_id)
Definition yac.c:6153
int const YAC_DNN_DIST
Definition yac.c:91
void yac_cput(int const field_id, int const collection_size, double ***const send_field, int *info, int *ierr)
Definition yac.c:4271
void yac_cget_async(int const field_id, int collection_size, double **recv_field, int *info, int *ierr)
Definition yac.c:3307
void yac_cread_config_yaml(const char *yaml_filename)
Definition yac.c:817
@ YAC_CONFIG_OUTPUT_SYNC_LOC_ENDDEF_
Definition yac.c:127
@ YAC_CONFIG_OUTPUT_SYNC_LOC_SYNC_DEF_
Definition yac.c:126
@ YAC_CONFIG_OUTPUT_SYNC_LOC_DEF_COMP_
Definition yac.c:125
void yac_cset_ext_couple_config_weight_file_(struct yac_ext_couple_config *ext_couple_config, char const *weight_file)
Definition yac.c:2108
int yac_cget_default_instance_id()
Definition yac.c:691
void yac_cadd_interp_stack_config_user_file(int interp_stack_config_id, char const *filename)
Definition yac.c:6502
void yac_cexchange_frac_(int const send_field_id, int const recv_field_id, int const collection_size, double *send_field, double *send_frac_mask, double *recv_field, int *send_info, int *recv_info, int *ierr)
Definition yac.c:4395
const char * yac_cget_component_name_from_field_id(int field_id)
Definition yac.c:5355
void yac_cinit_comm_instance_f2c(MPI_Fint comm, int *yac_instance_id)
Definition yac.c:706
#define AGGREGATE(EXTRA_CHECK, ACCU_OP)
int yac_cget_field_collection_size(const char *comp_name, const char *grid_name, const char *field_name)
Definition yac.c:5458
int const YAC_CONFIG_OUTPUT_SYNC_LOC_DEF_COMP
after component definition
Definition yac.c:130
int const YAC_SPMAP_FRACAREA
Definition yac.c:107
void yac_cdef_component_metadata_instance(int yac_instance_id, const char *comp_name, const char *metadata)
Definition yac.c:1978
void yac_cenddef_and_emit_config_instance(int yac_instance_id, int emit_flags, char **config)
Definition yac.c:5012
void yac_cexchange_frac_ptr_(int const send_field_id, int const recv_field_id, int const collection_size, double **send_field, double **send_frac_mask, double **recv_field, int *send_info, int *recv_info, int *ierr)
Definition yac.c:4499
void yac_ccheck_src_field_buffer_size(int field_id, int collection_size, int src_field_buffer_size_)
Definition yac.c:2627
char * yac_cget_end_datetime(void)
Definition yac.c:1070
int const YAC_WGT_ON_EXISTING_OVERWRITE
overwrite existing weight file
Definition yac.c:122
int const YAC_ACTION_NONE
no data exchanges
Definition yac.c:47
static void check_cell_to_edge(int *cell_to_edge, int *num_edges_per_cell, int nbr_cells, int nbr_edges, char const *routine_name)
Definition yac.c:1479
int const YAC_WGT_ON_EXISTING_KEEP
keep existing weight file
Definition yac.c:121
static struct user_input_data_grid * get_grid_info(int grid_id, char const *caller, int allow_preliminary)
Definition yac.c:427
int yac_cyaml_get_emitter_flag_json_c2f()
Definition yac.c:801
void yac_cdef_calendar(int calendar)
Definition yac.c:1036
int const YAC_SPMAP_NONE
Definition yac.c:104
void yac_cset_core_mask(int const *is_core, int location, int grid_id)
Definition yac.c:5742
void yac_cinit_comm_f2c(MPI_Fint comm_f)
Definition yac.c:720
void yac_cget_raw_frac_async_(int const field_id, int const collection_size, double *src_field_buffer, double *src_frac_mask_buffer, int *info, int *ierr)
Definition yac.c:3457
void yac_cset_coordinates_check_instance(int yac_instance_id, int apply_check)
Definition yac.c:916
void yac_cwait(int field_id)
Definition yac.c:3773
void yac_cadd_interp_stack_config_rbf(int interp_stack_config_id, size_t n, double max_search_distance, double scale)
Definition yac.c:5936
int yac_cget_mask_id(int grid_id, int location, const char *mask_name)
Definition yac.c:5090
int yac_cget_calendar()
Definition yac.c:1041
int const YAC_CONFIG_OUTPUT_SYNC_LOC_SYNC_DEF
after synchronization of definition
Definition yac.c:132
void yac_cget_raw_frac_(int const field_id, int const collection_size, double *src_field_buffer, double *src_frac_mask_buffer, int *info, int *ierr)
Definition yac.c:3400
void set_cell_area_config_file(CellAreaConfig *cell_area_config, char const *filename, char const *varname, int min_global_id, char const *role)
Definition yac.c:6101
void yac_cget_comp_names(int nbr_comps, const char **comp_names)
Definition yac.c:5235
static int yac_add_grid(const char *grid_name, struct yac_basic_grid_data grid_data)
Definition yac.c:495
struct yac_ext_spmap_config ExtSpmapConfig
void yac_cdef_comps(char const **comp_names, int num_comps, int *comp_ids)
Definition yac.c:1331
const char * yac_cget_field_metadata(const char *comp_name, const char *grid_name, const char *field_name)
Definition yac.c:2056
int const YAC_ACTION_REDUCTION
data reduction, but data exchange
Definition yac.c:48
int const YAC_ACTION_GET_FOR_RESTART
last valid get
Definition yac.c:51
void yac_cput_(int const field_id, int const collection_size, double *send_field, int *info, int *ierr)
Definition yac.c:3601
void yac_cset_ext_spmap_config_tgt_cell_area_config_yac(int ext_spmap_config_id, double sphere_radius)
Definition yac.c:6083
void yac_cget_comps_comm_f2c(char const **comp_names, int num_comps, MPI_Fint *comps_comm_f)
Definition yac.c:1202
int const YAC_PROLEPTIC_GREGORIAN
Definition yac.c:73
void yac_cget_comp_grid_names_instance(int yac_instance_id, const char *comp_name, int nbr_grids, const char **grid_names)
Definition yac.c:5265
double yac_cget_field_frac_mask_fallback_value(const char *comp_name, const char *grid_name, const char *field_name)
Definition yac.c:5450
void yac_cset_mask(int const *is_valid, int points_id)
Definition yac.c:1833
void yac_cget_async_(int const field_id, int const collection_size, double *recv_field, int *info, int *ierr)
Definition yac.c:3289
static void trace_coupling_stop(int field_id, int h_pak_trace)
Definition yac.c:395
void yac_cadd_interp_stack_config_hcsbb(int interp_stack_config_id)
Definition yac.c:6470
void yac_cget_comps_comm_instance(int yac_instance_id, char const **comp_names, int num_comps, MPI_Comm *comps_comm)
Definition yac.c:1172
void yac_cadd_interp_stack_config_fixed(int interp_stack_config_id, double value)
Definition yac.c:6511
int const YAC_TIME_UNIT_DAY
Definition yac.c:67
void yac_get_(int const field_id, int const collection_size, double *recv_field, int is_async, int *info, int *ierr)
Definition yac.c:3262
static void yac_cupdate_(struct coupling_field *cpl_field, struct event *event, int is_source)
Definition yac.c:2943
int yac_cget_comp_nbr_grids(const char *comp_name)
Definition yac.c:5186
int const YAC_ACTION_COUPLING
data exchange
Definition yac.c:49
double yac_cget_field_frac_mask_fallback_value_instance(int yac_instance_id, const char *comp_name, const char *grid_name, const char *field_name)
Definition yac.c:5419
void yac_cset_ext_spmap_config_src_cell_area_config_file(int ext_spmap_config_id, char const *filename, char const *varname, int min_global_id)
Definition yac.c:6141
int const YAC_TIME_UNIT_ISO_FORMAT
Definition yac.c:70
void yac_cget_field_source_instance(int yac_instance_id, const char *tgt_comp_name, const char *tgt_grid_name, const char *tgt_field_name, const char **src_comp_name, const char **src_grid_name, const char **src_field_name)
Definition yac.c:5484
void yac_cexchange_raw(int const send_field_id, int const recv_field_id, int const collection_size, double ***const send_field, double ***src_field_buffer, int *send_info, int *recv_info, int *ierr)
Definition yac.c:4898
int const YAC_AVG_DIST
Definition yac.c:78
void yac_cexchange_raw_ptr_(int const send_field_id, int const recv_field_id, int const collection_size, double **send_field, double **src_field_buffer, int *send_info, int *recv_info, int *ierr)
Definition yac.c:4462
int yac_cget_field_role_instance(int yac_instance_id, const char *comp_name, const char *grid_name, const char *field_name)
Definition yac.c:5466
static void yac_check_version(MPI_Comm comm)
Definition yac.c:594
void yac_cdef_mask(int const grid_id, int const nbr_points, int const located, int const *is_valid, int *mask_id)
Definition yac.c:1824
static void * yac_unique_id_to_pointer(int id, char const *id_name)
Definition yac.c:282
int const YAC_CONSERV_FRACAREA
Definition yac.c:99
void yac_cadd_interp_stack_config_spmap(int interp_stack_config_id, double spread_distance, double max_search_distance, int weight_type, int scale_type, double src_sphere_radius, char const *src_filename, char const *src_varname, int src_min_global_id, double tgt_sphere_radius, char const *tgt_filename, char const *tgt_varname, int tgt_min_global_id)
Definition yac.c:6246
void yac_cadd_interp_stack_config_user_callback(int interp_stack_config_id, char const *func_compute_weights_key)
Definition yac.c:6543
void yac_cdef_grid_unstruct_edge_ll(const char *grid_name, int nbr_vertices, int nbr_cells, int nbr_edges, int *num_edges_per_cell, double *x_vertices, double *y_vertices, int *cell_to_edge, int *edge_to_vertex, int *grid_id)
Definition yac.c:5608
void yac_cdef_points_curve2d(int const grid_id, int const *nbr_points, int const located, double const *x_points, double const *y_points, int *point_id)
Definition yac.c:1594
void yac_cset_ext_couple_config_mapping_side(int ext_couple_config_id, int mapping_side)
Definition yac.c:2171
void yac_cdef_mask_named(int const grid_id, int const nbr_points, int const located, int const *is_valid, char const *name, int *mask_id)
Definition yac.c:1801
void yac_ccleanup_instance(int yac_instance_id)
Clean-up a YAC instance (see Restarting YAC)
Definition yac.c:969
int yac_cget_field_collection_size_instance(int yac_instance_id, const char *comp_name, const char *grid_name, const char *field_name)
Definition yac.c:5430
static void check_y_vertices(double const *y_vertices, size_t count, char const *routine_name)
Definition yac.c:1449
void yac_cfree_interp_stack_config(int interp_stack_config_id)
Definition yac.c:5834
static double *** get_send_field_pointers(int field_id, size_t collection_size, double *send_field)
Definition yac.c:3566
static void yac_free_global_masks()
Definition yac.c:544
int const YAC_CALENDAR_NOT_SET
Definition yac.c:72
void yac_cset_grid_output_file(const char *gridname, const char *filename)
Definition yac.c:890
int const YAC_NNN_AVG
Definition yac.c:84
static struct user_input_data_masks ** global_masks
Definition yac.c:188
void yac_cadd_interp_stack_config_nnn(int interp_stack_config_id, int type, size_t n, double max_search_distance, double scale)
Definition yac.c:5890
void yac_cget_ext_couple_config_scale_summand(int ext_couple_config_id, double *scale_summand)
Definition yac.c:2222
void yac_ccheck_src_field_buffer_sizes(int field_id, int num_src_fields_, int collection_size, int *src_field_buffer_sizes_)
Definition yac.c:2663
int const YAC_CONFIG_OUTPUT_FORMAT_JSON
Definition yac.c:118
size_t yac_cget_grid_size(int located, int grid_id)
Definition yac.c:5784
void yac_cinit_instance(int *yac_instance_id)
Definition yac.c:725
void yac_ctest(int field_id, int *flag)
Definition yac.c:3749
void yac_cset_ext_couple_config_yaxt_exchanger_name_(struct yac_ext_couple_config *ext_couple_config, char const *yaxt_exchanger_name)
Definition yac.c:2284
void yac_cget_interp_stack_config(int *interp_stack_config_id)
Definition yac.c:5818
void yac_cset_ext_couple_config_collection_selection(int ext_couple_config_id, int collection_size, int const *collection_indices)
Definition yac.c:2356
static void yac_free_pointer_unique_lookup()
Definition yac.c:314
void yac_cadd_interp_stack_config_spmap_f2c(int interp_stack_config_id, double spread_distance, double max_search_distance, int weight_type, int scale_type, double src_sphere_radius, char const *src_filename, char const *src_varname, int src_min_global_id, double tgt_sphere_radius, char const *tgt_filename, char const *tgt_varname, int tgt_min_global_id, int *overwrite_config_ids, int overwrite_config_count)
Definition yac.c:6394
void yac_cinit_dummy(void)
Definition yac.c:763
void yac_cadd_interp_stack_config_average(int interp_stack_config_id, int reduction_type, int partial_coverage)
Definition yac.c:5855
int const YAC_ACTION_PUT_FOR_RESTART
last valid put
Definition yac.c:52
#define WEIGHT_ACC(ACC, EXTRA_CHECK)
int const YAC_NNN_ZERO
Definition yac.c:88
void yac_cdef_comp(char const *comp_name, int *comp_id)
Definition yac.c:1345
int const YAC_EXCHANGE_TYPE_INVALID
Definition yac.c:42
int const YAC_SPMAP_DIST
Definition yac.c:102
void yac_cget_raw_frac_async_ptr_(int const field_id, int const collection_size, double **src_field_buffer, double **src_frac_mask_buffer, int *info, int *ierr)
Definition yac.c:3485
void yac_cget_raw_frac_ptr_(int const field_id, int const collection_size, double **src_field_buffer, double **src_frac_mask_buffer, int *info, int *ierr)
Definition yac.c:3428
void yac_cdef_field(char const *name, int const comp_id, int const *point_ids, int const num_pointsets, int collection_size, const char *timestep, int time_unit, int *field_id)
Definition yac.c:1929
size_t yac_cget_points_size(int points_id)
Definition yac.c:5805
void yac_cset_spmap_overwrite_config_spread_distance(int spmap_overwrite_config_id, double spread_distance)
Definition yac.c:6211
void yac_csync_def_comps_instance(int yac_instance_id, char const **comp_names, int num_comp_names)
Definition yac.c:4928
static void check_name_string(char const *caller, char const *name, char const *name_type)
Definition yac.c:410
void yac_cdef_couple_instance(int yac_instance_id, 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_timestep, int time_unit, int time_reduction, int interp_stack_config_id, int src_lag, int tgt_lag)
Definition yac.c:2458
void yac_cget_spmap_overwrite_config(int *spmap_overwrite_config_id)
Definition yac.c:6165
void yac_cdef_couple(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_timestep, int time_unit, int time_reduction, int interp_stack_config_id, int src_lag, int tgt_lag)
Definition yac.c:2475
int yac_cget_nbr_comps(void)
Definition yac.c:5147
static int default_instance_id
Definition yac.c:172
void yac_cdef_field_metadata_instance(int yac_instance_id, const char *comp_name, const char *grid_name, const char *field_name, const char *metadata)
Definition yac.c:2005
int const YAC_AVG_BARY
Definition yac.c:79
void yac_cget_raw_async_ptr_(int const field_id, int const collection_size, double **src_field_buffer, int *info, int *ierr)
Definition yac.c:3473
static void check_x_vertices(double const *x_vertices, size_t count, char const *routine_name)
Definition yac.c:1439
void yac_cset_ext_couple_config_tgt_mask_name_(struct yac_ext_couple_config *ext_couple_config, char const *tgt_mask_name)
Definition yac.c:2262
void yac_cput_ptr_(int const field_id, int const collection_size, double **send_field, int *info, int *ierr)
Definition yac.c:3695
void yac_cget_raw_ptr_(int const field_id, int const collection_size, double **src_field_buffer, int *info, int *ierr)
Definition yac.c:3416
static struct user_input_data_points ** global_points
Definition yac.c:185
static void yac_cfree_ext_couple_config_(struct yac_ext_couple_config ext_couple_config)
Definition yac.c:2087
void yac_cadd_interp_stack_config_dnn(int interp_stack_config_id, int weight_type, int search_distance_type, double search_distance, double scale)
Definition yac.c:5910
int const YAC_NNN_DIST
Definition yac.c:85
void yac_cget_comp_grid_names(const char *comp_name, int nbr_grids, const char **grid_names)
Definition yac.c:5304
int yac_cget_nbr_grids()
Definition yac.c:5160
void yac_cget_field_names_instance(int yac_instance_id, const char *comp_name, const char *grid_name, int nbr_fields, const char **field_names)
Definition yac.c:5311
struct yac_cell_area_config CellAreaConfig
void yac_cdef_comps_instance(int yac_instance_id, char const **comp_names, int num_comps, int *comp_ids)
Definition yac.c:1294
void yac_cexchange_raw_(int const send_field_id, int const recv_field_id, int const collection_size, double *send_field, double *src_field_buffer, int *send_info, int *recv_info, int *ierr)
Definition yac.c:4374
int const YAC_REDUCTION_TIME_NONE
Definition yac.c:57
void yac_cget_comp_names_instance(int yac_instance_id, int nbr_comps, const char **comp_names)
Definition yac.c:5216
void yac_cdef_field_metadata(const char *comp_name, const char *grid_name, const char *field_name, const char *metadata)
Definition yac.c:2014
void yac_cget_ext_spmap_config(int *ext_spmap_config_id)
Definition yac.c:5966
void yac_cset_ext_couple_config_collection_selection_(struct yac_ext_couple_config *ext_couple_config, int collection_size, int const *collection_indices)
Definition yac.c:2326
static void yac_ccleanup_instance_(int yac_instance_id)
Definition yac.c:949
static void get_global_ids_reference(char const *caller, int location, int grid_id, yac_int **grid_global_ids, size_t *count)
Definition yac.c:5676
const char * yac_cget_component_metadata(const char *comp_name)
Definition yac.c:2029
const char * yac_cget_field_timestep(const char *comp_name, const char *grid_name, const char *field_name)
Definition yac.c:5412
void yac_cget_field_names(const char *comp_name, const char *grid_name, int nbr_fields, const char **field_names)
Definition yac.c:5348
static void ** pointer_lookup_table
Definition yac.c:176
static int yac_cget_interp_stack_config_from_string(char const *interp_stack_config, int parse_flags)
Definition yac.c:6566
void yac_cget_ext_couple_config_weight_file(int ext_couple_config_id, char const **weight_file)
Definition yac.c:2123
void yac_cinit_comm(MPI_Comm comm)
Definition yac.c:712
static void yac_free_global_interp_stack_configs()
Definition yac.c:570
#define YAC_MAX_CHARLEN
Definition yac.h:106
#define YAC_ASSERT_F(exp, format,...)
Definition yac_assert.h:39
#define YAC_ASSERT_FUNC(exp, func, msg)
Definition yac_assert.h:36
#define YAC_UNREACHABLE_DEFAULT_F_FUNC(func, format,...)
Definition yac_assert.h:63
#define YAC_ASSERT_F_FUNC(exp, func, format,...)
Definition yac_assert.h:42
#define YAC_UNREACHABLE_DEFAULT(msg)
Definition yac_assert.h:56
void yac_mpi_finalize()
Definition yac_mpi.c:106
void yac_mpi_cleanup()
Definition yac_mpi.c:94
int yac_mpi_is_initialised()
Definition yac_mpi.c:33
void yac_yaxt_init(MPI_Comm comm)
Definition yac_mpi.c:41
void yac_mpi_init()
Definition yac_mpi.c:77
#define yac_mpi_call(call, comm)
#define YAC_MPI_SIZE_T
void yac_pak_instrument_end(void)
End the window opened by yac_pak_instrument_begin (clears the callbacks). Safe to call unconditionall...
void yac_pak_instrument_begin(struct yac_pak *pak, yac_pak_trace_level_t level, char const *component, char const *grid)
Begin a tracing window: record instrumented core regions until the matching yac_pak_instrument_end as...
Bridge that turns YAC core instrumentation regions (see instrument.h) into nested YAC_PAK_EVENT_TYPE_...
YAC_INT yac_int
Definition yac_types.h:15
double(* yac_coordinate_pointer)[3]
Definition yac_types.h:21