YAC 3.15.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 "mpi_handshake.h"
21#include "utils_mci.h"
22#include "version.h"
23#include "instance.h"
24#include "fields.h"
25#include "couple_config.h"
26#include "config_yaml.h"
27#include "geometry.h"
28#include "yac_mpi.h"
29#include "yac_assert.h"
30#include "utils_common.h"
34
38
42
52
58
67
68int const YAC_CALENDAR_NOT_SET = CALENDAR_NOT_SET;
69int const YAC_PROLEPTIC_GREGORIAN = PROLEPTIC_GREGORIAN;
70int const YAC_YEAR_OF_365_DAYS = YEAR_OF_365_DAYS;
71int const YAC_YEAR_OF_360_DAYS = YEAR_OF_360_DAYS;
72
76
79
85
90
93
96
99
104
107
112
115
119
120enum {
124};
125
132
137
144
150
155static const char* mpi_handshake_group_name = "yac";
156
157static int default_instance_id = INT_MAX;
158
159static int yac_instance_count = 0;
160
161void ** pointer_lookup_table = NULL;
163
164struct yac_basic_grid ** grids = NULL;
165size_t num_grids = 0;
166
167static struct user_input_data_component ** components = NULL;
168static size_t num_components = 0;
169
170static struct user_input_data_points ** points = NULL;
171static size_t num_points = 0;
172
173static struct user_input_data_masks ** masks = NULL;
174static size_t num_masks = 0;
175
177static size_t num_interp_stack_configs = 0;
178
192
193typedef struct yac_cell_area_config {
194
196 union {
197 struct {
200 struct {
201 char * filename;
202 char * varname;
207
217
233
252
259static void * yac_unique_id_to_pointer(int id, char const * id_name) {
260
263 id >= 0,
264 "ERROR(yac_unique_id_to_pointer): invalid %s", id_name)
265 return pointer_lookup_table[id];
266}
267
276static int yac_lookup_pointer(void const * pointer) {
277
278 int ret = INT_MAX;
279 for (int i = 0; (ret == INT_MAX) && (i < pointer_lookup_table_size); ++i)
280 if (pointer_lookup_table[i] == pointer) ret = i;
281 return ret;
282}
283
297
298/* ---------------------------------------------------------------------- */
299
300static int yac_add_grid(
301 const char * grid_name, struct yac_basic_grid_data grid_data) {
302
303 for (size_t i = 0; i < num_grids; ++i)
305 strcmp(yac_basic_grid_get_name(grids[i]), grid_name),
306 "ERROR(yac_add_grid): multiple definitions of grid with identical name")
307
309 strlen(grid_name) <= YAC_MAX_CHARLEN,
310 "ERROR(yac_add_grid): grid name is too long (maximum is YAC_MAX_CHARLEN)")
311
312 struct yac_basic_grid * grid = yac_basic_grid_new(grid_name, grid_data);
313
314 grids = xrealloc(grids, (num_grids + 1) * sizeof(*grids));
315 grids[num_grids] = grid;
316 num_grids++;
317 return yac_pointer_to_unique_id(grid);
318}
319
320static void yac_free_grids() {
321
322 for (size_t i = 0; i < num_grids; ++i)
324 free(grids);
325 grids = NULL;
326 num_grids = 0;
327}
328
329/* ---------------------------------------------------------------------- */
330
331static void yac_free_points() {
332
333 for (size_t i = 0; i < num_points; ++i) free(points[i]);
334 free(points);
335 points = NULL;
336 num_points = 0;
337}
338
339/* ---------------------------------------------------------------------- */
340
341static void yac_free_masks() {
342
343 for (size_t i = 0; i < num_masks; ++i) free(masks[i]);
344 free(masks);
345 masks = NULL;
346 num_masks = 0;
347}
348
349/* ---------------------------------------------------------------------- */
350
351static void yac_free_components() {
352
353 for (size_t i = 0; i < num_components; ++i){
354 free(components[i]->name);
355 free(components[i]);
356 }
357 free(components);
358 components = NULL;
359 num_components = 0;
360}
361
362/* ---------------------------------------------------------------------- */
363
373
374/* ---------------------------------------------------------------------- */
375
377 return (default_instance_id != INT_MAX);
378}
379
380static void check_default_instance_id(char const * routine_name) {
383 "ERROR(%s): no default YAC instance is defined yet", routine_name)
384}
385
386/* ---------------------------------------------------------------------- */
387
388static void yac_check_version(MPI_Comm comm) {
389
390 int comm_rank;
391 yac_mpi_call(MPI_Comm_rank(comm, &comm_rank), comm);
392
393 char recv_version[64];
394
395 size_t yac_version_len = strlen(yac_version) + 1;
396
398 yac_version_len <= sizeof(recv_version),
399 "ERROR(yac_check_version): "
400 "version string \"%s\" is too long (has to be shorter than %zu)",
401 yac_version, sizeof(recv_version))
402
403 if (comm_rank == 0) strcpy(recv_version, yac_version);
404
406 MPI_Bcast(recv_version, (int)yac_version_len, MPI_CHAR, 0, comm), comm);
407
409 !strcmp(recv_version, yac_version),
410 "ERROR(yac_check_version): inconsistent YAC versions between processes "
411 "(on local process \"%s\"; on root \"%s\")", yac_version, recv_version)
412}
413
414static void yac_check_yac_int(MPI_Comm comm) {
415
416 int comm_rank;
417 yac_mpi_call(MPI_Comm_rank(comm, &comm_rank), comm);
418
419 int yac_int_size_local = (int)(sizeof(yac_int));
420 int yac_int_size_root = (int)(sizeof(yac_int));
421
423 MPI_Bcast(&yac_int_size_root, 1, MPI_INT, 0, comm), comm);
424
426 yac_int_size_local == yac_int_size_root,
427 "ERROR(yac_check_yac_int): inconsistent size of yac_int datatype between "
428 "processes (on local process \"%d\"; on root \"%d\")",
429 yac_int_size_local, yac_int_size_root)
430}
431
432void check_mpi_initialised(char const * routine_name) {
433
436 "ERROR(%s): "
437 "MPI has not yet been initialised, but this call got a "
438 "communicator which is not allowed by the MPI standard "
439 "(MPI_COMM_WORLD is not to be used before the call to "
440 "MPI_Init or MPI_Init_thread)", routine_name);
441}
442
443void yac_cmpi_handshake(MPI_Comm comm, size_t n, char const** group_names,
444 MPI_Comm * group_comms) {
445 check_mpi_initialised("yac_cmpi_handshake");
446 yac_mpi_handshake(comm, n, group_names, group_comms);
447}
448
449void yac_cmpi_handshake_f2c(MPI_Fint comm, int n, char const** group_names,
450 MPI_Fint * group_comms) {
451 MPI_Comm comm_c = MPI_Comm_f2c(comm);
452 MPI_Comm * group_comms_c = xmalloc(n*sizeof(*group_comms_c));
453 yac_mpi_handshake(comm_c, n, group_names, group_comms_c);
454 for(int i = 0; i<n; ++i)
455 group_comms[i] = MPI_Comm_c2f(group_comms_c[i]);
456 free(group_comms_c);
457}
458
459static int yac_init(MPI_Comm comm) {
460
461 check_mpi_initialised("yac_init");
462 yac_yaxt_init(comm);
463 yac_check_version(comm);
464 yac_check_yac_int(comm);
465
466 int comm_rank, comm_size;
467 yac_mpi_call(MPI_Comm_rank(comm, &comm_rank), comm);
468 yac_mpi_call(MPI_Comm_size(comm, &comm_size), comm);
469
471 return
473 yac_instance_new(comm));
474}
475
477 check_default_instance_id("yac_cget_default_instance_id");
478 return default_instance_id;
479}
480
484
486 MPI_Comm comm, int * yac_instance_id) {
487
488 *yac_instance_id = yac_init(comm);
489}
490
492 MPI_Fint comm, int * yac_instance_id) {
493
494 yac_cinit_comm_instance(MPI_Comm_f2c(comm), yac_instance_id);
495}
496
497void yac_cinit_comm ( MPI_Comm comm ) {
498
500 default_instance_id == INT_MAX,
501 "ERROR(yac_cinit_comm): default YAC instance already defined")
502
504}
505
506void yac_cinit_comm_f2c ( MPI_Fint comm_f ) {
507
508 yac_cinit_comm(MPI_Comm_f2c(comm_f));
509}
510
512 int * yac_instance_id) {
513
514 // we have to initalise MPI here in order to be able to use MPI_COMM_WORLD
515 yac_mpi_init();
516 MPI_Comm yac_comm;
517 const char* group_name = yac_cget_mpi_handshake_group_name();
518 yac_cmpi_handshake(MPI_COMM_WORLD, 1, &group_name, &yac_comm);
519 yac_cinit_comm_instance(yac_comm, yac_instance_id);
520 yac_mpi_call(MPI_Comm_free(&yac_comm), MPI_COMM_WORLD);
521}
522
523void yac_cinit ( void ) {
525 default_instance_id == INT_MAX,
526 "ERROR(yac_cinit_comm): default YAC instance already defined")
527
529}
530
531/* ---------------------------------------------------------------------- */
532
533void yac_cinit_comm_dummy ( MPI_Comm comm ) {
534
535 check_mpi_initialised("yac_cinit_comm_dummy");
536
537 yac_yaxt_init(comm);
538 yac_check_version(comm);
539 yac_check_yac_int(comm);
540
542}
543
544void yac_cinit_comm_dummy_f2c ( MPI_Fint comm_f ) {
545
546 check_mpi_initialised("yac_cinit_comm_dummy_f2c");
547 yac_cinit_comm_dummy(MPI_Comm_f2c(comm_f));
548}
549
550void yac_cinit_dummy( void ) {
551
552 // we have to initalise MPI here in order to be able to use MPI_COMM_WORLD
553 yac_mpi_init();
554 yac_cmpi_handshake(MPI_COMM_WORLD, 0, NULL, NULL);
555}
556
557/* ---------------------------------------------------------------------- */
558
559/* internal routine to serve the Python interface
560 * (helps to avoid issue with "from mpi4py import MPI")
561 */
562
563void yac_cget_instance_rank_c2py ( int yac_instance_id, int * rank ) {
564
565 MPI_Comm instance_comm =
567 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id"));
568
569 yac_mpi_call(MPI_Comm_rank(instance_comm, rank), instance_comm);
570
571}
572
573void yac_cget_instance_size_c2py ( int yac_instance_id, int * size ) {
574
575 MPI_Comm instance_comm =
577 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id"));
578
579 yac_mpi_call(MPI_Comm_size(instance_comm, size), instance_comm);
580}
581
582/* ---------------------------------------------------------------------- */
583
587
591
592/* ---------------------------------------------------------------------- */
593
594
595void yac_cread_config_yaml_instance( int yac_instance_id,
596 const char * yaml_filename) {
597 struct yac_instance * instance
598 = yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
602}
603
608
609void yac_cread_config_json_instance( int yac_instance_id,
610 const char * yaml_filename) {
611 struct yac_instance * instance
612 = yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
616}
617
622
623/* ---------------------------------------------------------------------- */
624
626 int yac_instance_id, const char * filename, int fileformat,
627 int sync_location, int include_definitions) {
628
629 struct yac_instance * instance =
630 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
631
633 filename != NULL,
634 "ERROR(yac_cset_config_output_file_instance): filename is NULL")
636 (fileformat == YAC_TEXT_FILETYPE_YAML) ||
637 (fileformat == YAC_TEXT_FILETYPE_JSON),
638 "ERROR(yac_cset_config_output_file_instance): invalid file format")
640 (sync_location == YAC_CONFIG_OUTPUT_SYNC_LOC_DEF_COMP) ||
641 (sync_location == YAC_CONFIG_OUTPUT_SYNC_LOC_SYNC_DEF) ||
642 (sync_location == YAC_CONFIG_OUTPUT_SYNC_LOC_ENDDEF),
643 "ERROR(yac_cset_config_output_file_instance): invalid file format")
644
645 char const * output_refs[] =
649
651 yac_instance_get_couple_config(instance), filename,
652 (enum yac_text_filetype)fileformat,
653 output_refs[sync_location], include_definitions);
654}
655
657 const char * filename, int filetype, int sync_location,
658 int include_definitions) {
659
660 check_default_instance_id("yac_cset_config_output_file");
662 default_instance_id, filename, filetype, sync_location,
663 include_definitions);
664}
665
666/* ---------------------------------------------------------------------- */
667
669 int yac_instance_id, const char * gridname, const char * filename) {
670
671 struct yac_instance * instance =
672 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
673
675 gridname != NULL,
676 "ERROR(yac_cset_grid_output_file_instance): gridname is NULL")
678 filename != NULL,
679 "ERROR(yac_cset_grid_output_file_instance): filename is NULL")
680
682 yac_instance_get_couple_config(instance), gridname, filename);
683}
684
685void yac_cset_grid_output_file(const char * gridname, const char * filename) {
686
687 check_default_instance_id("yac_cset_grid_output_file");
689}
690
691/* ---------------------------------------------------------------------- */
692
693static void yac_ccleanup_instance_(int yac_instance_id) {
694
695 struct yac_instance * instance
696 = yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
697
698 /* free memory */
699 yac_instance_delete(instance);
701 if(yac_instance_id == default_instance_id)
702 default_instance_id = INT_MAX;
703
704 // remove dangeling pointers from components
705 for(size_t i = 0; i<num_components;++i){
706 if(components[i]->instance == instance){
707 components[i]->instance = NULL;
708 }
709 }
710}
711
712void yac_ccleanup_instance (int yac_instance_id) {
713
714 yac_ccleanup_instance_(yac_instance_id);
715
716 /* cleanup mpi */
718}
719
721
722 check_default_instance_id("yac_ccleanup");
723
725}
726
727/* ---------------------------------------------------------------------- */
728
739
740void yac_cfinalize_instance(int yac_instance_id) {
741
742 yac_ccleanup_instance_(yac_instance_id);
743
744 /* cleanup close MPI */
745
746 if (yac_instance_count == 0) cleanup();
747}
748
750
753
754 /* cleanup close MPI */
755
756 if (yac_instance_count == 0) cleanup();
757}
758
759/* ---------------------------------------------------------------------- */
760
762 int yac_instance_id, const char * start_datetime,
763 const char * end_datetime) {
764
766 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id"),
767 start_datetime, end_datetime);
768}
769
770void yac_cdef_datetime ( const char * start_datetime,
771 const char * end_datetime ) {
772
773 check_default_instance_id("yac_cdef_datetime");
775 default_instance_id, start_datetime, end_datetime);
776}
777
778void yac_cdef_calendar ( int calendar ) {
779
781 (calendar == YAC_PROLEPTIC_GREGORIAN) ||
782 (calendar == YAC_YEAR_OF_360_DAYS) ||
783 (calendar == YAC_YEAR_OF_365_DAYS),
784 "ERROR(yac_cdef_calendar): invalid calendar type")
785
786 calendarType curr_calendar = getCalendarType();
788 (curr_calendar == CALENDAR_NOT_SET) ||
789 (curr_calendar == (calendarType)calendar),
790 "ERROR(yac_cdef_calendar): inconsistent calendar definition")
791
792 initCalendar((calendarType)calendar);
793}
794
796
797 return (int)getCalendarType();
798}
799
800/* ---------------------------------------------------------------------- */
801
802char * yac_cget_start_datetime_instance(int yac_instance_id) {
803
804 return
806 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id"));
807}
808
809char * yac_cget_start_datetime ( void ) {
810
811 check_default_instance_id("yac_cget_start_datetime");
813}
814
815/* ---------------------------------------------------------------------- */
816
817char * yac_cget_end_datetime_instance(int yac_instance_id) {
818
819 return
821 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id"));
822}
823
824char * yac_cget_end_datetime ( void ) {
825
826 check_default_instance_id("yac_cget_end_datetime");
828}
829
830/* ---------------------------------------------------------------------- */
831
832/* The YAC version number is provided in version.h
833 */
834
835char * yac_cget_version ( void ) {
836 return yac_version;
837}
838
839/* ---------------------------------------------------------------------- */
840
843}
844
845/* ---------------------------------------------------------------------- */
846
848 int comp_id, char const * routine) {
849
850 struct user_input_data_component * comp_info =
852
854 comp_info->instance != NULL,
855 "ERROR(%s): instance of component \"%s\" is already finalized",
856 routine, comp_info->name);
857
858 return comp_info;
859}
860
861/* ---------------------------------------------------------------------- */
862
863/* c interface routine */
864
865void yac_cget_comp_comm ( int comp_id, MPI_Comm *comp_comm ) {
866
867 struct user_input_data_component * comp_info =
868 get_user_input_data_component(comp_id, "yac_cget_comp_comm");
869
870 *comp_comm =
872 comp_info->instance, (char const **)&(comp_info->name), 1);
873}
874
875/* internal routine to serve the Fortran interface */
876
877void yac_get_comp_comm_f2c ( int comp_id, MPI_Fint *comp_comm_f ) {
878
879 MPI_Comm comp_comm;
880 yac_cget_comp_comm(comp_id, &comp_comm);
881
882 *comp_comm_f = MPI_Comm_c2f(comp_comm);
883}
884
885/* internal routine to serve the Python interface */
886
887void yac_cget_comp_size_c2py(int comp_id, int* size){
888 struct user_input_data_component * comp_info =
889 get_user_input_data_component(comp_id, "yac_cget_comp_size_c2py");
890
891 *size = yac_instance_get_comp_size(comp_info->instance, comp_info->name);
892}
893
894void yac_cget_comp_rank_c2py(int comp_id, int* rank){
895 struct user_input_data_component * comp_info =
896 get_user_input_data_component(comp_id, "yac_cget_comp_rank_c2py");
897
898 *rank = yac_instance_get_comp_rank(comp_info->instance, comp_info->name);
899}
900
901/* ---------------------------------------------------------------------- */
902
903/* c interface routine */
904
906 int yac_instance_id,
907 char const ** comp_names, int num_comps, MPI_Comm * comps_comm) {
908
909 *comps_comm =
911 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id"),
912 comp_names, (size_t)num_comps);
913}
914
916 const char ** comp_names, int num_comps, MPI_Comm * comps_comm) {
917
918 check_default_instance_id("yac_cget_comps_comm");
920 default_instance_id, comp_names, num_comps, comps_comm);
921}
922
923/* internal routine to serve the Fortran interface */
924
926 int yac_instance_id,
927 char const ** comp_names, int num_comps, MPI_Fint * comps_comm_f) {
928
929 MPI_Comm comps_comm;
931 yac_instance_id, comp_names, num_comps, &comps_comm);
932 *comps_comm_f = MPI_Comm_c2f(comps_comm);
933}
934
936 char const ** comp_names, int num_comps, MPI_Fint *comps_comm_f) {
937
938 MPI_Comm comps_comm;
939 yac_cget_comps_comm(comp_names, num_comps, &comps_comm);
940 *comps_comm_f = MPI_Comm_c2f(comps_comm);
941}
942
943/* ---------------------------------------------------------------------- */
944
946 int yac_instance_id, char const * name, int * comp_id){
947
948 struct yac_instance * instance =
949 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
950
953 "ERROR(yac_cpredef_comp_instance): components have already been defined");
954
956 (name != NULL) && (*name != '\0'),
957 "ERROR(yac_cpredef_comp_instance): missing component name");
958
959 for (size_t i = 0; i < num_components; ++i) {
961 (components[i]->instance != instance) ||
962 strcmp(components[i]->name, name),
963 "ERROR(yac_cpredef_comp_instance): "
964 "component \"%s\" is already defined", name);
965 }
966
967 components =
968 xrealloc(
969 components, (num_components + 1) * sizeof(*components));
970
976}
977
982
984 int yac_instance_id, char const ** comp_names, int num_comps,
985 int * comp_ids) {
986
987 struct yac_instance * instance =
988 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
989
990 for(int i = 0; i<num_comps; ++i)
991 yac_cpredef_comp_instance(yac_instance_id, comp_names[i], comp_ids + i);
992
993 // count predefined components and set their index
994 size_t comp_counter = 0;
995 char const ** all_comp_names = xmalloc(num_components * sizeof(*all_comp_names));
996 for(size_t i = 0; i<num_components; ++i){
997 if(components[i]->instance == instance){
998 all_comp_names[comp_counter] = components[i]->name;
999 comp_counter++;
1000 }
1001 }
1002
1003 yac_instance_def_components(instance, all_comp_names, comp_counter);
1004
1005 free(all_comp_names);
1006}
1007
1009 char const ** comp_names, int num_comps, int * comp_ids ) {
1010
1011 check_default_instance_id("yac_cdef_comps");
1013 default_instance_id, comp_names, num_comps, comp_ids);
1014}
1015
1017 int yac_instance_id, char const * comp_name, int * comp_id ) {
1018
1019 yac_cdef_comps_instance(yac_instance_id, &comp_name, 1, comp_id);
1020}
1021
1022void yac_cdef_comp ( char const * comp_name, int * comp_id ) {
1023
1024 yac_cdef_comps(&comp_name, 1, comp_id);
1025}
1026
1027/* ---------------------------------------------------------------------- */
1028
1030 struct yac_basic_grid * grid, enum yac_location location,
1031 yac_coordinate_pointer coordinates) {
1032
1033 struct user_input_data_points * curr_points = xmalloc(1 * sizeof(*curr_points));
1034 curr_points->default_mask_id = INT_MAX;
1035 curr_points->grid = grid;
1036 curr_points->location = location;
1037 curr_points->coordinates_idx =
1039
1040 points = xrealloc(points, (num_points + 1) * sizeof(*points));
1041 points[num_points] = curr_points;
1042 num_points++;
1043
1044 return yac_pointer_to_unique_id(curr_points);
1045}
1046
1047/* ---------------------------------------------------------------------- */
1048
1050 double const * x_vertices, size_t count, char const * routine_name) {
1051
1052 for (size_t i = 0; i < count; ++i)
1054 (x_vertices[i] >= -4.0 * M_PI) && (x_vertices[i] <= 4.0 * M_PI),
1055 "ERROR(%s): x_vertices[%zu] = %lf outside of valid range [-4*PI;4*PI]",
1056 routine_name, i, x_vertices[i]);
1057}
1058
1060 double const * y_vertices, size_t count, char const * routine_name) {
1061
1062 for (size_t i = 0; i < count; ++i)
1064 (y_vertices[i] >= - (M_PI_2 + 1e-5)) &&
1065 (y_vertices[i] <= (M_PI_2 + 1e-5)),
1066 "ERROR(%s): y_vertices[%zu] = %.10lf outside of valid range [-PI/2;PI/2]",
1067 routine_name, i, y_vertices[i]);
1068}
1069
1071 int *cell_to_vertex, int *num_vertices_per_cell, int nbr_cells,
1072 int nbr_vertices, char const * routine_name) {
1073
1074 size_t count = 0;
1075 for (int i = 0; i < nbr_cells; ++i) {
1077 num_vertices_per_cell[i] >= 0,
1078 "ERROR(%s): num_vertices_per_cell[%d] = %d ",
1079 routine_name, i, num_vertices_per_cell[i]);
1080 count += num_vertices_per_cell[i];
1081 }
1082 for (size_t i = 0; i < count; ++i)
1084 (cell_to_vertex[i] >= 0) && (cell_to_vertex[i] < nbr_vertices),
1085 "ERROR(%s): cell_to_vertex[%zu] = %d "
1086 "invalid value (nbr_vertices = %d)",
1087 routine_name, i, cell_to_vertex[i], nbr_vertices);
1088}
1089
1091 int *cell_to_edge, int *num_edges_per_cell, int nbr_cells,
1092 int nbr_edges, char const * routine_name) {
1093
1094 size_t count = 0;
1095 for (int i = 0; i < nbr_cells; ++i) {
1097 num_edges_per_cell[i] >= 0,
1098 "ERROR(%s): num_edges_per_cell[%d] = %d ",
1099 routine_name, i, num_edges_per_cell[i]);
1100 count += num_edges_per_cell[i];
1101 }
1102 for (size_t i = 0; i < count; ++i)
1104 (cell_to_edge[i] >= 0) && (cell_to_edge[i] < nbr_edges),
1105 "ERROR(%s): cell_to_edge[%zu] = %d "
1106 "invalid value (nbr_edges = %d)",
1107 routine_name, i, cell_to_edge[i], nbr_edges);
1108}
1109
1110/* ---------------------------------------------------------------------- */
1111
1113 int const *nbr_points,
1114 int const located,
1115 double const *x_points,
1116 double const *y_points,
1117 int *point_id ) {
1118
1119 enum yac_location location = yac_get_location(located);
1120 struct yac_basic_grid * grid = yac_unique_id_to_pointer(grid_id, "grid_id");
1121
1122 YAC_ASSERT(
1124 "ERROR(yac_cdef_points_reg2d): "
1125 "edge-location is not supported, use yac_cdef_points_unstruct instead.");
1126
1127 size_t data_size = yac_basic_grid_get_data_size(grid, location);
1128
1130 ((size_t)nbr_points[0] * (size_t)nbr_points[1]) == data_size,
1131 "ERROR(yac_cdef_points_reg2d): nbr_points does not match with grid. "
1132 "Given nbr_points[0] * nbr_points[1] != Expected (%zu*%zu != %zu)",
1133 (size_t)nbr_points[0], (size_t)nbr_points[1], data_size);
1134
1136 x_points, (size_t)(nbr_points[0]), "yac_cdef_points_reg2d");
1138 y_points, (size_t)(nbr_points[1]), "yac_cdef_points_reg2d");
1139
1140 yac_coordinate_pointer coordinates =
1141 xmalloc(data_size * sizeof(*coordinates));
1142 for (int i = 0, k = 0; i < nbr_points[1]; ++i)
1143 for (int j = 0; j < nbr_points[0]; ++j, ++k)
1144 LLtoXYZ(x_points[j], y_points[i], coordinates[k]);
1145
1146 *point_id = user_input_data_add_points(grid, location, coordinates);
1147}
1148
1149/* ---------------------------------------------------------------------- */
1150
1152 int const *nbr_points,
1153 int const located,
1154 double const *x_points,
1155 double const *y_points,
1156 int *point_id ) {
1157
1158 enum yac_location location = yac_get_location(located);
1159 struct yac_basic_grid * grid = yac_unique_id_to_pointer(grid_id, "grid_id");
1160
1161 YAC_ASSERT(
1163 "ERROR(yac_cdef_points_curve2d): "
1164 "edge-location is not supported, use yac_cdef_points_unstruct instead.");
1165
1166 size_t data_size = yac_basic_grid_get_data_size(grid, location);
1167
1169 ((size_t)nbr_points[0] * (size_t)nbr_points[1]) == data_size,
1170 "ERROR(yac_cdef_points_curve2d): nbr_points does not match with grid. "
1171 "Given nbr_points[0] * nbr_points[1] != Expected (%zu*%zu != %zu)",
1172 (size_t)nbr_points[0], (size_t)nbr_points[1], data_size);
1173
1175 x_points, (size_t)(nbr_points[0]), "yac_cdef_points_curve2d");
1177 y_points, (size_t)(nbr_points[1]), "yac_cdef_points_curve2d");
1178
1179 yac_coordinate_pointer coordinates =
1180 xmalloc(data_size * sizeof(*coordinates));
1181 for (int i = 0, k = 0; i < nbr_points[1]; ++i)
1182 for (int j = 0; j < nbr_points[0]; ++j, ++k)
1183 LLtoXYZ(x_points[k], y_points[k], coordinates[k]);
1184
1185 *point_id = user_input_data_add_points(grid, location, coordinates);
1186}
1187
1188/* ---------------------------------------------------------------------- */
1189
1191 int const nbr_points,
1192 int const located,
1193 double const *x_points,
1194 double const *y_points,
1195 int *point_id ) {
1196
1197 enum yac_location location = yac_get_location(located);
1198 struct yac_basic_grid * grid = yac_unique_id_to_pointer(grid_id, "grid_id");
1199
1201 (size_t)nbr_points == yac_basic_grid_get_data_size(grid, location),
1202 "ERROR(yac_cdef_points_unstruct): nbr_points does not match with grid. "
1203 "Given nbr_points != Expected (%zu != %zu)",
1204 (size_t)nbr_points, yac_basic_grid_get_data_size(grid, location));
1205
1206 check_x_vertices(x_points, (size_t)nbr_points, "yac_cdef_points_unstruct");
1207 check_y_vertices(y_points, (size_t)nbr_points, "yac_cdef_points_unstruct");
1208
1209 yac_coordinate_pointer coordinates =
1210 xmalloc((size_t)nbr_points * sizeof(*coordinates));
1211 for (int i = 0; i < nbr_points; ++i)
1212 LLtoXYZ(x_points[i], y_points[i], coordinates[i]);
1213
1214 *point_id = user_input_data_add_points(grid, location, coordinates);
1215}
1216
1217/* ---------------------------------------------------------------------- */
1218
1220 int const *nbr_points,
1221 int const located,
1222 double const *x_points,
1223 double const *y_points,
1224 double x_north_pole,
1225 double y_north_pole,
1226 int *point_id ) {
1227
1228 enum yac_location location = yac_get_location(located);
1229 struct yac_basic_grid * grid = yac_unique_id_to_pointer(grid_id, "grid_id");
1230
1231 YAC_ASSERT(
1233 "ERROR(yac_cdef_points_reg2d_rot): "
1234 "edge-location is not supported, use yac_cdef_points_unstruct instead.");
1235
1236 size_t data_size = yac_basic_grid_get_data_size(grid, location);
1237
1239 ((size_t)nbr_points[0] * (size_t)nbr_points[1]) == data_size,
1240 "ERROR(yac_cdef_points_reg2d_rot): nbr_points does not match with grid. "
1241 "Given nbr_points[0] * nbr_points[1] != Expected (%zu*%zu != %zu)",
1242 (size_t)nbr_points[0], (size_t)nbr_points[1], data_size);
1243
1245 x_points, (size_t)(nbr_points[0]), "yac_cdef_points_reg2d_rot");
1247 y_points, (size_t)(nbr_points[1]), "yac_cdef_points_reg2d_rot");
1248
1249 yac_coordinate_pointer coordinates =
1250 xmalloc(data_size * sizeof(*coordinates));
1251 for (int i = 0, k = 0; i < nbr_points[1]; ++i)
1252 for (int j = 0; j < nbr_points[0]; ++j, ++k)
1253 LLtoXYZ(x_points[j], y_points[i], coordinates[k]);
1254
1255 double north_pole[3];
1256 LLtoXYZ(x_north_pole, y_north_pole, north_pole);
1257 yac_rotate_coordinates(coordinates, num_points, north_pole);
1258
1259 *point_id = user_input_data_add_points(grid, location, coordinates);
1260}
1261
1262/* ---------------------------------------------------------------------- */
1263
1265 struct yac_basic_grid * grid, enum yac_location location,
1266 int const * is_valid, size_t nbr_points, char const * name) {
1267
1268 struct user_input_data_masks * curr_mask = xmalloc(1 * sizeof(*curr_mask));
1269 curr_mask->grid = grid;
1270 curr_mask->location = location;
1271 curr_mask->masks_idx =
1272 yac_basic_grid_add_mask(grid, location, is_valid, nbr_points, name);
1273
1274 masks = xrealloc(masks, (num_masks + 1) * sizeof(*masks));
1275 masks[num_masks] = curr_mask;
1276 num_masks++;
1277
1278 return yac_pointer_to_unique_id(curr_mask);
1279}
1280
1281/* ---------------------------------------------------------------------- */
1282
1284 int const nbr_points,
1285 int const located,
1286 int const * is_valid,
1287 char const * name,
1288 int *mask_id ) {
1289
1290 enum yac_location location = yac_get_location(located);
1291 struct yac_basic_grid * grid = yac_unique_id_to_pointer(grid_id, "grid_id");
1292
1294 (size_t)nbr_points == yac_basic_grid_get_data_size(grid, location),
1295 "ERROR(yac_cdef_mask_named): nbr_points does not match with grid. "
1296 "Given nbr_points != Expected (%zu != %zu)",
1297 (size_t)nbr_points, yac_basic_grid_get_data_size(grid, location));
1298
1299 *mask_id =
1301 grid, location, is_valid, (size_t)nbr_points, name);
1302}
1303
1304void yac_cdef_mask ( int const grid_id,
1305 int const nbr_points,
1306 int const located,
1307 int const * is_valid,
1308 int *mask_id ) {
1309
1310 yac_cdef_mask_named(grid_id, nbr_points, located, is_valid, NULL, mask_id);
1311}
1312
1313void yac_cset_mask ( int const * is_valid, int points_id ) {
1314
1316 yac_unique_id_to_pointer(points_id, "points_id");
1317
1318 YAC_ASSERT(
1319 points->default_mask_id == INT_MAX,
1320 "ERROR(yac_cset_mask): default mask has already been set before")
1321
1322 struct yac_basic_grid * grid = points->grid;
1324 size_t nbr_points = yac_basic_grid_get_data_size(grid, location);
1325
1327 user_input_data_add_mask(grid, location, is_valid, nbr_points, NULL);
1328}
1329
1330/* ---------------------------------------------------------------------- */
1331
1332void yac_cdef_field_mask ( char const * name,
1333 int const comp_id,
1334 int const * point_ids,
1335 int const * mask_ids,
1336 int const num_pointsets,
1337 int collection_size,
1338 const char* timestep,
1339 int time_unit,
1340 int * field_id ) {
1341
1342 YAC_ASSERT(
1343 num_pointsets >= 1,
1344 "ERROR(yac_cdef_field_mask): invalid number of pointsets")
1345
1346 YAC_ASSERT(
1347 point_ids != NULL,"ERROR(yac_cdef_field_mask): no point_ids provided")
1348
1349 struct yac_basic_grid * grid =
1350 ((struct user_input_data_points *)
1351 yac_unique_id_to_pointer(point_ids[0], "point_ids[0]"))->grid;
1352
1353 struct yac_interp_field interp_fields_buf;
1354 struct yac_interp_field * interp_fields =
1355 (num_pointsets == 1)?
1356 &interp_fields_buf:
1357 xmalloc((size_t)num_pointsets * sizeof(*interp_fields));
1358
1359 for (int i = 0; i < num_pointsets; ++i) {
1360
1362 yac_unique_id_to_pointer(point_ids[i], "point_ids[i]");
1363
1364 YAC_ASSERT(
1365 grid == points->grid,
1366 "ERROR(yac_cdef_field_mask): grid of point_ids do not match")
1367
1368 size_t masks_idx;
1369 if (mask_ids[i] != INT_MAX) {
1370
1371 struct user_input_data_masks * mask =
1372 yac_unique_id_to_pointer(mask_ids[i], "mask_ids[i]");
1373
1374 YAC_ASSERT(
1375 mask->grid == points->grid,
1376 "ERROR(yac_cdef_field_mask): "
1377 "grids of mask and points do not match")
1378 YAC_ASSERT(
1379 mask->location == points->location,
1380 "ERROR(yac_cdef_field_mask): "
1381 "location of mask and points do not match")
1382 masks_idx = mask->masks_idx;
1383 } else {
1384 masks_idx = SIZE_MAX;
1385 }
1386
1387 interp_fields[i].location = points->location;
1388 interp_fields[i].coordinates_idx = points->coordinates_idx;
1389 interp_fields[i].masks_idx = masks_idx;
1390 }
1391
1392 struct user_input_data_component * comp_info =
1393 get_user_input_data_component(comp_id, "yac_cdef_field_mask");
1394
1395 *field_id =
1398 comp_info->instance, name, comp_info->name,
1399 grid, interp_fields, num_pointsets, collection_size,
1400 yac_time_to_ISO(timestep, (enum yac_time_unit_type)time_unit)));
1401
1402 if (num_pointsets > 1) free(interp_fields);
1403}
1404
1405void yac_cdef_field ( char const * name,
1406 int const comp_id,
1407 int const * point_ids,
1408 int const num_pointsets,
1409 int collection_size,
1410 const char* timestep,
1411 int time_unit,
1412 int * field_id ) {
1413
1414 YAC_ASSERT(
1415 num_pointsets >= 1,
1416 "ERROR(yac_cdef_field): invalid number of pointsets")
1417
1418 YAC_ASSERT(
1419 point_ids != NULL, "ERROR(yac_cdef_field): no point_ids provided")
1420
1421 int * mask_ids = xmalloc((size_t)num_pointsets * sizeof(*mask_ids));
1422
1423 for (int i = 0; i < num_pointsets; ++i)
1424 mask_ids[i] =
1425 ((struct user_input_data_points *)
1426 yac_unique_id_to_pointer(point_ids[i], "point_ids[i]"))->
1427 default_mask_id;
1428
1430 name, comp_id, point_ids, mask_ids, num_pointsets,
1431 collection_size, timestep, time_unit, field_id);
1432
1433 free(mask_ids);
1434}
1435
1437 int yac_instance_id, const char* comp_name, const char* grid_name,
1438 const char* field_name, double frac_mask_fallback_value) {
1439 struct yac_instance * instance =
1440 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
1441 struct yac_couple_config * couple_config =
1444 couple_config, comp_name, grid_name, field_name,
1445 frac_mask_fallback_value);
1446}
1447
1449 const char* comp_name, const char* grid_name, const char* field_name,
1450 double frac_mask_fallback_value) {
1451 check_default_instance_id("yac_cenable_field_frac_mask");
1453 default_instance_id, comp_name, grid_name, field_name,
1454 frac_mask_fallback_value);
1455}
1456
1458 const char* comp_name, const char* metadata) {
1459 struct yac_instance * instance =
1460 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
1461 struct yac_couple_config * couple_config = yac_instance_get_couple_config(instance);
1462 yac_couple_config_component_set_metadata(couple_config, comp_name, metadata);
1463}
1464
1465void yac_cdef_component_metadata(const char* comp_name, const char* metadata) {
1466 check_default_instance_id("yac_cdef_component_metadata");
1468}
1469
1470void yac_cdef_grid_metadata_instance(int yac_instance_id, const char* grid_name,
1471 const char* metadata) {
1472 struct yac_instance * instance =
1473 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
1474 struct yac_couple_config * couple_config
1476 yac_couple_config_grid_set_metadata(couple_config, grid_name, metadata);
1477}
1478
1479void yac_cdef_grid_metadata(const char* grid_name, const char* metadata) {
1480 check_default_instance_id("yac_cdef_grid_metadata");
1482}
1483
1484void yac_cdef_field_metadata_instance(int yac_instance_id, const char* comp_name,
1485 const char* grid_name, const char* field_name, const char* metadata) {
1486 struct yac_instance * instance =
1487 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
1488 struct yac_couple_config * couple_config
1490 yac_couple_config_field_set_metadata(couple_config, comp_name, grid_name, field_name, metadata);
1491}
1492
1493void yac_cdef_field_metadata(const char* comp_name, const char* grid_name,
1494 const char* field_name, const char* metadata) {
1495 check_default_instance_id("yac_cdef_field_metadata");
1497 field_name, metadata);
1498}
1499
1500const char* yac_cget_component_metadata_instance(int yac_instance_id,
1501 const char* comp_name) {
1502 struct yac_instance * instance =
1503 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
1504 struct yac_couple_config * couple_config = yac_instance_get_couple_config(instance);
1505 return yac_couple_config_component_get_metadata(couple_config, comp_name);
1506}
1507
1508const char* yac_cget_component_metadata(const char* comp_name) {
1509 check_default_instance_id("yac_cget_component_metadata");
1511}
1512
1513const char* yac_cget_grid_metadata_instance(int yac_instance_id,
1514 const char* grid_name) {
1515 struct yac_instance * instance =
1516 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
1517 struct yac_couple_config * couple_config = yac_instance_get_couple_config(instance);
1518 return yac_couple_config_grid_get_metadata(couple_config, grid_name);
1519}
1520
1521const char* yac_cget_grid_metadata(const char* grid_name) {
1522 check_default_instance_id("yac_cget_grid_metadata");
1524}
1525
1526const char* yac_cget_field_metadata_instance(int yac_instance_id,
1527 const char* comp_name, const char* grid_name, const char* field_name) {
1528 struct yac_instance * instance =
1529 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
1530 struct yac_couple_config * couple_config = yac_instance_get_couple_config(instance);
1531 return yac_couple_config_field_get_metadata(couple_config, comp_name, grid_name,
1532 field_name);
1533}
1534
1535const char* yac_cget_field_metadata(const char* comp_name, const char* grid_name,
1536 const char* field_name) {
1537 check_default_instance_id("yac_cget_field_metadata");
1539 grid_name, field_name);
1540}
1541
1543 struct yac_ext_couple_config * ext_couple_config) {
1544 ext_couple_config->weight_file = NULL;
1545 ext_couple_config->weight_file_on_existing =
1547 ext_couple_config->mapping_side = 1;
1548 ext_couple_config->scale_factor = 1.0;
1549 ext_couple_config->scale_summand = 0.0;
1550 ext_couple_config->num_src_mask_names = 0;
1551 ext_couple_config->src_mask_names = NULL;
1552 ext_couple_config->tgt_mask_name = NULL;
1553 ext_couple_config->yaxt_exchanger_name = NULL;
1554 ext_couple_config->collection_selection = NULL;
1555 ext_couple_config->use_raw_exchange = 0;
1556}
1557
1558void yac_cget_ext_couple_config(int * ext_couple_config_id) {
1559
1560 struct yac_ext_couple_config * ext_couple_config =
1561 xmalloc(1 * sizeof(*ext_couple_config));
1562 init_ext_couple_config(ext_couple_config);
1563 *ext_couple_config_id = yac_pointer_to_unique_id(ext_couple_config);
1564}
1565
1567 struct yac_ext_couple_config ext_couple_config) {
1568
1569 free(ext_couple_config.weight_file);
1570 for (size_t i = 0; i < ext_couple_config.num_src_mask_names; ++i)
1571 free(ext_couple_config.src_mask_names[i]);
1572 free(ext_couple_config.src_mask_names);
1573 free(ext_couple_config.tgt_mask_name);
1575 ext_couple_config.collection_selection);
1576 free(ext_couple_config.yaxt_exchanger_name);
1577}
1578
1579void yac_cfree_ext_couple_config(int ext_couple_config_id) {
1580 struct yac_ext_couple_config * ext_couple_config =
1581 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id");
1582 yac_cfree_ext_couple_config_(*ext_couple_config);
1583 free(ext_couple_config);
1584}
1585
1587 struct yac_ext_couple_config * ext_couple_config,
1588 char const * weight_file) {
1589 free(ext_couple_config->weight_file);
1590 ext_couple_config->weight_file =
1591 (weight_file != NULL)?xstrdup(weight_file):NULL;
1592}
1593
1594void yac_cset_ext_couple_config_weight_file(int ext_couple_config_id,
1595 char const * weight_file) {
1597 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id"),
1598 weight_file);
1599}
1600
1601void yac_cget_ext_couple_config_weight_file(int ext_couple_config_id,
1602 char const ** weight_file) {
1603 struct yac_ext_couple_config * ext_couple_config =
1604 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id");
1605 *weight_file = ext_couple_config->weight_file;
1606}
1607
1609 struct yac_ext_couple_config * ext_couple_config,
1615 "ERROR(yac_cset_ext_couple_config_weight_file_on_existing_): "
1616 "\"%d\" is not a valid weight file on existing value "
1617 "(has to be YAC_WGT_ON_EXISTING_ERROR (%d), "
1618 "YAC_WGT_ON_EXISTING_KEEP(%d), or "
1619 "YAC_WGT_ON_EXISTING_OVERWRITE(%d))",
1623}
1624
1626 int ext_couple_config_id, int weight_file_on_existing) {
1628 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id"),
1630}
1631
1633 int ext_couple_config_id, int * weight_file_on_existing) {
1634 struct yac_ext_couple_config * ext_couple_config =
1635 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id");
1637}
1638
1640 struct yac_ext_couple_config * ext_couple_config,
1641 int mapping_side) {
1643 (mapping_side == 0) ||
1644 (mapping_side == 1),
1645 "ERROR(yac_cset_ext_couple_config_mapping_side_): "
1646 "\"%d\" is not a valid mapping side (has to be 0 or 1)",
1647 mapping_side);
1648 ext_couple_config->mapping_side = mapping_side;
1649}
1650
1651void yac_cset_ext_couple_config_mapping_side(int ext_couple_config_id,
1652 int mapping_side) {
1654 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id"),
1655 mapping_side);
1656}
1657
1658void yac_cget_ext_couple_config_mapping_side(int ext_couple_config_id,
1659 int * mapping_side) {
1660 struct yac_ext_couple_config * ext_couple_config =
1661 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id");
1662 *mapping_side = ext_couple_config->mapping_side;
1663}
1664
1666 struct yac_ext_couple_config * ext_couple_config,
1667 double scale_factor) {
1668 YAC_ASSERT_F(isnormal(scale_factor),
1669 "ERROR(yac_cset_ext_couple_config_scale_factor_): "
1670 "\"%lf\" is not a valid scale factor", scale_factor);
1671 ext_couple_config->scale_factor = scale_factor;
1672}
1673
1674void yac_cset_ext_couple_config_scale_factor(int ext_couple_config_id,
1675 double scale_factor) {
1677 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id"),
1678 scale_factor);
1679}
1680
1681void yac_cget_ext_couple_config_scale_factor(int ext_couple_config_id,
1682 double * scale_factor) {
1683 struct yac_ext_couple_config * ext_couple_config =
1684 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id");
1685 *scale_factor = ext_couple_config->scale_factor;
1686}
1687
1689 struct yac_ext_couple_config * ext_couple_config,
1690 double scale_summand) {
1691 YAC_ASSERT_F((scale_summand == 0.0) || isnormal(scale_summand),
1692 "ERROR(yac_cset_ext_couple_config_scale_summand_): "
1693 "\"%lf\" is not a valid scale summand", scale_summand);
1694 ext_couple_config->scale_summand = scale_summand;
1695}
1696
1697void yac_cset_ext_couple_config_scale_summand(int ext_couple_config_id,
1698 double scale_summand) {
1700 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id"),
1702}
1703
1704void yac_cget_ext_couple_config_scale_summand(int ext_couple_config_id,
1705 double * scale_summand) {
1706 struct yac_ext_couple_config * ext_couple_config =
1707 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id");
1708 *scale_summand = ext_couple_config->scale_summand;
1709}
1710
1712 struct yac_ext_couple_config * ext_couple_config,
1713 size_t num_src_mask_names, char const * const * src_mask_names) {
1714 if (ext_couple_config->num_src_mask_names > 0)
1715 for (size_t i = 0; i < ext_couple_config->num_src_mask_names; ++i)
1716 free(ext_couple_config->src_mask_names[i]);
1717 free(ext_couple_config->src_mask_names);
1718 ext_couple_config->num_src_mask_names = num_src_mask_names;
1719 if (num_src_mask_names > 0) {
1720 ext_couple_config->src_mask_names =
1722 for (size_t i = 0; i < num_src_mask_names; ++i)
1723 ext_couple_config->src_mask_names[i] = xstrdup(src_mask_names[i]);
1724 } else ext_couple_config->src_mask_names = NULL;
1725}
1726
1728 int ext_couple_config_id, size_t num_src_mask_names,
1729 char const * const * src_mask_names) {
1731 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id"),
1733}
1734
1736 int ext_couple_config_id, size_t * num_src_mask_names,
1737 char const * const ** src_mask_names) {
1738 struct yac_ext_couple_config * ext_couple_config =
1739 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id");
1740 *num_src_mask_names = ext_couple_config->num_src_mask_names;
1741 *src_mask_names = (char const * const *)ext_couple_config->src_mask_names;
1742}
1743
1745 struct yac_ext_couple_config * ext_couple_config,
1746 char const * tgt_mask_name) {
1747 free(ext_couple_config->tgt_mask_name);
1748 ext_couple_config->tgt_mask_name =
1749 (tgt_mask_name != NULL)?xstrdup(tgt_mask_name):NULL;
1750}
1751
1753 int ext_couple_config_id, char const * tgt_mask_name) {
1755 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id"),
1757}
1758
1760 int ext_couple_config_id, char const ** tgt_mask_name) {
1761 struct yac_ext_couple_config * ext_couple_config =
1762 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id");
1763 *tgt_mask_name = ext_couple_config->tgt_mask_name;
1764}
1765
1767 struct yac_ext_couple_config * ext_couple_config,
1768 char const * yaxt_exchanger_name) {
1769 free(ext_couple_config->yaxt_exchanger_name);
1770 ext_couple_config->yaxt_exchanger_name =
1772}
1773
1775 int ext_couple_config_id, char const * yaxt_exchanger_name) {
1777 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id"),
1779}
1780
1782 int ext_couple_config_id, char const ** yaxt_exchanger_name) {
1783 struct yac_ext_couple_config * ext_couple_config =
1784 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id");
1785 *yaxt_exchanger_name = ext_couple_config->yaxt_exchanger_name;
1786}
1787
1789 struct yac_ext_couple_config * ext_couple_config,
1790 int use_raw_exchange) {
1791 ext_couple_config->use_raw_exchange = use_raw_exchange;
1792}
1793
1795 int ext_couple_config_id, int use_raw_exchange) {
1797 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id"),
1799}
1800
1802 int ext_couple_config_id, int * use_raw_exchange) {
1803 struct yac_ext_couple_config * ext_couple_config =
1804 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id");
1805 *use_raw_exchange = ext_couple_config->use_raw_exchange;
1806}
1807
1809 struct yac_ext_couple_config * ext_couple_config, int collection_size,
1810 int const * collection_indices) {
1812 (collection_size >= 0),
1813 "ERROR(yac_cset_ext_couple_config_collection_selection): "
1814 "collection_size has to be non-negative (%d given)",
1816 if (ext_couple_config->collection_selection != NULL) {
1818 ext_couple_config->collection_selection = NULL;
1819 }
1820 // convert collection_indices from int to size_t
1821 size_t * size_t_collection_indices = NULL;
1822 if (collection_size > 0 && collection_indices != NULL) {
1823 size_t_collection_indices =
1824 xmalloc((size_t)collection_size * sizeof(*size_t_collection_indices));
1825 for (int i = 0; i < collection_size; ++i) {
1827 collection_indices[i] >= 0,
1828 "ERROR(yac_cset_ext_couple_config_collection_selection): "
1829 "collection_indices[%d] has to be non-negative (%d given)",
1830 i, collection_indices[i]);
1831 size_t_collection_indices[i] = (size_t)collection_indices[i];
1832 }
1833 }
1834 ext_couple_config->collection_selection =
1836 (size_t)collection_size, size_t_collection_indices);
1837 free(size_t_collection_indices);
1838}
1839
1841 int ext_couple_config_id, int collection_size,
1842 int const * collection_indices) {
1844 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id"),
1845 collection_size, collection_indices);
1846}
1847
1849 int ext_couple_config_id,
1850 int * collection_size,
1851 int ** collection_indices) {
1852 struct yac_ext_couple_config * ext_couple_config =
1853 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id");
1854 if (ext_couple_config->collection_selection != NULL) {
1857 ext_couple_config->collection_selection);
1858 size_t const * indices =
1860 ext_couple_config->collection_selection);
1861 if ((*collection_size > 0) && (indices != NULL)) {
1862 int * int_indices =
1863 xmalloc((size_t)(*collection_size) * sizeof(*int_indices));
1864 for (int i = 0; i < *collection_size; ++i) {
1866 indices[i] <= (size_t)INT_MAX,
1867 "ERROR(yac_cget_ext_couple_config_collection_selection): "
1868 "collection_indices[%d] value %zu exceeds INT_MAX",
1869 i, indices[i]);
1870 int_indices[i] = (int)indices[i];
1871 }
1872 *collection_indices = int_indices;
1873 } else {
1874 *collection_indices = NULL;
1875 }
1876 } else {
1877 *collection_size = 0;
1878 *collection_indices = NULL;
1879 }
1880}
1881
1883 int yac_instance_id,
1884 char const * src_comp_name, char const * src_grid_name, char const * src_field_name,
1885 char const * tgt_comp_name, char const * tgt_grid_name, char const * tgt_field_name,
1886 char const * coupling_timestep, int time_unit, int time_reduction,
1887 int interp_stack_config_id, int src_lag, int tgt_lag,
1888 struct yac_ext_couple_config * ext_couple_config) {
1889 struct yac_instance * instance =
1890 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
1891 struct yac_interp_stack_config * interp_stack_config =
1893 interp_stack_config_id, "interp_stack_config_id");
1894 char const * coupling_timestep_iso8601 =
1895 yac_time_to_ISO(coupling_timestep, (enum yac_time_unit_type)time_unit);
1896 yac_instance_def_couple(instance,
1897 src_comp_name, src_grid_name, src_field_name,
1898 tgt_comp_name, tgt_grid_name, tgt_field_name,
1899 coupling_timestep_iso8601, time_reduction,
1900 interp_stack_config, src_lag, tgt_lag,
1902 ext_couple_config->mapping_side,
1903 ext_couple_config->scale_factor,
1904 ext_couple_config->scale_summand,
1905 ext_couple_config->num_src_mask_names,
1906 (char const * const *)ext_couple_config->src_mask_names,
1907 ext_couple_config->tgt_mask_name,
1908 ext_couple_config->yaxt_exchanger_name,
1909 ext_couple_config->collection_selection,
1910 ext_couple_config->use_raw_exchange);
1911}
1912
1914 int yac_instance_id,
1915 char const * src_comp_name, char const * src_grid_name, char const * src_field_name,
1916 char const * tgt_comp_name, char const * tgt_grid_name, char const * tgt_field_name,
1917 char const * coupling_timestep, int time_unit, int time_reduction,
1918 int interp_stack_config_id, int src_lag, int tgt_lag,
1919 int ext_couple_config_id) {
1920
1922 yac_instance_id, src_comp_name, src_grid_name, src_field_name,
1923 tgt_comp_name, tgt_grid_name, tgt_field_name, coupling_timestep,
1924 time_unit, time_reduction, interp_stack_config_id, src_lag, tgt_lag,
1925 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id"));
1926}
1927
1929 char const * src_comp_name, char const * src_grid_name, char const * src_field_name,
1930 char const * tgt_comp_name, char const * tgt_grid_name, char const * tgt_field_name,
1931 char const * coupling_timestep, int time_unit, int time_reduction,
1932 int interp_stack_config_id, int src_lag, int tgt_lag,
1933 int ext_couple_config_id) {
1934
1935 check_default_instance_id("yac_cdef_couple_custom");
1937 src_comp_name, src_grid_name, src_field_name,
1938 tgt_comp_name, tgt_grid_name, tgt_field_name, coupling_timestep,
1939 time_unit, time_reduction, interp_stack_config_id, src_lag, tgt_lag,
1940 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id"));
1941}
1942
1944 int yac_instance_id,
1945 char const * src_comp_name, char const * src_grid_name, char const * src_field_name,
1946 char const * tgt_comp_name, char const * tgt_grid_name, char const * tgt_field_name,
1947 char const * coupling_timestep, int time_unit, int time_reduction,
1948 int interp_stack_config_id, int src_lag, int tgt_lag) {
1949
1950 struct yac_ext_couple_config ext_couple_config;
1951 init_ext_couple_config(&ext_couple_config);
1952
1954 yac_instance_id, src_comp_name, src_grid_name, src_field_name,
1955 tgt_comp_name, tgt_grid_name, tgt_field_name, coupling_timestep,
1956 time_unit, time_reduction, interp_stack_config_id, src_lag, tgt_lag,
1957 &ext_couple_config);
1958}
1959
1961 char const * src_comp_name, char const * src_grid_name, char const * src_field_name,
1962 char const * tgt_comp_name, char const * tgt_grid_name, char const * tgt_field_name,
1963 char const * coupling_timestep, int time_unit, int time_reduction,
1964 int interp_stack_config_id, int src_lag, int tgt_lag){
1965
1966 check_default_instance_id("yac_cdef_couple");
1968 src_comp_name, src_grid_name, src_field_name,
1969 tgt_comp_name, tgt_grid_name, tgt_field_name,
1970 coupling_timestep, time_unit, time_reduction, interp_stack_config_id,
1971 src_lag, tgt_lag);
1972}
1973
1975 int yac_instance_id,
1976 char const * src_comp_name, char const * src_grid_name, char const * src_field_name,
1977 char const * tgt_comp_name, char const * tgt_grid_name, char const * tgt_field_name,
1978 char const * coupling_timestep, int time_unit, int time_reduction,
1979 int interp_stack_config_id, int src_lag, int tgt_lag,
1980 char const * weight_file, int weight_file_on_existing, int mapping_side,
1981 double scale_factor, double scale_summand,
1982 int num_src_mask_names, char const * const * src_mask_names,
1983 char const * tgt_mask_name, char const * yaxt_exchanger_name,
1984 int collection_size, int const * collection_indices,
1985 int use_raw_exchange) {
1986
1988 num_src_mask_names >= 0,
1989 "ERROR(yac_cdef_couple_instance_): "
1990 "\"%d\" is not a valid number of source mask names", num_src_mask_names)
1992 collection_size >= 0,
1993 "ERROR(yac_cdef_couple_instance_): "
1994 "\"%d\" is not a valid collection size", collection_size);
1995
1996 struct yac_ext_couple_config ext_couple_config;
1997 init_ext_couple_config(&ext_couple_config);
1999 &ext_couple_config, weight_file);
2001 &ext_couple_config, weight_file_on_existing);
2003 &ext_couple_config, mapping_side);
2005 &ext_couple_config, scale_factor);
2007 &ext_couple_config, scale_summand);
2009 &ext_couple_config, (size_t)num_src_mask_names, src_mask_names);
2011 &ext_couple_config, tgt_mask_name);
2013 &ext_couple_config, yaxt_exchanger_name);
2014 if (collection_size > 0) {
2016 &ext_couple_config, collection_size, collection_indices);
2017 }
2019 &ext_couple_config, use_raw_exchange);
2020
2022 yac_instance_id, src_comp_name, src_grid_name, src_field_name,
2023 tgt_comp_name, tgt_grid_name, tgt_field_name, coupling_timestep,
2024 time_unit, time_reduction, interp_stack_config_id, src_lag, tgt_lag,
2025 &ext_couple_config);
2026
2027 yac_cfree_ext_couple_config_(ext_couple_config);
2028}
2029
2031 char const * src_comp_name, char const * src_grid_name, char const * src_field_name,
2032 char const * tgt_comp_name, char const * tgt_grid_name, char const * tgt_field_name,
2033 char const * coupling_timestep, int time_unit, int time_reduction,
2034 int interp_stack_config_id, int src_lag, int tgt_lag,
2035 char const * weight_file, int weight_file_on_existing, int mapping_side,
2036 double scale_factor, double scale_summand,
2037 int num_src_mask_names, char const * const * src_mask_names,
2038 char const * tgt_mask_name, char const * yaxt_exchanger_name,
2039 int collection_size, int const * collection_indices, int use_raw_exchange) {
2040
2041 check_default_instance_id("yac_cdef_couple_");
2043 src_comp_name, src_grid_name, src_field_name,
2044 tgt_comp_name, tgt_grid_name, tgt_field_name,
2045 coupling_timestep, time_unit, time_reduction, interp_stack_config_id,
2050}
2051
2052/* ---------------------------------------------------------------------- */
2053
2055 int collection_size,
2056 int num_interp_fields,
2057 int const * interp_field_sizes ) {
2058
2059 struct coupling_field * cpl_field =
2061
2065 "ERROR(yac_ccheck_field_dimensions): mismatching collection sizes "
2066 "for component %s grid %s field %s (%d != %d)",
2070 yac_get_coupling_field_name(cpl_field),
2072
2073 if (num_interp_fields != -1) {
2074
2076 (size_t)num_interp_fields ==
2078 "ERROR(yac_ccheck_field_dimensions): mismatching number of interp fields "
2079 "for component %s grid %s field %s (%d != %zu)",
2083 yac_get_coupling_field_name(cpl_field),
2085
2086 if (interp_field_sizes) {
2087 for (int interp_field_idx = 0; interp_field_idx < num_interp_fields;
2088 ++interp_field_idx) {
2089
2091 (size_t)interp_field_sizes[interp_field_idx] ==
2093 cpl_field,
2095 cpl_field, (size_t)interp_field_idx)),
2096 "ERROR(yac_ccheck_field_dimensions): mismatching interp field size "
2097 "for component %s grid %s field %s interp_field_idx %d (%d != %zu)",
2101 yac_get_coupling_field_name(cpl_field),
2102 interp_field_idx,
2103 interp_field_sizes[interp_field_idx],
2105 cpl_field,
2107 cpl_field, (size_t)interp_field_idx)));
2108 }
2109 }
2110 }
2111}
2112
2113/* ---------------------------------------------------------------------- */
2114
2116 int collection_size,
2117 int src_field_buffer_size_ ) {
2118
2119 struct coupling_field * cpl_field =
2121
2125 "ERROR(yac_ccheck_src_field_buffer_size): mismatching collection sizes "
2126 "for component %s grid %s field %s (%d != %d)",
2130 yac_get_coupling_field_name(cpl_field),
2132
2133 size_t num_src_fields;
2134 size_t const * src_field_buffer_sizes;
2135 size_t src_field_buffer_size = 0;
2137 cpl_field, &num_src_fields, &src_field_buffer_sizes);
2138 for (size_t i = 0; i < num_src_fields; ++i)
2139 src_field_buffer_size += src_field_buffer_sizes[i];
2140
2142 (size_t)src_field_buffer_size_ == src_field_buffer_size,
2143 "ERROR(yac_ccheck_src_field_buffer_size): "
2144 "mismatching source buffer size "
2145 "for component %s grid %s field %s (%d != %zu)",
2149 yac_get_coupling_field_name(cpl_field),
2150 src_field_buffer_size_, src_field_buffer_size);
2151}
2152
2154 int num_src_fields_,
2155 int collection_size,
2156 int * src_field_buffer_sizes_ ) {
2157
2158 struct coupling_field * cpl_field =
2160
2164 "ERROR(yac_ccheck_src_field_buffer_sizes): mismatching collection sizes "
2165 "for component %s grid %s field %s (%d != %d)",
2169 yac_get_coupling_field_name(cpl_field),
2171
2172 size_t num_src_fields;
2173 size_t const * src_field_buffer_sizes;
2175 cpl_field, &num_src_fields, &src_field_buffer_sizes);
2176
2178 (size_t)num_src_fields_ == num_src_fields,
2179 "ERROR(yac_ccheck_src_field_buffer_sizes): "
2180 "mismatching number of source fields "
2181 "for component %s grid %s field %s (%d != %zu)",
2185 yac_get_coupling_field_name(cpl_field), num_src_fields_, num_src_fields);
2186
2187 for (size_t i = 0; i < num_src_fields; ++i)
2189 (size_t)src_field_buffer_sizes_[i] == src_field_buffer_sizes[i],
2190 "ERROR(yac_ccheck_src_field_buffer_sizes): "
2191 "mismatching source buffer size "
2192 "for component %s grid %s field %s field_idx %zu (%d != %zu)",
2196 yac_get_coupling_field_name(cpl_field),
2197 i, src_field_buffer_sizes_[i], src_field_buffer_sizes[i]);
2198}
2199
2200/* ---------------------------------------------------------------------- */
2201
2203 double * frac_mask_fallback_value,
2204 double * scaling_factor,
2205 double * scaling_summand,
2206 size_t * num_fixed_values,
2207 double ** fixed_values,
2208 size_t ** num_tgt_per_fixed_value,
2209 size_t ** tgt_idx_fixed,
2210 size_t * num_wgt_tgt,
2211 size_t ** wgt_tgt_idx,
2212 size_t ** num_src_per_tgt,
2213 double ** weights,
2214 size_t ** src_field_idx,
2215 size_t ** src_idx,
2216 size_t * num_src_fields,
2217 size_t ** src_field_buffer_size ) {
2218
2219 struct coupling_field * cpl_field =
2221
2224
2239 *src_field_buffer_size = interp_weights_data.src_field_buffer_size;
2240}
2241
2243 double * frac_mask_fallback_value,
2244 double * scaling_factor,
2245 double * scaling_summand,
2246 size_t * num_fixed_values,
2247 double ** fixed_values,
2248 size_t ** num_tgt_per_fixed_value,
2249 size_t ** tgt_idx_fixed,
2250 size_t ** src_indptr_,
2251 double ** weights,
2252 size_t ** src_field_idx,
2253 size_t ** src_idx,
2254 size_t * num_src_fields,
2255 size_t ** src_field_buffer_sizes ) {
2256
2257 size_t num_wgt_tgt;
2258 size_t * num_src_per_tgt;
2259 size_t * wgt_tgt_idx;
2264 src_field_idx, src_idx, num_src_fields, src_field_buffer_sizes);
2265
2266 struct coupling_field * cpl_field =
2268
2271 "ERROR(yac_cget_raw_interp_weights_data_csr): "
2272 "target field \"%s\" has more than one interpolation field",
2273 yac_get_coupling_field_name(cpl_field));
2274
2275 size_t field_data_size =
2277 cpl_field,
2279
2280 size_t * src_indptr =
2281 xcalloc((field_data_size + 1), sizeof(*src_indptr));
2282 for (size_t i = 0; i < num_wgt_tgt; ++i)
2283 src_indptr[wgt_tgt_idx[i]] = num_src_per_tgt[i];
2284 size_t total_num_weights = 0;
2285 for (size_t i = 0; i < field_data_size; ++i) {
2286 size_t curr_count = src_indptr[i];
2287 src_indptr[i] = total_num_weights;
2288 total_num_weights += curr_count;
2289 }
2290 src_indptr[field_data_size] = total_num_weights;
2291
2292 // check whether weighted target indices are already in sorted order
2293 int tgt_sorted = 1;
2294 for (size_t i = 1; (i < num_wgt_tgt) && tgt_sorted; ++i)
2295 tgt_sorted = wgt_tgt_idx[i] > wgt_tgt_idx[i-1];
2296
2298 tgt_sorted,
2299 "ERROR(yac_cget_raw_interp_weights_data_csr): "
2300 "target indices for field \"%s\" are unsorted, which is unexpected, "
2301 "please contact the author!", yac_get_coupling_field_name(cpl_field));
2302
2303 // The following could should be able to handle the case of unsorted
2304 // target indices. However since I currently not able to write an
2305 // appropriate test, it is commented out.
2306
2307 /*
2308 // sort weight information based on target indices
2309 if (!tgt_sorted) {
2310
2311 double * weights_ = xmalloc(total_num_weights * sizeof(*weights_));
2312 size_t * src_idx_ = xmalloc(total_num_weights * sizeof(*src_idx_));
2313 size_t * src_field_idx_ =
2314 xmalloc(total_num_weights * sizeof(*src_field_idx_));
2315
2316 double * from_weights = *weights;
2317 size_t * from_src_idx = *src_idx;
2318 size_t * from_src_field_idx = *src_field_idx;
2319
2320 for (size_t i = 0; i < num_wgt_tgt; ++i) {
2321
2322 size_t tgt_idx = wgt_tgt_idx[i];
2323 size_t num_src = num_src_per_tgt[i];
2324 size_t offset = src_indptr[tgt_idx];
2325 memcpy(weights_ + offset, from_weights, num_src * sizeof(*weights_));
2326 memcpy(src_idx_ + offset, from_src_idx, num_src * sizeof(*src_idx_));
2327 memcpy(
2328 src_field_idx_ + offset, from_src_field_idx,
2329 num_src * sizeof(*src_field_idx_));
2330 from_weights += num_src;
2331 from_src_idx += num_src;
2332 from_src_field_idx += num_src;
2333 }
2334 free(*weights);
2335 free(*src_idx);
2336 free(*src_field_idx);
2337 *weights = weights_;
2338 *src_idx = src_idx_;
2339 *src_field_idx = src_field_idx_;
2340 }
2341 */
2342
2343 free(num_src_per_tgt);
2344 free(wgt_tgt_idx);
2345
2346 *src_indptr_ = src_indptr;
2347}
2348
2350 int const field_id,
2351 double * frac_mask_fallback_value,
2352 double * scaling_factor,
2353 double * scaling_summand,
2354 size_t * num_fixed_values,
2355 double ** fixed_values,
2356 size_t ** num_tgt_per_fixed_value,
2357 size_t ** tgt_idx_fixed,
2358 size_t ** src_indptr,
2359 double ** weights,
2360 size_t ** src_field_idx,
2361 size_t ** src_idx,
2362 size_t * num_src_fields,
2363 size_t ** src_field_buffer_sizes,
2364 size_t * tgt_field_data_size) {
2365
2366 struct coupling_field * cpl_field =
2368
2371 "ERROR(yac_cget_raw_interp_weights_data_csr_c2f): "
2372 "target field \"%s\" has more than one interpolation field",
2373 yac_get_coupling_field_name(cpl_field));
2374
2375 *tgt_field_data_size =
2377 cpl_field,
2379
2381 field_id, frac_mask_fallback_value, scaling_factor, scaling_summand,
2382 num_fixed_values, fixed_values, num_tgt_per_fixed_value, tgt_idx_fixed,
2383 src_indptr, weights, src_field_idx, src_idx, num_src_fields,
2384 src_field_buffer_sizes);
2385}
2386
2387/* ---------------------------------------------------------------------- */
2388
2389void yac_cget_action(int field_id, int * action) {
2390
2391 struct coupling_field * cpl_field =
2395
2396 YAC_ASSERT(
2397 (exchange_type == NOTHING) ||
2398 (exchange_type == SOURCE) ||
2399 (exchange_type == TARGET),
2400 "ERROR(yac_cget_action): invalid field exchange type")
2401
2402 switch(exchange_type) {
2403 default:
2404 case(NOTHING): {
2405
2406 *action = YAC_ACTION_NONE;
2407 break;
2408 }
2409 case(TARGET): {
2410
2411 const enum yac_action_type event_action =
2413 *action = (int)((event_action == RESTART)?GET_FOR_RESTART:event_action);
2414 break;
2415 }
2416 case(SOURCE): {
2417
2418 enum yac_action_type event_action = NONE;
2419 unsigned num_puts = yac_get_coupling_field_num_puts(cpl_field);
2420 for (unsigned put_idx = 0; put_idx < num_puts; ++put_idx)
2421 event_action =
2422 MAX(
2423 event_action,
2425 yac_get_coupling_field_put_op_event(cpl_field, put_idx)));
2426 *action = (int)((event_action == RESTART)?PUT_FOR_RESTART:event_action);
2427 break;
2428 }
2429 }
2430}
2431
2433 struct coupling_field * cpl_field =
2435 return yac_coupling_field_get_datetime(cpl_field);
2436}
2437
2438/* ---------------------------------------------------------------------- */
2439
2440static inline void yac_cupdate_(
2441 struct coupling_field * cpl_field, struct event * event, int is_source) {
2442
2443 const enum yac_action_type action = yac_event_check(event);
2444
2446 (action == NONE) || (action == OUT_OF_BOUND),
2447 "ERROR(yac_cupdate): current action of %s field \"%s\" of "
2448 "componente \"%s\" is not YAC_ACTION_NONE or YAC_ACTION_OUT_OF_BOUND",
2449 ((is_source)?"source":"target"), yac_get_coupling_field_name(cpl_field),
2452
2453 if ( action == OUT_OF_BOUND ) {
2454 fputs("WARNING: YAC update action is beyond end of run date!\n", stderr);
2455 fputs("WARNING: YAC update action is beyond end of run date!\n", stdout);
2456 }
2457}
2458
2460
2461 struct coupling_field * cpl_field =
2465
2466 YAC_ASSERT(
2467 (exchange_type == NOTHING) ||
2468 (exchange_type == SOURCE) ||
2469 (exchange_type == TARGET),
2470 "ERROR(yac_cupdate): invalid field exchange type")
2471
2472 switch(exchange_type) {
2473 default:
2474 case(NOTHING): {
2475 break;
2476 }
2477 case(TARGET): {
2478
2480 cpl_field, yac_get_coupling_field_get_op_event(cpl_field), 0);
2481 break;
2482 }
2483 case(SOURCE): {
2484
2485 unsigned num_puts = yac_get_coupling_field_num_puts(cpl_field);
2486 for (unsigned put_idx = 0; put_idx < num_puts; ++put_idx)
2488 cpl_field,
2489 yac_get_coupling_field_put_op_event(cpl_field, put_idx), 1);
2490 break;
2491 }
2492 }
2493}
2494
2495/* ---------------------------------------------------------------------- */
2496
2498 int const field_id,
2499 int const collection_size,
2500 double *recv_field) { // recv_field[collection_size][Points]
2501
2502 struct coupling_field * cpl_field =
2504
2505 YAC_ASSERT(
2507 "ERROR(get_recv_field_pointers): invalid number of interpolation fields "
2508 "(should be one)")
2509
2510 enum yac_location location =
2512 size_t data_size =
2514
2515 double ** recv_field_ = xmalloc(collection_size * sizeof(*recv_field_));
2516
2517 for (int i = 0; i < collection_size; ++i) {
2518 recv_field_[i] = recv_field;
2519 recv_field += data_size;
2520 }
2521
2522 return recv_field_;
2523}
2524
2526 int field_id, size_t collection_size, double *src_field_buffer) {
2527 // src_field_buffer
2528 // [collection_size *
2529 // SUM(src_field_buffer_sizes[0:num_src_fields-1])]
2530
2531 struct coupling_field * cpl_field =
2533
2534 size_t num_src_fields;
2535 size_t const * src_field_buffer_sizes;
2537 cpl_field, &num_src_fields, &src_field_buffer_sizes);
2538
2539 double *** src_field_buffer_ =
2540 xmalloc(collection_size * sizeof(*src_field_buffer_));
2541 double ** src_field_buffer__ =
2542 xmalloc(collection_size * num_src_fields * sizeof(*src_field_buffer__));
2543
2544 for (size_t i = 0; i < collection_size; ++i) {
2545 src_field_buffer_[i] =
2546 src_field_buffer__ + i * num_src_fields;
2547 for (size_t j = 0; j < num_src_fields; ++j) {
2548 src_field_buffer_[i][j] = src_field_buffer;
2549 src_field_buffer += src_field_buffer_sizes[j];
2550 }
2551 }
2552
2553 return src_field_buffer_;
2554}
2555
2557 int field_id,
2558 size_t collection_size,
2559 double **src_field_buffer) { // src_field_buffer
2560 // [collection_size*num_src_points]
2561 // [src_field_buffer_sizes[src_field_idx]]
2562
2563 struct coupling_field * cpl_field =
2565
2566 size_t num_src_fields;
2567 size_t const * src_field_buffer_sizes;
2569 cpl_field, &num_src_fields, &src_field_buffer_sizes);
2570
2571 double *** src_field_buffer_ =
2572 xmalloc(collection_size * sizeof(*src_field_buffer_));
2573 double ** src_field_buffer__ =
2574 xmalloc(collection_size * num_src_fields * sizeof(*src_field_buffer__));
2575
2576 for (size_t i = 0, k = 0; i < collection_size; ++i) {
2577 src_field_buffer_[i] =
2578 src_field_buffer__ + i * num_src_fields;
2579 for (size_t j = 0; j < num_src_fields; ++j, ++k)
2580 src_field_buffer_[i][j] = src_field_buffer[k];
2581 }
2582
2583 return src_field_buffer_;
2584}
2585
2587 int const field_id, int collection_size, int *info, int *ierr) {
2588
2589 *info = (int)NONE;
2590 *ierr = 0;
2591
2592 struct coupling_field * cpl_field =
2594
2597
2600 "ERROR(yac_cget_pre_processing): get was called for field \"%s\" which "
2601 "is configured as source", yac_get_coupling_field_name(cpl_field));
2602
2603 if (exchange_type != TARGET) return NULL;
2604
2605 /* --------------------------------------------------------------------
2606 Check for restart and coupling events
2607 -------------------------------------------------------------------- */
2608
2609 struct event * event = yac_get_coupling_field_get_op_event(cpl_field);
2611 *info = (int)((action == RESTART)?GET_FOR_RESTART:action);
2612
2613 /* --------------------------------------------------------------------
2614 add one model time step (as provided in coupling configuration) to
2615 the current event date
2616 -------------------------------------------------------------------- */
2617
2619
2620 /* ------------------------------------------------------------------
2621 return in case we are already beyond the end of the run
2622 ------------------------------------------------------------------ */
2623
2624 if ( action == OUT_OF_BOUND ) {
2625
2626 fputs("WARNING: YAC get action is beyond end of run date!\n", stderr);
2627 fputs("WARNING: YAC get action is beyond end of run date!\n", stdout);
2628
2629 return NULL;
2630 }
2631
2632 /* --------------------------------------------------------------------
2633 start actions
2634 -------------------------------------------------------------------- */
2635
2636 if ( action == NONE ) return NULL;
2637
2638 YAC_ASSERT(
2639 (size_t)collection_size ==
2641 "ERROR: collection size does not match with coupling configuration.")
2642
2643 return
2647}
2648
2649// basic internal routine for get operation
2650static void yac_get ( int const field_id,
2651 int collection_size,
2652 double ** recv_field,
2653 int is_async,
2654 int *info,
2655 int *ierr ) {
2656
2658
2659 struct yac_interpolation * interpolation =
2661
2662 if ((*ierr == 0) && (interpolation != NULL)) {
2663 if (is_async)
2664 yac_interpolation_execute_get_async(interpolation, recv_field);
2665 else
2666 yac_interpolation_execute_get(interpolation, recv_field);
2667 }
2668}
2669
2670// basic internal routine for get operation with raw data exchange
2672 int const collection_size,
2673 double ***src_field_buffer,
2674 double ***src_frac_mask_buffer,
2675 int is_async,
2676 int *info,
2677 int *ierror ) {
2678
2679
2681
2682 struct coupling_field * cpl_field =
2684 enum yac_field_exchange_type field_role =
2686 if (field_role == NOTHING) return;
2687
2689 field_role != SOURCE,
2690 "ERROR(yac_cget_raw_frac): field \"%s\" is source",
2691 yac_get_coupling_field_name(cpl_field));
2692
2693 struct yac_interpolation_exchange * interpolation_exchange =
2695
2697 size_t num_src_fields;
2699 cpl_field, &num_src_fields, NULL);
2700
2702 with_frac_mask == (src_frac_mask_buffer != NULL),
2703 "ERROR(yac_get_raw_frac): target field \"%s\" was configured %s "
2704 "support for fractional masking, but %s source fractional mask buffer "
2705 "was provided to this call",
2706 yac_get_coupling_field_name(cpl_field), with_frac_mask?"with":"without",
2707 with_frac_mask?"no":"a")
2708
2709 double ** src_field_buffer_ =
2710 xmalloc(
2711 (size_t)(1 + with_frac_mask) * (size_t)collection_size * num_src_fields *
2712 sizeof(*src_field_buffer_));
2713
2714 size_t k = 0;
2715 for (int i = 0; i < collection_size; ++i)
2716 for (size_t j = 0; j < num_src_fields; ++j, ++k)
2717 src_field_buffer_[k] = src_field_buffer[i][j];
2718 if (with_frac_mask)
2719 for (int i = 0; i < collection_size; ++i)
2720 for (size_t j = 0; j < num_src_fields; ++j, ++k)
2721 src_field_buffer_[k] = src_frac_mask_buffer[i][j];
2722
2723 if ((*ierror == 0) && (interpolation_exchange != NULL)) {
2724 if (is_async)
2726 interpolation_exchange, src_field_buffer_, "yac_get_raw_frac");
2727 else
2729 interpolation_exchange, src_field_buffer_, "yac_get_raw_frac");
2730 }
2731 free(src_field_buffer_);
2732}
2733
2734/* --------------- user interface routines for get operation --------------- */
2735
2736void yac_get_ ( int const field_id,
2737 int const collection_size,
2738 double *recv_field,
2739 int is_async,
2740 int *info,
2741 int *ierr ) {
2742
2744
2745 /* Needed to transfer from Fortran data structure to C */
2746 double ** recv_field_ =
2748
2749 yac_get(field_id, collection_size, recv_field_, is_async, info, ierr);
2750
2751 free(recv_field_);
2752}
2753
2754void yac_cget_ ( int const field_id,
2755 int const collection_size,
2756 double *recv_field, // recv_field[collection_size*Points]
2757 int *info,
2758 int *ierr ) {
2759
2760 yac_get_(field_id, collection_size, recv_field, 0, info, ierr);
2761}
2762
2763void yac_cget_async_ ( int const field_id,
2764 int const collection_size,
2765 double *recv_field, // recv_field[collection_size*Points]
2766 int *info,
2767 int *ierr ) {
2768
2769 yac_get_(field_id, collection_size, recv_field, 1, info, ierr);
2770}
2771
2772void yac_cget ( int const field_id,
2773 int collection_size,
2774 double ** recv_field, // recv_field[collection_size][Points]
2775 int *info,
2776 int *ierr ) {
2777
2778 yac_get(field_id, collection_size, recv_field, 0, info, ierr);
2779}
2780
2781void yac_cget_async ( int const field_id,
2782 int collection_size,
2783 double ** recv_field, // recv_field[collection_size][Points]
2784 int *info,
2785 int *ierr ) {
2786
2787
2788 yac_get(field_id, collection_size, recv_field, 1, info, ierr);
2789}
2790
2791/* ------- user interface routines for get operation with raw exchange ----- */
2792
2794 int const collection_size,
2795 double *src_field_buffer, // src_field_buffer
2796 // [collection_size *
2797 // SUM(src_field_buffer_sizes[0:num_src_fields-1])]
2798 double *src_frac_mask_buffer, // src_frac_mask_buffer
2799 // [collection_size *
2800 // SUM(src_field_buffer_sizes[0:num_src_fields-1])]
2801 int is_async,
2802 int *info,
2803 int *ierr ) {
2804
2806
2807 /* Needed to transfer from Fortran data structure to C */
2808 double *** src_field_buffer_ =
2810 field_id, collection_size, src_field_buffer);
2811 double *** src_frac_mask_buffer_ =
2812 src_frac_mask_buffer?
2814 field_id, collection_size, src_frac_mask_buffer):NULL;
2815
2817 field_id, collection_size, src_field_buffer_, src_frac_mask_buffer_,
2818 is_async, info, ierr);
2819
2820 if (src_frac_mask_buffer) {
2821 free(src_frac_mask_buffer_[0]);
2822 free(src_frac_mask_buffer_);
2823 }
2824 free(src_field_buffer_[0]);
2825 free(src_field_buffer_);
2826}
2827
2828static void yac_get_raw_frac_ptr_ ( int const field_id,
2829 int const collection_size,
2830 double **src_field_buffer, // src_field_buffer
2831 // [collection_size*num_src_fields]
2832 // [src_field_buffer_size[src_field_idx]]
2833 double **src_frac_mask_buffer, // src_frac_mask_buffer
2834 // [collection_size*num_src_fields]
2835 // [src_field_buffer_size[src_field_idx]]
2836 int is_async,
2837 int *info,
2838 int *ierr ) {
2839
2841
2842 /* Needed to transfer from Fortran data structure to C */
2843 double *** src_field_buffer_ =
2845 field_id, (size_t)collection_size, src_field_buffer);
2846 double *** src_frac_mask_buffer_ =
2847 src_frac_mask_buffer?
2849 field_id, (size_t)collection_size, src_frac_mask_buffer):NULL;
2850
2852 field_id, collection_size, src_field_buffer_, src_frac_mask_buffer_,
2853 is_async, info, ierr);
2854
2855 if (src_frac_mask_buffer) {
2856 free(src_frac_mask_buffer_[0]);
2857 free(src_frac_mask_buffer_);
2858 }
2859 free(src_field_buffer_[0]);
2860 free(src_field_buffer_);
2861}
2862
2863void yac_cget_raw_ ( int const field_id,
2864 int const collection_size,
2865 double *src_field_buffer, // src_field_buffer
2866 // [collection_size *
2867 // SUM(src_field_buffer_size[src_field_idx]]
2868 int *info,
2869 int *ierr ) {
2870
2872 field_id, collection_size, src_field_buffer, NULL, 0, info, ierr);
2873}
2874
2876 int const collection_size,
2877 double *src_field_buffer, // src_field_buffer
2878 // [collection_size *
2879 // SUM(src_field_buffer_size[src_field_idx]]
2880 double *src_frac_mask_buffer, // src_frac_mask_buffer
2881 // [collection_size *
2882 // SUM(src_field_buffer_size[src_field_idx]]
2883 int *info,
2884 int *ierr ) {
2885
2887 field_id, collection_size, src_field_buffer, src_frac_mask_buffer,
2888 0, info, ierr);
2889}
2890
2892 int const collection_size,
2893 double **src_field_buffer, // src_field_buffer
2894 // [collection_size*num_src_fields]
2895 // [src_field_buffer_size[src_field_idx]]
2896 int *info,
2897 int *ierr ) {
2898
2900 field_id, collection_size, src_field_buffer, NULL, 0, info, ierr);
2901}
2902
2904 int const collection_size,
2905 double **src_field_buffer, // src_field_buffer
2906 // [collection_size*num_src_fields]
2907 // [src_field_buffer_size[src_field_idx]]
2908 double **src_frac_mask_buffer, // src_frac_mask_buffer
2909 // [collection_size]
2910 // [num_src_fields]
2911 // [src_field_buffer_size[src_field_idx]]
2912 int *info,
2913 int *ierr ) {
2914
2916 field_id, collection_size, src_field_buffer, src_frac_mask_buffer,
2917 0, info, ierr);
2918}
2919
2921 int const collection_size,
2922 double *src_field_buffer, // src_field_buffer
2923 // [collection_size *
2924 // SUM(src_field_buffer_sizes[0:num_src_fields-1])]
2925 int *info,
2926 int *ierr ) {
2927
2929 field_id, collection_size, src_field_buffer, NULL, 1, info, ierr);
2930}
2931
2933 int const collection_size,
2934 double *src_field_buffer, // src_field_buffer
2935 // [collection_size *
2936 // SUM(src_field_buffer_sizes[0:num_src_fields-1])]
2937 double *src_frac_mask_buffer, // src_frac_mask_buffer
2938 // [collection_size *
2939 // SUM(src_field_buffer_sizes[0:num_src_fields-1])]
2940 int *info,
2941 int *ierr ) {
2942
2944 field_id, collection_size, src_field_buffer, src_frac_mask_buffer,
2945 1, info, ierr);
2946}
2947
2949 int const collection_size,
2950 double **src_field_buffer, // src_field_buffer
2951 // [collection_size*num_src_fields]
2952 // [src_field_buffer_size[src_field_idx]]
2953 int *info,
2954 int *ierr ) {
2955
2957 field_id, collection_size, src_field_buffer, NULL, 1, info, ierr);
2958}
2959
2961 int const collection_size,
2962 double **src_field_buffer, // src_field_buffer
2963 // [collection_size*num_src_fields]
2964 // [src_field_buffer_size[src_field_idx]]
2965 double **src_frac_mask_buffer, // src_frac_mask_buffer
2966 // [collection_size*num_src_fields]
2967 // [src_field_buffer_size[src_field_idx]]
2968 int *info,
2969 int *ierr ) {
2970
2972 field_id, collection_size, src_field_buffer, src_frac_mask_buffer,
2973 1, info, ierr);
2974}
2975
2976void yac_cget_raw ( int const field_id,
2977 int collection_size,
2978 double ***src_field_buffer, // src_field_buffer
2979 // [collection_size]
2980 // [num_src_fields]
2981 // [src_field_buffer_size[src_field_idx]]
2982 int *info,
2983 int *ierr ) {
2984
2986 field_id, collection_size, src_field_buffer, NULL, 0, info, ierr);
2987}
2988
2990 int collection_size,
2991 double ***src_field_buffer, // src_field_buffer
2992 // [collection_size]
2993 // [num_src_fields]
2994 // [src_field_buffer_size[src_field_idx]]
2995 int *info,
2996 int *ierr ) {
2997
2998
3000 field_id, collection_size, src_field_buffer, NULL, 1, info, ierr);
3001}
3002
3004 int collection_size,
3005 double ***src_field_buffer, // src_field_buffer
3006 // [collection_size]
3007 // [num_src_fields]
3008 // [src_field_buffer_size[src_field_idx]]
3009 double ***src_frac_mask_buffer, // src_frac_mask_buffer
3010 // [collection_size]
3011 // [num_src_fields]
3012 // [src_field_buffer_size[src_field_idx]]
3013 int *info,
3014 int *ierr ) {
3015
3017 field_id, collection_size, src_field_buffer, src_frac_mask_buffer,
3018 0, info, ierr);
3019}
3020
3022 int collection_size,
3023 double ***src_field_buffer, // src_field_buffer
3024 // [collection_size]
3025 // [num_src_fields]
3026 // [src_field_buffer_size[src_field_idx]]
3027 double ***src_frac_mask_buffer, // src_frac_mask_buffer
3028 // [collection_size]
3029 // [num_src_fields]
3030 // [src_field_buffer_size[src_field_idx]]
3031 int *info,
3032 int *ierr ) {
3033
3035 field_id, collection_size, src_field_buffer, src_frac_mask_buffer,
3036 1, info, ierr);
3037}
3038
3039/* ---------------------------------------------------------------------- */
3040
3041static double *** get_send_field_pointers(
3042 int field_id, size_t collection_size, double * send_field) {
3043 // send_field[collection_size][nPointSets][Points]
3044
3045 struct coupling_field * cpl_field =
3047
3048 size_t num_interp_fields =
3050
3051 size_t * data_sizes = xmalloc(num_interp_fields * sizeof(*data_sizes));
3052
3053 for (size_t i = 0; i < num_interp_fields; i++) {
3054
3055 enum yac_location location =
3057 data_sizes[i] = yac_coupling_field_get_data_size(cpl_field, location);
3058 }
3059
3060 double ***send_field_ =
3061 xmalloc(collection_size * sizeof(*send_field_));
3062 double **send_field__ =
3063 xmalloc(collection_size * num_interp_fields * sizeof(*send_field__));
3064
3065 for (size_t i = 0; i < collection_size; ++i) {
3066 send_field_[i] = send_field__ + i * num_interp_fields;
3067 for (size_t j = 0; j < num_interp_fields; ++j) {
3068 send_field_[i][j] = send_field;
3069 send_field += data_sizes[j];
3070 }
3071 }
3072 free(data_sizes);
3073 return send_field_;
3074}
3075
3076void yac_cput_ ( int const field_id,
3077 int const collection_size,
3078 double *send_field, // send_field[collection_size *
3079 // nPointSets *
3080 // Points]
3081 int *info,
3082 int *ierr ) {
3083
3085
3086 /* Needed to transfer from Fortran data structure to C */
3087 double *** send_field_ =
3089
3090 yac_cput ( field_id, collection_size, send_field_, info, ierr );
3091
3092 free(send_field_[0]);
3093 free(send_field_);
3094}
3095
3096void yac_cput_frac_ ( int const field_id,
3097 int const collection_size,
3098 double *send_field, // send_field[collection_size *
3099 // nPointSets *
3100 // Points]
3101 double *send_frac_mask, // send_frac_mask[collection_size *
3102 // nPointSets *
3103 // Points]
3104 int *info,
3105 int *ierr ) {
3106
3108
3109 /* Needed to transfer from Fortran data structure to C */
3110 double *** send_field_ =
3112 double *** send_frac_mask_ =
3114
3116 field_id, collection_size, send_field_, send_frac_mask_, info, ierr);
3117
3118 free(send_field_[0]);
3119 free(send_field_);
3120 free(send_frac_mask_[0]);
3121 free(send_frac_mask_);
3122}
3123
3124/* ---------------------------------------------------------------------- */
3125
3127 int const field_id,
3128 int const collection_size,
3129 double **send_field, // send_field[collection_size*nPointSets][Points]
3130 double **send_frac_mask,
3131 double ****send_field_,
3132 double ****send_frac_mask_) {
3133
3134 struct coupling_field * cpl_field =
3136
3137 size_t num_interp_fields =
3139
3140 size_t * data_sizes = xmalloc(num_interp_fields * sizeof(*data_sizes));
3141
3142 for (size_t i = 0; i < num_interp_fields; i++) {
3143
3144 enum yac_location location =
3146 data_sizes[i] = yac_coupling_field_get_data_size(cpl_field, location);
3147 }
3148
3149 *send_field_ = xmalloc(collection_size * sizeof(**send_field_));
3150 for (int i = 0, k = 0; i < collection_size; ++i) {
3151
3152 (*send_field_)[i] = xmalloc(num_interp_fields * sizeof(***send_field_));
3153 for (size_t j = 0; j < num_interp_fields; ++j, ++k)
3154 (*send_field_)[i][j] = send_field[k];
3155 }
3156 if (send_frac_mask != NULL) {
3157 *send_frac_mask_ = xmalloc(collection_size * sizeof(**send_frac_mask_));
3158 for (int i = 0, k = 0; i < collection_size; ++i) {
3159
3160 (*send_frac_mask_)[i] =
3161 xmalloc(num_interp_fields * sizeof(***send_frac_mask_));
3162 for (size_t j = 0; j < num_interp_fields; ++j, ++k)
3163 (*send_frac_mask_)[i][j] = send_frac_mask[k];
3164 }
3165 }
3166
3167 free(data_sizes);
3168}
3169
3170void yac_cput_ptr_ ( int const field_id,
3171 int const collection_size,
3172 double ** send_field, // send_field
3173 // [collection_size * nPointSets]
3174 // [Points]
3175 int *info,
3176 int *ierr ) {
3177
3179
3180 /* Needed to transfer from Fortran data structure to C */
3181 double *** send_field_;
3183 field_id, collection_size, send_field, NULL, &send_field_, NULL);
3184
3185 yac_cput ( field_id, collection_size, send_field_, info, ierr );
3186
3187 for (int i = 0; i < collection_size; ++i) free(send_field_[i]);
3188 free(send_field_);
3189}
3190
3192 int const collection_size,
3193 double ** send_field, // send_field
3194 // [collection_size * nPointSets]
3195 // [Points]
3196 double ** send_frac_mask, // send_frac_mask
3197 // [collection_size * nPointSets]
3198 // [Points]
3199 int *info,
3200 int *ierr ) {
3201
3203
3204 /* Needed to transfer from Fortran data structure to C */
3205 double *** send_field_;
3206 double *** send_frac_mask_;
3208 field_id, collection_size, send_field, send_frac_mask,
3209 &send_field_, &send_frac_mask_);
3210
3212 field_id, collection_size, send_field_, send_frac_mask_, info, ierr);
3213
3214 for (int i = 0; i < collection_size; ++i) {
3215 free(send_field_[i]);
3216 free(send_frac_mask_[i]);
3217 }
3218 free(send_field_);
3219 free(send_frac_mask_);
3220}
3221
3222/* ---------------------------------------------------------------------- */
3223
3224void yac_ctest(int field_id, int * flag) {
3225
3226 struct coupling_field * cpl_field =
3228
3229 *flag = 1;
3230 if (yac_get_coupling_field_exchange_type(cpl_field) == SOURCE) {
3231 for (
3232 unsigned put_idx = 0;
3233 (put_idx < yac_get_coupling_field_num_puts(cpl_field)) && *flag;
3234 ++put_idx)
3235 *flag &=
3238 }
3239
3240 if (*flag && yac_get_coupling_field_exchange_type(cpl_field) == TARGET)
3241 *flag =
3244}
3245
3246/* ---------------------------------------------------------------------- */
3247
3249
3250 struct coupling_field * cpl_field =
3252
3253 if (yac_get_coupling_field_exchange_type(cpl_field) == SOURCE) {
3254 for (
3255 unsigned put_idx = 0;
3256 (put_idx < yac_get_coupling_field_num_puts(cpl_field)); ++put_idx) {
3257 if (yac_get_coupling_field_put_op_use_raw_exchange(cpl_field, put_idx))
3260 cpl_field, put_idx), "yac_cwait");
3261 else
3264 }
3265 }
3266
3267 if (yac_get_coupling_field_exchange_type(cpl_field) == TARGET) {
3271 "yac_cwait");
3272 else
3275 }
3276}
3277
3278/* ---------------------------------------------------------------------- */
3279
3281
3282 struct coupling_field * cpl_field =
3284
3285 return (void*)yac_get_coupling_field_put_mask(cpl_field);
3286}
3287
3289
3290 struct coupling_field * cpl_field =
3292
3293 return (void*)yac_get_coupling_field_get_mask(cpl_field);
3294}
3295
3296/* ---------------------------------------------------------------------- */
3297
3299 struct coupling_field * cpl_field, unsigned put_idx,
3300 int const collection_size, double *** send_field,
3301 double **** send_field_acc_, double *** send_frac_mask,
3302 double **** send_frac_mask_acc_, int * with_frac_mask_,
3303 int * use_raw_exchange_, int *info, int *ierr) {
3304
3305 *ierr = 0;
3306 void * interpolation =
3309 cpl_field, put_idx):
3311 cpl_field, put_idx);
3312
3313 int use_raw_exchange =
3315 int with_frac_mask =
3319
3320 *with_frac_mask_ = with_frac_mask;
3321 *use_raw_exchange_ = use_raw_exchange;
3322
3323 /* ------------------------------------------------------------------
3324 Check for restart and coupling events
3325 ------------------------------------------------------------------ */
3326
3327 struct event * event =
3328 yac_get_coupling_field_put_op_event(cpl_field, put_idx);
3330 *info = (int)((action == RESTART)?PUT_FOR_RESTART:action);
3331
3332 /* ------------------------------------------------------------------
3333 add one model time step (as provided in coupling configuration) to
3334 the current event date
3335 ------------------------------------------------------------------ */
3336
3338
3339 /* ------------------------------------------------------------------
3340 return in case we are already beyond the end of the run
3341 ------------------------------------------------------------------ */
3342
3343 if (action == OUT_OF_BOUND) {
3344
3345 fputs("WARNING: YAC put action is beyond end of run date!\n", stderr);
3346 fputs("WARNING: YAC put action is beyond end of run date!\n", stdout);
3347
3348 *send_field_acc_ = NULL;
3349 *send_frac_mask_acc_ = NULL;
3350 return NULL;
3351 }
3352
3353 /* ------------------------------------------------------------------
3354 start actions
3355 ------------------------------------------------------------------ */
3356
3357 if ( action == NONE ) return NULL;
3358
3359 /* ------------------------------------------------------------------
3360 If it is time for restart, set appropriate flags and continue
3361 ------------------------------------------------------------------ */
3362
3363 /* ------------------------------------------------------------------
3364 First deal with instant sends
3365 ------------------------------------------------------------------ */
3366
3367 int ** put_mask = yac_get_coupling_field_put_mask(cpl_field);
3368 size_t num_interp_fields =
3370
3372 if ( time_operation == TIME_NONE ) {
3373
3374 *info = MAX((int)COUPLING, *info);
3375
3376 if (with_frac_mask) {
3377
3378 // apply fractional mask to send field
3379 double *** send_field_acc =
3381 *send_field_acc_ = send_field_acc;
3382 *send_frac_mask_acc_ = send_frac_mask;
3383
3384 for (int h = 0; h < collection_size; h++) {
3385 for (size_t i = 0; i < num_interp_fields; i++) {
3386 size_t data_size =
3388 cpl_field,
3390 if (put_mask) {
3391 for (size_t j = 0; j < data_size; ++j) {
3392 if (put_mask[i][j]) {
3393 double frac_mask = send_frac_mask[h][i][j];
3394 send_field_acc[h][i][j] =
3395 (frac_mask != 0.0)?(send_field[h][i][j] * frac_mask):0.0;
3396 }
3397 }
3398 } else {
3399 for (size_t j = 0; j < data_size; ++j) {
3400 double frac_mask = send_frac_mask[h][i][j];
3401 send_field_acc[h][i][j] =
3402 (frac_mask != 0.0)?(send_field[h][i][j] * frac_mask):0.0;
3403 }
3404 }
3405 }
3406 }
3407 } else {
3408 *send_field_acc_ = send_field;
3409 *send_frac_mask_acc_ = send_frac_mask;
3410 }
3411 return interpolation;
3412 }
3413
3414 /* ------------------------------------------------------------------
3415 Accumulation & Averaging
3416 ------------------------------------------------------------------ */
3417
3418 YAC_ASSERT(
3423 "ERROR(yac_cput_pre_processing): invalid time operation type")
3424
3425 int time_accumulation_count =
3427
3428 time_accumulation_count++;
3429
3430 // if this is the first accumulation step
3431 if (time_accumulation_count == 1) {
3432
3433 double send_field_acc_init_value;
3434 switch (time_operation) {
3435 default:
3436 case(TIME_ACCUMULATE):
3437 case(TIME_AVERAGE):
3438 send_field_acc_init_value = 0.0;
3439 break;
3440 case(TIME_MINIMUM):
3441 send_field_acc_init_value = DBL_MAX;
3442 break;
3443 case(TIME_MAXIMUM):
3444 send_field_acc_init_value = -DBL_MAX;
3445 break;
3446 }
3447
3448 /* initalise memory */
3449
3451 cpl_field, put_idx, send_field_acc_init_value);
3452 if (with_frac_mask)
3454 cpl_field, put_idx, 0.0);
3455 }
3456
3457 /* accumulate data */
3458
3459 double *** send_field_acc =
3461 *send_field_acc_ = send_field_acc;
3462 double *** send_frac_mask_acc;
3463 if (with_frac_mask) {
3464 send_frac_mask_acc =
3466 *send_frac_mask_acc_ = send_frac_mask_acc;
3467 } else {
3468 send_frac_mask_acc = NULL;
3469 *send_frac_mask_acc_ = NULL;
3470 }
3471
3472#define NO_CHECK (1)
3473#define PUT_CHECK (put_mask[i][j])
3474#define SUM +=
3475#define ASSIGN =
3476#define AGGREGATE_FRAC(CHECK, EXTRA_CHECK, ACCU_OP) \
3477 { \
3478 YAC_OMP_PARALLEL \
3479 { \
3480 YAC_OMP_FOR \
3481 for (size_t j = 0; j < num_points; ++j) { \
3482 double frac_mask = send_frac_mask[h][i][j]; \
3483 double send_field_value = send_field[h][i][j] * frac_mask; \
3484 if (CHECK && (EXTRA_CHECK)) { \
3485 if (frac_mask != 0.0) { \
3486 send_field_acc[h][i][j] ACCU_OP send_field_value; \
3487 send_frac_mask_acc[h][i][j] ACCU_OP frac_mask; \
3488 } \
3489 } \
3490 } \
3491 } \
3492 }
3493#define AGGREATE_NOFRAC(CHECK, EXTRA_CHECK, ACCU_OP) \
3494 { \
3495 YAC_OMP_PARALLEL \
3496 { \
3497 YAC_OMP_FOR \
3498 for (size_t j = 0; j < num_points; ++j) {\
3499 double send_field_value = send_field[h][i][j]; \
3500 if (CHECK && (EXTRA_CHECK)) \
3501 send_field_acc[h][i][j] ACCU_OP send_field_value; \
3502 } \
3503 } \
3504 }
3505#define AGGREGATE(EXTRA_CHECK, ACCU_OP) \
3506 { \
3507 for (int h = 0; h < collection_size; h++) { \
3508 for (size_t i = 0; i < num_interp_fields; i++) { \
3509 size_t num_points = \
3510 yac_coupling_field_get_data_size( \
3511 cpl_field, \
3512 yac_coupling_field_get_interp_fields(cpl_field)[i].location); \
3513 if (with_frac_mask) { \
3514 if (put_mask) AGGREGATE_FRAC(PUT_CHECK, EXTRA_CHECK, ACCU_OP) \
3515 else AGGREGATE_FRAC(NO_CHECK, EXTRA_CHECK, ACCU_OP) \
3516 } else { \
3517 if (put_mask) AGGREATE_NOFRAC(PUT_CHECK, EXTRA_CHECK, ACCU_OP) \
3518 else AGGREATE_NOFRAC(NO_CHECK, EXTRA_CHECK, ACCU_OP) \
3519 } \
3520 } \
3521 } \
3522 break; \
3523 }
3524
3525 switch (time_operation) {
3526 default:
3527 case(TIME_ACCUMULATE):
3528 case(TIME_AVERAGE):
3530 case(TIME_MINIMUM):
3531 AGGREGATE(send_field_acc[h][i][j] > send_field_value, ASSIGN)
3532 case(TIME_MAXIMUM):
3533 AGGREGATE(send_field_acc[h][i][j] < send_field_value, ASSIGN)
3534 }
3535
3536#undef AGGREGATE
3537#undef AGGREATE_NOFRAC
3538#undef AGGREGATE_FRAC
3539#undef ASSIGN
3540#undef SUM
3541#undef PUT_CHECK
3542#undef NO_CHECK
3543
3544/* --------------------------------------------------------------------
3545 Check whether we have to perform the coupling in this call
3546 -------------------------------------------------------------------- */
3547
3548 if (action == REDUCTION) {
3550 cpl_field, put_idx, time_accumulation_count);
3551 return NULL;
3552 }
3553
3554/* --------------------------------------------------------------------
3555 Average data if required
3556 -------------------------------------------------------------------- */
3557
3558 if (( time_operation == TIME_AVERAGE ) ||
3560
3561 double weight = 1.0 / (double)time_accumulation_count;
3562
3563#define NO_CHECK (1)
3564#define PUT_CHECK (put_mask[i][j])
3565#define WEIGHT_ACC_(ACC, CHECK, EXTRA_CHECK) \
3566 { \
3567 for (size_t j = 0; j < num_points; j++) \
3568 if (CHECK && (EXTRA_CHECK)) ACC[h][i][j] *= weight; \
3569 }
3570#define WEIGHT_ACC(ACC, EXTRA_CHECK) \
3571 { \
3572 if (put_mask) WEIGHT_ACC_(ACC, PUT_CHECK, EXTRA_CHECK) \
3573 else WEIGHT_ACC_(ACC, NO_CHECK, EXTRA_CHECK) \
3574 }
3575
3576 for (int h = 0; h < collection_size; ++h) {
3577 for (size_t i = 0; i < num_interp_fields; i++) {
3578 size_t num_points =
3580 cpl_field,
3582 if (with_frac_mask)
3583 WEIGHT_ACC(send_frac_mask_acc, NO_CHECK)
3585 if (with_frac_mask)
3586 WEIGHT_ACC(send_field_acc, send_frac_mask_acc[h][i][j] != 0.0)
3587 else
3588 WEIGHT_ACC(send_field_acc, NO_CHECK)
3589 }
3590 }
3591 }
3592 }
3593
3594#undef NO_CHECK
3595#undef PUT_CHECK
3596#undef WEIGHT_ACC_
3597#undef WEIGHT_ACC
3598
3599 // reset time_accumulation_count
3601 cpl_field, put_idx, 0);
3602
3603/* --------------------------------------------------------------------
3604 return interpolation
3605 -------------------------------------------------------------------- */
3606
3607 *info = MAX((int)COUPLING, *info);
3608 return interpolation;
3609}
3610
3611void yac_cput_frac ( int const field_id,
3612 int const collection_size,
3613 double *** const send_field, // send_field[collection_size]
3614 // [nPointSets][Points]
3615 double *** const send_frac_mask, // send_frac_mask[collection_size]
3616 // [nPointSets][Points]
3617 int *info,
3618 int *ierr ) {
3619
3621
3622 *info = NONE;
3623 *ierr = 0;
3624
3625 struct coupling_field * cpl_field =
3627
3630
3633 "ERROR(yac_cput_frac): put was called for field \"%s\" which is "
3634 "configured as target", yac_get_coupling_field_name(cpl_field));
3635
3636 if (exchange_type != SOURCE) return;
3637
3639 (size_t)collection_size ==
3641 "ERROR(yac_cput_frac): collection size of field \"%s\" does not match with "
3642 "coupling configuration.", yac_get_coupling_field_name(cpl_field));
3643
3644 for (unsigned put_idx = 0;
3645 put_idx < yac_get_coupling_field_num_puts(cpl_field); ++put_idx) {
3646
3647 int curr_action;
3648 int curr_ierr;
3649 double *** send_field_acc;
3650 double *** send_frac_mask_acc;
3651
3652 int with_frac_mask;
3653 int use_raw_exchange;
3654 void * interpolation =
3656 cpl_field, put_idx, collection_size,
3657 send_field, &send_field_acc,
3658 send_frac_mask, &send_frac_mask_acc,
3659 &with_frac_mask, &use_raw_exchange,
3660 &curr_action, &curr_ierr);
3661
3662 *info = MAX(*info, curr_action);
3663 *ierr = MAX(*ierr, curr_ierr);
3664
3665 /* ------------------------------------------------------------------
3666 return in case we are already beyond the end of the run
3667 ------------------------------------------------------------------ */
3668 if (curr_action == OUT_OF_BOUND) {
3669 *info = OUT_OF_BOUND;
3670 return;
3671 }
3672
3673 /* ------------------------------------------------------------------
3674 in case there is nothing to be done for the current put
3675 ------------------------------------------------------------------ */
3676 if ((curr_action == NONE) || (curr_action == REDUCTION)) continue;
3677
3678 /* ------------------------------------------------------------------
3679 in case we are supposed to couple
3680 ------------------------------------------------------------------ */
3681 if ((*ierr == 0) && (interpolation != NULL)) {
3682
3684 (with_frac_mask && (send_frac_mask != NULL)) ||
3685 !with_frac_mask,
3686 "ERROR(yac_cput_frac): interpolation for field \"%s\" was built for "
3687 "dynamic fractional masking, but no mask was provided",
3688 yac_get_coupling_field_name(cpl_field));
3690 (!with_frac_mask && (send_frac_mask == NULL)) ||
3691 with_frac_mask,
3692 "ERROR(yac_cput_frac): interpolation for field \"%s\" was not built "
3693 "for dynamic fractional masking, but a mask was provided",
3694 yac_get_coupling_field_name(cpl_field));
3695
3696 double *** send_field_ptr =
3697 (send_field_acc == NULL)?send_field:send_field_acc;
3698 double *** send_frac_mask_ptr =
3699 (send_frac_mask_acc == NULL)?send_frac_mask:send_frac_mask_acc;
3700
3701 if (use_raw_exchange) {
3702
3703 size_t num_src_fields =
3705 double const ** send_field_ptr_ =
3706 xmalloc(
3707 (size_t)(1 + with_frac_mask) * (size_t)collection_size *
3708 num_src_fields * sizeof(*send_field_ptr_));
3709
3710 size_t k = 0;
3711 for (int i = 0; i < collection_size; ++i)
3712 for (size_t j = 0; j < num_src_fields; ++j, ++k)
3713 send_field_ptr_[k] = send_field_ptr[i][j];
3714 if (with_frac_mask)
3715 for (int i = 0; i < collection_size; ++i)
3716 for (size_t j = 0; j < num_src_fields; ++j, ++k)
3717 send_field_ptr_[k] = send_frac_mask_ptr[i][j];
3719 interpolation, send_field_ptr_, "yac_cput_frac");
3720
3721 free(send_field_ptr_);
3722
3723 } else {
3724 if (with_frac_mask)
3726 interpolation, send_field_ptr, send_frac_mask_ptr);
3727 else
3729 }
3730 }
3731 }
3732}
3733
3734void yac_cput ( int const field_id,
3735 int const collection_size,
3736 double *** const send_field, // send_field[collection_size]
3737 // [nPointSets][Points]
3738 int *info,
3739 int *ierr ) {
3740
3742 field_id, collection_size, send_field, NULL, info, ierr);
3743}
3744
3745/* ---------------------------------------------------------------------- */
3746
3747
3748void yac_cexchange_ ( int const send_field_id,
3749 int const recv_field_id,
3750 int const collection_size,
3751 double *send_field, // send_field[collection_size *
3752 // nPointSets *
3753 // Points]
3754 double *recv_field, // recv_field[collection_size * Points]
3755 int *send_info,
3756 int *recv_info,
3757 int *ierr ) {
3758
3759 yac_ccheck_field_dimensions(send_field_id, collection_size, 1, NULL);
3760 yac_ccheck_field_dimensions(recv_field_id, collection_size, -1, NULL);
3761
3762 /* Needed to transfer from Fortran data structure to C */
3763 double *** send_field_ =
3764 get_send_field_pointers(send_field_id, collection_size, send_field);
3765 double ** recv_field_ =
3766 get_recv_field_pointers(recv_field_id, collection_size, recv_field);
3767
3769 send_field_id, recv_field_id, collection_size, send_field_, recv_field_,
3770 send_info, recv_info, ierr);
3771
3772 free(recv_field_);
3773 free(send_field_[0]);
3774 free(send_field_);
3775}
3776
3777/* ---------------------------------------------------------------------- */
3778
3779
3780void yac_cexchange_raw_frac_ ( int const send_field_id,
3781 int const recv_field_id,
3782 int const collection_size,
3783 double *send_field, // send_field[collection_size *
3784 // nPointSets *
3785 // Points]
3786 double *send_frac_mask, // send_frac_mask[collection_size *
3787 // nPointSets *
3788 // Points]
3789 double *src_field_buffer, // src_field_buffer
3790 // [collection_size *
3791 // SUM(src_field_buffer_sizes[0:num_src_fields-1])]
3792 double *src_frac_mask_buffer, // src_frac_mask_buffer
3793 // [collection_size *
3794 // SUM(src_field_buffer_sizes[0:num_src_fields-1])]
3795 int *send_info,
3796 int *recv_info,
3797 int *ierr ) {
3798
3799 yac_ccheck_field_dimensions(send_field_id, collection_size, 1, NULL);
3800 yac_ccheck_field_dimensions(recv_field_id, collection_size, -1, NULL);
3801
3802 /* Needed to transfer from Fortran data structure to C */
3803 double *** send_field_ =
3804 get_send_field_pointers(send_field_id, collection_size, send_field);
3805 double *** send_frac_mask_ =
3806 send_frac_mask?
3808 send_field_id, collection_size, send_frac_mask):NULL;
3809 double *** src_field_buffer_ =
3811 recv_field_id, collection_size, src_field_buffer);
3812 double *** src_frac_mask_buffer_ =
3813 src_frac_mask_buffer?
3815 recv_field_id, collection_size, src_frac_mask_buffer):NULL;
3816
3818 send_field_id, recv_field_id, collection_size,
3819 send_field_, send_frac_mask_,
3820 src_field_buffer_, src_frac_mask_buffer_,
3821 send_info, recv_info, ierr);
3822
3823 if (src_frac_mask_buffer) {
3824 free(src_frac_mask_buffer_[0]);
3825 free(src_frac_mask_buffer_);
3826 }
3827 free(src_field_buffer_[0]);
3828 free(src_field_buffer_);
3829 if (send_frac_mask_) {
3830 free(send_frac_mask_[0]);
3831 free(send_frac_mask_);
3832 }
3833 free(send_field_[0]);
3834 free(send_field_);
3835}
3836
3837
3838void yac_cexchange_raw_ ( int const send_field_id,
3839 int const recv_field_id,
3840 int const collection_size,
3841 double *send_field, // send_field[collection_size *
3842 // nPointSets *
3843 // Points]
3844 double *src_field_buffer, // src_field_buffer
3845 // [collection_size *
3846 // SUM(src_field_buffer_sizes[0:num_src_fields-1])]
3847 int *send_info,
3848 int *recv_info,
3849 int *ierr ) {
3850
3852 send_field_id, recv_field_id, collection_size,
3853 send_field, NULL, src_field_buffer, NULL, send_info, recv_info, ierr);
3854}
3855
3856/* ---------------------------------------------------------------------- */
3857
3858
3859void yac_cexchange_frac_ ( int const send_field_id,
3860 int const recv_field_id,
3861 int const collection_size,
3862 double *send_field, // send_field[collection_size *
3863 // nPointSets *
3864 // Points]
3865 double *send_frac_mask, // send_frac_mask[collection_size *
3866 // nPointSets *
3867 // Points]
3868 double *recv_field, // recv_field[collection_size * Points]
3869 int *send_info,
3870 int *recv_info,
3871 int *ierr ) {
3872
3873 yac_ccheck_field_dimensions(send_field_id, collection_size, 1, NULL);
3874 yac_ccheck_field_dimensions(recv_field_id, collection_size, -1, NULL);
3875
3876 /* Needed to transfer from Fortran data structure to C */
3877 double *** send_field_ =
3878 get_send_field_pointers(send_field_id, collection_size, send_field);
3879 double *** send_frac_mask_ =
3880 get_send_field_pointers(send_field_id, collection_size, send_frac_mask);
3881 double ** recv_field_ =
3882 get_recv_field_pointers(recv_field_id, collection_size, recv_field);
3883
3885 send_field_id, recv_field_id, collection_size, send_field_, send_frac_mask_,
3886 recv_field_, send_info, recv_info, ierr);
3887
3888 free(recv_field_);
3889 free(send_field_[0]);
3890 free(send_field_);
3891 free(send_frac_mask_[0]);
3892 free(send_frac_mask_);
3893}
3894
3895/* ---------------------------------------------------------------------- */
3896
3897
3898void yac_cexchange_ptr_ ( int const send_field_id,
3899 int const recv_field_id,
3900 int const collection_size,
3901 double ** send_field, // send_field[collection_size *
3902 // nPointSets][Points]
3903 double ** recv_field, // recv_field[collection_size][Points]
3904 int *send_info,
3905 int *recv_info,
3906 int *ierr ) {
3907
3908 yac_ccheck_field_dimensions(send_field_id, collection_size, 1, NULL);
3909 yac_ccheck_field_dimensions(recv_field_id, collection_size, -1, NULL);
3910
3911
3912 /* Needed to transfer from Fortran data structure to C */
3913 double *** send_field_;
3915 send_field_id, collection_size, send_field, NULL, &send_field_, NULL);
3916
3918 send_field_id, recv_field_id, collection_size, send_field_, recv_field,
3919 send_info, recv_info, ierr);
3920
3921 free(send_field_[0]);
3922 free(send_field_);
3923}
3924
3925
3926void yac_cexchange_raw_ptr_ ( int const send_field_id,
3927 int const recv_field_id,
3928 int const collection_size,
3929 double ** send_field, // send_field[collection_size *
3930 // nPointSets][Points]
3931 double **src_field_buffer, // src_field_buffer
3932 // [collection_size*num_src_fields]
3933 // [src_field_buffer_size[src_field_idx]]
3934 int *send_info,
3935 int *recv_info,
3936 int *ierr ) {
3937
3938 yac_ccheck_field_dimensions(send_field_id, collection_size, 1, NULL);
3939 yac_ccheck_field_dimensions(recv_field_id, collection_size, -1, NULL);
3940
3941
3942 /* Needed to transfer from Fortran data structure to C */
3943 double *** send_field_;
3945 send_field_id, collection_size, send_field, NULL, &send_field_, NULL);
3946 double *** src_field_buffer_ =
3948 recv_field_id, (size_t)collection_size, src_field_buffer);
3949
3951 send_field_id, recv_field_id, collection_size, send_field_,
3952 src_field_buffer_, send_info, recv_info, ierr);
3953
3954 free(src_field_buffer_[0]);
3955 free(src_field_buffer_);
3956 free(send_field_[0]);
3957 free(send_field_);
3958}
3959
3960/* ---------------------------------------------------------------------- */
3961
3962
3963void yac_cexchange_frac_ptr_ ( int const send_field_id,
3964 int const recv_field_id,
3965 int const collection_size,
3966 double ** send_field, // send_field[collection_size *
3967 // nPointSets][Points]
3968 double ** send_frac_mask, // send_frac_mask[collection_size *
3969 // nPointSets][Points]
3970 double ** recv_field, // recv_field[collection_size][Points]
3971 int *send_info,
3972 int *recv_info,
3973 int *ierr ) {
3974
3975 yac_ccheck_field_dimensions(send_field_id, collection_size, 1, NULL);
3976 yac_ccheck_field_dimensions(recv_field_id, collection_size, -1, NULL);
3977
3978 /* Needed to transfer from Fortran data structure to C */
3979 double *** send_field_;
3980 double *** send_frac_mask_;
3982 send_field_id, collection_size, send_field, send_frac_mask,
3983 &send_field_, &send_frac_mask_);
3984
3986 send_field_id, recv_field_id, collection_size, send_field_, send_frac_mask_,
3987 recv_field, send_info, recv_info, ierr);
3988
3989 free(send_field_[0]);
3990 free(send_field_);
3991 free(send_frac_mask_[0]);
3992 free(send_frac_mask_);
3993}
3994
3995
3996void yac_cexchange_raw_frac_ptr_ ( int const send_field_id,
3997 int const recv_field_id,
3998 int const collection_size,
3999 double ** send_field, // send_field[collection_size *
4000 // nPointSets][Points]
4001 double ** send_frac_mask, // send_frac_mask[collection_size *
4002 // nPointSets][Points]
4003 double ** src_field_buffer, // src_field_buffer
4004 // [collection_size*num_src_fields]
4005 // [src_field_buffer_size[src_field_idx]]
4006 double ** src_frac_mask_buffer, // src_frac_mask_buffer
4007 // [collection_size*num_src_fields]
4008 // [src_field_buffer_size[src_field_idx]]
4009 int *send_info,
4010 int *recv_info,
4011 int *ierr ) {
4012
4013 yac_ccheck_field_dimensions(send_field_id, collection_size, 1, NULL);
4014 yac_ccheck_field_dimensions(recv_field_id, collection_size, -1, NULL);
4015
4016 /* Needed to transfer from Fortran data structure to C */
4017 double *** send_field_;
4018 double *** send_frac_mask_;
4020 send_field_id, collection_size, send_field, send_frac_mask,
4021 &send_field_, &send_frac_mask_);
4022 double *** src_field_buffer_ =
4024 recv_field_id, (size_t)collection_size, src_field_buffer);
4025 double *** src_frac_mask_buffer_ =
4026 src_frac_mask_buffer?
4028 recv_field_id, (size_t)collection_size, src_frac_mask_buffer):NULL;
4029
4031 send_field_id, recv_field_id, collection_size, send_field_, send_frac_mask_,
4032 src_field_buffer_, src_frac_mask_buffer_, send_info, recv_info, ierr);
4033
4034 free(src_frac_mask_buffer_[0]);
4035 free(src_frac_mask_buffer_);
4036 free(src_field_buffer_[0]);
4037 free(src_field_buffer_);
4038 free(send_field_[0]);
4039 free(send_field_);
4040 free(send_frac_mask_[0]);
4041 free(send_frac_mask_);
4042}
4043
4044/* ---------------------------------------------------------------------- */
4045
4046void yac_cexchange_frac ( int const send_field_id,
4047 int const recv_field_id,
4048 int const collection_size,
4049 double *** const send_field, // send_field[collection_size]
4050 // [nPointSets][Points]
4051 double *** const send_frac_mask, // send_frac_mask[collection_size]
4052 // [nPointSets][Points]
4053 double ** recv_field, // recv_field[collection_size][Points]
4054 int *send_info,
4055 int *recv_info,
4056 int *ierr ) {
4057
4058 yac_ccheck_field_dimensions(send_field_id, collection_size, 1, NULL);
4059 yac_ccheck_field_dimensions(recv_field_id, collection_size, -1, NULL);
4060
4061 *send_info = NONE;
4062 *ierr = -1;
4063
4064 struct coupling_field * send_cpl_field =
4065 yac_unique_id_to_pointer(send_field_id, "send_field_id");
4066
4067 if (yac_get_coupling_field_exchange_type(send_cpl_field) != SOURCE) {
4068 yac_cget(recv_field_id, collection_size, recv_field, recv_info, ierr);
4069 return;
4070 }
4071
4072 YAC_ASSERT(
4073 (size_t)collection_size ==
4075 "ERROR(yac_cexchange_frac): "
4076 "collection size does not match with coupling configuration.")
4077
4078 YAC_ASSERT(
4079 yac_get_coupling_field_num_puts(send_cpl_field) == 1,
4080 "ERROR(yac_cexchange_frac): more than one put per field is not supported "
4081 "for yac_cexchange_frac.")
4082
4083 int send_action;
4084 int send_ierr;
4085 double *** send_field_acc;
4086 double *** send_frac_mask_acc;
4087 int send_with_frac_mask;
4088 int use_raw_exchange;
4089 struct yac_interpolation * put_interpolation =
4091 send_cpl_field, 0, collection_size, send_field,
4092 &send_field_acc, send_frac_mask, &send_frac_mask_acc,
4093 &send_with_frac_mask, &use_raw_exchange,
4094 &send_action, &send_ierr);
4095
4097 send_with_frac_mask == (send_frac_mask != NULL),
4098 "ERROR(yac_cexchange_frac): source field \"%s\" was configured %s "
4099 "support for fractional masking, but %s fractional mask "
4100 "was provided to this call",
4101 yac_get_coupling_field_name(send_cpl_field),
4102 (send_with_frac_mask?"with":"without"), (send_with_frac_mask?"no":"a"))
4103
4104 *send_info = MAX(*send_info, send_action);
4105 *ierr = MAX(*ierr, send_ierr);
4106
4107 /* ------------------------------------------------------------------
4108 return in case we are already beyond the end of the run for the puts
4109 or there is nothing to be done for the current put
4110 ------------------------------------------------------------------ */
4111 if ((send_action == OUT_OF_BOUND) ||
4112 (send_action == NONE) ||
4113 (send_action == REDUCTION)) {
4114 yac_cget(recv_field_id, collection_size, recv_field, recv_info, ierr);
4115 return;
4116 }
4117
4118 /* ------------------------------------------------------------------
4119 check the get
4120 ------------------------------------------------------------------ */
4121
4122 struct yac_interpolation * get_interpolation =
4123 yac_cget_pre_processing(recv_field_id, collection_size, recv_info, ierr);
4124
4125 /* ------------------------------------------------------------------
4126 do the required exchanges
4127 ------------------------------------------------------------------ */
4128
4129 if (*ierr == 0) {
4130
4131 double *** send_field_ptr =
4132 (send_field_acc == NULL)?send_field:send_field_acc;
4133 double *** send_frac_mask_ptr =
4134 (send_frac_mask_acc == NULL)?send_frac_mask:send_frac_mask_acc;
4135
4136 // if the get is active
4137 if (get_interpolation != NULL) {
4138
4139 YAC_ASSERT(
4140 get_interpolation == put_interpolation,
4141 "ERROR(yac_cexchange): send_field_id and recv_field_id do not match")
4142
4143 if (send_with_frac_mask)
4145 put_interpolation, send_field_ptr, send_frac_mask_ptr, recv_field);
4146 else
4148 put_interpolation, send_field_ptr, recv_field);
4149
4150 } else {
4151
4152 // just execute the put
4153 if (send_with_frac_mask)
4155 put_interpolation, send_field_ptr, send_frac_mask_ptr);
4156 else
4157 yac_interpolation_execute_put(put_interpolation, send_field_ptr);
4158 }
4159 }
4160}
4161
4162void yac_cexchange_raw_frac ( int const send_field_id,
4163 int const recv_field_id,
4164 int const collection_size,
4165 double *** const send_field, // send_field[collection_size]
4166 // [nPointSets][Points]
4167 double *** const send_frac_mask, // send_frac_mask[collection_size]
4168 // [nPointSets][Points]
4169 double ***src_field_buffer, // source field buffer
4170 // [collection_size]
4171 // [num_src_fields]
4172 // [src_field_buffer_size[src_field_idx]]
4173 double ***src_frac_mask_buffer, // source fractional mask buffer
4174 // [collection_size]
4175 // [num_src_fields]
4176 // [src_field_buffer_size[src_field_idx]]
4177 int *send_info,
4178 int *recv_info,
4179 int *ierr ) {
4180
4181 yac_ccheck_field_dimensions(send_field_id, collection_size, -1, NULL);
4182 yac_ccheck_field_dimensions(recv_field_id, collection_size, 1, NULL);
4183
4184 *send_info = NONE;
4185 *ierr = -1;
4186
4187 struct coupling_field * send_cpl_field =
4188 yac_unique_id_to_pointer(send_field_id, "send_field_id");
4189 struct coupling_field * recv_cpl_field =
4190 yac_unique_id_to_pointer(recv_field_id, "recv_field_id");
4191
4192 if (yac_get_coupling_field_exchange_type(recv_cpl_field) != TARGET) {
4194 send_field_id, collection_size, send_field, send_frac_mask,
4195 send_info, ierr);
4196 *recv_info = NONE;
4197 return;
4198 }
4199
4200 int recv_with_frac_mask =
4202
4203 if (yac_get_coupling_field_exchange_type(send_cpl_field) != SOURCE) {
4204 if (recv_with_frac_mask)
4206 recv_field_id, collection_size, src_field_buffer, src_frac_mask_buffer,
4207 recv_info, ierr);
4208 else
4210 recv_field_id, collection_size, src_field_buffer, recv_info, ierr);
4211 *send_info = NONE;
4212 return;
4213 }
4214
4216 recv_with_frac_mask == (src_frac_mask_buffer != NULL),
4217 "ERROR(yac_cexchange_raw_frac): target field \"%s\" was configured %s "
4218 "support for fractional masking, but %s source fractional mask buffer "
4219 "was provided to this call",
4220 yac_get_coupling_field_name(recv_cpl_field),
4221 (recv_with_frac_mask?"with":"without"), (recv_with_frac_mask?"no":"a"))
4222
4223 YAC_ASSERT(
4224 (size_t)collection_size ==
4226 "ERROR(yac_cexchange_raw_frac): "
4227 "collection size does not match with coupling configuration.")
4228
4229 YAC_ASSERT(
4230 yac_get_coupling_field_num_puts(send_cpl_field) == 1,
4231 "ERROR(yac_cexchange_raw_frac): "
4232 "more than one put per field is not supported for yac_cexchange_frac.")
4233
4236 "ERROR(yac_cexchange_raw_frac): "
4237 "source field \"%s\" is not configured for raw data exchange",
4238 yac_get_coupling_field_name(send_cpl_field))
4239
4240 int send_action;
4241 int send_ierr;
4242 double *** send_field_acc;
4243 double *** send_frac_mask_acc;
4244 int send_with_frac_mask;
4245 int use_raw_exchange;
4246 struct yac_interpolation_exchange * put_interpolation_exchange =
4248 send_cpl_field, 0, collection_size, send_field,
4249 &send_field_acc, send_frac_mask, &send_frac_mask_acc,
4250 &send_with_frac_mask, &use_raw_exchange,
4251 &send_action, &send_ierr);
4252
4254 (put_interpolation_exchange == NULL) ||
4255 (send_with_frac_mask == recv_with_frac_mask),
4256 "ERROR(yac_cexchange_raw_frac): fractional mask configuration for "
4257 "source field \"%s\" and target field \"%s\" does not match",
4258 yac_get_coupling_field_name(send_cpl_field),
4259 yac_get_coupling_field_name(recv_cpl_field));
4260
4262 send_with_frac_mask == (send_frac_mask != NULL),
4263 "ERROR(yac_cexchange_raw_frac): source field \"%s\" was configured %s "
4264 "support for fractional masking, but %s fractional mask "
4265 "was provided to this call",
4266 yac_get_coupling_field_name(send_cpl_field),
4267 (send_with_frac_mask?"with":"without"), (send_with_frac_mask?"no":"a"))
4268
4269 *send_info = MAX(*send_info, send_action);
4270 *ierr = MAX(*ierr, send_ierr);
4271
4272 /* ------------------------------------------------------------------
4273 return in case we are already beyond the end of the run for the puts
4274 or there is nothing to be done for the current put
4275 ------------------------------------------------------------------ */
4276 if ((send_action == OUT_OF_BOUND) ||
4277 (send_action == NONE) ||
4278 (send_action == REDUCTION)) {
4279 if (recv_with_frac_mask)
4281 recv_field_id, collection_size, src_field_buffer, src_frac_mask_buffer,
4282 recv_info, ierr);
4283 else
4285 recv_field_id, collection_size, src_field_buffer, recv_info, ierr);
4286 return;
4287 }
4288
4289 /* ------------------------------------------------------------------
4290 check the get
4291 ------------------------------------------------------------------ */
4292
4293 struct yac_interpolation_exchange * get_interpolation_exchange =
4294 yac_cget_pre_processing(recv_field_id, collection_size, recv_info, ierr);
4295
4296 /* ------------------------------------------------------------------
4297 do the required exchanges
4298 ------------------------------------------------------------------ */
4299
4300 if (*ierr == 0) {
4301
4302 size_t num_src_fields;
4304 recv_cpl_field, &num_src_fields, NULL);
4305
4306 double const ** send_field_ptr_ =
4307 xmalloc(
4308 (size_t)(1 + send_with_frac_mask) * (size_t)collection_size *
4309 num_src_fields * sizeof(*send_field_ptr_));
4310 {
4311 size_t k = 0;
4312 for (int i = 0; i < collection_size; ++i)
4313 for (size_t j = 0; j < num_src_fields; ++j, ++k)
4314 send_field_ptr_[k] = send_field_acc[i][j];
4315 if (send_with_frac_mask)
4316 for (int i = 0; i < collection_size; ++i)
4317 for (size_t j = 0; j < num_src_fields; ++j, ++k)
4318 send_field_ptr_[k] = send_frac_mask_acc[i][j];
4319 }
4320
4321 YAC_ASSERT(
4322 get_interpolation_exchange == put_interpolation_exchange,
4323 "ERROR(yac_cexchange_raw_frac): "
4324 "send_field_id and recv_field_id do not match")
4325
4327 recv_with_frac_mask == (src_frac_mask_buffer != NULL),
4328 "ERROR(yac_cexchange_raw_frac): target field \"%s\" was configured %s "
4329 "support for fractional masking, but %s fractional mask buffer"
4330 "was provided to this call",
4331 yac_get_coupling_field_name(recv_cpl_field),
4332 (recv_with_frac_mask?"with":"without"), (recv_with_frac_mask?"no":"a"))
4333
4334 double ** src_field_buffer_ =
4335 xmalloc(
4336 (size_t)(1 + send_with_frac_mask) * (size_t)collection_size *
4337 num_src_fields * sizeof(*src_field_buffer_));
4338 {
4339 size_t k = 0;
4340 for (int i = 0; i < collection_size; ++i)
4341 for (size_t j = 0; j < num_src_fields; ++j, ++k)
4342 src_field_buffer_[k] = src_field_buffer[i][j];
4343 if (recv_with_frac_mask)
4344 for (int i = 0; i < collection_size; ++i)
4345 for (size_t j = 0; j < num_src_fields; ++j, ++k)
4346 src_field_buffer_[k] = src_frac_mask_buffer[i][j];
4347 }
4348
4350 put_interpolation_exchange, send_field_ptr_, src_field_buffer_,
4351 "yac_cexchange_raw_frac");
4352
4353 free(src_field_buffer_);
4354 free(send_field_ptr_);
4355 }
4356}
4357
4358void yac_cexchange ( int const send_field_id,
4359 int const recv_field_id,
4360 int const collection_size,
4361 double *** const send_field, // send_field[collection_size]
4362 // [nPointSets][Points]
4363 double ** recv_field, // recv_field[collection_size][Points]
4364 int *send_info,
4365 int *recv_info,
4366 int *ierr ) {
4367
4369 send_field_id, recv_field_id, collection_size,
4370 send_field, NULL, recv_field, send_info, recv_info, ierr);
4371}
4372
4373void yac_cexchange_raw ( int const send_field_id,
4374 int const recv_field_id,
4375 int const collection_size,
4376 double *** const send_field, // send_field[collection_size]
4377 // [nPointSets][Points]
4378 double ***src_field_buffer, // src_field_buffer
4379 // [collection_size]
4380 // [num_src_fields]
4381 // [src_field_buffer_size[src_field_idx]]
4382 int *send_info,
4383 int *recv_info,
4384 int *ierr ) {
4385
4387 send_field_id, recv_field_id, collection_size,
4388 send_field, NULL, src_field_buffer, NULL, send_info, recv_info, ierr);
4389}
4390
4391/* ---------------------------------------------------------------------- */
4392
4393void yac_csync_def_instance ( int yac_instance_id ){
4395 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id"));
4396}
4397
4402
4404 int yac_instance_id, char const ** comp_names, int num_comp_names ){
4406 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id"),
4407 comp_names, (size_t)num_comp_names);
4408}
4409
4411 char const ** comp_names, int num_comp_names ){
4412 check_default_instance_id("yac_csync_def_comps");
4414 default_instance_id, comp_names, (size_t)num_comp_names);
4415}
4416
4417
4418/* ---------------------------------------------------------------------- */
4419
4420void yac_cenddef_instance(int yac_instance_id) {
4421
4423 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id"),
4424 grids, num_grids);
4425}
4426
4427void yac_cenddef (void) {
4428
4429 check_default_instance_id("yac_cenddef");
4431}
4432
4434 int yac_instance_id, int emit_flags, char ** config) {
4435
4436 *config =
4438 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id"),
4439 grids, num_grids, emit_flags);
4440}
4441
4442void yac_cenddef_and_emit_config ( int emit_flags, char ** config ) {
4443
4444 check_default_instance_id("yac_cenddef");
4446 default_instance_id, emit_flags, config);
4447}
4448
4449/* ----------------------------------------------------------------------
4450 query functions
4451 ----------------------------------------------------------------------*/
4452
4453int yac_cget_field_is_defined_instance(int yac_instance_id, const char* comp_name,
4454 const char* grid_name, const char* field_name){
4455 struct yac_instance* instance =
4456 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
4457 struct coupling_field* cpl_field =
4458 yac_instance_get_field(instance, comp_name, grid_name, field_name);
4459 return cpl_field != NULL;
4460}
4461
4463 const char* comp_name, const char* grid_name, const char* field_name){
4464 check_default_instance_id("yac_cget_field_is_defined");
4465 return
4467 default_instance_id, comp_name, grid_name, field_name);
4468}
4469
4470int yac_cget_field_id_instance(int yac_instance_id, const char* comp_name,
4471 const char* grid_name, const char* field_name){
4472 struct yac_instance * instance =
4473 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
4474 struct coupling_field* cpl_field =
4475 yac_instance_get_field(instance, comp_name, grid_name, field_name);
4476 YAC_ASSERT_F(cpl_field != NULL,
4477 "ERROR(yac_cget_field_id_instance): "
4478 "no field '%s' defined on the local process for "
4479 "component '%s' and grid '%s'", field_name, comp_name, grid_name);
4480 return yac_lookup_pointer(cpl_field);
4481}
4482
4483int yac_cget_field_id(const char* comp_name, const char* grid_name, const char* field_name){
4484 check_default_instance_id("yac_cget_field_id");
4486 grid_name, field_name);
4487}
4488
4489/* ---------------------------------------------------------------------- */
4490
4491int yac_cget_nbr_comps_instance ( int yac_instance_id ) {
4492 struct yac_instance * instance =
4493 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
4494 return yac_instance_get_nbr_comps(instance);
4495}
4496
4498 check_default_instance_id("yac_cget_nbr_comps");
4500}
4501
4502int yac_cget_nbr_grids_instance ( int yac_instance_id ) {
4503 struct yac_instance * instance =
4504 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
4505 struct yac_couple_config * couple_config =
4507 return yac_couple_config_get_num_grids(couple_config);
4508}
4509
4511 check_default_instance_id("yac_cget_nbr_grids");
4513}
4514
4516 int yac_instance_id, const char* comp_name ) {
4517
4518 struct yac_instance * instance =
4519 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
4520 struct yac_couple_config * couple_config =
4522 size_t nbr_couple_config_grids =
4523 yac_couple_config_get_num_grids(couple_config);
4524
4525 YAC_ASSERT(comp_name != NULL,
4526 "ERROR(yac_cget_comp_grid_names_instance):"
4527 "Invalid comp_name. (NULL is not allowed)");
4528
4529 int nbr_comp_grids = 0;
4530 for(size_t i = 0; i < nbr_couple_config_grids; ++i)
4532 yac_instance_id, comp_name,
4533 yac_couple_config_get_grid_name(couple_config, i)) > 0)
4534 nbr_comp_grids++;
4535 return nbr_comp_grids;
4536}
4537
4538int yac_cget_comp_nbr_grids ( const char* comp_name ){
4539 check_default_instance_id("yac_cget_comp_nbr_grids");
4541}
4542
4543int yac_cget_nbr_fields_instance ( int yac_instance_id, const char* comp_name,
4544 const char* grid_name) {
4545 struct yac_instance * instance =
4546 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
4547 struct yac_couple_config * couple_config =
4549 size_t comp_idx = yac_couple_config_get_component_idx(couple_config, comp_name);
4550 int nbr_fields = 0;
4551 size_t nbr_comp_fields =
4552 yac_couple_config_get_num_fields(couple_config, comp_idx);
4553 for(size_t field_idx=0; field_idx<nbr_comp_fields; ++field_idx)
4554 if(yac_couple_config_field_is_valid(couple_config, comp_idx, field_idx) &&
4555 !strcmp(
4556 grid_name,
4558 couple_config, comp_idx, field_idx)))
4559 nbr_fields++;
4560 return nbr_fields;
4561}
4562
4563int yac_cget_nbr_fields ( const char* comp_name, const char* grid_name ) {
4564 check_default_instance_id("yac_cget_nbr_fields");
4565 return yac_cget_nbr_fields_instance(default_instance_id, comp_name, grid_name);
4566}
4567
4569 int yac_instance_id, int nbr_comps, const char ** comp_names) {
4570
4571 struct yac_instance * instance =
4572 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
4573 struct yac_couple_config * couple_config =
4575 size_t nbr_couple_config_comps =
4577
4579 (size_t)nbr_comps == nbr_couple_config_comps,
4580 "ERROR(yac_cget_comp_names_instance): "
4581 "invalid array size (nbr_comps = %d; nbr_couple_config_comps = %zu)",
4582 nbr_comps, nbr_couple_config_comps);
4583
4584 for(size_t i = 0; i < nbr_couple_config_comps; ++i)
4585 comp_names[i] = yac_couple_config_get_component_name(couple_config, i);
4586}
4587
4588void yac_cget_comp_names ( int nbr_comps, const char ** comp_names ) {
4589 check_default_instance_id("yac_cget_comp_names");
4591 comp_names );
4592}
4593
4595 int yac_instance_id, int nbr_grids, const char ** grid_names ) {
4596
4597 struct yac_instance * instance =
4598 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
4599 struct yac_couple_config * couple_config =
4601 size_t nbr_couple_config_grids =
4602 yac_couple_config_get_num_grids(couple_config);
4603
4605 (size_t)nbr_grids == nbr_couple_config_grids,
4606 "ERROR(yac_cget_grid_names_instance): "
4607 "invalid array size (nbr_grids = %d, nbr_couple_config_grids = %zu)",
4608 nbr_grids, nbr_couple_config_grids);
4609
4610 for(size_t i = 0; i < nbr_couple_config_grids; ++i)
4611 grid_names[i] = yac_couple_config_get_grid_name(couple_config, i);
4612}
4613
4614void yac_cget_grid_names ( int nbr_grids, const char ** grid_names ) {
4615 check_default_instance_id("yac_cget_grid_names");
4617}
4618
4620 int yac_instance_id, const char* comp_name,
4621 int nbr_grids, const char ** grid_names ) {
4622
4623 struct yac_instance * instance =
4624 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
4625 struct yac_couple_config * couple_config =
4627 size_t nbr_couple_config_grids =
4628 yac_couple_config_get_num_grids(couple_config);
4629
4630 YAC_ASSERT(comp_name != NULL,
4631 "ERROR(yac_cget_comp_grid_names_instance): "
4632 "Invalid comp_name. (NULL is not allowed)");
4633
4634 size_t nbr_comp_grid = 0;
4635 for(size_t i = 0; i < nbr_couple_config_grids; ++i) {
4636
4637 const char* curr_grid_name =
4638 yac_couple_config_get_grid_name(couple_config, i);
4639
4641 yac_instance_id, comp_name, curr_grid_name) > 0) {
4642
4644 nbr_comp_grid < (size_t)nbr_grids,
4645 "ERROR(yac_cget_comp_grid_names_instance): "
4646 "invalid array size (nbr_grids = %d; nbr_comp_grid > %zu)",
4647 nbr_grids, nbr_comp_grid);
4648
4649 grid_names[nbr_comp_grid] = curr_grid_name;
4650 nbr_comp_grid++;
4651 }
4652 }
4653
4655 nbr_comp_grid == (size_t)nbr_grids,
4656 "ERROR(yac_cget_comp_grid_names_instance): "
4657 "invalid array size (nbr_grids = %d; nbr_comp_grid = %zu)",
4658 nbr_grids, nbr_comp_grid);
4659}
4660
4661void yac_cget_comp_grid_names ( const char* comp_name, int nbr_grids,
4662 const char ** grid_names ) {
4663 check_default_instance_id("yac_cget_grid_names");
4665}
4666
4667void yac_cget_field_names_instance ( int yac_instance_id,
4668 const char * comp_name, const char* grid_name,
4669 int nbr_fields, const char ** field_names ) {
4670
4671 struct yac_instance * instance =
4672 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
4673 struct yac_couple_config * couple_config =
4675 size_t comp_idx = yac_couple_config_get_component_idx(couple_config, comp_name);
4676 size_t nbr_comp_fields =
4677 yac_couple_config_get_num_fields(couple_config, comp_idx);
4678
4679 size_t nbr_comp_grid_fields = 0;
4680 for(size_t field_idx = 0; field_idx < nbr_comp_fields; ++field_idx) {
4681 if(yac_couple_config_field_is_valid(couple_config, comp_idx, field_idx) &&
4682 !strcmp(
4683 grid_name,
4685 couple_config, comp_idx, field_idx))) {
4686
4688 (size_t)nbr_fields > nbr_comp_grid_fields,
4689 "ERROR(yac_cget_field_names_instance): "
4690 "invalid array size (nbr_fields = %d; nbr_comp_grid_fields > %zu",
4691 nbr_fields, nbr_comp_fields);
4692
4693 field_names[nbr_comp_grid_fields] =
4694 yac_couple_config_get_field_name(couple_config, comp_idx, field_idx);
4695 nbr_comp_grid_fields++;
4696 }
4697 }
4698
4700 (size_t)nbr_fields == nbr_comp_grid_fields,
4701 "ERROR(yac_cget_field_names_instance): "
4702 "invalid array size (nbr_fields = %d; nbr_comp_grid_fields = %zu",
4703 nbr_fields, nbr_comp_fields);
4704}
4705
4706void yac_cget_field_names ( const char* comp_name, const char* grid_name,
4707 int nbr_fields, const char ** field_names ) {
4708 check_default_instance_id("yac_cget_field_names");
4710 comp_name, grid_name, nbr_fields, field_names );
4711}
4712
4714 struct coupling_field * field =
4716 YAC_ASSERT(field != NULL, "ERROR: field ID not defined!");
4718}
4719
4721 struct coupling_field * field =
4723 YAC_ASSERT(field != NULL, "ERROR: field ID not defined!");
4725 return yac_basic_grid_get_name(grid);
4726}
4727
4729 struct coupling_field * field =
4731 YAC_ASSERT(field != NULL, "ERROR: field ID not defined!");
4732 return yac_get_coupling_field_name(field);
4733}
4734
4736 struct coupling_field * field =
4738 YAC_ASSERT(field != NULL, "ERROR: field ID not defined!");
4739 return yac_get_coupling_field_timestep(field);
4740}
4741
4743 struct coupling_field * field =
4745 YAC_ASSERT(field != NULL, "ERROR: field ID not defined!");
4747}
4748
4750 struct coupling_field * field =
4752 YAC_ASSERT(field != NULL, "ERROR: field ID not defined!");
4754}
4755
4756/* ---------------------------------------------------------------------- */
4757
4759 int yac_instance_id, const char* comp_name, const char* grid_name,
4760 const char* field_name ) {
4761 struct yac_instance * instance =
4762 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
4763 struct yac_couple_config * couple_config =
4765 return
4767 couple_config, comp_name, grid_name, field_name);
4768}
4769
4770const char* yac_cget_field_timestep ( const char* comp_name, const char* grid_name,
4771 const char* field_name ) {
4772 check_default_instance_id("yac_cget_field_timestep");
4774 grid_name, field_name);
4775}
4776
4778 int yac_instance_id, const char* comp_name, const char* grid_name,
4779 const char* field_name) {
4780 struct yac_instance * instance =
4781 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
4782 return
4785 comp_name, grid_name, field_name);
4786}
4787
4789 const char* comp_name, const char* grid_name, const char* field_name ) {
4790 struct yac_instance * instance =
4791 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
4792 return
4795 comp_name, grid_name, field_name);
4796}
4797
4799 const char* comp_name, const char* grid_name, const char* field_name) {
4800 check_default_instance_id("yac_cget_field_frac_mask_fallback_value");
4801 return
4803 default_instance_id, comp_name, grid_name, field_name);
4804}
4805
4806int yac_cget_field_collection_size ( const char* comp_name,
4807 const char* grid_name, const char* field_name ) {
4808 check_default_instance_id("yac_cget_field_collection_size");
4810 grid_name, field_name);
4811}
4812
4813int yac_cget_field_role_instance ( int yac_instance_id, const char* comp_name,
4814 const char* grid_name, const char* field_name ) {
4815 struct yac_instance * instance =
4816 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
4817 struct yac_couple_config * couple_config =
4819 return
4821 couple_config, comp_name, grid_name, field_name);
4822}
4823
4824int yac_cget_field_role ( const char* comp_name, const char* grid_name,
4825 const char* field_name ) {
4826 check_default_instance_id("yac_cget_field_role");
4828 grid_name, field_name);
4829}
4830
4831void yac_cget_field_source_instance ( int yac_instance_id,
4832 const char* tgt_comp_name, const char* tgt_grid_name,
4833 const char* tgt_field_name, const char** src_comp_name,
4834 const char** src_grid_name, const char** src_field_name ) {
4835 struct yac_instance * instance =
4836 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
4837 struct yac_couple_config * couple_config =
4840 couple_config,
4841 tgt_comp_name, tgt_grid_name, tgt_field_name,
4842 src_comp_name, src_grid_name, src_field_name);
4843}
4844
4846 const char* tgt_comp_name, const char* tgt_grid_name,
4847 const char* tgt_field_name, const char** src_comp_name,
4848 const char** src_grid_name, const char** src_field_name ) {
4849 check_default_instance_id("yac_cget_field_source");
4852 tgt_comp_name, tgt_grid_name, tgt_field_name,
4853 src_comp_name, src_grid_name, src_field_name);
4854}
4855
4856/* ---------------------------------------------------------------------- */
4857
4859 const char * grid_name, int nbr_vertices[2], int cyclic[2],
4860 double *x_vertices, double *y_vertices, int *grid_id) {
4861
4862 size_t nbr_vertices_size_t[2] =
4863 {(size_t)nbr_vertices[0], (size_t)nbr_vertices[1]};
4864
4865 check_x_vertices(x_vertices, nbr_vertices[0], "yac_cdef_grid_reg2d");
4866 check_y_vertices(y_vertices, nbr_vertices[1], "yac_cdef_grid_reg2d");
4867
4868 *grid_id =
4871 nbr_vertices_size_t, cyclic, x_vertices, y_vertices));
4872}
4873
4874/* ---------------------------------------------------------------------- */
4875
4877 const char * grid_name, int nbr_vertices[2], int cyclic[2],
4878 double *x_vertices, double *y_vertices, int *grid_id) {
4879
4880 size_t nbr_vertices_size_t[2] =
4881 {(size_t)nbr_vertices[0], (size_t)nbr_vertices[1]};
4882
4883 check_x_vertices(x_vertices, nbr_vertices[0], "yac_cdef_grid_curve2d");
4884 check_y_vertices(y_vertices, nbr_vertices[1], "yac_cdef_grid_curve2d");
4885
4886 *grid_id =
4889 nbr_vertices_size_t, cyclic, x_vertices, y_vertices));
4890}
4891
4892/* ---------------------------------------------------------------------- */
4893
4895 const char * grid_name, int nbr_vertices,
4896 int nbr_cells, int *num_vertices_per_cell, double *x_vertices,
4897 double *y_vertices, int *cell_to_vertex, int *grid_id) {
4898
4899 check_x_vertices(x_vertices, nbr_vertices, "yac_cdef_grid_unstruct");
4900 check_y_vertices(y_vertices, nbr_vertices, "yac_cdef_grid_unstruct");
4902 cell_to_vertex, num_vertices_per_cell, nbr_cells, nbr_vertices,
4903 "yac_cdef_grid_unstruct");
4904
4905 *grid_id =
4907 grid_name,
4909 (size_t)nbr_vertices, (size_t)nbr_cells, num_vertices_per_cell,
4910 x_vertices, y_vertices, cell_to_vertex));
4911}
4912
4913/* ---------------------------------------------------------------------- */
4914
4916 const char * grid_name, int nbr_vertices,
4917 int nbr_cells, int *num_vertices_per_cell, double *x_vertices,
4918 double *y_vertices, int *cell_to_vertex, int *grid_id) {
4919
4920 check_x_vertices(x_vertices, nbr_vertices, "yac_cdef_grid_unstruct_ll");
4921 check_y_vertices(y_vertices, nbr_vertices, "yac_cdef_grid_unstruct_ll");
4923 cell_to_vertex, num_vertices_per_cell, nbr_cells, nbr_vertices,
4924 "yac_cdef_grid_unstruct_ll");
4925
4926 *grid_id =
4928 grid_name,
4930 (size_t)nbr_vertices, (size_t)nbr_cells, num_vertices_per_cell,
4931 x_vertices, y_vertices, cell_to_vertex));
4932}
4933
4934/* ---------------------------------------------------------------------- */
4935
4937 const char * grid_name, int nbr_vertices, int nbr_cells, int nbr_edges,
4938 int *num_edges_per_cell, double *x_vertices, double *y_vertices,
4939 int *cell_to_edge, int *edge_to_vertex, int *grid_id) {
4940
4941 check_x_vertices(x_vertices, nbr_vertices, "yac_cdef_grid_unstruct_edge");
4942 check_y_vertices(y_vertices, nbr_vertices, "yac_cdef_grid_unstruct_edge");
4944 cell_to_edge, num_edges_per_cell, nbr_cells, nbr_edges,
4945 "yac_cdef_grid_unstruct_edge");
4946
4947 *grid_id =
4949 grid_name,
4951 (size_t)nbr_vertices, (size_t)nbr_cells, (size_t)nbr_edges,
4952 num_edges_per_cell, x_vertices, y_vertices,
4953 cell_to_edge, edge_to_vertex));
4954}
4955
4956/* ---------------------------------------------------------------------- */
4957
4959 const char * grid_name, int nbr_vertices, int nbr_cells, int nbr_edges,
4960 int *num_edges_per_cell, double *x_vertices, double *y_vertices,
4961 int *cell_to_edge, int *edge_to_vertex, int *grid_id) {
4962
4963 check_x_vertices(x_vertices, nbr_vertices, "yac_cdef_grid_unstruct_edge_ll");
4964 check_y_vertices(y_vertices, nbr_vertices, "yac_cdef_grid_unstruct_edge_ll");
4966 cell_to_edge, num_edges_per_cell, nbr_cells, nbr_edges,
4967 "yac_cdef_grid_unstruct_edge_ll");
4968
4969 *grid_id =
4971 grid_name,
4973 (size_t)nbr_vertices, (size_t)nbr_cells, (size_t)nbr_edges,
4974 num_edges_per_cell, x_vertices, y_vertices,
4975 cell_to_edge, edge_to_vertex));
4976}
4977
4978/* ---------------------------------------------------------------------- */
4979
4981 const char * grid_name, int nbr_points,
4982 double *x_points, double *y_points, int *grid_id) {
4983
4984 check_x_vertices(x_points, nbr_points, "yac_cdef_grid_cloud");
4985 check_y_vertices(y_points, nbr_points, "yac_cdef_grid_cloud");
4986
4987 *grid_id =
4989 grid_name,
4991 (size_t)nbr_points, x_points, y_points));
4992}
4993
4994/* ---------------------------------------------------------------------- */
4995
4997 const char * grid_name, int nbr_vertices[2], int cyclic[2],
4998 double *x_vertices, double *y_vertices,
4999 double x_north_pole, double y_north_pole, int *grid_id) {
5000
5001 size_t nbr_vertices_size_t[2] =
5002 {(size_t)nbr_vertices[0], (size_t)nbr_vertices[1]};
5003
5004 check_x_vertices(x_vertices, nbr_vertices[0], "yac_cdef_grid_reg2d_rot");
5005 check_y_vertices(y_vertices, nbr_vertices[1], "yac_cdef_grid_reg2d_rot");
5006
5007 *grid_id =
5010 nbr_vertices_size_t, cyclic, x_vertices, y_vertices,
5011 x_north_pole, y_north_pole));
5012}
5013
5014/* ---------------------------------------------------------------------- */
5015
5028 char const * caller, int location, int grid_id,
5029 yac_int ** grid_global_ids, size_t * count) {
5030
5033
5034 yac_int ** temp_grid_global_ids;
5035
5036 switch (location) {
5038 "ERROR(%s): invalid location (%d)", caller, location);
5039 case (YAC_LOC_CELL): {
5040 temp_grid_global_ids = &(grid_data->cell_ids);
5041 *count = grid_data->num_cells;
5042 break;
5043 }
5044 case (YAC_LOC_CORNER): {
5045 temp_grid_global_ids = &(grid_data->vertex_ids);
5046 *count = grid_data->num_vertices;
5047 break;
5048 }
5049 case (YAC_LOC_EDGE): {
5050 temp_grid_global_ids = &(grid_data->edge_ids);
5051 *count = grid_data->num_edges;
5052 break;
5053 }
5054 }
5055
5056 if (*temp_grid_global_ids == NULL) {
5057 *temp_grid_global_ids = xmalloc(*count * sizeof(**temp_grid_global_ids));
5058 }
5059
5060 *grid_global_ids = *temp_grid_global_ids;
5061}
5062
5064 yac_int const * global_index, int location, int grid_id) {
5065
5066 yac_int * grid_global_ids;
5067 size_t count;
5068
5070 "yac_cset_global_index_yac_int", location, grid_id,
5071 &grid_global_ids, &count);
5072
5073 memcpy(grid_global_ids, global_index, count * sizeof(*global_index));
5074}
5075
5077 int const * global_index, int location, int grid_id) {
5078
5079 yac_int * grid_global_ids;
5080 size_t count;
5081
5083 "yac_cset_global_index", location, grid_id, &grid_global_ids, &count);
5084
5085 for (size_t i = 0; i < count; ++i) {
5086 grid_global_ids[i] = (yac_int)(global_index[i]);
5087 }
5088}
5089
5090/* ---------------------------------------------------------------------- */
5091
5093 int const * is_core, int location, int grid_id) {
5094
5097
5098 int ** grid_core_mask;
5099 size_t count;
5100
5101 YAC_ASSERT(
5102 (location == YAC_LOC_CELL) ||
5103 (location == YAC_LOC_CORNER) ||
5105 "ERROR(yac_cset_core_mask): invalid location")
5106 switch (location) {
5107 case (YAC_LOC_CELL): {
5108 grid_core_mask = &(grid_data->core_cell_mask);
5109 count = grid_data->num_cells;
5110 break;
5111 }
5112 case (YAC_LOC_CORNER): {
5113 grid_core_mask = &(grid_data->core_vertex_mask);
5114 count = grid_data->num_vertices;
5115 break;
5116 }
5117 default:
5118 case (YAC_LOC_EDGE): {
5119 grid_core_mask = &(grid_data->core_edge_mask);
5120 count = grid_data->num_edges;
5121 break;
5122 }
5123 }
5124
5125 size_t core_mask_size = count * sizeof(**grid_core_mask);
5126 if (*grid_core_mask == NULL) *grid_core_mask = xmalloc(core_mask_size);
5127 memcpy(*grid_core_mask, is_core, core_mask_size);
5128}
5129
5130/* ---------------------------------------------------------------------- */
5131
5132size_t yac_cget_grid_size ( int located, int grid_id ) {
5133
5134 struct yac_basic_grid * grid =
5136 enum yac_location location = yac_get_location(located);
5137
5139}
5140
5141/* ---------------------------------------------------------------------- */
5142
5143void yac_ccompute_grid_cell_areas ( int grid_id, double * cell_areas) {
5144
5145 struct yac_basic_grid * grid = yac_unique_id_to_pointer(grid_id, "grid_id");
5146
5147 yac_basic_grid_compute_cell_areas(grid, cell_areas);
5148}
5149
5150/* ---------------------------------------------------------------------- */
5151
5152size_t yac_cget_points_size ( int points_id ) {
5153
5155 yac_unique_id_to_pointer(points_id, "points_id");
5156 struct yac_basic_grid * grid = points->grid;
5158
5160}
5161
5162/* ---------------------------------------------------------------------- */
5163
5177
5178void yac_cfree_interp_stack_config(int interp_stack_config_id) {
5179
5180 struct yac_interp_stack_config * interp_stack_config =
5182 interp_stack_config_id, "interp_stack_config_id");
5183 yac_interp_stack_config_delete(interp_stack_config);
5184
5185 int flag = 0;
5186 for (size_t i = 0; i < num_interp_stack_configs; ++i) {
5187 if (interp_stack_configs[i] == interp_stack_config)
5188 interp_stack_configs[i] = NULL;
5189 flag |= (interp_stack_configs[i] != NULL);
5190 }
5191 if (!flag) {
5193 interp_stack_configs = NULL;
5195 }
5196}
5197
5199 int interp_stack_config_id,
5200 int reduction_type, int partial_coverage) {
5201
5202 struct yac_interp_stack_config * interp_stack_config =
5204 interp_stack_config_id, "interp_stack_config_id");
5205
5206 YAC_ASSERT(
5207 (reduction_type == YAC_INTERP_AVG_ARITHMETIC) ||
5208 (reduction_type == YAC_INTERP_AVG_DIST) ||
5209 (reduction_type == YAC_INTERP_AVG_BARY),
5210 "ERROR(yac_add_interp_stack_config_average): invalid reduction type")
5211
5213 interp_stack_config, (enum yac_interp_avg_weight_type)reduction_type,
5214 partial_coverage);
5215}
5216
5218 int interp_stack_config_id,
5219 int weight_type, int partial_coverage) {
5220
5221 struct yac_interp_stack_config * interp_stack_config =
5223 interp_stack_config_id, "interp_stack_config_id");
5224
5225 YAC_ASSERT(
5228 "ERROR(yac_add_interp_stack_config_ncc): invalid reduction type")
5229
5231 interp_stack_config, (enum yac_interp_ncc_weight_type)weight_type,
5232 partial_coverage);
5233}
5234
5236 int interp_stack_config_id,
5237 int type, size_t n, double max_search_distance, double scale) {
5238
5239 struct yac_interp_stack_config * interp_stack_config =
5241 interp_stack_config_id, "interp_stack_config_id");
5242
5243 YAC_ASSERT(
5244 (type == YAC_INTERP_NNN_AVG) ||
5247 (type == YAC_INTERP_NNN_RBF) ||
5249 "ERROR(yac_add_interp_stack_config_nnn): invalid weightening type")
5250
5252 interp_stack_config, (enum yac_interp_nnn_weight_type)type, n,
5253 max_search_distance, scale);
5254}
5255
5257 int interp_stack_config_id,
5258 int weight_type, int search_distance_type, double search_distance, double scale) {
5259
5260 struct yac_interp_stack_config * interp_stack_config =
5262 interp_stack_config_id, "interp_stack_config_id");
5263
5264 YAC_ASSERT(
5269 "ERROR(yac_cadd_interp_stack_config_dnn): invalid weight type")
5270
5271 YAC_ASSERT(
5272 (search_distance_type == YAC_INTERP_DNN_SEARCH_DISTANCE_FIXED) ||
5273 (search_distance_type == YAC_INTERP_DNN_SEARCH_DISTANCE_CELL_AREA),
5274 "ERROR(yac_cadd_interp_stack_config_dnn): invalid search distance type")
5275
5277 interp_stack_config,
5279 (enum yac_interp_dnn_search_distance_type)search_distance_type,
5281}
5282
5284 int interp_stack_config_id,
5285 size_t n, double max_search_distance, double scale) {
5286
5287 struct yac_interp_stack_config * interp_stack_config =
5289 interp_stack_config_id, "interp_stack_config_id");
5290
5292 interp_stack_config, n, max_search_distance, scale);
5293}
5294
5296 int interp_stack_config_id, int order, int enforced_conserv,
5297 int partial_coverage, int normalisation) {
5298
5299 struct yac_interp_stack_config * interp_stack_config =
5301 interp_stack_config_id, "interp_stack_config_id");
5302
5303 YAC_ASSERT(
5304 (normalisation == YAC_INTERP_CONSERV_DESTAREA) ||
5305 (normalisation == YAC_INTERP_CONSERV_FRACAREA),
5306 "ERROR(yac_add_interp_stack_config_conservative):"
5307 "invalid normalisation type")
5308
5310 interp_stack_config, order, enforced_conserv, partial_coverage,
5311 (enum yac_interp_method_conserv_normalisation)normalisation);
5312}
5313
5314void yac_cget_ext_spmap_config(int * ext_spmap_config_id) {
5315
5316 ExtSpmapConfig * ext_spmap_config =
5317 xmalloc(1 * sizeof(*ext_spmap_config));
5318
5319 ext_spmap_config->spread_distance =
5321 ext_spmap_config->max_search_distance =
5323 ext_spmap_config->weight_type =
5325 ext_spmap_config->scale_type =
5327
5328 ext_spmap_config->src_cell_area_config.type =
5330 ext_spmap_config->src_cell_area_config.data.yac.sphere_radius =
5332 ext_spmap_config->tgt_cell_area_config.type =
5334 ext_spmap_config->tgt_cell_area_config.data.yac.sphere_radius =
5336
5337 *ext_spmap_config_id = yac_pointer_to_unique_id(ext_spmap_config);
5338}
5339
5340void yac_cfree_ext_spmap_config(int ext_spmap_config_id) {
5341
5342 ExtSpmapConfig * ext_spmap_config =
5344 ext_spmap_config_id, "ext_spmap_config_id");
5345
5346 if (ext_spmap_config->src_cell_area_config.type ==
5348 free(ext_spmap_config->src_cell_area_config.data.file.filename);
5349 free(ext_spmap_config->src_cell_area_config.data.file.varname);
5350 }
5351 if (ext_spmap_config->tgt_cell_area_config.type ==
5353 free(ext_spmap_config->tgt_cell_area_config.data.file.filename);
5354 free(ext_spmap_config->tgt_cell_area_config.data.file.varname);
5355 }
5356
5357 free(ext_spmap_config);
5358}
5359
5361 int ext_spmap_config_id, double spread_distance) {
5362
5363 ExtSpmapConfig * ext_spmap_config =
5365 ext_spmap_config_id, "ext_spmap_config_id");
5366
5367 ext_spmap_config->spread_distance = spread_distance;
5368}
5369
5371 int ext_spmap_config_id, double max_search_distance) {
5372
5373 ExtSpmapConfig * ext_spmap_config =
5375 ext_spmap_config_id, "ext_spmap_config_id");
5376
5377 ext_spmap_config->max_search_distance = max_search_distance;
5378}
5379
5381 int ext_spmap_config_id, int weight_type) {
5382
5383 ExtSpmapConfig * ext_spmap_config =
5385 ext_spmap_config_id, "ext_spmap_config_id");
5386
5387 YAC_ASSERT(
5390 "ERROR(yac_cset_ext_spmap_config_weight_type): invalid weight type");
5391
5392 ext_spmap_config->weight_type =
5394}
5395
5397 int ext_spmap_config_id, int scale_type) {
5398
5399 ExtSpmapConfig * ext_spmap_config =
5401 ext_spmap_config_id, "ext_spmap_config_id");
5402
5403 YAC_ASSERT(
5404 (scale_type == YAC_INTERP_SPMAP_NONE) ||
5405 (scale_type == YAC_INTERP_SPMAP_SRCAREA) ||
5406 (scale_type == YAC_INTERP_SPMAP_INVTGTAREA) ||
5407 (scale_type == YAC_INTERP_SPMAP_FRACAREA),
5408 "ERROR(yac_cset_ext_spmap_config_scale_type): invalid scaling type");
5409
5410 ext_spmap_config->scale_type =
5411 (enum yac_interp_spmap_scale_type)scale_type;
5412}
5413
5415 int ext_spmap_config_id, double sphere_radius) {
5416
5417 ExtSpmapConfig * ext_spmap_config =
5419 ext_spmap_config_id, "ext_spmap_config_id");
5420
5421 if (ext_spmap_config->src_cell_area_config.type ==
5423 free(ext_spmap_config->src_cell_area_config.data.file.filename);
5424 free(ext_spmap_config->src_cell_area_config.data.file.varname);
5425 }
5426
5427 ext_spmap_config->src_cell_area_config.type =
5429 ext_spmap_config->src_cell_area_config.data.yac.sphere_radius = sphere_radius;
5430}
5431
5433 int ext_spmap_config_id, double sphere_radius) {
5434
5435 ExtSpmapConfig * ext_spmap_config =
5437 ext_spmap_config_id, "ext_spmap_config_id");
5438
5439 if (ext_spmap_config->tgt_cell_area_config.type ==
5441 free(ext_spmap_config->tgt_cell_area_config.data.file.filename);
5442 free(ext_spmap_config->tgt_cell_area_config.data.file.varname);
5443 }
5444
5445 ext_spmap_config->tgt_cell_area_config.type =
5447 ext_spmap_config->tgt_cell_area_config.data.yac.sphere_radius = sphere_radius;
5448}
5449
5451 int ext_spmap_config_id, char const * filename,
5452 char const * varname, int min_global_id) {
5453
5454 ExtSpmapConfig * ext_spmap_config =
5456 ext_spmap_config_id, "ext_spmap_config_id");
5457
5458 YAC_ASSERT(
5459 (filename != NULL) && (*filename != '\0'),
5460 "ERROR(yac_cset_ext_spmap_config_src_cell_area_config_file): "
5461 "missing file name");
5462
5463 YAC_ASSERT(
5464 (varname != NULL) && (*varname != '\0'),
5465 "ERROR(yac_cset_ext_spmap_config_src_cell_area_config_file): "
5466 "missing variable name");
5467
5468 if (ext_spmap_config->src_cell_area_config.type ==
5470 free(ext_spmap_config->src_cell_area_config.data.file.filename);
5471 free(ext_spmap_config->src_cell_area_config.data.file.varname);
5472 }
5473
5474 ext_spmap_config->src_cell_area_config.type =
5476 ext_spmap_config->src_cell_area_config.data.file.filename =
5477 xstrdup(filename);
5478 ext_spmap_config->src_cell_area_config.data.file.varname =
5479 xstrdup(varname);
5480 ext_spmap_config->src_cell_area_config.data.file.min_global_id =
5481 min_global_id;
5482}
5483
5485 int ext_spmap_config_id, char const * filename,
5486 char const * varname, int min_global_id) {
5487
5488 ExtSpmapConfig * ext_spmap_config =
5490 ext_spmap_config_id, "ext_spmap_config_id");
5491
5492 YAC_ASSERT(
5493 (filename != NULL) && (*filename != '\0'),
5494 "ERROR(yac_cset_ext_spmap_config_tgt_cell_area_config_file): "
5495 "missing file name");
5496
5497 YAC_ASSERT(
5498 (varname != NULL) && (*varname != '\0'),
5499 "ERROR(yac_cset_ext_spmap_config_tgt_cell_area_config_file): "
5500 "missing variable name");
5501
5502 if (ext_spmap_config->tgt_cell_area_config.type ==
5504 free(ext_spmap_config->tgt_cell_area_config.data.file.filename);
5505 free(ext_spmap_config->tgt_cell_area_config.data.file.varname);
5506 }
5507
5508 ext_spmap_config->tgt_cell_area_config.type =
5510 ext_spmap_config->tgt_cell_area_config.data.file.filename =
5511 xstrdup(filename);
5512 ext_spmap_config->tgt_cell_area_config.data.file.varname =
5513 xstrdup(varname);
5514 ext_spmap_config->tgt_cell_area_config.data.file.min_global_id =
5515 min_global_id;
5516}
5517
5518void yac_cget_spmap_overwrite_config(int * spmap_overwrite_config_id) {
5519
5520 ExtSpmapConfigOverwriteConfig * spmap_overwrite_config =
5521 xmalloc(1 * sizeof(*spmap_overwrite_config));
5522
5523 spmap_overwrite_config->src_point_selection.type =
5525
5526 spmap_overwrite_config->spread_distance =
5528 spmap_overwrite_config->max_search_distance =
5530 spmap_overwrite_config->weight_type =
5532
5533 *spmap_overwrite_config_id = yac_pointer_to_unique_id(spmap_overwrite_config);
5534}
5535
5536void yac_cfree_spmap_overwrite_config(int spmap_overwrite_config_id) {
5537
5538 ExtSpmapConfigOverwriteConfig * spmap_overwrite_config =
5540 spmap_overwrite_config_id, "spmap_overwrite_config_id");
5541
5542 free(spmap_overwrite_config);
5543}
5544
5546 int spmap_overwrite_config_id, double center_lon, double center_lat,
5547 double inc_angle) {
5548
5549 ExtSpmapConfigOverwriteConfig * spmap_overwrite_config =
5551 spmap_overwrite_config_id, "spmap_overwrite_config_id");
5552
5553 spmap_overwrite_config->src_point_selection.type =
5555 spmap_overwrite_config->src_point_selection.data.bnd_circle.center_lon =
5556 center_lon;
5557 spmap_overwrite_config->src_point_selection.data.bnd_circle.center_lat =
5558 center_lat;
5559 spmap_overwrite_config->src_point_selection.data.bnd_circle.inc_angle =
5560 inc_angle;
5561}
5562
5564 int spmap_overwrite_config_id, double spread_distance) {
5565
5566 ExtSpmapConfigOverwriteConfig * spmap_overwrite_config =
5568 spmap_overwrite_config_id, "spmap_overwrite_config_id");
5569
5570 spmap_overwrite_config->spread_distance = spread_distance;
5571}
5572
5574 int spmap_overwrite_config_id, double max_search_distance) {
5575
5576 ExtSpmapConfigOverwriteConfig * spmap_overwrite_config =
5578 spmap_overwrite_config_id, "spmap_overwrite_config_id");
5579
5580 spmap_overwrite_config->max_search_distance = max_search_distance;
5581}
5582
5584 int spmap_overwrite_config_id, int weight_type) {
5585
5586 ExtSpmapConfigOverwriteConfig * spmap_overwrite_config =
5588 spmap_overwrite_config_id, "spmap_overwrite_config_id");
5589
5590 YAC_ASSERT(
5593 "ERROR(yac_cset_spmap_overwrite_config_weight_type): invalid weight type");
5594
5595 spmap_overwrite_config->weight_type =
5597}
5598
5600 int interp_stack_config_id, double spread_distance,
5601 double max_search_distance, int weight_type, int scale_type,
5602 double src_sphere_radius, char const * src_filename,
5603 char const * src_varname, int src_min_global_id,
5604 double tgt_sphere_radius, char const * tgt_filename,
5605 char const * tgt_varname, int tgt_min_global_id) {
5606
5607 struct yac_interp_stack_config * interp_stack_config =
5609 interp_stack_config_id, "interp_stack_config_id");
5610
5611 YAC_ASSERT(
5614 "ERROR(yac_add_interp_stack_config_spmap):"
5615 "invalid weightening type")
5616
5617 YAC_ASSERT(
5618 (scale_type == YAC_INTERP_SPMAP_NONE) ||
5619 (scale_type == YAC_INTERP_SPMAP_SRCAREA) ||
5620 (scale_type == YAC_INTERP_SPMAP_INVTGTAREA) ||
5621 (scale_type == YAC_INTERP_SPMAP_FRACAREA),
5622 "ERROR(yac_add_interp_stack_config_spmap):"
5623 "invalid scaling type")
5624
5626 interp_stack_config, spread_distance, max_search_distance,
5628 (enum yac_interp_spmap_scale_type)scale_type,
5629 src_sphere_radius, src_filename, src_varname, src_min_global_id,
5630 tgt_sphere_radius, tgt_filename, tgt_varname, tgt_min_global_id);
5631}
5632
5633static struct yac_spmap_cell_area_config *
5635
5636 struct yac_spmap_cell_area_config * cell_area_config = NULL;
5637
5638 switch (config.type) {
5640 "ERROR(generate_cell_area_config): invalid cell area config type");
5642 cell_area_config =
5644 break;
5645 };
5647 cell_area_config =
5649 config.data.file.filename, config.data.file.varname,
5650 (yac_int)config.data.file.min_global_id);
5651 break;
5652 };
5653 }
5654
5655 return cell_area_config;
5656}
5657
5659 int spmap_overwrite_config_id) {
5660
5661 ExtSpmapConfigOverwriteConfig * ext_spmap_overwrite_config =
5663 spmap_overwrite_config_id, "spmap_overwrite_config_id");
5664
5665 struct yac_point_selection * src_point_selection;
5666
5667 YAC_ASSERT(
5668 ext_spmap_overwrite_config->src_point_selection.type !=
5670 "ERROR(generate_overwrite_config): missing point selection type");
5671
5672 switch(ext_spmap_overwrite_config->src_point_selection.type) {
5674 "ERROR(generate_overwrite_config): invalid point selection type");
5676 src_point_selection =
5678 ext_spmap_overwrite_config->src_point_selection.data.
5680 ext_spmap_overwrite_config->src_point_selection.data.
5682 ext_spmap_overwrite_config->src_point_selection.data.
5684 break;
5685 }
5686 }
5687
5688 struct yac_interp_spmap_config * spmap_config =
5690 ext_spmap_overwrite_config->spread_distance,
5691 ext_spmap_overwrite_config->max_search_distance,
5692 ext_spmap_overwrite_config->weight_type, NULL);
5693
5694 struct yac_spmap_overwrite_config * overwrite_config =
5696
5697 yac_interp_spmap_config_delete(spmap_config);
5699
5700 return overwrite_config;
5701}
5702
5704 int interp_stack_config_id, int ext_spmap_config_id,
5705 int * spmap_overwrite_config_ids, int spmap_overwrite_config_count) {
5706
5707 struct yac_interp_stack_config * interp_stack_config =
5709 interp_stack_config_id, "interp_stack_config_id");
5710
5711 ExtSpmapConfig * ext_spmap_config =
5713 ext_spmap_config_id, "ext_spmap_config_id");
5714
5715 struct yac_spmap_cell_area_config * src_cell_area_config =
5717 struct yac_spmap_cell_area_config * tgt_cell_area_config =
5719
5720 struct yac_spmap_scale_config * scale_config =
5722 ext_spmap_config->scale_type, src_cell_area_config, tgt_cell_area_config);
5723
5724 yac_spmap_cell_area_config_delete(tgt_cell_area_config);
5725 yac_spmap_cell_area_config_delete(src_cell_area_config);
5726
5727 struct yac_interp_spmap_config * spmap_config =
5729 ext_spmap_config->spread_distance, ext_spmap_config->max_search_distance,
5730 ext_spmap_config->weight_type, scale_config);
5731
5732 struct yac_spmap_overwrite_config ** overwrite_configs =
5733 (spmap_overwrite_config_count > 0)?
5734 xcalloc(
5735 ((size_t)spmap_overwrite_config_count + 1),
5736 sizeof(*overwrite_configs)):NULL;
5737
5738 for (int i = 0; i < spmap_overwrite_config_count; ++i) {
5739 overwrite_configs[i] =
5740 generate_overwrite_config(spmap_overwrite_config_ids[i]);
5741 }
5742
5744 interp_stack_config, spmap_config, overwrite_configs);
5745
5746 for (int i = 0; i < spmap_overwrite_config_count; ++i) {
5747 yac_spmap_overwrite_config_delete(overwrite_configs[i]);
5748 }
5749 free(overwrite_configs);
5750 yac_interp_spmap_config_delete(spmap_config);
5751 yac_spmap_scale_config_delete(scale_config);
5752}
5753
5755 int interp_stack_config_id, double spread_distance,
5756 double max_search_distance, int weight_type, int scale_type,
5757 double src_sphere_radius, char const * src_filename,
5758 char const * src_varname, int src_min_global_id,
5759 double tgt_sphere_radius, char const * tgt_filename,
5760 char const * tgt_varname, int tgt_min_global_id,
5761 int * overwrite_config_ids, int overwrite_config_count) {
5762
5763 if (src_filename && (src_filename[0] == '\0')) src_filename = NULL;
5764 if (src_varname && (src_varname[0] == '\0')) src_varname = NULL;
5765 if (tgt_filename && (tgt_filename[0] == '\0')) tgt_filename = NULL;
5766 if (tgt_varname && (tgt_varname[0] == '\0')) tgt_varname = NULL;
5767
5768 if (overwrite_config_count == 0) {
5769
5771 interp_stack_config_id, spread_distance, max_search_distance,
5772 weight_type, scale_type,
5773 src_sphere_radius, src_filename, src_varname, src_min_global_id,
5774 tgt_sphere_radius, tgt_filename, tgt_varname, tgt_min_global_id);
5775
5776 } else {
5777
5778 YAC_ASSERT(
5779 overwrite_config_ids,
5780 "ERROR(yac_cadd_interp_stack_config_spmap_f2c): "
5781 "missing overwrite configuration ids");
5782
5783 int ext_spmap_config_id;
5784 yac_cget_ext_spmap_config(&ext_spmap_config_id);
5786 ext_spmap_config_id, spread_distance);
5788 ext_spmap_config_id, max_search_distance);
5790 yac_cset_ext_spmap_config_scale_type(ext_spmap_config_id, scale_type);
5791
5792 if (src_filename != NULL) {
5794 src_varname != NULL,
5795 "ERROR(yac_cadd_interp_stack_config_spmap_f2c): source file name "
5796 "\"%s\" was provided, but variable name is missing", src_filename);
5798 src_sphere_radius == YAC_INTERP_SPMAP_SPHERE_RADIUS_DEFAULT,
5799 "ERROR(yac_cadd_interp_stack_config_spmap_f2c): source file name "
5800 "\"%s\" was provided, but sphere radius is set as well", src_filename);
5802 ext_spmap_config_id, src_filename, src_varname, src_min_global_id);
5803 } else {
5805 ext_spmap_config_id, src_sphere_radius);
5806 }
5807
5808 if (tgt_filename != NULL) {
5810 tgt_varname != NULL,
5811 "ERROR(yac_cadd_interp_stack_config_spmap_f2c): target file name "
5812 "\"%s\" was provided, but variable name is missing", tgt_filename);
5814 tgt_sphere_radius == YAC_INTERP_SPMAP_SPHERE_RADIUS_DEFAULT,
5815 "ERROR(yac_cadd_interp_stack_config_spmap_f2c): target file name "
5816 "\"%s\" was provided, but sphere radius is set as well", tgt_filename);
5818 ext_spmap_config_id, tgt_filename, tgt_varname, tgt_min_global_id);
5819 } else {
5821 ext_spmap_config_id, tgt_sphere_radius);
5822 }
5823
5825 interp_stack_config_id, ext_spmap_config_id,
5826 overwrite_config_ids, overwrite_config_count);
5827
5828 yac_cfree_ext_spmap_config(ext_spmap_config_id);
5829 }
5830}
5831
5832void yac_cadd_interp_stack_config_hcsbb(int interp_stack_config_id) {
5833
5834 struct yac_interp_stack_config * interp_stack_config =
5836 interp_stack_config_id, "interp_stack_config_id");
5837
5838 yac_interp_stack_config_add_hcsbb(interp_stack_config);
5839}
5840
5842 int interp_stack_config_id, char const * filename,
5843 int on_missing_file, int on_succes) {
5844
5845 struct yac_interp_stack_config * interp_stack_config =
5847 interp_stack_config_id, "interp_stack_config_id");
5848
5849 YAC_ASSERT(
5850 (on_missing_file == YAC_INTERP_FILE_MISSING_ERROR) ||
5851 (on_missing_file == YAC_INTERP_FILE_MISSING_CONT),
5852 "ERROR(yac_cadd_interp_stack_config_user_file_2):"
5853 "invalid on_missing_file value")
5854
5855 YAC_ASSERT(
5856 (on_succes == YAC_INTERP_FILE_SUCCESS_STOP) ||
5857 (on_succes == YAC_INTERP_FILE_SUCCESS_CONT),
5858 "ERROR(yac_cadd_interp_stack_config_user_file_2):"
5859 "invalid on_succes value")
5860
5862 interp_stack_config, filename,
5863 (enum yac_interp_file_on_missing_file)on_missing_file,
5864 (enum yac_interp_file_on_success)on_succes);
5865}
5866
5868 int interp_stack_config_id, char const * filename) {
5869
5871 interp_stack_config_id, filename,
5874}
5875
5877 int interp_stack_config_id, double value) {
5878
5879 struct yac_interp_stack_config * interp_stack_config =
5881 interp_stack_config_id, "interp_stack_config_id");
5882
5883 yac_interp_stack_config_add_fixed(interp_stack_config, value);
5884}
5885
5887 int interp_stack_config_id, char const * constructor_key,
5888 char const * do_search_key) {
5889
5890 struct yac_interp_stack_config * interp_stack_config =
5892 interp_stack_config_id, "interp_stack_config_id");
5893
5895 interp_stack_config, constructor_key, do_search_key);
5896}
5897
5899 int interp_stack_config_id, int creep_distance) {
5900
5901 struct yac_interp_stack_config * interp_stack_config =
5903 interp_stack_config_id, "interp_stack_config_id");
5904
5905 yac_interp_stack_config_add_creep(interp_stack_config, creep_distance);
5906}
5907
5909 int interp_stack_config_id, char const * func_compute_weights_key) {
5910
5911 struct yac_interp_stack_config * interp_stack_config =
5913 interp_stack_config_id, "interp_stack_config_id");
5914
5916 interp_stack_config, func_compute_weights_key);
5917}
5918
5919/* ---------------------------------------------------------------------- */
5920
5928
5929/* ---------------------------------------------------------------------- */
5930
5932 char const * interp_stack_config, int parse_flags) {
5933
5934
5936 xrealloc(
5939
5942 interp_stack_config, parse_flags);
5943
5944 int interp_stack_config_id =
5947
5948 return interp_stack_config_id;
5949}
5950
5952 char const * interp_stack_config, int * interp_stack_config_id) {
5953
5954 *interp_stack_config_id =
5956 interp_stack_config, YAC_YAML_PARSER_DEFAULT);
5957}
5958
5960 char const * interp_stack_config, int * interp_stack_config_id) {
5961
5962 *interp_stack_config_id =
5964 interp_stack_config, YAC_YAML_PARSER_JSON_FORCE);
5965}
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:53
struct yac_basic_grid_data * yac_basic_grid_get_data(struct yac_basic_grid *grid)
Definition basic_grid.c:140
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:287
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:211
char const * yac_basic_grid_get_name(struct yac_basic_grid *grid)
Definition basic_grid.c:131
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:150
void yac_basic_grid_delete(struct yac_basic_grid *grid)
Definition basic_grid.c:73
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:65
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:68
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:69
int const YAC_YAML_PARSER_DEFAULT
default parse flags (YAML format)
Definition config_yaml.c:70
double scale
char const * yac_time_to_ISO(char const *time, enum yac_time_unit_type time_unit)
Definition event.c:336
int const YAC_YAML_PARSER_JSON_FORCE
assume JSON format
Definition config_yaml.c:72
search_distance
@ COUPLING
void yac_couple_config_grid_set_metadata(struct yac_couple_config *couple_config, char const *grid_name, const char *metadata)
int yac_couple_config_field_is_valid(struct yac_couple_config *couple_config, size_t component_idx, size_t field_idx)
void yac_couple_config_get_field_source(struct yac_couple_config *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_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)
size_t yac_couple_config_get_num_fields(struct yac_couple_config *couple_config, size_t component_idx)
char const * yac_couple_config_get_field_timestep(struct yac_couple_config *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 *couple_config, char const *component_name, char const *grid_name, char const *field_name)
void yac_couple_config_field_set_metadata(struct yac_couple_config *couple_config, const char *comp_name, const char *grid_name, const char *field_name, const char *metadata)
char const * yac_couple_config_get_field_name(struct yac_couple_config *couple_config, size_t component_idx, size_t field_idx)
void yac_couple_config_component_set_metadata(struct yac_couple_config *couple_config, char const *comp_name, const char *metadata)
size_t yac_couple_config_get_field_collection_size(struct yac_couple_config *couple_config, char const *component_name, char const *grid_name, char const *field_name)
double yac_couple_config_get_frac_mask_fallback_value(struct yac_couple_config *couple_config, char const *component_name, char const *grid_name, char const *field_name)
const char * yac_couple_config_field_get_metadata(struct yac_couple_config *couple_config, const char *comp_name, const char *grid_name, const char *field_name)
const char * yac_couple_config_grid_get_metadata(struct yac_couple_config *couple_config, const char *grid_name)
const char * yac_couple_config_component_get_metadata(struct yac_couple_config *couple_config, const char *comp_name)
size_t yac_couple_config_get_component_idx(struct yac_couple_config *couple_config, char const *component_name)
char const * yac_couple_config_get_grid_name(struct yac_couple_config *couple_config, size_t grid_idx)
void yac_couple_config_grid_set_output_filename(struct yac_couple_config *couple_config, char const *grid_name, const char *output_filename)
char const * yac_couple_config_get_component_name(struct yac_couple_config *couple_config, size_t component_idx)
size_t yac_couple_config_get_num_grids(struct yac_couple_config *couple_config)
char const * yac_couple_config_get_field_grid_name(struct yac_couple_config *couple_config, size_t component_idx, size_t field_idx)
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)
size_t yac_couple_config_get_num_components(struct yac_couple_config *couple_config)
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:182
void yac_event_update(struct event *event)
Definition event.c:170
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:433
unsigned yac_get_coupling_field_collection_size(struct coupling_field *field)
Definition fields.c:94
const char * yac_get_coupling_field_timestep(struct coupling_field *field)
Definition fields.c:99
unsigned yac_get_coupling_field_num_puts(struct coupling_field *field)
Definition fields.c:502
char const * yac_get_coupling_field_comp_name(struct coupling_field *field)
Definition fields.c:127
int yac_get_coupling_field_put_op_time_accumulation_count(struct coupling_field *field, unsigned put_idx)
Definition fields.c:454
double *** yac_get_coupling_field_put_op_send_frac_mask_acc(struct coupling_field *field, unsigned put_idx)
Definition fields.c:217
struct yac_basic_grid * yac_coupling_field_get_basic_grid(struct coupling_field *field)
Definition fields.c:121
size_t yac_coupling_field_get_num_interp_fields(struct coupling_field *field)
Definition fields.c:104
struct yac_interpolation * yac_get_coupling_field_put_op_interpolation(struct coupling_field *field, unsigned put_idx)
Definition fields.c:411
enum yac_location yac_get_coupling_field_get_interp_field_location(struct coupling_field *field, size_t interp_field_idx)
Definition fields.c:110
struct event * yac_get_coupling_field_get_op_event(struct coupling_field *field)
Definition fields.c:511
size_t yac_coupling_field_get_data_size(struct coupling_field *field, enum yac_location location)
Definition fields.c:144
struct yac_interp_field const * yac_coupling_field_get_interp_fields(struct coupling_field *cpl_field)
Definition fields.c:741
int * yac_get_coupling_field_get_mask(struct coupling_field *field)
Definition fields.c:318
struct event * yac_get_coupling_field_put_op_event(struct coupling_field *field, unsigned put_idx)
Definition fields.c:397
char * yac_coupling_field_get_datetime(struct coupling_field *cpl_field)
Definition fields.c:747
void yac_init_coupling_field_put_op_send_field_acc(struct coupling_field *field, unsigned put_idx, double init_value)
Definition fields.c:355
struct yac_interpolation * yac_get_coupling_field_get_op_interpolation(struct coupling_field *field)
Definition fields.c:545
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:612
void yac_set_coupling_field_put_op_time_accumulation_count(struct coupling_field *field, unsigned put_idx, int count)
Definition fields.c:486
int yac_get_coupling_field_get_op_use_raw_exchange(struct coupling_field *field)
Definition fields.c:522
struct yac_interpolation_exchange * yac_get_coupling_field_get_op_interpolation_exchange(struct coupling_field *field)
Definition fields.c:562
int yac_get_coupling_field_get_op_with_frac_mask(struct coupling_field *field)
Definition fields.c:533
enum yac_field_exchange_type yac_get_coupling_field_exchange_type(struct coupling_field *field)
Definition fields.c:133
const char * yac_get_coupling_field_name(struct coupling_field *field)
Definition fields.c:116
int ** yac_get_coupling_field_put_mask(struct coupling_field *field)
Definition fields.c:273
struct yac_interp_weights_data yac_get_coupling_field_get_op_interp_weights_data(struct coupling_field *field)
Definition fields.c:579
void yac_init_coupling_field_put_op_send_frac_mask_acc(struct coupling_field *field, unsigned put_idx, double init_value)
Definition fields.c:376
double *** yac_get_coupling_field_put_op_send_field_acc(struct coupling_field *field, unsigned put_idx)
Definition fields.c:207
int yac_get_coupling_field_put_op_use_raw_exchange(struct coupling_field *field, unsigned put_idx)
Definition fields.c:470
yac_field_exchange_type
Definition fields.h:12
@ SOURCE
Definition fields.h:14
@ TARGET
Definition fields.h:15
@ NOTHING
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.
void yac_instance_delete(struct yac_instance *instance)
Definition instance.c:1452
char * yac_instance_setup_and_emit_config(struct yac_instance *instance, struct yac_basic_grid **grids, size_t num_grids, int emit_flags)
Definition instance.c:1381
int yac_instance_get_comp_rank(struct yac_instance *instance, const char *comp_name)
Definition instance.c:1418
char * yac_instance_get_start_datetime(struct yac_instance *instance)
Definition instance.c:1499
char * yac_instance_get_end_datetime(struct yac_instance *instance)
Definition instance.c:1504
void yac_instance_def_datetime(struct yac_instance *instance, const char *start_datetime, const char *end_datetime)
Definition instance.c:1491
void yac_instance_setup(struct yac_instance *instance, struct yac_basic_grid **grids, size_t num_grids)
Definition instance.c:1357
void yac_instance_sync_def(struct yac_instance *instance)
Definition instance.c:1323
struct yac_instance * yac_instance_new(MPI_Comm comm)
Definition instance.c:1427
int yac_instance_get_nbr_comps(struct yac_instance *instance)
Definition instance.c:1402
int yac_instance_components_are_defined(struct yac_instance *instance)
Definition instance.c:1533
MPI_Comm yac_instance_get_comm(struct yac_instance *instance)
Definition instance.c:1469
struct coupling_field * yac_instance_add_field(struct yac_instance *instance, char const *field_name, char const *comp_name, struct yac_basic_grid *grid, struct yac_interp_field *interp_fields, size_t num_interp_fields, int collection_size, char const *timestep)
Definition instance.c:1546
void yac_instance_dummy_new(MPI_Comm comm)
Definition instance.c:1446
void yac_instance_def_components(struct yac_instance *instance, char const **comp_names, size_t num_comps)
Definition instance.c:1509
struct yac_couple_config * yac_instance_get_couple_config(struct yac_instance *instance)
Definition instance.c:1476
void yac_instance_def_couple(struct yac_instance *instance, char const *src_comp_name, char const *src_grid_name, char const *src_field_name, char const *tgt_comp_name, char const *tgt_grid_name, char const *tgt_field_name, char const *coupling_period, int time_reduction, struct yac_interp_stack_config *interp_stack_config, int src_lag, int tgt_lag, const char *weight_file_name, int weight_file_on_existing, int mapping_on_source, double scale_factor, double scale_summand, size_t num_src_mask_names, char const *const *src_mask_names, char const *tgt_mask_name, char const *yaxt_exchanger_name, struct yac_collection_selection const *collection_selection, int use_raw_exchange)
Definition instance.c:1611
void yac_instance_sync_def_comps(struct yac_instance *instance, char const **comp_names, size_t num_comp_names)
Definition instance.c:1333
int yac_instance_get_comp_size(struct yac_instance *instance, const char *comp_name)
Definition instance.c:1409
MPI_Comm yac_instance_get_comps_comm(struct yac_instance *instance, char const **comp_names, size_t num_comp_names)
Definition instance.c:1393
struct coupling_field * yac_instance_get_field(struct yac_instance *instance, const char *comp_name, const char *grid_name, const char *field_name)
Definition instance.c:1637
#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)
struct @22::@23 value
enum callback_type type
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)
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()
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_async(struct yac_interpolation_exchange *exchange, double **recv_data, char const *routine_name)
Execute the get phase asynchronously.
void yac_interpolation_exchange_execute_get(struct yac_interpolation_exchange *exchange, double **recv_data, char const *routine_name)
Execute the get phase and receive target data synchronously.
void yac_interpolation_exchange_wait(struct yac_interpolation_exchange *exchange, char const *routine_name)
Wait for completion of pending put/get phases.
void yac_interpolation_exchange_execute_put(struct yac_interpolation_exchange *exchange, double const **send_data, char const *routine_name)
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(struct yac_interpolation_exchange *exchange, double const **send_data_, double **recv_data_, char const *routine_name)
Execute the full exchange (put + get) synchronously.
Interpolation exchange object for temporary buffers and MPI exchanges.
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:43
int use_raw_exchange
Definition fields.c:45
double *** send_frac_mask_acc
Definition fields.c:44
enum yac_field_exchange_type exchange_type
Definition fields.c:34
unsigned num_puts
Definition fields.c:47
size_t num_interp_fields
Definition fields.c:26
struct yac_interpolation * interpolation
Definition fields.c:40
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:134
enum yac_location location
Definition yac.c:147
struct yac_basic_grid * grid
Definition yac.c:146
enum yac_location location
Definition yac.c:141
struct yac_basic_grid * grid
Definition yac.c:140
size_t coordinates_idx
Definition yac.c:142
char * filename
Definition yac.c:201
struct yac_cell_area_config::@75::@76 yac
double sphere_radius
Definition yac.c:198
struct yac_cell_area_config::@75::@77 file
enum yac_interp_spmap_cell_area_provider type
Definition yac.c:195
union yac_cell_area_config::@75 data
size_t num_src_mask_names
Definition yac.c:185
char * weight_file
Definition yac.c:180
char * tgt_mask_name
Definition yac.c:187
char ** src_mask_names
Definition yac.c:186
char * yaxt_exchanger_name
Definition yac.c:188
struct yac_collection_selection * collection_selection
Definition yac.c:190
int weight_file_on_existing
Definition yac.c:181
double scale_summand
Definition yac.c:184
double scale_factor
Definition yac.c:183
struct yac_ext_spmap_config_overwrite_config::@78::@79::@80 bnd_circle
enum yac_point_selection_type type
Definition yac.c:221
struct yac_ext_spmap_config_overwrite_config::@78 src_point_selection
enum yac_interp_spmap_weight_type weight_type
Definition yac.c:231
union yac_ext_spmap_config_overwrite_config::@78::@79 data
CellAreaConfig tgt_cell_area_config
Definition yac.c:215
enum yac_interp_spmap_scale_type scale_type
Definition yac.c:213
CellAreaConfig src_cell_area_config
Definition yac.c:215
double max_search_distance
Definition yac.c:211
enum yac_interp_spmap_weight_type weight_type
Definition yac.c:212
double spread_distance
Definition yac.c:210
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::@47::@48 bnd_circle
struct yac_point_selection * src_point_selection
int * cell_to_vertex
int collection_size
char * yaml_filename
char const src_grid_name[]
char const tgt_grid_name[]
unsigned cyclic[2]
static int mask[16]
size_t field_data_size
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)
static char * yac_version
Definition version.h:7
int const YAC_YEAR_OF_365_DAYS
Definition yac.c:70
void yac_cset_ext_spmap_config_src_cell_area_config_yac(int ext_spmap_config_id, double sphere_radius)
Definition yac.c:5414
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:3021
int const YAC_ACTION_PUT_FOR_CHECKPOINT
Definition yac.c:50
static const char * mpi_handshake_group_name
Name of the MPI group used by YAC in MPI handshake.
Definition yac.c:155
int const YAC_REDUCTION_TIME_AVERAGE
Definition yac.c:55
void yac_cenddef_and_emit_config(int emit_flags, char **config)
Definition yac.c:4442
static double *** get_src_field_buffer_pointers(int field_id, size_t collection_size, double *src_field_buffer)
Definition yac.c:2525
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:1974
static int yac_lookup_pointer(void const *pointer)
Definition yac.c:276
void yac_cget_raw_async(int const field_id, int collection_size, double ***src_field_buffer, int *info, int *ierr)
Definition yac.c:2989
#define NO_CHECK
void yac_ccompute_grid_cell_areas(int grid_id, double *cell_areas)
Definition yac.c:5143
int const YAC_DNN_GAUSS
Definition yac.c:88
void yac_cinit_comm_dummy(MPI_Comm comm)
Definition yac.c:533
void yac_cget_grid_names(int nbr_grids, const char **grid_names)
Definition yac.c:4614
void yac_cadd_interp_stack_config_ncc(int interp_stack_config_id, int weight_type, int partial_coverage)
Definition yac.c:5217
void yac_cget_ext_couple_config_scale_factor(int ext_couple_config_id, double *scale_factor)
Definition yac.c:1681
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:1526
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:3611
int const YAC_NCC_AVG
Definition yac.c:77
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:5703
void yac_cget_instance_size_c2py(int yac_instance_id, int *size)
Definition yac.c:573
#define SUM
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:2793
void yac_cset_global_index_yac_int(yac_int const *global_index, int location, int grid_id)
Definition yac.c:5063
void yac_cenddef(void)
Definition yac.c:4427
static int yac_init(MPI_Comm comm)
Definition yac.c:459
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:3298
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:3126
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:1448
int const YAC_ACTION_OUT_OF_BOUND
put/get is outside of the valid range
Definition yac.c:51
int const YAC_DNN_SEARCH_DISTANCE_CELL_AREA
Definition yac.c:92
void yac_cget_ext_couple_config_mapping_side(int ext_couple_config_id, int *mapping_side)
Definition yac.c:1658
void yac_cset_config_output_file(const char *filename, int filetype, int sync_location, int include_definitions)
Definition yac.c:656
void yac_cpredef_comp_instance(int yac_instance_id, char const *name, int *comp_id)
Definition yac.c:945
int const YAC_SPMAP_SRCAREA
Definition yac.c:101
int const YAC_CONFIG_OUTPUT_SYNC_LOC_ENDDEF
after end of definitions
Definition yac.c:130
char * yac_cget_start_datetime_instance(int yac_instance_id)
Definition yac.c:802
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:1332
void yac_cset_global_index(int const *global_index, int location, int grid_id)
Definition yac.c:5076
void yac_cset_grid_output_file_instance(int yac_instance_id, const char *gridname, const char *filename)
Definition yac.c:668
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:2242
int const YAC_NNN_RBF
Definition yac.c:83
void yac_cdef_datetime_instance(int yac_instance_id, const char *start_datetime, const char *end_datetime)
Definition yac.c:761
int yac_cget_role_from_field_id(int field_id)
Definition yac.c:4749
void yac_cget_(int const field_id, int const collection_size, double *recv_field, int *info, int *ierr)
Definition yac.c:2754
int yac_cget_nbr_grids_instance(int yac_instance_id)
Definition yac.c:4502
void yac_cfree_ext_couple_config(int ext_couple_config_id)
Definition yac.c:1579
const char * yac_cget_grid_metadata_instance(int yac_instance_id, const char *grid_name)
Definition yac.c:1513
int const YAC_FILE_SUCCESS_CONT
Definition yac.c:110
char * yac_cget_end_datetime_instance(int yac_instance_id)
Definition yac.c:817
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:5841
void yac_cdef_datetime(const char *start_datetime, const char *end_datetime)
Definition yac.c:770
static void * yac_cget_pre_processing(int const field_id, int collection_size, int *info, int *ierr)
Definition yac.c:2586
int const YAC_SPMAP_INVTGTAREA
Definition yac.c:102
void yac_get_comp_comm_f2c(int comp_id, MPI_Fint *comp_comm_f)
Definition yac.c:877
int const YAC_LOCATION_CELL
Definition yac.c:35
void yac_cfree_spmap_overwrite_config(int spmap_overwrite_config_id)
Definition yac.c:5536
int const YAC_REDUCTION_TIME_MINIMUM
Definition yac.c:56
void yac_cset_ext_couple_config_tgt_mask_name(int ext_couple_config_id, char const *tgt_mask_name)
Definition yac.c:1752
void yac_cget_ext_couple_config_weight_file_on_existing(int ext_couple_config_id, int *weight_file_on_existing)
Definition yac.c:1632
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:1882
static int user_input_data_add_mask(struct yac_basic_grid *grid, enum yac_location location, int const *is_valid, size_t nbr_points, char const *name)
Definition yac.c:1264
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:1070
void yac_cdef_grid_metadata(const char *grid_name, const char *metadata)
Definition yac.c:1479
int const YAC_FILE_MISSING_CONT
continue on missing file
Definition yac.c:106
int const YAC_TIME_UNIT_MINUTE
Definition yac.c:61
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:4876
void yac_cread_config_json(const char *yaml_filename)
Definition yac.c:618
void * yac_get_field_get_mask_c2f(int field_id)
Definition yac.c:3288
void yac_cget_grid_names_instance(int yac_instance_id, int nbr_grids, const char **grid_names)
Definition yac.c:4594
void yac_cset_ext_couple_config_scale_factor(int ext_couple_config_id, double scale_factor)
Definition yac.c:1674
static void yac_free_masks()
Definition yac.c:341
int const YAC_NCC_DIST
Definition yac.c:78
int const YAC_FILE_MISSING_ERROR
abort on missing file
Definition yac.c:105
int const YAC_ACTION_GET_FOR_CHECKPOINT
Definition yac.c:49
void yac_cset_ext_couple_config_weight_file_on_existing(int ext_couple_config_id, int weight_file_on_existing)
Definition yac.c:1625
void yac_cadd_interp_stack_config_creep(int interp_stack_config_id, int creep_distance)
Definition yac.c:5898
static void check_default_instance_id(char const *routine_name)
Definition yac.c:380
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:3096
void yac_cdef_component_metadata(const char *comp_name, const char *metadata)
Definition yac.c:1465
int const YAC_TIME_UNIT_YEAR
Definition yac.c:65
void yac_csync_def_comps(char const **comp_names, int num_comp_names)
Definition yac.c:4410
static void yac_free_components()
Definition yac.c:351
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:925
void yac_cget_comp_rank_c2py(int comp_id, int *rank)
Definition yac.c:894
void * yac_get_field_put_mask_c2f(int field_id)
Definition yac.c:3280
int yac_cget_field_role(const char *comp_name, const char *grid_name, const char *field_name)
Definition yac.c:4824
void yac_ccleanup()
Clean-up default YAC instance (see Restarting YAC)
Definition yac.c:720
int const YAC_AVG_ARITHMETIC
Definition yac.c:73
void yac_cget_comp_size_c2py(int comp_id, int *size)
Definition yac.c:887
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:2349
int const YAC_DNN_AVG
Definition yac.c:86
void yac_cset_spmap_overwrite_config_max_search_distance(int spmap_overwrite_config_id, double max_search_distance)
Definition yac.c:5573
void yac_cadd_compute_weights_callback(yac_func_compute_weights compute_weights_callback, void *user_data, char const *key)
Definition yac.c:5921
void yac_cmpi_handshake(MPI_Comm comm, size_t n, char const **group_names, MPI_Comm *group_comms)
Definition yac.c:443
int const YAC_REDUCTION_TIME_MAXIMUM
Definition yac.c:57
void yac_cset_ext_couple_config_scale_summand_(struct yac_ext_couple_config *ext_couple_config, double scale_summand)
Definition yac.c:1688
int const YAC_WGT_ON_EXISTING_ERROR
Definition yac.c:116
int const YAC_TIME_UNIT_MILLISECOND
Definition yac.c:59
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:4046
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:4470
int yac_cget_comp_nbr_grids_instance(int yac_instance_id, const char *comp_name)
Definition yac.c:4515
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:2671
int yac_cget_field_is_defined(const char *comp_name, const char *grid_name, const char *field_name)
Definition yac.c:4462
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:4915
const char * yac_cget_timestep_from_field_id(int field_id)
Definition yac.c:4735
int const YAC_FILE_SUCCESS_STOP
Definition yac.c:108
static struct user_input_data_component ** components
Definition yac.c:167
void yac_cget_raw(int const field_id, int collection_size, double ***src_field_buffer, int *info, int *ierr)
Definition yac.c:2976
int yac_cget_nbr_fields(const char *comp_name, const char *grid_name)
Definition yac.c:4563
int const YAC_DNN_SEARCH_DISTANCE_FIXED
Definition yac.c:91
#define ASSIGN
int const YAC_NNN_GAUSS
Definition yac.c:82
void yac_cset_ext_spmap_config_scale_type(int ext_spmap_config_id, int scale_type)
Definition yac.c:5396
void yac_cinit_comm_dummy_f2c(MPI_Fint comm_f)
Definition yac.c:544
void yac_csync_def_instance(int yac_instance_id)
Definition yac.c:4393
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:1711
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:4845
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:3780
static void cleanup()
Definition yac.c:729
void yac_cget_interp_stack_config_from_string_json(char const *interp_stack_config, int *interp_stack_config_id)
Definition yac.c:5959
void yac_cpredef_comp(char const *name, int *comp_id)
Definition yac.c:978
int yac_cyaml_get_emitter_flag_default_c2f()
Definition yac.c:584
void yac_csync_def(void)
Definition yac.c:4398
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:4453
static double ** get_recv_field_pointers(int const field_id, int const collection_size, double *recv_field)
Definition yac.c:2497
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:4996
int const YAC_TIME_UNIT_HOUR
Definition yac.c:62
static int default_instance_id_defined()
Definition yac.c:376
void yac_cinit(void)
Definition yac.c:523
int const YAC_YEAR_OF_360_DAYS
Definition yac.c:71
void yac_cget_raw_(int const field_id, int const collection_size, double *src_field_buffer, int *info, int *ierr)
Definition yac.c:2863
void yac_cfinalize_instance(int yac_instance_id)
Finalises YAC.
Definition yac.c:740
static struct user_input_data_masks ** masks
Definition yac.c:173
static void init_ext_couple_config(struct yac_ext_couple_config *ext_couple_config)
Definition yac.c:1542
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:3003
int const YAC_DNN_RBF
Definition yac.c:89
void yac_cfinalize()
Finalises YAC.
Definition yac.c:749
const char * yac_cget_field_name_from_field_id(int field_id)
Definition yac.c:4728
void yac_cget_ext_couple_config_collection_selection(int ext_couple_config_id, int *collection_size, int **collection_indices)
Definition yac.c:1848
void yac_cadd_interp_stack_config_check(int interp_stack_config_id, char const *constructor_key, char const *do_search_key)
Definition yac.c:5886
void yac_cenddef_instance(int yac_instance_id)
Definition yac.c:4420
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:3996
void yac_cget_ext_couple_config_yaxt_exchanger_name(int ext_couple_config_id, char const **yaxt_exchanger_name)
Definition yac.c:1781
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:1727
void yac_cget_raw_async_(int const field_id, int const collection_size, double *src_field_buffer, int *info, int *ierr)
Definition yac.c:2920
int yac_cget_nbr_comps_instance(int yac_instance_id)
Definition yac.c:4491
int yac_cget_nbr_fields_instance(int yac_instance_id, const char *comp_name, const char *grid_name)
Definition yac.c:4543
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:2202
void yac_cget_ext_couple_config(int *ext_couple_config_id)
Definition yac.c:1558
const char * yac_cget_mpi_handshake_group_name(void)
Retrieve the MPI handshake group name used by YAC.
Definition yac.c:841
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:2828
static size_t num_masks
Definition yac.c:174
static void yac_get(int const field_id, int collection_size, double **recv_field, int is_async, int *info, int *ierr)
Definition yac.c:2650
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:4936
size_t num_grids
Definition yac.c:165
void yac_cdef_grid_metadata_instance(int yac_instance_id, const char *grid_name, const char *metadata)
Definition yac.c:1470
void yac_cset_ext_couple_config_weight_file(int ext_couple_config_id, char const *weight_file)
Definition yac.c:1594
const char * yac_cget_component_metadata_instance(int yac_instance_id, const char *comp_name)
Definition yac.c:1500
void yac_cread_config_yaml_instance(int yac_instance_id, const char *yaml_filename)
Definition yac.c:595
void yac_cset_ext_spmap_config_spread_distance(int ext_spmap_config_id, double spread_distance)
Definition yac.c:5360
void yac_cset_ext_couple_config_yaxt_exchanger_name(int ext_couple_config_id, char const *yaxt_exchanger_name)
Definition yac.c:1774
static struct user_input_data_component * get_user_input_data_component(int comp_id, char const *routine)
Definition yac.c:847
int const YAC_LOCATION_CORNER
Definition yac.c:36
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:1928
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:4758
void yac_cset_ext_couple_config_scale_summand(int ext_couple_config_id, double scale_summand)
Definition yac.c:1697
void yac_cget_comp_comm(int comp_id, MPI_Comm *comp_comm)
Definition yac.c:865
void yac_cset_spmap_overwrite_config_weight_type(int spmap_overwrite_config_id, int weight_type)
Definition yac.c:5583
static struct yac_spmap_overwrite_config * generate_overwrite_config(int spmap_overwrite_config_id)
Definition yac.c:5658
const char * yac_cget_field_datetime(int field_id)
Definition yac.c:2432
int const YAC_SPMAP_AVG
Definition yac.c:97
int const YAC_CONSERV_DESTAREA
Definition yac.c:94
void yac_cget(int const field_id, int collection_size, double **recv_field, int *info, int *ierr)
Definition yac.c:2772
static size_t num_components
Definition yac.c:168
int const YAC_EXCHANGE_TYPE_SOURCE
Definition yac.c:40
void yac_cdef_comp_instance(int yac_instance_id, char const *comp_name, int *comp_id)
Definition yac.c:1016
static void yac_check_yac_int(MPI_Comm comm)
Definition yac.c:414
void yac_cupdate(int field_id)
Definition yac.c:2459
void yac_cget_action(int field_id, int *action)
Definition yac.c:2389
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:1608
static double *** get_src_field_buffer_pointers_ptr(int field_id, size_t collection_size, double **src_field_buffer)
Definition yac.c:2556
void yac_cset_ext_couple_config_use_raw_exchange_(struct yac_ext_couple_config *ext_couple_config, int use_raw_exchange)
Definition yac.c:1788
static void yac_free_interp_stack_configs()
Definition yac.c:364
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:3748
int const YAC_REDUCTION_TIME_ACCUMULATE
Definition yac.c:54
void yac_cset_ext_spmap_config_weight_type(int ext_spmap_config_id, int weight_type)
Definition yac.c:5380
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:1219
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:5545
int yac_cget_field_id(const char *comp_name, const char *grid_name, const char *field_name)
Definition yac.c:4483
void yac_cget_ext_couple_config_tgt_mask_name(int ext_couple_config_id, char const **tgt_mask_name)
Definition yac.c:1759
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:1735
const char * yac_cget_grid_name_from_field_id(int field_id)
Definition yac.c:4720
int yac_cget_collection_size_from_field_id(int field_id)
Definition yac.c:4742
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:4858
void yac_cmpi_handshake_f2c(MPI_Fint comm, int n, char const **group_names, MPI_Fint *group_comms)
Definition yac.c:449
void yac_cget_ext_couple_config_use_raw_exchange(int ext_couple_config_id, int *use_raw_exchange)
Definition yac.c:1801
int yac_cdefault_instance_defined(void)
Definition yac.c:481
int const YAC_EXCHANGE_TYPE_NONE
Definition yac.c:39
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:2030
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:1913
void yac_cset_ext_couple_config_use_raw_exchange(int ext_couple_config_id, int use_raw_exchange)
Definition yac.c:1794
static int yac_pointer_to_unique_id(void *pointer)
Definition yac.c:240
void check_mpi_initialised(char const *routine_name)
Definition yac.c:432
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:625
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:1112
void yac_cget_comps_comm(const char **comp_names, int num_comps, MPI_Comm *comps_comm)
Definition yac.c:915
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:3898
void yac_cinit_comm_instance(MPI_Comm comm, int *yac_instance_id)
Definition yac.c:485
static struct user_input_data_points ** points
Definition yac.c:170
void yac_cfree_ext_spmap_config(int ext_spmap_config_id)
Definition yac.c:5340
int const YAC_EXCHANGE_TYPE_TARGET
Definition yac.c:41
void yac_cread_config_json_instance(int yac_instance_id, const char *yaml_filename)
Definition yac.c:609
void yac_cget_instance_rank_c2py(int yac_instance_id, int *rank)
Definition yac.c:563
static struct yac_spmap_cell_area_config * generate_cell_area_config(CellAreaConfig config)
Definition yac.c:5634
void yac_cset_ext_couple_config_scale_factor_(struct yac_ext_couple_config *ext_couple_config, double scale_factor)
Definition yac.c:1665
const char * yac_cget_grid_metadata(const char *grid_name)
Definition yac.c:1521
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:1436
char * yac_cget_start_datetime(void)
Definition yac.c:809
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:4162
void yac_ccheck_field_dimensions(int field_id, int collection_size, int num_interp_fields, int const *interp_field_sizes)
Definition yac.c:2054
void yac_cget_interp_stack_config_from_string_yaml(char const *interp_stack_config, int *interp_stack_config_id)
Definition yac.c:5951
int const YAC_TIME_UNIT_MONTH
Definition yac.c:64
void yac_cset_ext_spmap_config_max_search_distance(int ext_spmap_config_id, double max_search_distance)
Definition yac.c:5370
int const YAC_CONFIG_OUTPUT_FORMAT_YAML
Definition yac.c:113
int const YAC_TIME_UNIT_SECOND
Definition yac.c:60
int const YAC_ACTION_RESTART
Definition yac.c:46
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:5295
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:3191
void yac_cset_ext_couple_config_mapping_side_(struct yac_ext_couple_config *ext_couple_config, int mapping_side)
Definition yac.c:1639
void yac_cdef_grid_cloud(const char *grid_name, int nbr_points, double *x_points, double *y_points, int *grid_id)
Definition yac.c:4980
static void yac_free_points()
Definition yac.c:331
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:4894
static int yac_instance_count
Definition yac.c:159
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:4358
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:1190
char * yac_cget_version(void)
Definition yac.c:835
static int pointer_lookup_table_size
Definition yac.c:162
int const YAC_LOCATION_EDGE
Definition yac.c:37
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:5484
int const YAC_DNN_DIST
Definition yac.c:87
void yac_cput(int const field_id, int const collection_size, double ***const send_field, int *info, int *ierr)
Definition yac.c:3734
void yac_cget_async(int const field_id, int collection_size, double **recv_field, int *info, int *ierr)
Definition yac.c:2781
void yac_cread_config_yaml(const char *yaml_filename)
Definition yac.c:604
void yac_cset_ext_couple_config_weight_file_(struct yac_ext_couple_config *ext_couple_config, char const *weight_file)
Definition yac.c:1586
int yac_cget_default_instance_id()
Definition yac.c:476
static size_t num_interp_stack_configs
Definition yac.c:177
void yac_cadd_interp_stack_config_user_file(int interp_stack_config_id, char const *filename)
Definition yac.c:5867
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:3859
const char * yac_cget_component_name_from_field_id(int field_id)
Definition yac.c:4713
void yac_cinit_comm_instance_f2c(MPI_Fint comm, int *yac_instance_id)
Definition yac.c:491
#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:4806
int const YAC_CONFIG_OUTPUT_SYNC_LOC_DEF_COMP
after component definition
Definition yac.c:126
int const YAC_SPMAP_FRACAREA
Definition yac.c:103
void yac_cdef_component_metadata_instance(int yac_instance_id, const char *comp_name, const char *metadata)
Definition yac.c:1457
void yac_cenddef_and_emit_config_instance(int yac_instance_id, int emit_flags, char **config)
Definition yac.c:4433
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:3963
void yac_ccheck_src_field_buffer_size(int field_id, int collection_size, int src_field_buffer_size_)
Definition yac.c:2115
char * yac_cget_end_datetime(void)
Definition yac.c:824
int const YAC_WGT_ON_EXISTING_OVERWRITE
overwrite existing weight file
Definition yac.c:118
int const YAC_ACTION_NONE
no data exchanges
Definition yac.c:43
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:1090
int const YAC_WGT_ON_EXISTING_KEEP
keep existing weight file
Definition yac.c:117
int yac_cyaml_get_emitter_flag_json_c2f()
Definition yac.c:588
void yac_cdef_calendar(int calendar)
Definition yac.c:778
int const YAC_SPMAP_NONE
Definition yac.c:100
void yac_cset_core_mask(int const *is_core, int location, int grid_id)
Definition yac.c:5092
void yac_cinit_comm_f2c(MPI_Fint comm_f)
Definition yac.c:506
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:2932
void yac_cwait(int field_id)
Definition yac.c:3248
void yac_cadd_interp_stack_config_rbf(int interp_stack_config_id, size_t n, double max_search_distance, double scale)
Definition yac.c:5283
int yac_cget_calendar()
Definition yac.c:795
int const YAC_CONFIG_OUTPUT_SYNC_LOC_SYNC_DEF
after synchronization of definition
Definition yac.c:128
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:2875
void yac_cget_comp_names(int nbr_comps, const char **comp_names)
Definition yac.c:4588
static int yac_add_grid(const char *grid_name, struct yac_basic_grid_data grid_data)
Definition yac.c:300
struct yac_ext_spmap_config ExtSpmapConfig
void yac_cdef_comps(char const **comp_names, int num_comps, int *comp_ids)
Definition yac.c:1008
const char * yac_cget_field_metadata(const char *comp_name, const char *grid_name, const char *field_name)
Definition yac.c:1535
int const YAC_ACTION_REDUCTION
data reduction, but data exchange
Definition yac.c:44
int const YAC_ACTION_GET_FOR_RESTART
last valid get
Definition yac.c:47
void yac_cput_(int const field_id, int const collection_size, double *send_field, int *info, int *ierr)
Definition yac.c:3076
void yac_cset_ext_spmap_config_tgt_cell_area_config_yac(int ext_spmap_config_id, double sphere_radius)
Definition yac.c:5432
void yac_cget_comps_comm_f2c(char const **comp_names, int num_comps, MPI_Fint *comps_comm_f)
Definition yac.c:935
int const YAC_PROLEPTIC_GREGORIAN
Definition yac.c:69
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:4619
double yac_cget_field_frac_mask_fallback_value(const char *comp_name, const char *grid_name, const char *field_name)
Definition yac.c:4798
void yac_cset_mask(int const *is_valid, int points_id)
Definition yac.c:1313
void yac_cget_async_(int const field_id, int const collection_size, double *recv_field, int *info, int *ierr)
Definition yac.c:2763
void yac_cadd_interp_stack_config_hcsbb(int interp_stack_config_id)
Definition yac.c:5832
void yac_cget_comps_comm_instance(int yac_instance_id, char const **comp_names, int num_comps, MPI_Comm *comps_comm)
Definition yac.c:905
void yac_cadd_interp_stack_config_fixed(int interp_stack_config_id, double value)
Definition yac.c:5876
int const YAC_TIME_UNIT_DAY
Definition yac.c:63
static size_t num_points
Definition yac.c:171
void yac_get_(int const field_id, int const collection_size, double *recv_field, int is_async, int *info, int *ierr)
Definition yac.c:2736
static void yac_cupdate_(struct coupling_field *cpl_field, struct event *event, int is_source)
Definition yac.c:2440
int yac_cget_comp_nbr_grids(const char *comp_name)
Definition yac.c:4538
int const YAC_ACTION_COUPLING
data exchange
Definition yac.c:45
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:4777
static int user_input_data_add_points(struct yac_basic_grid *grid, enum yac_location location, yac_coordinate_pointer coordinates)
Definition yac.c:1029
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:5450
int const YAC_TIME_UNIT_ISO_FORMAT
Definition yac.c:66
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:4831
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:4373
int const YAC_AVG_DIST
Definition yac.c:74
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:3926
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:4813
static void yac_check_version(MPI_Comm comm)
Definition yac.c:388
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:1304
static void * yac_unique_id_to_pointer(int id, char const *id_name)
Definition yac.c:259
int const YAC_CONSERV_FRACAREA
Definition yac.c:95
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:5599
void yac_cadd_interp_stack_config_user_callback(int interp_stack_config_id, char const *func_compute_weights_key)
Definition yac.c:5908
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:4958
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:1151
void yac_cset_ext_couple_config_mapping_side(int ext_couple_config_id, int mapping_side)
Definition yac.c:1651
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:1283
void yac_ccleanup_instance(int yac_instance_id)
Clean-up a YAC instance (see Restarting YAC)
Definition yac.c:712
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:4788
static void check_y_vertices(double const *y_vertices, size_t count, char const *routine_name)
Definition yac.c:1059
void yac_cfree_interp_stack_config(int interp_stack_config_id)
Definition yac.c:5178
static double *** get_send_field_pointers(int field_id, size_t collection_size, double *send_field)
Definition yac.c:3041
int const YAC_CALENDAR_NOT_SET
Definition yac.c:68
void yac_cset_grid_output_file(const char *gridname, const char *filename)
Definition yac.c:685
int const YAC_NNN_AVG
Definition yac.c:80
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:5235
@ YAC_CONFIG_OUTPUT_SYNC_LOC_ENDDEF_
Definition yac.c:123
@ YAC_CONFIG_OUTPUT_SYNC_LOC_SYNC_DEF_
Definition yac.c:122
@ YAC_CONFIG_OUTPUT_SYNC_LOC_DEF_COMP_
Definition yac.c:121
void yac_cget_ext_couple_config_scale_summand(int ext_couple_config_id, double *scale_summand)
Definition yac.c:1704
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:2153
int const YAC_CONFIG_OUTPUT_FORMAT_JSON
Definition yac.c:114
size_t yac_cget_grid_size(int located, int grid_id)
Definition yac.c:5132
void yac_cinit_instance(int *yac_instance_id)
Definition yac.c:511
void yac_ctest(int field_id, int *flag)
Definition yac.c:3224
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:1766
void yac_cget_interp_stack_config(int *interp_stack_config_id)
Definition yac.c:5164
void yac_cset_ext_couple_config_collection_selection(int ext_couple_config_id, int collection_size, int const *collection_indices)
Definition yac.c:1840
static void yac_free_pointer_unique_lookup()
Definition yac.c:291
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:5754
void yac_cinit_dummy(void)
Definition yac.c:550
void yac_cadd_interp_stack_config_average(int interp_stack_config_id, int reduction_type, int partial_coverage)
Definition yac.c:5198
int const YAC_ACTION_PUT_FOR_RESTART
last valid put
Definition yac.c:48
#define WEIGHT_ACC(ACC, EXTRA_CHECK)
int const YAC_NNN_ZERO
Definition yac.c:84
void yac_cdef_comp(char const *comp_name, int *comp_id)
Definition yac.c:1022
static struct yac_interp_stack_config ** interp_stack_configs
Definition yac.c:176
int const YAC_SPMAP_DIST
Definition yac.c:98
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:2960
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:2903
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:1405
size_t yac_cget_points_size(int points_id)
Definition yac.c:5152
void yac_cset_spmap_overwrite_config_spread_distance(int spmap_overwrite_config_id, double spread_distance)
Definition yac.c:5563
void yac_csync_def_comps_instance(int yac_instance_id, char const **comp_names, int num_comp_names)
Definition yac.c:4403
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:1943
void yac_cget_spmap_overwrite_config(int *spmap_overwrite_config_id)
Definition yac.c:5518
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:1960
int yac_cget_nbr_comps(void)
Definition yac.c:4497
static int default_instance_id
Definition yac.c:157
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:1484
int const YAC_AVG_BARY
Definition yac.c:75
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:2948
static void check_x_vertices(double const *x_vertices, size_t count, char const *routine_name)
Definition yac.c:1049
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:1744
void yac_cput_ptr_(int const field_id, int const collection_size, double **send_field, int *info, int *ierr)
Definition yac.c:3170
struct yac_basic_grid ** grids
Definition yac.c:164
void yac_cget_raw_ptr_(int const field_id, int const collection_size, double **src_field_buffer, int *info, int *ierr)
Definition yac.c:2891
static void yac_cfree_ext_couple_config_(struct yac_ext_couple_config ext_couple_config)
Definition yac.c:1566
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:5256
int const YAC_NNN_DIST
Definition yac.c:81
void yac_cget_comp_grid_names(const char *comp_name, int nbr_grids, const char **grid_names)
Definition yac.c:4661
int yac_cget_nbr_grids()
Definition yac.c:4510
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:4667
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:983
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:3838
int const YAC_REDUCTION_TIME_NONE
Definition yac.c:53
void yac_cget_comp_names_instance(int yac_instance_id, int nbr_comps, const char **comp_names)
Definition yac.c:4568
void yac_cdef_field_metadata(const char *comp_name, const char *grid_name, const char *field_name, const char *metadata)
Definition yac.c:1493
void yac_cget_ext_spmap_config(int *ext_spmap_config_id)
Definition yac.c:5314
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:1808
static void yac_ccleanup_instance_(int yac_instance_id)
Definition yac.c:693
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:5027
const char * yac_cget_component_metadata(const char *comp_name)
Definition yac.c:1508
const char * yac_cget_field_timestep(const char *comp_name, const char *grid_name, const char *field_name)
Definition yac.c:4770
void yac_cget_field_names(const char *comp_name, const char *grid_name, int nbr_fields, const char **field_names)
Definition yac.c:4706
void ** pointer_lookup_table
Definition yac.c:161
static int yac_cget_interp_stack_config_from_string(char const *interp_stack_config, int parse_flags)
Definition yac.c:5931
void yac_cget_ext_couple_config_weight_file(int ext_couple_config_id, char const **weight_file)
Definition yac.c:1601
void yac_cinit_comm(MPI_Comm comm)
Definition yac.c:497
static void yac_free_grids()
Definition yac.c:320
#define YAC_MAX_CHARLEN
Definition yac.h:105
#define YAC_UNREACHABLE_DEFAULT_F(format,...)
Definition yac_assert.h:50
#define YAC_ASSERT_F(exp, format,...)
Definition yac_assert.h:30
#define YAC_UNREACHABLE_DEFAULT(msg)
Definition yac_assert.h:43
void yac_mpi_finalize()
Definition yac_mpi.c:109
void yac_mpi_cleanup()
Definition yac_mpi.c:96
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:78
#define yac_mpi_call(call, comm)
YAC_INT yac_int
Definition yac_types.h:15
double(* yac_coordinate_pointer)[3]
Definition yac_types.h:21