YAC 3.7.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 <stdlib.h>
10#include <stdio.h>
11#include <string.h>
12#include "yac_mpi_common.h"
13#include "ensure_array_size.h"
14#include "event.h"
15#include "yac.h"
16#include "mpi_handshake.h"
17#include "utils_mci.h"
18#include "version.h"
19#include "instance.h"
20#include "fields.h"
21#include "couple_config.h"
22#include "config_yaml.h"
23#include "geometry.h"
24#include "yac_mpi.h"
25#include "utils_common.h"
27#include "interp_weights.h"
28
32
36
46
52
61
62int const YAC_CALENDAR_NOT_SET = CALENDAR_NOT_SET;
63int const YAC_PROLEPTIC_GREGORIAN = PROLEPTIC_GREGORIAN;
64int const YAC_YEAR_OF_365_DAYS = YEAR_OF_365_DAYS;
65int const YAC_YEAR_OF_360_DAYS = YEAR_OF_360_DAYS;
66
70
73
79
82
85
90
93
98
101
105
106enum {
110};
111
118
123
130
136
137static int default_instance_id = INT_MAX;
138
139static int yac_instance_count = 0;
140
141void ** pointer_lookup_table = NULL;
143
144struct yac_basic_grid ** grids = NULL;
145size_t num_grids = 0;
146
147static struct user_input_data_component ** components = NULL;
148static size_t num_components = 0;
149
150static struct user_input_data_points ** points = NULL;
151static size_t num_points = 0;
152
153static struct user_input_data_masks ** masks = NULL;
154static size_t num_masks = 0;
155
157static size_t num_interp_stack_configs = 0;
158
171
190
197static void * yac_unique_id_to_pointer(int id, char const * id_name) {
198
201 id >= 0,
202 "ERROR(yac_unique_id_to_pointer): invalid %s", id_name)
203 return pointer_lookup_table[id];
204}
205
214static int yac_lookup_pointer(void const * pointer) {
215
216 int ret = INT_MAX;
217 for (int i = 0; (ret == INT_MAX) && (i < pointer_lookup_table_size); ++i)
218 if (pointer_lookup_table[i] == pointer) ret = i;
219 return ret;
220}
221
235
236/* ---------------------------------------------------------------------- */
237
238static int yac_add_grid(
239 const char * grid_name, struct yac_basic_grid_data grid_data) {
240
241 for (size_t i = 0; i < num_grids; ++i)
243 strcmp(yac_basic_grid_get_name(grids[i]), grid_name),
244 "ERROR(yac_add_grid): multiple definitions of grid with identical name")
245
247 strlen(grid_name) <= YAC_MAX_CHARLEN,
248 "ERROR(yac_add_grid): grid name is too long (maximum is YAC_MAX_CHARLEN)")
249
250 struct yac_basic_grid * grid = yac_basic_grid_new(grid_name, grid_data);
251
252 grids = xrealloc(grids, (num_grids + 1) * sizeof(*grids));
253 grids[num_grids] = grid;
254 num_grids++;
255 return yac_pointer_to_unique_id(grid);
256}
257
258static void yac_free_grids() {
259
260 for (size_t i = 0; i < num_grids; ++i)
262 free(grids);
263 grids = NULL;
264 num_grids = 0;
265}
266
267/* ---------------------------------------------------------------------- */
268
269static void yac_free_points() {
270
271 for (size_t i = 0; i < num_points; ++i) free(points[i]);
272 free(points);
273 points = NULL;
274 num_points = 0;
275}
276
277/* ---------------------------------------------------------------------- */
278
279static void yac_free_masks() {
280
281 for (size_t i = 0; i < num_masks; ++i) free(masks[i]);
282 free(masks);
283 masks = NULL;
284 num_masks = 0;
285}
286
287/* ---------------------------------------------------------------------- */
288
289static void yac_free_components() {
290
291 for (size_t i = 0; i < num_components; ++i){
292 free(components[i]->name);
293 free(components[i]);
294 }
295 free(components);
296 components = NULL;
297 num_components = 0;
298}
299
300/* ---------------------------------------------------------------------- */
301
311
312/* ---------------------------------------------------------------------- */
313
314static void check_default_instance_id(char const * routine_name) {
315
317 default_instance_id != INT_MAX,
318 "ERROR(%s): no default yac instance is defined yet", routine_name)
319}
320
321/* ---------------------------------------------------------------------- */
322
323static void yac_check_version(MPI_Comm comm) {
324
325 int comm_rank;
326 yac_mpi_call(MPI_Comm_rank(comm, &comm_rank), comm);
327
328 char recv_version[64];
329
330 size_t yac_version_len = strlen(yac_version) + 1;
331
333 yac_version_len <= sizeof(recv_version),
334 "ERROR(yac_check_version): "
335 "version string \"%s\" is too long (has to be shorter than %zu)",
336 yac_version, sizeof(recv_version))
337
338 if (comm_rank == 0) strcpy(recv_version, yac_version);
339
341 MPI_Bcast(recv_version, (int)yac_version_len, MPI_CHAR, 0, comm), comm);
342
344 !strcmp(recv_version, yac_version),
345 "ERROR(yac_check_version): inconsistent yac versions between processes "
346 "(on local process \"%s\"; on root \"%s\")", yac_version, recv_version)
347}
348
349void check_mpi_initialised(char const * routine_name) {
350
353 "ERROR(%s): "
354 "MPI has not yet been initialised, but this call got a "
355 "communicator which is not allowed by the MPI standard "
356 "(MPI_COMM_WORLD is not to be used before the call to "
357 "MPI_Init or MPI_Init_thread)", routine_name);
358}
359
360void yac_cmpi_handshake(MPI_Comm comm, size_t n, char const** group_names,
361 MPI_Comm * group_comms) {
362 check_mpi_initialised("yac_cmpi_handshake");
363 yac_mpi_handshake(comm, n, group_names, group_comms);
364}
365
366void yac_cmpi_handshake_f2c(MPI_Fint comm, int n, char const** group_names,
367 MPI_Fint * group_comms) {
368 MPI_Comm comm_c = MPI_Comm_f2c(comm);
369 MPI_Comm * group_comms_c = xmalloc(n*sizeof(*group_comms_c));
370 yac_mpi_handshake(comm_c, n, group_names, group_comms_c);
371 for(int i = 0; i<n; ++i)
372 group_comms[i] = MPI_Comm_c2f(group_comms_c[i]);
373 free(group_comms_c);
374}
375
376static int yac_init(MPI_Comm comm) {
377
378 check_mpi_initialised("yac_init");
379 yac_yaxt_init(comm);
380 yac_check_version(comm);
381
382 int comm_rank, comm_size;
383 yac_mpi_call(MPI_Comm_rank(comm, &comm_rank), comm);
384 yac_mpi_call(MPI_Comm_size(comm, &comm_size), comm);
385
387 return
389 yac_instance_new(comm));
390}
391
393 check_default_instance_id("yac_cget_default_instance_id");
394 return default_instance_id;
395}
396
398 MPI_Comm comm, int * yac_instance_id) {
399
400 *yac_instance_id = yac_init(comm);
401}
402
404 MPI_Fint comm, int * yac_instance_id) {
405
406 yac_cinit_comm_instance(MPI_Comm_f2c(comm), yac_instance_id);
407}
408
409void yac_cinit_comm ( MPI_Comm comm ) {
410
412 default_instance_id == INT_MAX,
413 "ERROR(yac_cinit_comm): default yac instance already defined")
414
416}
417
418void yac_cinit_comm_f2c ( MPI_Fint comm_f ) {
419
420 yac_cinit_comm(MPI_Comm_f2c(comm_f));
421}
422
424 int * yac_instance_id) {
425
426 // we have to initalise MPI here in order to be able to use MPI_COMM_WORLD
427 yac_mpi_init();
428 MPI_Comm yac_comm;
429 const char* group_name = "yac";
430 yac_cmpi_handshake(MPI_COMM_WORLD, 1, &group_name, &yac_comm);
431 yac_cinit_comm_instance(yac_comm, yac_instance_id);
432 yac_mpi_call(MPI_Comm_free(&yac_comm), MPI_COMM_WORLD);
433}
434
435void yac_cinit ( void ) {
437 default_instance_id == INT_MAX,
438 "ERROR(yac_cinit_comm): default yac instance already defined")
439
441}
442
443/* ---------------------------------------------------------------------- */
444
445void yac_cinit_comm_dummy ( MPI_Comm comm ) {
446
447 check_mpi_initialised("yac_cinit_comm_dummy");
448
449 yac_yaxt_init(comm);
450 yac_check_version(comm);
451
453}
454
455void yac_cinit_comm_dummy_f2c ( MPI_Fint comm_f ) {
456
457 check_mpi_initialised("yac_cinit_comm_dummy_f2c");
458 yac_cinit_comm_dummy(MPI_Comm_f2c(comm_f));
459}
460
461void yac_cinit_dummy( void ) {
462
463 // we have to initalise MPI here in order to be able to use MPI_COMM_WORLD
464 yac_mpi_init();
465 yac_cmpi_handshake(MPI_COMM_WORLD, 0, NULL, NULL);
466}
467
468/* ---------------------------------------------------------------------- */
469
473
477
478/* ---------------------------------------------------------------------- */
479
480
481void yac_cread_config_yaml_instance( int yac_instance_id,
482 const char * yaml_filename) {
483 struct yac_instance * instance
484 = yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
486 yac_instance_get_couple_config(instance), yaml_filename,
488}
489
490void yac_cread_config_yaml( const char * yaml_filename) {
491 check_default_instance_id("read_config_yaml");
493}
494
495void yac_cread_config_json_instance( int yac_instance_id,
496 const char * yaml_filename) {
497 struct yac_instance * instance
498 = yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
500 yac_instance_get_couple_config(instance), yaml_filename,
502}
503
504void yac_cread_config_json( const char * yaml_filename) {
505 check_default_instance_id("read_config_yaml");
507}
508
509/* ---------------------------------------------------------------------- */
510
512 int yac_instance_id, const char * filename, int fileformat,
513 int sync_location, int include_definitions) {
514
515 struct yac_instance * instance =
516 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
517
519 filename != NULL,
520 "ERROR(yac_cset_config_output_file_instance): filename is NULL")
522 (fileformat == YAC_TEXT_FILETYPE_YAML) ||
523 (fileformat == YAC_TEXT_FILETYPE_JSON),
524 "ERROR(yac_cset_config_output_file_instance): invalid file format")
526 (sync_location == YAC_CONFIG_OUTPUT_SYNC_LOC_DEF_COMP) ||
527 (sync_location == YAC_CONFIG_OUTPUT_SYNC_LOC_SYNC_DEF) ||
528 (sync_location == YAC_CONFIG_OUTPUT_SYNC_LOC_ENDDEF),
529 "ERROR(yac_cset_config_output_file_instance): invalid file format")
530
531 char const * output_refs[] =
535
537 yac_instance_get_couple_config(instance), filename,
538 (enum yac_text_filetype)fileformat,
539 output_refs[sync_location], include_definitions);
540}
541
543 const char * filename, int filetype, int sync_location,
544 int include_definitions) {
545
546 check_default_instance_id("yac_cset_config_output_file");
548 default_instance_id, filename, filetype, sync_location,
549 include_definitions);
550}
551
552/* ---------------------------------------------------------------------- */
553
555 int yac_instance_id, const char * gridname, const char * filename) {
556
557 struct yac_instance * instance =
558 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
559
561 gridname != NULL,
562 "ERROR(yac_cset_grid_output_file_instance): gridname is NULL")
564 filename != NULL,
565 "ERROR(yac_cset_grid_output_file_instance): filename is NULL")
566
568 yac_instance_get_couple_config(instance), gridname, filename);
569}
570
571void yac_cset_grid_output_file(const char * gridname, const char * filename) {
572
573 check_default_instance_id("yac_cset_grid_output_file");
575}
576
577/* ---------------------------------------------------------------------- */
578
579static void yac_ccleanup_instance_(int yac_instance_id) {
580
581 struct yac_instance * instance
582 = yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
583
584 /* free memory */
585 yac_instance_delete(instance);
587 if(yac_instance_id == default_instance_id)
588 default_instance_id = INT_MAX;
589
590 // remove dangeling pointers from components
591 for(size_t i = 0; i<num_components;++i){
592 if(components[i]->instance == instance){
593 components[i]->instance = NULL;
594 }
595 }
596}
597
598void yac_ccleanup_instance (int yac_instance_id) {
599
600 yac_ccleanup_instance_(yac_instance_id);
601
602 /* cleanup mpi */
604}
605
607
608 check_default_instance_id("yac_ccleanup");
609
611}
612
613/* ---------------------------------------------------------------------- */
614
625
626void yac_cfinalize_instance(int yac_instance_id) {
627
628 yac_ccleanup_instance_(yac_instance_id);
629
630 /* cleanup close MPI */
631
632 if (yac_instance_count == 0) cleanup();
633}
634
636
637 if (default_instance_id != INT_MAX)
639
640 /* cleanup close MPI */
641
642 if (yac_instance_count == 0) cleanup();
643}
644
645/* ---------------------------------------------------------------------- */
646
648 int yac_instance_id, const char * start_datetime,
649 const char * end_datetime) {
650
652 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id"),
653 start_datetime, end_datetime);
654}
655
656void yac_cdef_datetime ( const char * start_datetime,
657 const char * end_datetime ) {
658
659 check_default_instance_id("yac_cdef_datetime");
661 default_instance_id, start_datetime, end_datetime);
662}
663
664void yac_cdef_calendar ( int calendar ) {
665
667 (calendar == YAC_PROLEPTIC_GREGORIAN) ||
668 (calendar == YAC_YEAR_OF_360_DAYS) ||
669 (calendar == YAC_YEAR_OF_365_DAYS),
670 "ERROR(yac_cdef_calendar): invalid calendar type")
671
672 calendarType curr_calendar = getCalendarType();
674 (curr_calendar == CALENDAR_NOT_SET) ||
675 (curr_calendar == (calendarType)calendar),
676 "ERROR(yac_cdef_calendar): inconsistent calendar definition")
677
678 initCalendar((calendarType)calendar);
679}
680
682
683 return (int)getCalendarType();
684}
685
686/* ---------------------------------------------------------------------- */
687
688char * yac_cget_start_datetime_instance(int yac_instance_id) {
689
690 return
692 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id"));
693}
694
695char * yac_cget_start_datetime ( void ) {
696
697 check_default_instance_id("yac_cget_start_datetime");
699}
700
701/* ---------------------------------------------------------------------- */
702
703char * yac_cget_end_datetime_instance(int yac_instance_id) {
704
705 return
707 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id"));
708}
709
710char * yac_cget_end_datetime ( void ) {
711
712 check_default_instance_id("yac_cget_end_datetime");
714}
715
716/* ---------------------------------------------------------------------- */
717
718/* The YAC version number is provided in version.h
719 */
720
721char * yac_cget_version ( void ) {
722 return yac_version;
723}
724
725/* ---------------------------------------------------------------------- */
726
728 int comp_id, char const * routine) {
729
730 struct user_input_data_component * comp_info =
731 yac_unique_id_to_pointer(comp_id, "comp_id");
732
734 comp_info->instance != NULL,
735 "ERROR(%s): instance of component \"%s\" is already finalized",
736 routine, comp_info->name);
737
738 return comp_info;
739}
740
741/* ---------------------------------------------------------------------- */
742
743/* c interface routine */
744
745void yac_cget_comp_comm ( int comp_id, MPI_Comm *comp_comm ) {
746
747 struct user_input_data_component * comp_info =
748 get_user_input_data_component(comp_id, "yac_cget_comp_comm");
749
750 *comp_comm =
752 comp_info->instance, (char const **)&(comp_info->name), 1);
753}
754
755/* internal routine to serve the Fortran interface */
756
757void yac_get_comp_comm_f2c ( int comp_id, MPI_Fint *comp_comm_f ) {
758
759 MPI_Comm comp_comm;
760 yac_cget_comp_comm(comp_id, &comp_comm);
761
762 *comp_comm_f = MPI_Comm_c2f(comp_comm);
763}
764
765/* internal routine to serve the Python interface */
766
767void yac_cget_comp_size_c2py(int comp_id, int* size){
768 struct user_input_data_component * comp_info =
769 get_user_input_data_component(comp_id, "yac_cget_comp_comm");
770
771 *size = yac_instance_get_comp_size(comp_info->instance, comp_info->name);
772}
773
774void yac_cget_comp_rank_c2py(int comp_id, int* rank){
775 struct user_input_data_component * comp_info =
776 get_user_input_data_component(comp_id, "yac_cget_comp_comm");
777
778 *rank = yac_instance_get_comp_rank(comp_info->instance, comp_info->name);
779}
780
781/* ---------------------------------------------------------------------- */
782
783/* c interface routine */
784
786 int yac_instance_id,
787 char const ** comp_names, int num_comps, MPI_Comm * comps_comm) {
788
789 *comps_comm =
791 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id"),
792 comp_names, (size_t)num_comps);
793}
794
796 const char ** comp_names, int num_comps, MPI_Comm * comps_comm) {
797
798 check_default_instance_id("yac_cget_comps_comm");
800 default_instance_id, comp_names, num_comps, comps_comm);
801}
802
803/* internal routine to serve the Fortran interface */
804
806 int yac_instance_id,
807 char const ** comp_names, int num_comps, MPI_Fint * comps_comm_f) {
808
809 MPI_Comm comps_comm;
811 yac_instance_id, comp_names, num_comps, &comps_comm);
812 *comps_comm_f = MPI_Comm_c2f(comps_comm);
813}
814
816 char const ** comp_names, int num_comps, MPI_Fint *comps_comm_f) {
817
818 MPI_Comm comps_comm;
819 yac_cget_comps_comm(comp_names, num_comps, &comps_comm);
820 *comps_comm_f = MPI_Comm_c2f(comps_comm);
821}
822
823/* ---------------------------------------------------------------------- */
824
826 int yac_instance_id, char const * name, int * comp_id){
827
828 struct yac_instance * instance =
829 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
830
833 "ERROR(yac_cpredef_comp_instance): components have already been defined");
834
836 (name != NULL) && (*name != '\0'),
837 "ERROR(yac_cpredef_comp_instance): missing component name");
838
839 for (size_t i = 0; i < num_components; ++i) {
841 (components[i]->instance != instance) ||
842 strcmp(components[i]->name, name),
843 "ERROR(yac_cpredef_comp_instance): "
844 "component \"%s\" is already defined", name);
845 }
846
847 components =
848 xrealloc(
849 components, (num_components + 1) * sizeof(*components));
850
853 components[num_components]->name = strdup(name);
856}
857
858void yac_cpredef_comp(char const * name, int * comp_id){
859 check_default_instance_id("yac_cpredef_comp");
861}
862
864 int yac_instance_id, char const ** comp_names, int num_comps,
865 int * comp_ids) {
866
867 struct yac_instance * instance =
868 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
869
870 for(int i = 0; i<num_comps; ++i)
871 yac_cpredef_comp_instance(yac_instance_id, comp_names[i], comp_ids + i);
872
873 // count predefined components and set their index
874 size_t comp_counter = 0;
875 char const ** all_comp_names = xmalloc(num_components * sizeof(*all_comp_names));
876 for(size_t i = 0; i<num_components; ++i){
877 if(components[i]->instance == instance){
878 all_comp_names[comp_counter] = components[i]->name;
879 comp_counter++;
880 }
881 }
882
883 yac_instance_def_components(instance, all_comp_names, comp_counter);
884
885 free(all_comp_names);
886}
887
889 char const ** comp_names, int num_comps, int * comp_ids ) {
890
891 check_default_instance_id("yac_cdef_comps");
893 default_instance_id, comp_names, num_comps, comp_ids);
894}
895
897 int yac_instance_id, char const * comp_name, int * comp_id ) {
898
899 yac_cdef_comps_instance(yac_instance_id, &comp_name, 1, comp_id);
900}
901
902void yac_cdef_comp ( char const * comp_name, int * comp_id ) {
903
904 yac_cdef_comps(&comp_name, 1, comp_id);
905}
906
907/* ---------------------------------------------------------------------- */
908
910 struct yac_basic_grid * grid, enum yac_location location,
911 yac_coordinate_pointer coordinates) {
912
913 struct user_input_data_points * curr_points = xmalloc(1 * sizeof(*curr_points));
914 curr_points->default_mask_id = INT_MAX;
915 curr_points->grid = grid;
916 curr_points->location = location;
917 curr_points->coordinates_idx =
919
920 points = xrealloc(points, (num_points + 1) * sizeof(*points));
921 points[num_points] = curr_points;
922 num_points++;
923
924 return yac_pointer_to_unique_id(curr_points);
925}
926
927/* ---------------------------------------------------------------------- */
928
930 double const * x_vertices, size_t count, char const * routine_name) {
931
932 for (size_t i = 0; i < count; ++i)
934 (x_vertices[i] >= -720.0) && (x_vertices[i] <= 720.0),
935 "ERROR(%s): x_vertices[%zu] = %lf outside of valid range [-720;720]",
936 routine_name, i, x_vertices[i]);
937}
938
940 double const * y_vertices, size_t count, char const * routine_name) {
941
942 for (size_t i = 0; i < count; ++i)
944 (y_vertices[i] >= -90.00001) && (y_vertices[i] <= 90.00001),
945 "ERROR(%s): y_vertices[%zu] = %lf "
946 "outside of valid range [-90.00001;90.00001]",
947 routine_name, i, y_vertices[i]);
948}
949
951 int *cell_to_vertex, int *num_vertices_per_cell, int nbr_cells,
952 int nbr_vertices, char const * routine_name) {
953
954 size_t count = 0;
955 for (int i = 0; i < nbr_cells; ++i) {
957 num_vertices_per_cell[i] >= 0,
958 "ERROR(%s): num_vertices_per_cell[%d] = %d ",
959 routine_name, i, num_vertices_per_cell[i]);
960 count += num_vertices_per_cell[i];
961 }
962 for (size_t i = 0; i < count; ++i)
964 (cell_to_vertex[i] >= 0) && (cell_to_vertex[i] < nbr_vertices),
965 "ERROR(%s): cell_to_vertex[%zu] = %d "
966 "invalid value (nbr_vertices = %d)",
967 routine_name, i, cell_to_vertex[i], nbr_vertices);
968}
969
971 int *cell_to_edge, int *num_edges_per_cell, int nbr_cells,
972 int nbr_edges, char const * routine_name) {
973
974 size_t count = 0;
975 for (int i = 0; i < nbr_cells; ++i) {
977 num_edges_per_cell[i] >= 0,
978 "ERROR(%s): num_edges_per_cell[%d] = %d ",
979 routine_name, i, num_edges_per_cell[i]);
980 count += num_edges_per_cell[i];
981 }
982 for (size_t i = 0; i < count; ++i)
984 (cell_to_edge[i] >= 0) && (cell_to_edge[i] < nbr_edges),
985 "ERROR(%s): cell_to_edge[%zu] = %d "
986 "invalid value (nbr_edges = %d)",
987 routine_name, i, cell_to_edge[i], nbr_edges);
988}
989
990/* ---------------------------------------------------------------------- */
991
992void yac_cdef_points_reg2d ( int const grid_id,
993 int const *nbr_points,
994 int const located,
995 double const *x_points,
996 double const *y_points,
997 int *point_id ) {
998
999 enum yac_location location = yac_get_location(located);
1000 struct yac_basic_grid * grid = yac_unique_id_to_pointer(grid_id, "grid_id");
1001
1002 YAC_ASSERT(
1003 location != YAC_LOC_EDGE,
1004 "ERROR(yac_cdef_points_reg2d): "
1005 "edge-location is not supported, use yac_cdef_points_unstruct instead.");
1006
1007 size_t num_points = yac_basic_grid_get_data_size(grid, location);
1008 YAC_ASSERT(
1009 ((size_t)nbr_points[0] * (size_t)nbr_points[1]) == num_points,
1010 "ERROR(yac_cdef_points_reg2d): nbr_points does not match with grid")
1011
1013 x_points, (size_t)(nbr_points[0]), "yac_cdef_points_reg2d");
1015 y_points, (size_t)(nbr_points[1]), "yac_cdef_points_reg2d");
1016
1017 yac_coordinate_pointer coordinates =
1018 xmalloc(num_points * sizeof(*coordinates));
1019 for (int i = 0, k = 0; i < nbr_points[1]; ++i)
1020 for (int j = 0; j < nbr_points[0]; ++j, ++k)
1021 LLtoXYZ(x_points[j], y_points[i], coordinates[k]);
1022
1023 *point_id = user_input_data_add_points(grid, location, coordinates);
1024}
1025
1026/* ---------------------------------------------------------------------- */
1027
1028void yac_cdef_points_curve2d ( int const grid_id,
1029 int const *nbr_points,
1030 int const located,
1031 double const *x_points,
1032 double const *y_points,
1033 int *point_id ) {
1034
1035 enum yac_location location = yac_get_location(located);
1036 struct yac_basic_grid * grid = yac_unique_id_to_pointer(grid_id, "grid_id");
1037
1038 YAC_ASSERT(
1039 location != YAC_LOC_EDGE,
1040 "ERROR(yac_cdef_points_curve2d): "
1041 "edge-location is not supported, use yac_cdef_points_unstruct instead.");
1042
1043 size_t num_points = yac_basic_grid_get_data_size(grid, location);
1045 ((size_t)nbr_points[0] * (size_t)nbr_points[1]) == num_points,
1046 "ERROR(yac_cdef_points_curve2d): nbr_points does not match with grid"
1047 " (%zu*%zu != %zu)",
1048 (size_t)nbr_points[0], (size_t)nbr_points[1], num_points)
1049
1051 x_points, (size_t)(nbr_points[0]), "yac_cdef_points_curve2d");
1053 y_points, (size_t)(nbr_points[1]), "yac_cdef_points_curve2d");
1054
1055 yac_coordinate_pointer coordinates =
1056 xmalloc(num_points * sizeof(*coordinates));
1057 for (int i = 0, k = 0; i < nbr_points[1]; ++i)
1058 for (int j = 0; j < nbr_points[0]; ++j, ++k)
1059 LLtoXYZ(x_points[k], y_points[k], coordinates[k]);
1060
1061 *point_id = user_input_data_add_points(grid, location, coordinates);
1062}
1063
1064/* ---------------------------------------------------------------------- */
1065
1066void yac_cdef_points_unstruct ( int const grid_id,
1067 int const nbr_points,
1068 int const located,
1069 double const *x_points,
1070 double const *y_points,
1071 int *point_id ) {
1072
1073 enum yac_location location = yac_get_location(located);
1074 struct yac_basic_grid * grid = yac_unique_id_to_pointer(grid_id, "grid_id");
1075
1076 YAC_ASSERT(
1077 (size_t)nbr_points == yac_basic_grid_get_data_size(grid, location),
1078 "ERROR(yac_cdef_points_unstruct): nbr_points does not match with grid")
1079
1080 check_x_vertices(x_points, (size_t)nbr_points, "yac_cdef_points_unstruct");
1081 check_y_vertices(y_points, (size_t)nbr_points, "yac_cdef_points_unstruct");
1082
1083 yac_coordinate_pointer coordinates =
1084 xmalloc((size_t)nbr_points * sizeof(*coordinates));
1085 for (int i = 0; i < nbr_points; ++i)
1086 LLtoXYZ(x_points[i], y_points[i], coordinates[i]);
1087
1088 *point_id = user_input_data_add_points(grid, location, coordinates);
1089}
1090
1091/* ---------------------------------------------------------------------- */
1092
1093void yac_cdef_points_reg2d_rot ( int const grid_id,
1094 int const *nbr_points,
1095 int const located,
1096 double const *x_points,
1097 double const *y_points,
1098 double x_north_pole,
1099 double y_north_pole,
1100 int *point_id ) {
1101
1102 enum yac_location location = yac_get_location(located);
1103 struct yac_basic_grid * grid = yac_unique_id_to_pointer(grid_id, "grid_id");
1104
1105 YAC_ASSERT(
1106 location != YAC_LOC_EDGE,
1107 "ERROR(yac_cdef_points_reg2d_rot): "
1108 "edge-location is not supported, use yac_cdef_points_unstruct instead.");
1109
1110 size_t num_points = yac_basic_grid_get_data_size(grid, location);
1111 YAC_ASSERT(
1112 ((size_t)nbr_points[0] * (size_t)nbr_points[1]) == num_points,
1113 "ERROR(yac_cdef_points_reg2d_rot): nbr_points does not match with grid")
1114
1116 x_points, (size_t)(nbr_points[0]), "yac_cdef_points_reg2d_rot");
1118 y_points, (size_t)(nbr_points[1]), "yac_cdef_points_reg2d_rot");
1119
1120 yac_coordinate_pointer coordinates =
1121 xmalloc(num_points * sizeof(*coordinates));
1122 for (int i = 0, k = 0; i < nbr_points[1]; ++i)
1123 for (int j = 0; j < nbr_points[0]; ++j, ++k)
1124 LLtoXYZ(x_points[j], y_points[i], coordinates[k]);
1125
1126 double north_pole[3];
1127 LLtoXYZ(x_north_pole, y_north_pole, north_pole);
1128 yac_rotate_coordinates(coordinates, num_points, north_pole);
1129
1130 *point_id = user_input_data_add_points(grid, location, coordinates);
1131}
1132
1133/* ---------------------------------------------------------------------- */
1134
1136 struct yac_basic_grid * grid, enum yac_location location,
1137 int const * is_valid, size_t nbr_points, char const * name) {
1138
1139 struct user_input_data_masks * curr_mask = xmalloc(1 * sizeof(*curr_mask));
1140 curr_mask->grid = grid;
1141 curr_mask->location = location;
1142 curr_mask->masks_idx =
1143 yac_basic_grid_add_mask(grid, location, is_valid, nbr_points, name);
1144
1145 masks = xrealloc(masks, (num_masks + 1) * sizeof(*masks));
1146 masks[num_masks] = curr_mask;
1147 num_masks++;
1148
1149 return yac_pointer_to_unique_id(curr_mask);
1150}
1151
1152/* ---------------------------------------------------------------------- */
1153
1154void yac_cdef_mask_named ( int const grid_id,
1155 int const nbr_points,
1156 int const located,
1157 int const * is_valid,
1158 char const * name,
1159 int *mask_id ) {
1160
1161 enum yac_location location = yac_get_location(located);
1162 struct yac_basic_grid * grid = yac_unique_id_to_pointer(grid_id, "grid_id");
1163
1164 YAC_ASSERT(
1165 (size_t)nbr_points == yac_basic_grid_get_data_size(grid, location),
1166 "ERROR(yac_cdef_mask_named): nbr_points does not match with grid")
1167
1168 *mask_id =
1170 grid, location, is_valid, (size_t)nbr_points, name);
1171}
1172
1173void yac_cdef_mask ( int const grid_id,
1174 int const nbr_points,
1175 int const located,
1176 int const * is_valid,
1177 int *mask_id ) {
1178
1179 yac_cdef_mask_named(grid_id, nbr_points, located, is_valid, NULL, mask_id);
1180}
1181
1182void yac_cset_mask ( int const * is_valid, int points_id ) {
1183
1185 yac_unique_id_to_pointer(points_id, "points_id");
1186
1187 YAC_ASSERT(
1188 points->default_mask_id == INT_MAX,
1189 "ERROR(yac_cset_mask): default mask has already been set before")
1190
1191 struct yac_basic_grid * grid = points->grid;
1192 enum yac_location location = points->location;
1193 size_t nbr_points = yac_basic_grid_get_data_size(grid, location);
1194
1196 user_input_data_add_mask(grid, location, is_valid, nbr_points, NULL);
1197}
1198
1199/* ---------------------------------------------------------------------- */
1200
1201void yac_cdef_field_mask ( char const * name,
1202 int const comp_id,
1203 int const * point_ids,
1204 int const * mask_ids,
1205 int const num_pointsets,
1206 int collection_size,
1207 const char* timestep,
1208 int time_unit,
1209 int * field_id ) {
1210
1211 YAC_ASSERT(
1212 num_pointsets >= 1,
1213 "ERROR(yac_cdef_field_mask): invalid number of pointsets")
1214
1215 YAC_ASSERT(
1216 point_ids != NULL,"ERROR(yac_cdef_field_mask): no point_ids provided")
1217
1218 struct yac_basic_grid * grid =
1219 ((struct user_input_data_points *)
1220 yac_unique_id_to_pointer(point_ids[0], "point_ids[0]"))->grid;
1221
1222 struct yac_interp_field interp_fields_buf;
1223 struct yac_interp_field * interp_fields =
1224 (num_pointsets == 1)?
1225 &interp_fields_buf:
1226 xmalloc((size_t)num_pointsets * sizeof(*interp_fields));
1227
1228 for (int i = 0; i < num_pointsets; ++i) {
1229
1231 yac_unique_id_to_pointer(point_ids[i], "point_ids[i]");
1232
1233 YAC_ASSERT(
1234 grid == points->grid,
1235 "ERROR(yac_cdef_field_mask): grid of point_ids do not match")
1236
1237 size_t masks_idx;
1238 if (mask_ids[i] != INT_MAX) {
1239
1240 struct user_input_data_masks * mask =
1241 yac_unique_id_to_pointer(mask_ids[i], "mask_ids[i]");
1242
1243 YAC_ASSERT(
1244 mask->grid == points->grid,
1245 "ERROR(yac_cdef_field_mask): "
1246 "grids of mask and points do not match")
1247 YAC_ASSERT(
1248 mask->location == points->location,
1249 "ERROR(yac_cdef_field_mask): "
1250 "location of mask and points do not match")
1251 masks_idx = mask->masks_idx;
1252 } else {
1253 masks_idx = SIZE_MAX;
1254 }
1255
1256 interp_fields[i].location = points->location;
1257 interp_fields[i].coordinates_idx = points->coordinates_idx;
1258 interp_fields[i].masks_idx = masks_idx;
1259 }
1260
1261 struct user_input_data_component * comp_info =
1262 get_user_input_data_component(comp_id, "yac_cdef_field_mask");
1263
1264 *field_id =
1267 comp_info->instance, name, comp_info->name,
1268 grid, interp_fields, num_pointsets, collection_size,
1269 yac_time_to_ISO(timestep, (enum yac_time_unit_type)time_unit)));
1270
1271 if (num_pointsets > 1) free(interp_fields);
1272}
1273
1274void yac_cdef_field ( char const * name,
1275 int const comp_id,
1276 int const * point_ids,
1277 int const num_pointsets,
1278 int collection_size,
1279 const char* timestep,
1280 int time_unit,
1281 int * field_id ) {
1282
1283 YAC_ASSERT(
1284 num_pointsets >= 1,
1285 "ERROR(yac_cdef_field): invalid number of pointsets")
1286
1287 YAC_ASSERT(
1288 point_ids != NULL, "ERROR(yac_cdef_field): no point_ids provided")
1289
1290 int * mask_ids = xmalloc((size_t)num_pointsets * sizeof(*mask_ids));
1291
1292 for (int i = 0; i < num_pointsets; ++i)
1293 mask_ids[i] =
1294 ((struct user_input_data_points *)
1295 yac_unique_id_to_pointer(point_ids[i], "point_ids[i]"))->
1296 default_mask_id;
1297
1299 name, comp_id, point_ids, mask_ids, num_pointsets,
1300 collection_size, timestep, time_unit, field_id);
1301
1302 free(mask_ids);
1303}
1304
1306 int yac_instance_id, const char* comp_name, const char* grid_name,
1307 const char* field_name, double frac_mask_fallback_value) {
1308 struct yac_instance * instance =
1309 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
1310 struct yac_couple_config * couple_config =
1313 couple_config, comp_name, grid_name, field_name,
1314 frac_mask_fallback_value);
1315}
1316
1318 const char* comp_name, const char* grid_name, const char* field_name,
1319 double frac_mask_fallback_value) {
1320 check_default_instance_id("yac_cenable_field_frac_mask");
1322 default_instance_id, comp_name, grid_name, field_name,
1323 frac_mask_fallback_value);
1324}
1325
1327 const char* comp_name, const char* metadata) {
1328 struct yac_instance * instance =
1329 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
1330 struct yac_couple_config * couple_config = yac_instance_get_couple_config(instance);
1331 yac_couple_config_component_set_metadata(couple_config, comp_name, metadata);
1332}
1333
1334void yac_cdef_component_metadata(const char* comp_name, const char* metadata) {
1335 check_default_instance_id("yac_cdef_component_metadata");
1337}
1338
1339void yac_cdef_grid_metadata_instance(int yac_instance_id, const char* grid_name,
1340 const char* metadata) {
1341 struct yac_instance * instance =
1342 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
1343 struct yac_couple_config * couple_config
1345 yac_couple_config_grid_set_metadata(couple_config, grid_name, metadata);
1346}
1347
1348void yac_cdef_grid_metadata(const char* grid_name, const char* metadata) {
1349 check_default_instance_id("yac_cdef_grid_metadata");
1351}
1352
1353void yac_cdef_field_metadata_instance(int yac_instance_id, const char* comp_name,
1354 const char* grid_name, const char* field_name, const char* metadata) {
1355 struct yac_instance * instance =
1356 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
1357 struct yac_couple_config * couple_config
1359 yac_couple_config_field_set_metadata(couple_config, comp_name, grid_name, field_name, metadata);
1360}
1361
1362void yac_cdef_field_metadata(const char* comp_name, const char* grid_name,
1363 const char* field_name, const char* metadata) {
1364 check_default_instance_id("yac_cdef_field_metadata");
1366 field_name, metadata);
1367}
1368
1369const char* yac_cget_component_metadata_instance(int yac_instance_id,
1370 const char* comp_name) {
1371 struct yac_instance * instance =
1372 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
1373 struct yac_couple_config * couple_config = yac_instance_get_couple_config(instance);
1374 return yac_couple_config_component_get_metadata(couple_config, comp_name);
1375}
1376
1377const char* yac_cget_component_metadata(const char* comp_name) {
1378 check_default_instance_id("yac_cget_component_metadata");
1380}
1381
1382const char* yac_cget_grid_metadata_instance(int yac_instance_id,
1383 const char* grid_name) {
1384 struct yac_instance * instance =
1385 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
1386 struct yac_couple_config * couple_config = yac_instance_get_couple_config(instance);
1387 return yac_couple_config_grid_get_metadata(couple_config, grid_name);
1388}
1389
1390const char* yac_cget_grid_metadata(const char* grid_name) {
1391 check_default_instance_id("yac_cget_grid_metadata");
1393}
1394
1395const char* yac_cget_field_metadata_instance(int yac_instance_id,
1396 const char* comp_name, const char* grid_name, const char* field_name) {
1397 struct yac_instance * instance =
1398 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
1399 struct yac_couple_config * couple_config = yac_instance_get_couple_config(instance);
1400 return yac_couple_config_field_get_metadata(couple_config, comp_name, grid_name,
1401 field_name);
1402}
1403
1404const char* yac_cget_field_metadata(const char* comp_name, const char* grid_name,
1405 const char* field_name) {
1406 check_default_instance_id("yac_cget_field_metadata");
1408 grid_name, field_name);
1409}
1410
1412 struct yac_ext_couple_config * ext_couple_config) {
1413 ext_couple_config->weight_file = NULL;
1414 ext_couple_config->weight_file_on_existing =
1416 ext_couple_config->mapping_side = 1;
1417 ext_couple_config->scale_factor = 1.0;
1418 ext_couple_config->scale_summand = 0.0;
1419 ext_couple_config->num_src_mask_names = 0;
1420 ext_couple_config->src_mask_names = NULL;
1421 ext_couple_config->tgt_mask_name = NULL;
1422 ext_couple_config->yaxt_exchanger_name = NULL;
1423 ext_couple_config->use_raw_exchange = 0;
1424}
1425
1426void yac_cget_ext_couple_config(int * ext_couple_config_id) {
1427
1428 struct yac_ext_couple_config * ext_couple_config =
1429 xmalloc(1 * sizeof(*ext_couple_config));
1430 init_ext_couple_config(ext_couple_config);
1431 *ext_couple_config_id = yac_pointer_to_unique_id(ext_couple_config);
1432}
1433
1434void yac_cfree_ext_couple_config(int ext_couple_config_id) {
1435 struct yac_ext_couple_config * ext_couple_config =
1436 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id");
1437 free(ext_couple_config->weight_file);
1438 for (size_t i = 0; i < ext_couple_config->num_src_mask_names; ++i)
1439 free(ext_couple_config->src_mask_names[i]);
1440 free(ext_couple_config->src_mask_names);
1441 free(ext_couple_config->tgt_mask_name);
1442 free(ext_couple_config->yaxt_exchanger_name);
1443 free(ext_couple_config);
1444}
1445
1447 struct yac_ext_couple_config * ext_couple_config,
1448 char const * weight_file) {
1449 free(ext_couple_config->weight_file);
1450 ext_couple_config->weight_file =
1451 (weight_file != NULL)?strdup(weight_file):NULL;
1452}
1453
1454void yac_cset_ext_couple_config_weight_file(int ext_couple_config_id,
1455 char const * weight_file) {
1457 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id"),
1458 weight_file);
1459}
1460
1461void yac_cget_ext_couple_config_weight_file(int ext_couple_config_id,
1462 char const ** weight_file) {
1463 struct yac_ext_couple_config * ext_couple_config =
1464 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id");
1465 *weight_file = ext_couple_config->weight_file;
1466}
1467
1469 struct yac_ext_couple_config * ext_couple_config,
1475 "ERROR(yac_cset_ext_couple_config_weight_file_on_existing_): "
1476 "\"%d\" is not a valid weight file on existing value "
1477 "(has to be YAC_WGT_ON_EXISTING_ERROR (%d), "
1478 "YAC_WGT_ON_EXISTING_KEEP(%d), or "
1479 "YAC_WGT_ON_EXISTING_OVERWRITE(%d))",
1483}
1484
1486 int ext_couple_config_id, int weight_file_on_existing) {
1488 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id"),
1490}
1491
1493 int ext_couple_config_id, int * weight_file_on_existing) {
1494 struct yac_ext_couple_config * ext_couple_config =
1495 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id");
1497}
1498
1500 struct yac_ext_couple_config * ext_couple_config,
1501 int mapping_side) {
1503 (mapping_side == 0) ||
1504 (mapping_side == 1),
1505 "ERROR(yac_cset_ext_couple_config_mapping_side_): "
1506 "\"%d\" is not a valid mapping side (has to be 0 or 1)",
1507 mapping_side);
1508 ext_couple_config->mapping_side = mapping_side;
1509}
1510
1511void yac_cset_ext_couple_config_mapping_side(int ext_couple_config_id,
1512 int mapping_side) {
1514 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id"),
1515 mapping_side);
1516}
1517
1518void yac_cget_ext_couple_config_mapping_side(int ext_couple_config_id,
1519 int * mapping_side) {
1520 struct yac_ext_couple_config * ext_couple_config =
1521 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id");
1522 *mapping_side = ext_couple_config->mapping_side;
1523}
1524
1526 struct yac_ext_couple_config * ext_couple_config,
1527 double scale_factor) {
1528 YAC_ASSERT_F(isnormal(scale_factor),
1529 "ERROR(yac_cset_ext_couple_config_scale_factor_): "
1530 "\"%lf\" is not a valid scale factor", scale_factor);
1531 ext_couple_config->scale_factor = scale_factor;
1532}
1533
1534void yac_cset_ext_couple_config_scale_factor(int ext_couple_config_id,
1535 double scale_factor) {
1537 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id"),
1538 scale_factor);
1539}
1540
1541void yac_cget_ext_couple_config_scale_factor(int ext_couple_config_id,
1542 double * scale_factor) {
1543 struct yac_ext_couple_config * ext_couple_config =
1544 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id");
1545 *scale_factor = ext_couple_config->scale_factor;
1546}
1547
1549 struct yac_ext_couple_config * ext_couple_config,
1550 double scale_summand) {
1551 YAC_ASSERT_F((scale_summand == 0.0) || isnormal(scale_summand),
1552 "ERROR(yac_cset_ext_couple_config_scale_summand_): "
1553 "\"%lf\" is not a valid scale summand", scale_summand);
1554 ext_couple_config->scale_summand = scale_summand;
1555}
1556
1557void yac_cset_ext_couple_config_scale_summand(int ext_couple_config_id,
1558 double scale_summand) {
1560 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id"),
1562}
1563
1564void yac_cget_ext_couple_config_scale_summand(int ext_couple_config_id,
1565 double * scale_summand) {
1566 struct yac_ext_couple_config * ext_couple_config =
1567 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id");
1568 *scale_summand = ext_couple_config->scale_summand;
1569}
1570
1572 struct yac_ext_couple_config * ext_couple_config,
1573 size_t num_src_mask_names, char const * const * src_mask_names) {
1574 if (ext_couple_config->num_src_mask_names > 0)
1575 for (size_t i = 0; i < ext_couple_config->num_src_mask_names; ++i)
1576 free(ext_couple_config->src_mask_names[i]);
1577 free(ext_couple_config->src_mask_names);
1578 ext_couple_config->num_src_mask_names = num_src_mask_names;
1579 if (num_src_mask_names > 0) {
1580 ext_couple_config->src_mask_names =
1582 for (size_t i = 0; i < num_src_mask_names; ++i)
1583 ext_couple_config->src_mask_names[i] = strdup(src_mask_names[i]);
1584 } else ext_couple_config->src_mask_names = NULL;
1585}
1586
1588 int ext_couple_config_id, size_t num_src_mask_names,
1589 char const * const * src_mask_names) {
1591 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id"),
1593}
1594
1596 int ext_couple_config_id, size_t * num_src_mask_names,
1597 char const * const ** src_mask_names) {
1598 struct yac_ext_couple_config * ext_couple_config =
1599 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id");
1600 *num_src_mask_names = ext_couple_config->num_src_mask_names;
1601 *src_mask_names = (char const * const *)ext_couple_config->src_mask_names;
1602}
1603
1605 struct yac_ext_couple_config * ext_couple_config,
1606 char const * tgt_mask_name) {
1607 free(ext_couple_config->tgt_mask_name);
1608 ext_couple_config->tgt_mask_name =
1609 (tgt_mask_name != NULL)?strdup(tgt_mask_name):NULL;
1610}
1611
1613 int ext_couple_config_id, char const * tgt_mask_name) {
1615 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id"),
1617}
1618
1620 int ext_couple_config_id, char const ** tgt_mask_name) {
1621 struct yac_ext_couple_config * ext_couple_config =
1622 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id");
1623 *tgt_mask_name = ext_couple_config->tgt_mask_name;
1624}
1625
1627 struct yac_ext_couple_config * ext_couple_config,
1628 char const * yaxt_exchanger_name) {
1629 free(ext_couple_config->yaxt_exchanger_name);
1630 ext_couple_config->yaxt_exchanger_name =
1631 (yaxt_exchanger_name != NULL)?strdup(yaxt_exchanger_name):NULL;
1632}
1633
1635 int ext_couple_config_id, char const * yaxt_exchanger_name) {
1637 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id"),
1639}
1640
1642 int ext_couple_config_id, char const ** yaxt_exchanger_name) {
1643 struct yac_ext_couple_config * ext_couple_config =
1644 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id");
1645 *yaxt_exchanger_name = ext_couple_config->yaxt_exchanger_name;
1646}
1647
1649 struct yac_ext_couple_config * ext_couple_config,
1650 int use_raw_exchange) {
1651 ext_couple_config->use_raw_exchange = use_raw_exchange;
1652}
1653
1655 int ext_couple_config_id, int use_raw_exchange) {
1657 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id"),
1659}
1660
1662 int ext_couple_config_id, int * use_raw_exchange) {
1663 struct yac_ext_couple_config * ext_couple_config =
1664 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id");
1665 *use_raw_exchange = ext_couple_config->use_raw_exchange;
1666}
1667
1669 int yac_instance_id,
1670 char const * src_comp_name, char const * src_grid_name, char const * src_field_name,
1671 char const * tgt_comp_name, char const * tgt_grid_name, char const * tgt_field_name,
1672 char const * coupling_timestep, int time_unit, int time_reduction,
1673 int interp_stack_config_id, int src_lag, int tgt_lag,
1674 struct yac_ext_couple_config * ext_couple_config) {
1675 struct yac_instance * instance =
1676 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
1677 struct yac_interp_stack_config * interp_stack_config =
1679 interp_stack_config_id, "interp_stack_config_id");
1680 char const * coupling_timestep_iso8601 =
1681 yac_time_to_ISO(coupling_timestep, (enum yac_time_unit_type)time_unit);
1682 yac_instance_def_couple(instance,
1683 src_comp_name, src_grid_name, src_field_name,
1684 tgt_comp_name, tgt_grid_name, tgt_field_name,
1685 coupling_timestep_iso8601, time_reduction,
1686 interp_stack_config, src_lag, tgt_lag,
1688 ext_couple_config->mapping_side,
1689 ext_couple_config->scale_factor,
1690 ext_couple_config->scale_summand,
1691 ext_couple_config->num_src_mask_names,
1692 (char const * const *)ext_couple_config->src_mask_names,
1693 ext_couple_config->tgt_mask_name,
1694 ext_couple_config->yaxt_exchanger_name,
1695 ext_couple_config->use_raw_exchange);
1696}
1697
1699 int yac_instance_id,
1700 char const * src_comp_name, char const * src_grid_name, char const * src_field_name,
1701 char const * tgt_comp_name, char const * tgt_grid_name, char const * tgt_field_name,
1702 char const * coupling_timestep, int time_unit, int time_reduction,
1703 int interp_stack_config_id, int src_lag, int tgt_lag,
1704 int ext_couple_config_id) {
1705
1707 yac_instance_id, src_comp_name, src_grid_name, src_field_name,
1708 tgt_comp_name, tgt_grid_name, tgt_field_name, coupling_timestep,
1709 time_unit, time_reduction, interp_stack_config_id, src_lag, tgt_lag,
1710 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id"));
1711}
1712
1714 char const * src_comp_name, char const * src_grid_name, char const * src_field_name,
1715 char const * tgt_comp_name, char const * tgt_grid_name, char const * tgt_field_name,
1716 char const * coupling_timestep, int time_unit, int time_reduction,
1717 int interp_stack_config_id, int src_lag, int tgt_lag,
1718 int ext_couple_config_id) {
1719
1720 check_default_instance_id("yac_cdef_couple_custom");
1722 src_comp_name, src_grid_name, src_field_name,
1723 tgt_comp_name, tgt_grid_name, tgt_field_name, coupling_timestep,
1724 time_unit, time_reduction, interp_stack_config_id, src_lag, tgt_lag,
1725 yac_unique_id_to_pointer(ext_couple_config_id, "ext_couple_config_id"));
1726}
1727
1729 int yac_instance_id,
1730 char const * src_comp_name, char const * src_grid_name, char const * src_field_name,
1731 char const * tgt_comp_name, char const * tgt_grid_name, char const * tgt_field_name,
1732 char const * coupling_timestep, int time_unit, int time_reduction,
1733 int interp_stack_config_id, int src_lag, int tgt_lag) {
1734
1735 struct yac_ext_couple_config ext_couple_config;
1736 init_ext_couple_config(&ext_couple_config);
1737
1739 yac_instance_id, src_comp_name, src_grid_name, src_field_name,
1740 tgt_comp_name, tgt_grid_name, tgt_field_name, coupling_timestep,
1741 time_unit, time_reduction, interp_stack_config_id, src_lag, tgt_lag,
1742 &ext_couple_config);
1743}
1744
1746 char const * src_comp_name, char const * src_grid_name, char const * src_field_name,
1747 char const * tgt_comp_name, char const * tgt_grid_name, char const * tgt_field_name,
1748 char const * coupling_timestep, int time_unit, int time_reduction,
1749 int interp_stack_config_id, int src_lag, int tgt_lag){
1750
1751 check_default_instance_id("yac_cdef_couple");
1753 src_comp_name, src_grid_name, src_field_name,
1754 tgt_comp_name, tgt_grid_name, tgt_field_name,
1755 coupling_timestep, time_unit, time_reduction, interp_stack_config_id,
1756 src_lag, tgt_lag);
1757}
1758
1760 int yac_instance_id,
1761 char const * src_comp_name, char const * src_grid_name, char const * src_field_name,
1762 char const * tgt_comp_name, char const * tgt_grid_name, char const * tgt_field_name,
1763 char const * coupling_timestep, int time_unit, int time_reduction,
1764 int interp_stack_config_id, int src_lag, int tgt_lag,
1765 char const * weight_file, int weight_file_on_existing, int mapping_side,
1766 double scale_factor, double scale_summand,
1767 int num_src_mask_names, char const * const * src_mask_names,
1768 char const * tgt_mask_name, char const * yaxt_exchanger_name,
1769 int use_raw_exchange) {
1770
1772 num_src_mask_names >= 0,
1773 "ERROR(yac_cdef_couple_instance_): "
1774 "\"%d\" is not a valid number of source mask names", num_src_mask_names)
1775
1776 struct yac_ext_couple_config ext_couple_config;
1777 init_ext_couple_config(&ext_couple_config);
1779 &ext_couple_config, weight_file);
1781 &ext_couple_config, weight_file_on_existing);
1783 &ext_couple_config, mapping_side);
1785 &ext_couple_config, scale_factor);
1787 &ext_couple_config, scale_summand);
1789 &ext_couple_config, (size_t)num_src_mask_names, src_mask_names);
1791 &ext_couple_config, tgt_mask_name);
1793 &ext_couple_config, yaxt_exchanger_name);
1795 &ext_couple_config, use_raw_exchange);
1796
1798 yac_instance_id, src_comp_name, src_grid_name, src_field_name,
1799 tgt_comp_name, tgt_grid_name, tgt_field_name, coupling_timestep,
1800 time_unit, time_reduction, interp_stack_config_id, src_lag, tgt_lag,
1801 &ext_couple_config);
1802}
1803
1805 char const * src_comp_name, char const * src_grid_name, char const * src_field_name,
1806 char const * tgt_comp_name, char const * tgt_grid_name, char const * tgt_field_name,
1807 char const * coupling_timestep, int time_unit, int time_reduction,
1808 int interp_stack_config_id, int src_lag, int tgt_lag,
1809 char const * weight_file, int weight_file_on_existing, int mapping_side,
1810 double scale_factor, double scale_summand,
1811 int num_src_mask_names, char const * const * src_mask_names,
1812 char const * tgt_mask_name, char const * yaxt_exchanger_name,
1813 int use_raw_exchange) {
1814
1815 check_default_instance_id("yac_cdef_couple_");
1817 src_comp_name, src_grid_name, src_field_name,
1818 tgt_comp_name, tgt_grid_name, tgt_field_name,
1819 coupling_timestep, time_unit, time_reduction, interp_stack_config_id,
1824}
1825
1826/* ---------------------------------------------------------------------- */
1827
1829 int collection_size,
1830 int num_interp_fields,
1831 int const * interp_field_sizes ) {
1832
1833 struct coupling_field * cpl_field =
1834 yac_unique_id_to_pointer(field_id, "field_id");
1835
1839 "ERROR(yac_ccheck_field_dimensions): mismatching collection sizes "
1840 "for component %s grid %s field %s (%d != %d)",
1844 yac_get_coupling_field_name(cpl_field),
1846
1847 if (num_interp_fields != -1) {
1848
1850 (size_t)num_interp_fields ==
1852 "ERROR(yac_ccheck_field_dimensions): mismatching number of interp fields "
1853 "for component %s grid %s field %s (%d != %zu)",
1857 yac_get_coupling_field_name(cpl_field),
1859
1860 if (interp_field_sizes) {
1861 for (int interp_field_idx = 0; interp_field_idx < num_interp_fields;
1862 ++interp_field_idx) {
1863
1865 (size_t)interp_field_sizes[interp_field_idx] ==
1867 cpl_field,
1869 cpl_field, (size_t)interp_field_idx)),
1870 "ERROR(yac_ccheck_field_dimensions): mismatching interp field size "
1871 "for component %s grid %s field %s interp_field_idx %d (%d != %zu)",
1875 yac_get_coupling_field_name(cpl_field),
1876 interp_field_idx,
1877 interp_field_sizes[interp_field_idx],
1879 cpl_field,
1881 cpl_field, (size_t)interp_field_idx)));
1882 }
1883 }
1884 }
1885}
1886
1887/* ---------------------------------------------------------------------- */
1888
1890 int collection_size,
1891 int src_field_buffer_size_ ) {
1892
1893 struct coupling_field * cpl_field =
1894 yac_unique_id_to_pointer(field_id, "field_id");
1895
1899 "ERROR(yac_ccheck_src_field_buffer_size): mismatching collection sizes "
1900 "for component %s grid %s field %s (%d != %d)",
1904 yac_get_coupling_field_name(cpl_field),
1906
1907 size_t num_src_fields;
1908 size_t const * src_field_buffer_sizes;
1909 size_t src_field_buffer_size = 0;
1911 cpl_field, &num_src_fields, &src_field_buffer_sizes);
1912 for (size_t i = 0; i < num_src_fields; ++i)
1913 src_field_buffer_size += src_field_buffer_sizes[i];
1914
1916 (size_t)src_field_buffer_size_ == src_field_buffer_size,
1917 "ERROR(yac_ccheck_src_field_buffer_size): "
1918 "mismatching source buffer size "
1919 "for component %s grid %s field %s (%d != %zu)",
1923 yac_get_coupling_field_name(cpl_field),
1924 src_field_buffer_size_, src_field_buffer_size);
1925}
1926
1928 int num_src_fields_,
1929 int collection_size,
1930 int * src_field_buffer_sizes_ ) {
1931
1932 struct coupling_field * cpl_field =
1933 yac_unique_id_to_pointer(field_id, "field_id");
1934
1938 "ERROR(yac_ccheck_src_field_buffer_sizes): mismatching collection sizes "
1939 "for component %s grid %s field %s (%d != %d)",
1943 yac_get_coupling_field_name(cpl_field),
1945
1946 size_t num_src_fields;
1947 size_t const * src_field_buffer_sizes;
1949 cpl_field, &num_src_fields, &src_field_buffer_sizes);
1950
1952 (size_t)num_src_fields_ == num_src_fields,
1953 "ERROR(yac_ccheck_src_field_buffer_sizes): "
1954 "mismatching number of source fields "
1955 "for component %s grid %s field %s (%d != %zu)",
1959 yac_get_coupling_field_name(cpl_field), num_src_fields_, num_src_fields);
1960
1961 for (size_t i = 0; i < num_src_fields; ++i)
1963 (size_t)src_field_buffer_sizes_[i] == src_field_buffer_sizes[i],
1964 "ERROR(yac_ccheck_src_field_buffer_sizes): "
1965 "mismatching source buffer size "
1966 "for component %s grid %s field %s field_idx %zu (%d != %zu)",
1970 yac_get_coupling_field_name(cpl_field),
1971 i, src_field_buffer_sizes_[i], src_field_buffer_sizes[i]);
1972}
1973
1974/* ---------------------------------------------------------------------- */
1975
1976void yac_cget_raw_interp_weights_data ( int const field_id,
1977 double * frac_mask_fallback_value,
1978 double * scaling_factor,
1979 double * scaling_summand,
1980 size_t * num_fixed_values,
1981 double ** fixed_values,
1982 size_t ** num_tgt_per_fixed_value,
1983 size_t ** tgt_idx_fixed,
1984 size_t * num_wgt_tgt,
1985 size_t ** wgt_tgt_idx,
1986 size_t ** num_src_per_tgt,
1987 double ** weights,
1988 size_t ** src_field_idx,
1989 size_t ** src_idx,
1990 size_t * num_src_fields,
1991 size_t ** src_field_buffer_size ) {
1992
1993 struct coupling_field * cpl_field =
1994 yac_unique_id_to_pointer(field_id, "field_id");
1995
1996 struct yac_interp_weights_data interp_weights_data =
1998
2000 *scaling_factor = interp_weights_data.scaling_factor;
2001 *scaling_summand = interp_weights_data.scaling_summand;
2002 *num_fixed_values = interp_weights_data.num_fixed_values;
2003 *fixed_values = interp_weights_data.fixed_values;
2004 *num_tgt_per_fixed_value = interp_weights_data.num_tgt_per_fixed_value;
2005 *tgt_idx_fixed = interp_weights_data.tgt_idx_fixed;
2006 *num_wgt_tgt = interp_weights_data.num_wgt_tgt;
2007 *wgt_tgt_idx = interp_weights_data.wgt_tgt_idx;
2008 *num_src_per_tgt = interp_weights_data.num_src_per_tgt;
2009 *weights = interp_weights_data.weights;
2010 *src_field_idx = interp_weights_data.src_field_idx;
2011 *src_idx = interp_weights_data.src_idx;
2012 *num_src_fields = interp_weights_data.num_src_fields;
2013 *src_field_buffer_size = interp_weights_data.src_field_buffer_size;
2014}
2015
2017 double * frac_mask_fallback_value,
2018 double * scaling_factor,
2019 double * scaling_summand,
2020 size_t * num_fixed_values,
2021 double ** fixed_values,
2022 size_t ** num_tgt_per_fixed_value,
2023 size_t ** tgt_idx_fixed,
2024 size_t ** src_indptr_,
2025 double ** weights,
2026 size_t ** src_field_idx,
2027 size_t ** src_idx,
2028 size_t * num_src_fields,
2029 size_t ** src_field_buffer_sizes ) {
2030
2031 size_t num_wgt_tgt;
2032 size_t * num_src_per_tgt;
2033 size_t * wgt_tgt_idx;
2038 src_field_idx, src_idx, num_src_fields, src_field_buffer_sizes);
2039
2040 struct coupling_field * cpl_field =
2041 yac_unique_id_to_pointer(field_id, "field_id");
2042
2045 "ERROR(yac_cget_raw_interp_weights_data_csr): "
2046 "target field \"%s\" has more than one interpolation field",
2047 yac_get_coupling_field_name(cpl_field));
2048
2049 size_t field_data_size =
2051 cpl_field,
2053
2054 size_t * src_indptr =
2055 xcalloc((field_data_size + 1), sizeof(*src_indptr));
2056 for (size_t i = 0; i < num_wgt_tgt; ++i)
2057 src_indptr[wgt_tgt_idx[i]] = num_src_per_tgt[i];
2058 size_t total_num_weights = 0;
2059 for (size_t i = 0; i < field_data_size; ++i) {
2060 size_t curr_count = src_indptr[i];
2061 src_indptr[i] = total_num_weights;
2062 total_num_weights += curr_count;
2063 }
2064 src_indptr[field_data_size] = total_num_weights;
2065
2066 // check whether weighted target indices are already in sorted order
2067 int tgt_sorted = 1;
2068 for (size_t i = 1; (i < num_wgt_tgt) && tgt_sorted; ++i)
2069 tgt_sorted = wgt_tgt_idx[i] > wgt_tgt_idx[i-1];
2070
2072 tgt_sorted,
2073 "ERROR(yac_cget_raw_interp_weights_data_csr): "
2074 "target indices for field \"%s\" are unsorted, which is unexpected, "
2075 "please contact the author!", yac_get_coupling_field_name(cpl_field));
2076
2077 // The following could should be able to handle the case of unsorted
2078 // target indices. However since I currently not able to write an
2079 // appropriate test, it is commented out.
2080
2081 /*
2082 // sort weight information based on target indices
2083 if (!tgt_sorted) {
2084
2085 double * weights_ = xmalloc(total_num_weights * sizeof(*weights_));
2086 size_t * src_idx_ = xmalloc(total_num_weights * sizeof(*src_idx_));
2087 size_t * src_field_idx_ =
2088 xmalloc(total_num_weights * sizeof(*src_field_idx_));
2089
2090 double * from_weights = *weights;
2091 size_t * from_src_idx = *src_idx;
2092 size_t * from_src_field_idx = *src_field_idx;
2093
2094 for (size_t i = 0; i < num_wgt_tgt; ++i) {
2095
2096 size_t tgt_idx = wgt_tgt_idx[i];
2097 size_t num_src = num_src_per_tgt[i];
2098 size_t offset = src_indptr[tgt_idx];
2099 memcpy(weights_ + offset, from_weights, num_src * sizeof(*weights_));
2100 memcpy(src_idx_ + offset, from_src_idx, num_src * sizeof(*src_idx_));
2101 memcpy(
2102 src_field_idx_ + offset, from_src_field_idx,
2103 num_src * sizeof(*src_field_idx_));
2104 from_weights += num_src;
2105 from_src_idx += num_src;
2106 from_src_field_idx += num_src;
2107 }
2108 free(*weights);
2109 free(*src_idx);
2110 free(*src_field_idx);
2111 *weights = weights_;
2112 *src_idx = src_idx_;
2113 *src_field_idx = src_field_idx_;
2114 }
2115 */
2116
2117 free(num_src_per_tgt);
2118 free(wgt_tgt_idx);
2119
2120 *src_indptr_ = src_indptr;
2121}
2122
2124 int const field_id,
2125 double * frac_mask_fallback_value,
2126 double * scaling_factor,
2127 double * scaling_summand,
2128 size_t * num_fixed_values,
2129 double ** fixed_values,
2130 size_t ** num_tgt_per_fixed_value,
2131 size_t ** tgt_idx_fixed,
2132 size_t ** src_indptr,
2133 double ** weights,
2134 size_t ** src_field_idx,
2135 size_t ** src_idx,
2136 size_t * num_src_fields,
2137 size_t ** src_field_buffer_sizes,
2138 size_t * tgt_field_data_size) {
2139
2140 struct coupling_field * cpl_field =
2141 yac_unique_id_to_pointer(field_id, "field_id");
2142
2145 "ERROR(yac_cget_raw_interp_weights_data_csr_c2f): "
2146 "target field \"%s\" has more than one interpolation field",
2147 yac_get_coupling_field_name(cpl_field));
2148
2149 *tgt_field_data_size =
2151 cpl_field,
2153
2155 field_id, frac_mask_fallback_value, scaling_factor, scaling_summand,
2156 num_fixed_values, fixed_values, num_tgt_per_fixed_value, tgt_idx_fixed,
2157 src_indptr, weights, src_field_idx, src_idx, num_src_fields,
2158 src_field_buffer_sizes);
2159}
2160
2161/* ---------------------------------------------------------------------- */
2162
2163void yac_cget_action(int field_id, int * action) {
2164
2165 struct coupling_field * cpl_field =
2166 yac_unique_id_to_pointer(field_id, "field_id");
2169
2170 YAC_ASSERT(
2171 (exchange_type == NOTHING) ||
2172 (exchange_type == SOURCE) ||
2173 (exchange_type == TARGET),
2174 "ERROR(yac_cget_action): invalid field exchange type")
2175
2176 switch(exchange_type) {
2177 default:
2178 case(NOTHING): {
2179
2180 *action = YAC_ACTION_NONE;
2181 break;
2182 }
2183 case(TARGET): {
2184
2185 enum yac_action_type event_action =
2187 *action = (int)((event_action == RESTART)?GET_FOR_RESTART:event_action);
2188 break;
2189 }
2190 case(SOURCE): {
2191
2192 enum yac_action_type event_action = NONE;
2193 unsigned num_puts = yac_get_coupling_field_num_puts(cpl_field);
2194 for (unsigned put_idx = 0; put_idx < num_puts; ++put_idx)
2195 event_action =
2196 MAX(
2197 event_action,
2199 yac_get_coupling_field_put_op_event(cpl_field, put_idx)));
2200 *action = (int)((event_action == RESTART)?PUT_FOR_RESTART:event_action);
2201 break;
2202 }
2203 }
2204}
2205
2206const char* yac_cget_field_datetime(int field_id){
2207 struct coupling_field * cpl_field =
2208 yac_unique_id_to_pointer(field_id, "field_id");
2209 return yac_coupling_field_get_datetime(cpl_field);
2210}
2211
2212/* ---------------------------------------------------------------------- */
2213
2214static inline void yac_cupdate_(
2215 struct coupling_field * cpl_field, struct event * event, int is_source) {
2216
2219 "ERROR(yac_cupdate): current action of %s field \"%s\" of "
2220 "componente \"%s\" is not YAC_ACTION_NONE",
2221 ((is_source)?"source":"target"), yac_get_coupling_field_name(cpl_field),
2224}
2225
2226void yac_cupdate(int field_id) {
2227
2228 struct coupling_field * cpl_field =
2229 yac_unique_id_to_pointer(field_id, "field_id");
2232
2233 YAC_ASSERT(
2234 (exchange_type == NOTHING) ||
2235 (exchange_type == SOURCE) ||
2236 (exchange_type == TARGET),
2237 "ERROR(yac_cupdate): invalid field exchange type")
2238
2239 switch(exchange_type) {
2240 default:
2241 case(NOTHING): {
2242 break;
2243 }
2244 case(TARGET): {
2245
2247 cpl_field, yac_get_coupling_field_get_op_event(cpl_field), 0);
2248 break;
2249 }
2250 case(SOURCE): {
2251
2252 unsigned num_puts = yac_get_coupling_field_num_puts(cpl_field);
2253 for (unsigned put_idx = 0; put_idx < num_puts; ++put_idx)
2255 cpl_field,
2256 yac_get_coupling_field_put_op_event(cpl_field, put_idx), 1);
2257 break;
2258 }
2259 }
2260}
2261
2262/* ---------------------------------------------------------------------- */
2263
2265 int const field_id,
2266 int const collection_size,
2267 double *recv_field) { // recv_field[collection_size][Points]
2268
2269 struct coupling_field * cpl_field =
2270 yac_unique_id_to_pointer(field_id, "field_id");
2271
2272 YAC_ASSERT(
2274 "ERROR(get_recv_field_pointers): invalid number of interpolation fields "
2275 "(should be one)")
2276
2277 enum yac_location location =
2279 size_t num_points =
2280 yac_coupling_field_get_data_size(cpl_field, location);
2281
2282 double ** recv_field_ = xmalloc(collection_size * sizeof(*recv_field_));
2283
2284 for (int i = 0; i < collection_size; ++i) {
2285 recv_field_[i] = recv_field;
2286 recv_field += num_points;
2287 }
2288
2289 return recv_field_;
2290}
2291
2293 int field_id, size_t collection_size, double *src_field_buffer) {
2294 // src_field_buffer
2295 // [collection_size *
2296 // SUM(src_field_buffer_sizes[0:num_src_fields-1])]
2297
2298 struct coupling_field * cpl_field =
2299 yac_unique_id_to_pointer(field_id, "field_id");
2300
2301 size_t num_src_fields;
2302 size_t const * src_field_buffer_sizes;
2304 cpl_field, &num_src_fields, &src_field_buffer_sizes);
2305
2306 double *** src_field_buffer_ =
2307 xmalloc(collection_size * sizeof(*src_field_buffer_));
2308 double ** src_field_buffer__ =
2309 xmalloc(collection_size * num_src_fields * sizeof(*src_field_buffer__));
2310
2311 for (size_t i = 0; i < collection_size; ++i) {
2312 src_field_buffer_[i] =
2313 src_field_buffer__ + i * num_src_fields;
2314 for (size_t j = 0; j < num_src_fields; ++j) {
2315 src_field_buffer_[i][j] = src_field_buffer;
2316 src_field_buffer += src_field_buffer_sizes[j];
2317 }
2318 }
2319
2320 return src_field_buffer_;
2321}
2322
2324 int field_id,
2325 size_t collection_size,
2326 double **src_field_buffer) { // src_field_buffer
2327 // [collection_size*num_src_points]
2328 // [src_field_buffer_sizes[src_field_idx]]
2329
2330 struct coupling_field * cpl_field =
2331 yac_unique_id_to_pointer(field_id, "field_id");
2332
2333 size_t num_src_fields;
2334 size_t const * src_field_buffer_sizes;
2336 cpl_field, &num_src_fields, &src_field_buffer_sizes);
2337
2338 double *** src_field_buffer_ =
2339 xmalloc(collection_size * sizeof(*src_field_buffer_));
2340 double ** src_field_buffer__ =
2341 xmalloc(collection_size * num_src_fields * sizeof(*src_field_buffer__));
2342
2343 for (size_t i = 0, k = 0; i < collection_size; ++i) {
2344 src_field_buffer_[i] =
2345 src_field_buffer__ + i * num_src_fields;
2346 for (size_t j = 0; j < num_src_fields; ++j, ++k)
2347 src_field_buffer_[i][j] = src_field_buffer[k];
2348 }
2349
2350 return src_field_buffer_;
2351}
2352
2354 int const field_id, int collection_size, int *info, int *ierr) {
2355
2356 *info = (int)NONE;
2357 *ierr = 0;
2358
2359 struct coupling_field * cpl_field =
2360 yac_unique_id_to_pointer(field_id, "field_id");
2361
2363 return NULL;
2364
2365 /* --------------------------------------------------------------------
2366 Check for restart and coupling events
2367 -------------------------------------------------------------------- */
2368
2369 struct event * event = yac_get_coupling_field_get_op_event(cpl_field);
2371 *info = (int)((action == RESTART)?GET_FOR_RESTART:action);
2372
2373 /* --------------------------------------------------------------------
2374 add one model time step (as provided in coupling configuration) to
2375 the current event date
2376 -------------------------------------------------------------------- */
2377
2379
2380 /* ------------------------------------------------------------------
2381 return in case we are already beyond the end of the run
2382 ------------------------------------------------------------------ */
2383
2384 if ( action == OUT_OF_BOUND ) {
2385
2386 fputs("WARNING: yac get action is beyond end of run date!\n", stderr);
2387 fputs("WARNING: yac get action is beyond end of run date!\n", stdout);
2388
2389 return NULL;
2390 }
2391
2392 /* --------------------------------------------------------------------
2393 start actions
2394 -------------------------------------------------------------------- */
2395
2396 if ( action == NONE ) return NULL;
2397
2398 YAC_ASSERT(
2399 (size_t)collection_size ==
2401 "ERROR: collection size does not match with coupling configuration.")
2402
2403 return
2407}
2408
2409// basic internal routine for get operation
2410static void yac_get ( int const field_id,
2411 int collection_size,
2412 double ** recv_field,
2413 int is_async,
2414 int *info,
2415 int *ierr ) {
2416
2417 yac_ccheck_field_dimensions(field_id, collection_size, 1, NULL);
2418
2419 struct yac_interpolation * interpolation =
2420 yac_cget_pre_processing(field_id, collection_size, info, ierr);
2421
2422 if ((*ierr == 0) && (interpolation != NULL)) {
2423 if (is_async)
2424 yac_interpolation_execute_get_async(interpolation, recv_field);
2425 else
2426 yac_interpolation_execute_get(interpolation, recv_field);
2427 }
2428}
2429
2430// basic internal routine for get operation with raw data exchange
2431void yac_get_raw_frac ( int const field_id,
2432 int const collection_size,
2433 double ***src_field_buffer,
2434 double ***src_frac_mask_buffer,
2435 int is_async,
2436 int *info,
2437 int *ierror ) {
2438
2439
2440 yac_ccheck_field_dimensions(field_id, collection_size, 1, NULL);
2441
2442 struct coupling_field * cpl_field =
2443 yac_unique_id_to_pointer(field_id, "field_id");
2444 enum yac_field_exchange_type field_role =
2446 if (field_role == NOTHING) return;
2447
2449 field_role != SOURCE,
2450 "ERROR(yac_cget_raw_frac): field \"%s\" is source",
2451 yac_get_coupling_field_name(cpl_field));
2452
2453 struct yac_interpolation_exchange * interpolation_exchange =
2454 yac_cget_pre_processing(field_id, collection_size, info, ierror);
2455
2457 size_t num_src_fields;
2459 cpl_field, &num_src_fields, NULL);
2460
2462 with_frac_mask == (src_frac_mask_buffer != NULL),
2463 "ERROR(yac_get_raw_frac): target field \"%s\" was configured %s "
2464 "support for fractional masking, but %s source fractional mask buffer "
2465 "was provided to this call",
2466 yac_get_coupling_field_name(cpl_field), with_frac_mask?"with":"without",
2467 with_frac_mask?"no":"a")
2468
2469 double ** src_field_buffer_ =
2470 xmalloc(
2471 (size_t)(1 + with_frac_mask) * (size_t)collection_size * num_src_fields *
2472 sizeof(*src_field_buffer_));
2473
2474 size_t k = 0;
2475 for (int i = 0; i < collection_size; ++i)
2476 for (size_t j = 0; j < num_src_fields; ++j, ++k)
2477 src_field_buffer_[k] = src_field_buffer[i][j];
2478 if (with_frac_mask)
2479 for (int i = 0; i < collection_size; ++i)
2480 for (size_t j = 0; j < num_src_fields; ++j, ++k)
2481 src_field_buffer_[k] = src_frac_mask_buffer[i][j];
2482
2483 if ((*ierror == 0) && (interpolation_exchange != NULL)) {
2484 if (is_async)
2486 interpolation_exchange, src_field_buffer_, "yac_get_raw_frac");
2487 else
2489 interpolation_exchange, src_field_buffer_, "yac_get_raw_frac");
2490 }
2491 free(src_field_buffer_);
2492}
2493
2494/* --------------- user interface routines for get operation --------------- */
2495
2496void yac_get_ ( int const field_id,
2497 int const collection_size,
2498 double *recv_field,
2499 int is_async,
2500 int *info,
2501 int *ierr ) {
2502
2503 yac_ccheck_field_dimensions(field_id, collection_size, 1, NULL);
2504
2505 /* Needed to transfer from Fortran data structure to C */
2506 double ** recv_field_ =
2507 get_recv_field_pointers(field_id, collection_size, recv_field);
2508
2509 yac_get(field_id, collection_size, recv_field_, is_async, info, ierr);
2510
2511 free(recv_field_);
2512}
2513
2514void yac_cget_ ( int const field_id,
2515 int const collection_size,
2516 double *recv_field, // recv_field[collection_size*Points]
2517 int *info,
2518 int *ierr ) {
2519
2520 yac_get_(field_id, collection_size, recv_field, 0, info, ierr);
2521}
2522
2523void yac_cget_async_ ( int const field_id,
2524 int const collection_size,
2525 double *recv_field, // recv_field[collection_size*Points]
2526 int *info,
2527 int *ierr ) {
2528
2529 yac_get_(field_id, collection_size, recv_field, 1, info, ierr);
2530}
2531
2532void yac_cget ( int const field_id,
2533 int collection_size,
2534 double ** recv_field, // recv_field[collection_size][Points]
2535 int *info,
2536 int *ierr ) {
2537
2538 yac_get(field_id, collection_size, recv_field, 0, info, ierr);
2539}
2540
2541void yac_cget_async ( int const field_id,
2542 int collection_size,
2543 double ** recv_field, // recv_field[collection_size][Points]
2544 int *info,
2545 int *ierr ) {
2546
2547
2548 yac_get(field_id, collection_size, recv_field, 1, info, ierr);
2549}
2550
2551/* ------- user interface routines for get operation with raw exchange ----- */
2552
2553void yac_get_raw_frac_ ( int const field_id,
2554 int const collection_size,
2555 double *src_field_buffer, // src_field_buffer
2556 // [collection_size *
2557 // SUM(src_field_buffer_sizes[0:num_src_fields-1])]
2558 double *src_frac_mask_buffer, // src_frac_mask_buffer
2559 // [collection_size *
2560 // SUM(src_field_buffer_sizes[0:num_src_fields-1])]
2561 int is_async,
2562 int *info,
2563 int *ierr ) {
2564
2565 yac_ccheck_field_dimensions(field_id, collection_size, 1, NULL);
2566
2567 /* Needed to transfer from Fortran data structure to C */
2568 double *** src_field_buffer_ =
2570 field_id, collection_size, src_field_buffer);
2571 double *** src_frac_mask_buffer_ =
2572 src_frac_mask_buffer?
2574 field_id, collection_size, src_frac_mask_buffer):NULL;
2575
2577 field_id, collection_size, src_field_buffer_, src_frac_mask_buffer_,
2578 is_async, info, ierr);
2579
2580 if (src_frac_mask_buffer) {
2581 free(src_frac_mask_buffer_[0]);
2582 free(src_frac_mask_buffer_);
2583 }
2584 free(src_field_buffer_[0]);
2585 free(src_field_buffer_);
2586}
2587
2588static void yac_get_raw_frac_ptr_ ( int const field_id,
2589 int const collection_size,
2590 double **src_field_buffer, // src_field_buffer
2591 // [collection_size*num_src_fields]
2592 // [src_field_buffer_size[src_field_idx]]
2593 double **src_frac_mask_buffer, // src_frac_mask_buffer
2594 // [collection_size*num_src_fields]
2595 // [src_field_buffer_size[src_field_idx]]
2596 int is_async,
2597 int *info,
2598 int *ierr ) {
2599
2600 yac_ccheck_field_dimensions(field_id, collection_size, 1, NULL);
2601
2602 /* Needed to transfer from Fortran data structure to C */
2603 double *** src_field_buffer_ =
2605 field_id, (size_t)collection_size, src_field_buffer);
2606 double *** src_frac_mask_buffer_ =
2607 src_frac_mask_buffer?
2609 field_id, (size_t)collection_size, src_frac_mask_buffer):NULL;
2610
2612 field_id, collection_size, src_field_buffer_, src_frac_mask_buffer_,
2613 is_async, info, ierr);
2614
2615 if (src_frac_mask_buffer) {
2616 free(src_frac_mask_buffer_[0]);
2617 free(src_frac_mask_buffer_);
2618 }
2619 free(src_field_buffer_[0]);
2620 free(src_field_buffer_);
2621}
2622
2623void yac_cget_raw_ ( int const field_id,
2624 int const collection_size,
2625 double *src_field_buffer, // src_field_buffer
2626 // [collection_size *
2627 // SUM(src_field_buffer_size[src_field_idx]]
2628 int *info,
2629 int *ierr ) {
2630
2632 field_id, collection_size, src_field_buffer, NULL, 0, info, ierr);
2633}
2634
2635void yac_cget_raw_frac_ ( int const field_id,
2636 int const collection_size,
2637 double *src_field_buffer, // src_field_buffer
2638 // [collection_size *
2639 // SUM(src_field_buffer_size[src_field_idx]]
2640 double *src_frac_mask_buffer, // src_frac_mask_buffer
2641 // [collection_size *
2642 // SUM(src_field_buffer_size[src_field_idx]]
2643 int *info,
2644 int *ierr ) {
2645
2647 field_id, collection_size, src_field_buffer, src_frac_mask_buffer,
2648 0, info, ierr);
2649}
2650
2651void yac_cget_raw_ptr_ ( int const field_id,
2652 int const collection_size,
2653 double **src_field_buffer, // src_field_buffer
2654 // [collection_size*num_src_fields]
2655 // [src_field_buffer_size[src_field_idx]]
2656 int *info,
2657 int *ierr ) {
2658
2660 field_id, collection_size, src_field_buffer, NULL, 0, info, ierr);
2661}
2662
2663void yac_cget_raw_frac_ptr_ ( int const field_id,
2664 int const collection_size,
2665 double **src_field_buffer, // src_field_buffer
2666 // [collection_size*num_src_fields]
2667 // [src_field_buffer_size[src_field_idx]]
2668 double **src_frac_mask_buffer, // src_frac_mask_buffer
2669 // [collection_size]
2670 // [num_src_fields]
2671 // [src_field_buffer_size[src_field_idx]]
2672 int *info,
2673 int *ierr ) {
2674
2676 field_id, collection_size, src_field_buffer, src_frac_mask_buffer,
2677 0, info, ierr);
2678}
2679
2680void yac_cget_raw_async_ ( int const field_id,
2681 int const collection_size,
2682 double *src_field_buffer, // src_field_buffer
2683 // [collection_size *
2684 // SUM(src_field_buffer_sizes[0:num_src_fields-1])]
2685 int *info,
2686 int *ierr ) {
2687
2689 field_id, collection_size, src_field_buffer, NULL, 1, info, ierr);
2690}
2691
2692void yac_cget_raw_frac_async_ ( int const field_id,
2693 int const collection_size,
2694 double *src_field_buffer, // src_field_buffer
2695 // [collection_size *
2696 // SUM(src_field_buffer_sizes[0:num_src_fields-1])]
2697 double *src_frac_mask_buffer, // src_frac_mask_buffer
2698 // [collection_size *
2699 // SUM(src_field_buffer_sizes[0:num_src_fields-1])]
2700 int *info,
2701 int *ierr ) {
2702
2704 field_id, collection_size, src_field_buffer, src_frac_mask_buffer,
2705 1, info, ierr);
2706}
2707
2708void yac_cget_raw_async_ptr_ ( int const field_id,
2709 int const collection_size,
2710 double **src_field_buffer, // src_field_buffer
2711 // [collection_size*num_src_fields]
2712 // [src_field_buffer_size[src_field_idx]]
2713 int *info,
2714 int *ierr ) {
2715
2717 field_id, collection_size, src_field_buffer, NULL, 1, info, ierr);
2718}
2719
2720void yac_cget_raw_frac_async_ptr_ ( int const field_id,
2721 int const collection_size,
2722 double **src_field_buffer, // src_field_buffer
2723 // [collection_size*num_src_fields]
2724 // [src_field_buffer_size[src_field_idx]]
2725 double **src_frac_mask_buffer, // src_frac_mask_buffer
2726 // [collection_size*num_src_fields]
2727 // [src_field_buffer_size[src_field_idx]]
2728 int *info,
2729 int *ierr ) {
2730
2732 field_id, collection_size, src_field_buffer, src_frac_mask_buffer,
2733 1, info, ierr);
2734}
2735
2736void yac_cget_raw ( int const field_id,
2737 int collection_size,
2738 double ***src_field_buffer, // src_field_buffer
2739 // [collection_size]
2740 // [num_src_fields]
2741 // [src_field_buffer_size[src_field_idx]]
2742 int *info,
2743 int *ierr ) {
2744
2746 field_id, collection_size, src_field_buffer, NULL, 0, info, ierr);
2747}
2748
2749void yac_cget_raw_async ( int const field_id,
2750 int collection_size,
2751 double ***src_field_buffer, // src_field_buffer
2752 // [collection_size]
2753 // [num_src_fields]
2754 // [src_field_buffer_size[src_field_idx]]
2755 int *info,
2756 int *ierr ) {
2757
2758
2760 field_id, collection_size, src_field_buffer, NULL, 1, info, ierr);
2761}
2762
2763void yac_cget_raw_frac ( int const field_id,
2764 int collection_size,
2765 double ***src_field_buffer, // src_field_buffer
2766 // [collection_size]
2767 // [num_src_fields]
2768 // [src_field_buffer_size[src_field_idx]]
2769 double ***src_frac_mask_buffer, // src_frac_mask_buffer
2770 // [collection_size]
2771 // [num_src_fields]
2772 // [src_field_buffer_size[src_field_idx]]
2773 int *info,
2774 int *ierr ) {
2775
2777 field_id, collection_size, src_field_buffer, src_frac_mask_buffer,
2778 0, info, ierr);
2779}
2780
2781void yac_cget_raw_frac_async ( int const field_id,
2782 int collection_size,
2783 double ***src_field_buffer, // src_field_buffer
2784 // [collection_size]
2785 // [num_src_fields]
2786 // [src_field_buffer_size[src_field_idx]]
2787 double ***src_frac_mask_buffer, // src_frac_mask_buffer
2788 // [collection_size]
2789 // [num_src_fields]
2790 // [src_field_buffer_size[src_field_idx]]
2791 int *info,
2792 int *ierr ) {
2793
2795 field_id, collection_size, src_field_buffer, src_frac_mask_buffer,
2796 1, info, ierr);
2797}
2798
2799/* ---------------------------------------------------------------------- */
2800
2801static double *** get_send_field_pointers(
2802 int field_id, size_t collection_size, double * send_field) {
2803 // send_field[collection_size][nPointSets][Points]
2804
2805 struct coupling_field * cpl_field =
2806 yac_unique_id_to_pointer(field_id, "field_id");
2807
2808 size_t num_interp_fields =
2810
2811 size_t * num_points = xmalloc(num_interp_fields * sizeof(*num_points));
2812
2813 for (size_t i = 0; i < num_interp_fields; i++) {
2814
2815 enum yac_location location =
2817 num_points[i] = yac_coupling_field_get_data_size(cpl_field, location);
2818 }
2819
2820 double ***send_field_ =
2821 xmalloc(collection_size * sizeof(*send_field_));
2822 double **send_field__ =
2823 xmalloc(collection_size * num_interp_fields * sizeof(*send_field__));
2824
2825 for (size_t i = 0; i < collection_size; ++i) {
2826 send_field_[i] = send_field__ + i * num_interp_fields;
2827 for (size_t j = 0; j < num_interp_fields; ++j) {
2828 send_field_[i][j] = send_field;
2829 send_field += num_points[j];
2830 }
2831 }
2832 free(num_points);
2833 return send_field_;
2834}
2835
2836void yac_cput_ ( int const field_id,
2837 int const collection_size,
2838 double *send_field, // send_field[collection_size *
2839 // nPointSets *
2840 // Points]
2841 int *info,
2842 int *ierr ) {
2843
2844 yac_ccheck_field_dimensions(field_id, collection_size, -1, NULL);
2845
2846 /* Needed to transfer from Fortran data structure to C */
2847 double *** send_field_ =
2848 get_send_field_pointers(field_id, collection_size, send_field);
2849
2850 yac_cput ( field_id, collection_size, send_field_, info, ierr );
2851
2852 free(send_field_[0]);
2853 free(send_field_);
2854}
2855
2856void yac_cput_frac_ ( int const field_id,
2857 int const collection_size,
2858 double *send_field, // send_field[collection_size *
2859 // nPointSets *
2860 // Points]
2861 double *send_frac_mask, // send_frac_mask[collection_size *
2862 // nPointSets *
2863 // Points]
2864 int *info,
2865 int *ierr ) {
2866
2867 yac_ccheck_field_dimensions(field_id, collection_size, -1, NULL);
2868
2869 /* Needed to transfer from Fortran data structure to C */
2870 double *** send_field_ =
2871 get_send_field_pointers(field_id, collection_size, send_field);
2872 double *** send_frac_mask_ =
2873 get_send_field_pointers(field_id, collection_size, send_frac_mask);
2874
2876 field_id, collection_size, send_field_, send_frac_mask_, info, ierr);
2877
2878 free(send_field_[0]);
2879 free(send_field_);
2880 free(send_frac_mask_[0]);
2881 free(send_frac_mask_);
2882}
2883
2884/* ---------------------------------------------------------------------- */
2885
2887 int const field_id,
2888 int const collection_size,
2889 double **send_field, // send_field[collection_size*nPointSets][Points]
2890 double **send_frac_mask,
2891 double ****send_field_,
2892 double ****send_frac_mask_) {
2893
2894 struct coupling_field * cpl_field =
2895 yac_unique_id_to_pointer(field_id, "field_id");
2896
2897 size_t num_interp_fields =
2899
2900 size_t * num_points = xmalloc(num_interp_fields * sizeof(*num_points));
2901
2902 for (size_t i = 0; i < num_interp_fields; i++) {
2903
2904 enum yac_location location =
2906 num_points[i] = yac_coupling_field_get_data_size(cpl_field, location);
2907 }
2908
2909 *send_field_ = xmalloc(collection_size * sizeof(**send_field_));
2910 for (int i = 0, k = 0; i < collection_size; ++i) {
2911
2912 (*send_field_)[i] = xmalloc(num_interp_fields * sizeof(***send_field_));
2913 for (size_t j = 0; j < num_interp_fields; ++j, ++k)
2914 (*send_field_)[i][j] = send_field[k];
2915 }
2916 if (send_frac_mask != NULL) {
2917 *send_frac_mask_ = xmalloc(collection_size * sizeof(**send_frac_mask_));
2918 for (int i = 0, k = 0; i < collection_size; ++i) {
2919
2920 (*send_frac_mask_)[i] =
2921 xmalloc(num_interp_fields * sizeof(***send_frac_mask_));
2922 for (size_t j = 0; j < num_interp_fields; ++j, ++k)
2923 (*send_frac_mask_)[i][j] = send_frac_mask[k];
2924 }
2925 }
2926
2927 free(num_points);
2928}
2929
2930void yac_cput_ptr_ ( int const field_id,
2931 int const collection_size,
2932 double ** send_field, // send_field
2933 // [collection_size * nPointSets]
2934 // [Points]
2935 int *info,
2936 int *ierr ) {
2937
2938 yac_ccheck_field_dimensions(field_id, collection_size, -1, NULL);
2939
2940 /* Needed to transfer from Fortran data structure to C */
2941 double *** send_field_;
2943 field_id, collection_size, send_field, NULL, &send_field_, NULL);
2944
2945 yac_cput ( field_id, collection_size, send_field_, info, ierr );
2946
2947 for (int i = 0; i < collection_size; ++i) free(send_field_[i]);
2948 free(send_field_);
2949}
2950
2951void yac_cput_frac_ptr_ ( int const field_id,
2952 int const collection_size,
2953 double ** send_field, // send_field
2954 // [collection_size * nPointSets]
2955 // [Points]
2956 double ** send_frac_mask, // send_frac_mask
2957 // [collection_size * nPointSets]
2958 // [Points]
2959 int *info,
2960 int *ierr ) {
2961
2962 yac_ccheck_field_dimensions(field_id, collection_size, -1, NULL);
2963
2964 /* Needed to transfer from Fortran data structure to C */
2965 double *** send_field_;
2966 double *** send_frac_mask_;
2968 field_id, collection_size, send_field, send_frac_mask,
2969 &send_field_, &send_frac_mask_);
2970
2972 field_id, collection_size, send_field_, send_frac_mask_, info, ierr);
2973
2974 for (int i = 0; i < collection_size; ++i) {
2975 free(send_field_[i]);
2976 free(send_frac_mask_[i]);
2977 }
2978 free(send_field_);
2979 free(send_frac_mask_);
2980}
2981
2982/* ---------------------------------------------------------------------- */
2983
2984void yac_ctest(int field_id, int * flag) {
2985
2986 struct coupling_field * cpl_field =
2987 yac_unique_id_to_pointer(field_id, "field_id");
2988
2989 *flag = 1;
2990 if (yac_get_coupling_field_exchange_type(cpl_field) == SOURCE) {
2991 for (
2992 unsigned put_idx = 0;
2993 (put_idx < yac_get_coupling_field_num_puts(cpl_field)) && *flag;
2994 ++put_idx)
2995 *flag &=
2998 }
2999
3000 if (*flag && yac_get_coupling_field_exchange_type(cpl_field) == TARGET)
3001 *flag =
3004}
3005
3006/* ---------------------------------------------------------------------- */
3007
3008void yac_cwait(int field_id) {
3009
3010 struct coupling_field * cpl_field =
3011 yac_unique_id_to_pointer(field_id, "field_id");
3012
3013 if (yac_get_coupling_field_exchange_type(cpl_field) == SOURCE) {
3014 for (
3015 unsigned put_idx = 0;
3016 (put_idx < yac_get_coupling_field_num_puts(cpl_field)); ++put_idx) {
3017 if (yac_get_coupling_field_put_op_use_raw_exchange(cpl_field, put_idx))
3020 cpl_field, put_idx), "yac_cwait");
3021 else
3024 }
3025 }
3026
3027 if (yac_get_coupling_field_exchange_type(cpl_field) == TARGET) {
3031 "yac_cwait");
3032 else
3035 }
3036}
3037
3038/* ---------------------------------------------------------------------- */
3039
3040void * yac_get_field_put_mask_c2f(int field_id) {
3041
3042 struct coupling_field * cpl_field =
3043 yac_unique_id_to_pointer(field_id, "field_id");
3044
3045 return (void*)yac_get_coupling_field_put_mask(cpl_field);
3046}
3047
3048void * yac_get_field_get_mask_c2f(int field_id) {
3049
3050 struct coupling_field * cpl_field =
3051 yac_unique_id_to_pointer(field_id, "field_id");
3052
3053 return (void*)yac_get_coupling_field_get_mask(cpl_field);
3054}
3055
3056/* ---------------------------------------------------------------------- */
3057
3059 struct coupling_field * cpl_field, unsigned put_idx,
3060 int const collection_size, double *** send_field,
3061 double **** send_field_acc_, double *** send_frac_mask,
3062 double **** send_frac_mask_acc_, int * with_frac_mask_,
3063 int * use_raw_exchange_, int *info, int *ierr) {
3064
3065 *ierr = 0;
3066 void * interpolation =
3069 cpl_field, put_idx):
3071 cpl_field, put_idx);
3072
3073 int use_raw_exchange =
3075 int with_frac_mask =
3079
3080 *with_frac_mask_ = with_frac_mask;
3081 *use_raw_exchange_ = use_raw_exchange;
3082
3083 /* ------------------------------------------------------------------
3084 Check for restart and coupling events
3085 ------------------------------------------------------------------ */
3086
3087 struct event * event =
3088 yac_get_coupling_field_put_op_event(cpl_field, put_idx);
3090 *info = (int)((action == RESTART)?PUT_FOR_RESTART:action);
3091
3092 /* ------------------------------------------------------------------
3093 add one model time step (as provided in coupling configuration) to
3094 the current event date
3095 ------------------------------------------------------------------ */
3096
3098
3099 /* ------------------------------------------------------------------
3100 return in case we are already beyond the end of the run
3101 ------------------------------------------------------------------ */
3102
3103 if (action == OUT_OF_BOUND) {
3104
3105 fputs("WARNING: yac put action is beyond end of run date!\n", stderr);
3106 fputs("WARNING: yac put action is beyond end of run date!\n", stdout);
3107
3108 *send_field_acc_ = NULL;
3109 *send_frac_mask_acc_ = NULL;
3110 return NULL;
3111 }
3112
3113 /* ------------------------------------------------------------------
3114 start actions
3115 ------------------------------------------------------------------ */
3116
3117 if ( action == NONE ) return NULL;
3118
3119 /* ------------------------------------------------------------------
3120 If it is time for restart, set appropriate flags and continue
3121 ------------------------------------------------------------------ */
3122
3123 /* ------------------------------------------------------------------
3124 First deal with instant sends
3125 ------------------------------------------------------------------ */
3126
3127 int ** put_mask = yac_get_coupling_field_put_mask(cpl_field);
3128 size_t num_interp_fields =
3130
3132 if ( time_operation == TIME_NONE ) {
3133
3134 *info = MAX((int)COUPLING, *info);
3135
3136 if (with_frac_mask) {
3137
3138 // apply fractional mask to send field
3139 double *** send_field_acc =
3141 *send_field_acc_ = send_field_acc;
3142 *send_frac_mask_acc_ = send_frac_mask;
3143
3144 for (int h = 0; h < collection_size; h++) {
3145 for (size_t i = 0; i < num_interp_fields; i++) {
3146 size_t num_points =
3148 cpl_field,
3149 yac_coupling_field_get_interp_fields(cpl_field)[i].location);
3150 if (put_mask) {
3151 for (size_t j = 0; j < num_points; ++j) {
3152 if (put_mask[i][j]) {
3153 double frac_mask = send_frac_mask[h][i][j];
3154 send_field_acc[h][i][j] =
3155 (frac_mask != 0.0)?(send_field[h][i][j] * frac_mask):0.0;
3156 }
3157 }
3158 } else {
3159 for (size_t j = 0; j < num_points; ++j) {
3160 double frac_mask = send_frac_mask[h][i][j];
3161 send_field_acc[h][i][j] =
3162 (frac_mask != 0.0)?(send_field[h][i][j] * frac_mask):0.0;
3163 }
3164 }
3165 }
3166 }
3167 } else {
3168 *send_field_acc_ = send_field;
3169 *send_frac_mask_acc_ = send_frac_mask;
3170 }
3171 return interpolation;
3172 }
3173
3174 /* ------------------------------------------------------------------
3175 Accumulation & Averaging
3176 ------------------------------------------------------------------ */
3177
3178 YAC_ASSERT(
3183 "ERROR(yac_cput_pre_processing): invalid time operation type")
3184
3185 int time_accumulation_count =
3187
3188 time_accumulation_count++;
3189
3190 // if this is the first accumulation step
3191 if (time_accumulation_count == 1) {
3192
3193 double send_field_acc_init_value;
3194 switch (time_operation) {
3195 default:
3196 case(TIME_ACCUMULATE):
3197 case(TIME_AVERAGE):
3198 send_field_acc_init_value = 0.0;
3199 break;
3200 case(TIME_MINIMUM):
3201 send_field_acc_init_value = DBL_MAX;
3202 break;
3203 case(TIME_MAXIMUM):
3204 send_field_acc_init_value = -DBL_MAX;
3205 break;
3206 }
3207
3208 /* initalise memory */
3209
3211 cpl_field, put_idx, send_field_acc_init_value);
3212 if (with_frac_mask)
3214 cpl_field, put_idx, 0.0);
3215 }
3216
3217 /* accumulate data */
3218
3219 double *** send_field_acc =
3221 *send_field_acc_ = send_field_acc;
3222 double *** send_frac_mask_acc;
3223 if (with_frac_mask) {
3224 send_frac_mask_acc =
3226 *send_frac_mask_acc_ = send_frac_mask_acc;
3227 } else {
3228 send_frac_mask_acc = NULL;
3229 *send_frac_mask_acc_ = NULL;
3230 }
3231
3232#define NO_CHECK (1)
3233#define PUT_CHECK (put_mask[i][j])
3234#define SUM +=
3235#define ASSIGN =
3236#define AGGREGATE_FRAC(CHECK, EXTRA_CHECK, ACCU_OP) \
3237 { \
3238 YAC_OMP_PARALLEL \
3239 { \
3240 YAC_OMP_FOR \
3241 for (size_t j = 0; j < num_points; ++j) { \
3242 double frac_mask = send_frac_mask[h][i][j]; \
3243 double send_field_value = send_field[h][i][j] * frac_mask; \
3244 if (CHECK && (EXTRA_CHECK)) { \
3245 if (frac_mask != 0.0) { \
3246 send_field_acc[h][i][j] ACCU_OP send_field_value; \
3247 send_frac_mask_acc[h][i][j] ACCU_OP frac_mask; \
3248 } \
3249 } \
3250 } \
3251 } \
3252 }
3253#define AGGREATE_NOFRAC(CHECK, EXTRA_CHECK, ACCU_OP) \
3254 { \
3255 YAC_OMP_PARALLEL \
3256 { \
3257 YAC_OMP_FOR \
3258 for (size_t j = 0; j < num_points; ++j) {\
3259 double send_field_value = send_field[h][i][j]; \
3260 if (CHECK && (EXTRA_CHECK)) \
3261 send_field_acc[h][i][j] ACCU_OP send_field_value; \
3262 } \
3263 } \
3264 }
3265#define AGGREGATE(EXTRA_CHECK, ACCU_OP) \
3266 { \
3267 for (int h = 0; h < collection_size; h++) { \
3268 for (size_t i = 0; i < num_interp_fields; i++) { \
3269 size_t num_points = \
3270 yac_coupling_field_get_data_size( \
3271 cpl_field, \
3272 yac_coupling_field_get_interp_fields(cpl_field)[i].location); \
3273 if (with_frac_mask) { \
3274 if (put_mask) AGGREGATE_FRAC(PUT_CHECK, EXTRA_CHECK, ACCU_OP) \
3275 else AGGREGATE_FRAC(NO_CHECK, EXTRA_CHECK, ACCU_OP) \
3276 } else { \
3277 if (put_mask) AGGREATE_NOFRAC(PUT_CHECK, EXTRA_CHECK, ACCU_OP) \
3278 else AGGREATE_NOFRAC(NO_CHECK, EXTRA_CHECK, ACCU_OP) \
3279 } \
3280 } \
3281 } \
3282 break; \
3283 }
3284
3285 switch (time_operation) {
3286 default:
3287 case(TIME_ACCUMULATE):
3288 case(TIME_AVERAGE):
3290 case(TIME_MINIMUM):
3291 AGGREGATE(send_field_acc[h][i][j] > send_field_value, ASSIGN)
3292 case(TIME_MAXIMUM):
3293 AGGREGATE(send_field_acc[h][i][j] < send_field_value, ASSIGN)
3294 }
3295
3296#undef AGGREGATE
3297#undef AGGREATE_NOFRAC
3298#undef AGGREGATE_FRAC
3299#undef ASSIGN
3300#undef SUM
3301#undef PUT_CHECK
3302#undef NO_CHECK
3303
3304/* --------------------------------------------------------------------
3305 Check whether we have to perform the coupling in this call
3306 -------------------------------------------------------------------- */
3307
3308 if (action == REDUCTION) {
3310 cpl_field, put_idx, time_accumulation_count);
3311 return NULL;
3312 }
3313
3314/* --------------------------------------------------------------------
3315 Average data if required
3316 -------------------------------------------------------------------- */
3317
3318 if (( time_operation == TIME_AVERAGE ) ||
3320
3321 double weight = 1.0 / (double)time_accumulation_count;
3322
3323#define NO_CHECK (1)
3324#define PUT_CHECK (put_mask[i][j])
3325#define WEIGHT_ACC_(ACC, CHECK, EXTRA_CHECK) \
3326 { \
3327 for (size_t j = 0; j < num_points; j++) \
3328 if (CHECK && (EXTRA_CHECK)) ACC[h][i][j] *= weight; \
3329 }
3330#define WEIGHT_ACC(ACC, EXTRA_CHECK) \
3331 { \
3332 if (put_mask) WEIGHT_ACC_(ACC, PUT_CHECK, EXTRA_CHECK) \
3333 else WEIGHT_ACC_(ACC, NO_CHECK, EXTRA_CHECK) \
3334 }
3335
3336 for (int h = 0; h < collection_size; ++h) {
3337 for (size_t i = 0; i < num_interp_fields; i++) {
3338 size_t num_points =
3340 cpl_field,
3341 yac_coupling_field_get_interp_fields(cpl_field)[i].location);
3342 if (with_frac_mask)
3343 WEIGHT_ACC(send_frac_mask_acc, NO_CHECK)
3345 if (with_frac_mask)
3346 WEIGHT_ACC(send_field_acc, send_frac_mask_acc[h][i][j] != 0.0)
3347 else
3348 WEIGHT_ACC(send_field_acc, NO_CHECK)
3349 }
3350 }
3351 }
3352 }
3353
3354#undef NO_CHECK
3355#undef PUT_CHECK
3356#undef WEIGHT_ACC_
3357#undef WEIGHT_ACC
3358
3359 // reset time_accumulation_count
3361 cpl_field, put_idx, 0);
3362
3363/* --------------------------------------------------------------------
3364 return interpolation
3365 -------------------------------------------------------------------- */
3366
3367 *info = MAX((int)COUPLING, *info);
3368 return interpolation;
3369}
3370
3371void yac_cput_frac ( int const field_id,
3372 int const collection_size,
3373 double *** const send_field, // send_field[collection_size]
3374 // [nPointSets][Points]
3375 double *** const send_frac_mask, // send_frac_mask[collection_size]
3376 // [nPointSets][Points]
3377 int *info,
3378 int *ierr ) {
3379
3380 yac_ccheck_field_dimensions(field_id, collection_size, -1, NULL);
3381
3382 *info = NONE;
3383 *ierr = 0;
3384
3385 struct coupling_field * cpl_field =
3386 yac_unique_id_to_pointer(field_id, "field_id");
3387
3389 return;
3390
3391 YAC_ASSERT(
3392 (size_t)collection_size ==
3394 "ERROR(yac_cput_frac): collection size does not match with "
3395 "coupling configuration.")
3396
3397 for (unsigned put_idx = 0;
3398 put_idx < yac_get_coupling_field_num_puts(cpl_field); ++put_idx) {
3399
3400 int curr_action;
3401 int curr_ierr;
3402 double *** send_field_acc;
3403 double *** send_frac_mask_acc;
3404
3405 int with_frac_mask;
3406 int use_raw_exchange;
3407 void * interpolation =
3409 cpl_field, put_idx, collection_size,
3410 send_field, &send_field_acc,
3411 send_frac_mask, &send_frac_mask_acc,
3412 &with_frac_mask, &use_raw_exchange,
3413 &curr_action, &curr_ierr);
3414
3415 *info = MAX(*info, curr_action);
3416 *ierr = MAX(*ierr, curr_ierr);
3417
3418 /* ------------------------------------------------------------------
3419 return in case we are already beyond the end of the run
3420 ------------------------------------------------------------------ */
3421 if (curr_action == OUT_OF_BOUND) {
3422 *info = OUT_OF_BOUND;
3423 return;
3424 }
3425
3426 /* ------------------------------------------------------------------
3427 in case there is nothing to be done for the current put
3428 ------------------------------------------------------------------ */
3429 if ((curr_action == NONE) || (curr_action == REDUCTION)) continue;
3430
3431 /* ------------------------------------------------------------------
3432 in case we are supposed to couple
3433 ------------------------------------------------------------------ */
3434 if ((*ierr == 0) && (interpolation != NULL)) {
3435
3437 (with_frac_mask && (send_frac_mask != NULL)) ||
3438 !with_frac_mask,
3439 "ERROR(yac_cput_frac): interpolation for field \"%s\" was built for "
3440 "dynamic fractional masking, but no mask was provided",
3441 yac_get_coupling_field_name(cpl_field));
3443 (!with_frac_mask && (send_frac_mask == NULL)) ||
3444 with_frac_mask,
3445 "ERROR(yac_cput_frac): interpolation for field \"%s\" was not built "
3446 "for dynamic fractional masking, but a mask was provided",
3447 yac_get_coupling_field_name(cpl_field));
3448
3449 double *** send_field_ptr =
3450 (send_field_acc == NULL)?send_field:send_field_acc;
3451 double *** send_frac_mask_ptr =
3452 (send_frac_mask_acc == NULL)?send_frac_mask:send_frac_mask_acc;
3453
3454 if (use_raw_exchange) {
3455
3456 size_t num_src_fields =
3458 double const ** send_field_ptr_ =
3459 xmalloc(
3460 (size_t)(1 + with_frac_mask) * (size_t)collection_size *
3461 num_src_fields * sizeof(*send_field_ptr_));
3462
3463 size_t k = 0;
3464 for (int i = 0; i < collection_size; ++i)
3465 for (size_t j = 0; j < num_src_fields; ++j, ++k)
3466 send_field_ptr_[k] = send_field_ptr[i][j];
3467 if (with_frac_mask)
3468 for (int i = 0; i < collection_size; ++i)
3469 for (size_t j = 0; j < num_src_fields; ++j, ++k)
3470 send_field_ptr_[k] = send_frac_mask_ptr[i][j];
3472 interpolation, send_field_ptr_, "yac_cput_frac");
3473
3474 free(send_field_ptr_);
3475
3476 } else {
3477 if (with_frac_mask)
3479 interpolation, send_field_ptr, send_frac_mask_ptr);
3480 else
3482 }
3483 }
3484 }
3485}
3486
3487void yac_cput ( int const field_id,
3488 int const collection_size,
3489 double *** const send_field, // send_field[collection_size]
3490 // [nPointSets][Points]
3491 int *info,
3492 int *ierr ) {
3493
3495 field_id, collection_size, send_field, NULL, info, ierr);
3496}
3497
3498/* ---------------------------------------------------------------------- */
3499
3500
3501void yac_cexchange_ ( int const send_field_id,
3502 int const recv_field_id,
3503 int const collection_size,
3504 double *send_field, // send_field[collection_size *
3505 // nPointSets *
3506 // Points]
3507 double *recv_field, // recv_field[collection_size * Points]
3508 int *send_info,
3509 int *recv_info,
3510 int *ierr ) {
3511
3512 yac_ccheck_field_dimensions(send_field_id, collection_size, 1, NULL);
3513 yac_ccheck_field_dimensions(recv_field_id, collection_size, -1, NULL);
3514
3515 /* Needed to transfer from Fortran data structure to C */
3516 double *** send_field_ =
3517 get_send_field_pointers(send_field_id, collection_size, send_field);
3518 double ** recv_field_ =
3519 get_recv_field_pointers(recv_field_id, collection_size, recv_field);
3520
3522 send_field_id, recv_field_id, collection_size, send_field_, recv_field_,
3523 send_info, recv_info, ierr);
3524
3525 free(recv_field_);
3526 free(send_field_[0]);
3527 free(send_field_);
3528}
3529
3530/* ---------------------------------------------------------------------- */
3531
3532
3533void yac_cexchange_raw_frac_ ( int const send_field_id,
3534 int const recv_field_id,
3535 int const collection_size,
3536 double *send_field, // send_field[collection_size *
3537 // nPointSets *
3538 // Points]
3539 double *send_frac_mask, // send_frac_mask[collection_size *
3540 // nPointSets *
3541 // Points]
3542 double *src_field_buffer, // src_field_buffer
3543 // [collection_size *
3544 // SUM(src_field_buffer_sizes[0:num_src_fields-1])]
3545 double *src_frac_mask_buffer, // src_frac_mask_buffer
3546 // [collection_size *
3547 // SUM(src_field_buffer_sizes[0:num_src_fields-1])]
3548 int *send_info,
3549 int *recv_info,
3550 int *ierr ) {
3551
3552 yac_ccheck_field_dimensions(send_field_id, collection_size, 1, NULL);
3553 yac_ccheck_field_dimensions(recv_field_id, collection_size, -1, NULL);
3554
3555 /* Needed to transfer from Fortran data structure to C */
3556 double *** send_field_ =
3557 get_send_field_pointers(send_field_id, collection_size, send_field);
3558 double *** send_frac_mask_ =
3559 send_frac_mask?
3561 send_field_id, collection_size, send_frac_mask):NULL;
3562 double *** src_field_buffer_ =
3564 recv_field_id, collection_size, src_field_buffer);
3565 double *** src_frac_mask_buffer_ =
3566 src_frac_mask_buffer?
3568 recv_field_id, collection_size, src_frac_mask_buffer):NULL;
3569
3571 send_field_id, recv_field_id, collection_size,
3572 send_field_, send_frac_mask_,
3573 src_field_buffer_, src_frac_mask_buffer_,
3574 send_info, recv_info, ierr);
3575
3576 if (src_frac_mask_buffer) {
3577 free(src_frac_mask_buffer_[0]);
3578 free(src_frac_mask_buffer_);
3579 }
3580 free(src_field_buffer_[0]);
3581 free(src_field_buffer_);
3582 if (send_frac_mask_) {
3583 free(send_frac_mask_[0]);
3584 free(send_frac_mask_);
3585 }
3586 free(send_field_[0]);
3587 free(send_field_);
3588}
3589
3590
3591void yac_cexchange_raw_ ( int const send_field_id,
3592 int const recv_field_id,
3593 int const collection_size,
3594 double *send_field, // send_field[collection_size *
3595 // nPointSets *
3596 // Points]
3597 double *src_field_buffer, // src_field_buffer
3598 // [collection_size *
3599 // SUM(src_field_buffer_sizes[0:num_src_fields-1])]
3600 int *send_info,
3601 int *recv_info,
3602 int *ierr ) {
3603
3605 send_field_id, recv_field_id, collection_size,
3606 send_field, NULL, src_field_buffer, NULL, send_info, recv_info, ierr);
3607}
3608
3609/* ---------------------------------------------------------------------- */
3610
3611
3612void yac_cexchange_frac_ ( int const send_field_id,
3613 int const recv_field_id,
3614 int const collection_size,
3615 double *send_field, // send_field[collection_size *
3616 // nPointSets *
3617 // Points]
3618 double *send_frac_mask, // send_frac_mask[collection_size *
3619 // nPointSets *
3620 // Points]
3621 double *recv_field, // recv_field[collection_size * Points]
3622 int *send_info,
3623 int *recv_info,
3624 int *ierr ) {
3625
3626 yac_ccheck_field_dimensions(send_field_id, collection_size, 1, NULL);
3627 yac_ccheck_field_dimensions(recv_field_id, collection_size, -1, NULL);
3628
3629 /* Needed to transfer from Fortran data structure to C */
3630 double *** send_field_ =
3631 get_send_field_pointers(send_field_id, collection_size, send_field);
3632 double *** send_frac_mask_ =
3633 get_send_field_pointers(send_field_id, collection_size, send_frac_mask);
3634 double ** recv_field_ =
3635 get_recv_field_pointers(recv_field_id, collection_size, recv_field);
3636
3638 send_field_id, recv_field_id, collection_size, send_field_, send_frac_mask_,
3639 recv_field_, send_info, recv_info, ierr);
3640
3641 free(recv_field_);
3642 free(send_field_[0]);
3643 free(send_field_);
3644 free(send_frac_mask_[0]);
3645 free(send_frac_mask_);
3646}
3647
3648/* ---------------------------------------------------------------------- */
3649
3650
3651void yac_cexchange_ptr_ ( int const send_field_id,
3652 int const recv_field_id,
3653 int const collection_size,
3654 double ** send_field, // send_field[collection_size *
3655 // nPointSets][Points]
3656 double ** recv_field, // recv_field[collection_size][Points]
3657 int *send_info,
3658 int *recv_info,
3659 int *ierr ) {
3660
3661 yac_ccheck_field_dimensions(send_field_id, collection_size, 1, NULL);
3662 yac_ccheck_field_dimensions(recv_field_id, collection_size, -1, NULL);
3663
3664
3665 /* Needed to transfer from Fortran data structure to C */
3666 double *** send_field_;
3668 send_field_id, collection_size, send_field, NULL, &send_field_, NULL);
3669
3671 send_field_id, recv_field_id, collection_size, send_field_, recv_field,
3672 send_info, recv_info, ierr);
3673
3674 free(send_field_[0]);
3675 free(send_field_);
3676}
3677
3678
3679void yac_cexchange_raw_ptr_ ( int const send_field_id,
3680 int const recv_field_id,
3681 int const collection_size,
3682 double ** send_field, // send_field[collection_size *
3683 // nPointSets][Points]
3684 double **src_field_buffer, // src_field_buffer
3685 // [collection_size*num_src_fields]
3686 // [src_field_buffer_size[src_field_idx]]
3687 int *send_info,
3688 int *recv_info,
3689 int *ierr ) {
3690
3691 yac_ccheck_field_dimensions(send_field_id, collection_size, 1, NULL);
3692 yac_ccheck_field_dimensions(recv_field_id, collection_size, -1, NULL);
3693
3694
3695 /* Needed to transfer from Fortran data structure to C */
3696 double *** send_field_;
3698 send_field_id, collection_size, send_field, NULL, &send_field_, NULL);
3699 double *** src_field_buffer_ =
3701 recv_field_id, (size_t)collection_size, src_field_buffer);
3702
3704 send_field_id, recv_field_id, collection_size, send_field_,
3705 src_field_buffer_, send_info, recv_info, ierr);
3706
3707 free(src_field_buffer_[0]);
3708 free(src_field_buffer_);
3709 free(send_field_[0]);
3710 free(send_field_);
3711}
3712
3713/* ---------------------------------------------------------------------- */
3714
3715
3716void yac_cexchange_frac_ptr_ ( int const send_field_id,
3717 int const recv_field_id,
3718 int const collection_size,
3719 double ** send_field, // send_field[collection_size *
3720 // nPointSets][Points]
3721 double ** send_frac_mask, // send_frac_mask[collection_size *
3722 // nPointSets][Points]
3723 double ** recv_field, // recv_field[collection_size][Points]
3724 int *send_info,
3725 int *recv_info,
3726 int *ierr ) {
3727
3728 yac_ccheck_field_dimensions(send_field_id, collection_size, 1, NULL);
3729 yac_ccheck_field_dimensions(recv_field_id, collection_size, -1, NULL);
3730
3731 /* Needed to transfer from Fortran data structure to C */
3732 double *** send_field_;
3733 double *** send_frac_mask_;
3735 send_field_id, collection_size, send_field, send_frac_mask,
3736 &send_field_, &send_frac_mask_);
3737
3739 send_field_id, recv_field_id, collection_size, send_field_, send_frac_mask_,
3740 recv_field, send_info, recv_info, ierr);
3741
3742 free(send_field_[0]);
3743 free(send_field_);
3744 free(send_frac_mask_[0]);
3745 free(send_frac_mask_);
3746}
3747
3748
3749void yac_cexchange_raw_frac_ptr_ ( int const send_field_id,
3750 int const recv_field_id,
3751 int const collection_size,
3752 double ** send_field, // send_field[collection_size *
3753 // nPointSets][Points]
3754 double ** send_frac_mask, // send_frac_mask[collection_size *
3755 // nPointSets][Points]
3756 double ** src_field_buffer, // src_field_buffer
3757 // [collection_size*num_src_fields]
3758 // [src_field_buffer_size[src_field_idx]]
3759 double ** src_frac_mask_buffer, // src_frac_mask_buffer
3760 // [collection_size*num_src_fields]
3761 // [src_field_buffer_size[src_field_idx]]
3762 int *send_info,
3763 int *recv_info,
3764 int *ierr ) {
3765
3766 yac_ccheck_field_dimensions(send_field_id, collection_size, 1, NULL);
3767 yac_ccheck_field_dimensions(recv_field_id, collection_size, -1, NULL);
3768
3769 /* Needed to transfer from Fortran data structure to C */
3770 double *** send_field_;
3771 double *** send_frac_mask_;
3773 send_field_id, collection_size, send_field, send_frac_mask,
3774 &send_field_, &send_frac_mask_);
3775 double *** src_field_buffer_ =
3777 recv_field_id, (size_t)collection_size, src_field_buffer);
3778 double *** src_frac_mask_buffer_ =
3779 src_frac_mask_buffer?
3781 recv_field_id, (size_t)collection_size, src_frac_mask_buffer):NULL;
3782
3784 send_field_id, recv_field_id, collection_size, send_field_, send_frac_mask_,
3785 src_field_buffer_, src_frac_mask_buffer_, send_info, recv_info, ierr);
3786
3787 free(src_frac_mask_buffer_[0]);
3788 free(src_frac_mask_buffer_);
3789 free(src_field_buffer_[0]);
3790 free(src_field_buffer_);
3791 free(send_field_[0]);
3792 free(send_field_);
3793 free(send_frac_mask_[0]);
3794 free(send_frac_mask_);
3795}
3796
3797/* ---------------------------------------------------------------------- */
3798
3799void yac_cexchange_frac ( int const send_field_id,
3800 int const recv_field_id,
3801 int const collection_size,
3802 double *** const send_field, // send_field[collection_size]
3803 // [nPointSets][Points]
3804 double *** const send_frac_mask, // send_frac_mask[collection_size]
3805 // [nPointSets][Points]
3806 double ** recv_field, // recv_field[collection_size][Points]
3807 int *send_info,
3808 int *recv_info,
3809 int *ierr ) {
3810
3811 yac_ccheck_field_dimensions(send_field_id, collection_size, 1, NULL);
3812 yac_ccheck_field_dimensions(recv_field_id, collection_size, -1, NULL);
3813
3814 *send_info = NONE;
3815 *ierr = -1;
3816
3817 struct coupling_field * send_cpl_field =
3818 yac_unique_id_to_pointer(send_field_id, "send_field_id");
3819
3820 if (yac_get_coupling_field_exchange_type(send_cpl_field) != SOURCE) {
3821 yac_cget(recv_field_id, collection_size, recv_field, recv_info, ierr);
3822 return;
3823 }
3824
3825 YAC_ASSERT(
3826 (size_t)collection_size ==
3828 "ERROR(yac_cexchange_frac): "
3829 "collection size does not match with coupling configuration.")
3830
3831 YAC_ASSERT(
3832 yac_get_coupling_field_num_puts(send_cpl_field) == 1,
3833 "ERROR(yac_cexchange_frac): more than one put per field is not supported "
3834 "for yac_cexchange_frac.")
3835
3836 int send_action;
3837 int send_ierr;
3838 double *** send_field_acc;
3839 double *** send_frac_mask_acc;
3840 int send_with_frac_mask;
3841 int use_raw_exchange;
3842 struct yac_interpolation * put_interpolation =
3844 send_cpl_field, 0, collection_size, send_field,
3845 &send_field_acc, send_frac_mask, &send_frac_mask_acc,
3846 &send_with_frac_mask, &use_raw_exchange,
3847 &send_action, &send_ierr);
3848
3850 send_with_frac_mask == (send_frac_mask != NULL),
3851 "ERROR(yac_cexchange_frac): source field \"%s\" was configured %s "
3852 "support for fractional masking, but %s fractional mask "
3853 "was provided to this call",
3854 yac_get_coupling_field_name(send_cpl_field),
3855 (send_with_frac_mask?"with":"without"), (send_with_frac_mask?"no":"a"))
3856
3857 *send_info = MAX(*send_info, send_action);
3858 *ierr = MAX(*ierr, send_ierr);
3859
3860 /* ------------------------------------------------------------------
3861 return in case we are already beyond the end of the run for the puts
3862 or there is nothing to be done for the current put
3863 ------------------------------------------------------------------ */
3864 if ((send_action == OUT_OF_BOUND) ||
3865 (send_action == NONE) ||
3866 (send_action == REDUCTION)) {
3867 yac_cget(recv_field_id, collection_size, recv_field, recv_info, ierr);
3868 return;
3869 }
3870
3871 /* ------------------------------------------------------------------
3872 check the get
3873 ------------------------------------------------------------------ */
3874
3875 struct yac_interpolation * get_interpolation =
3876 yac_cget_pre_processing(recv_field_id, collection_size, recv_info, ierr);
3877
3878 /* ------------------------------------------------------------------
3879 do the required exchanges
3880 ------------------------------------------------------------------ */
3881
3882 if (*ierr == 0) {
3883
3884 double *** send_field_ptr =
3885 (send_field_acc == NULL)?send_field:send_field_acc;
3886 double *** send_frac_mask_ptr =
3887 (send_frac_mask_acc == NULL)?send_frac_mask:send_frac_mask_acc;
3888
3889 // if the get is active
3890 if (get_interpolation != NULL) {
3891
3892 YAC_ASSERT(
3893 get_interpolation == put_interpolation,
3894 "ERROR(yac_cexchange): send_field_id and recv_field_id do not match")
3895
3896 if (send_with_frac_mask)
3898 put_interpolation, send_field_ptr, send_frac_mask_ptr, recv_field);
3899 else
3901 put_interpolation, send_field_ptr, recv_field);
3902
3903 } else {
3904
3905 // just execute the put
3906 if (send_with_frac_mask)
3908 put_interpolation, send_field_ptr, send_frac_mask_ptr);
3909 else
3910 yac_interpolation_execute_put(put_interpolation, send_field_ptr);
3911 }
3912 }
3913}
3914
3915void yac_cexchange_raw_frac ( int const send_field_id,
3916 int const recv_field_id,
3917 int const collection_size,
3918 double *** const send_field, // send_field[collection_size]
3919 // [nPointSets][Points]
3920 double *** const send_frac_mask, // send_frac_mask[collection_size]
3921 // [nPointSets][Points]
3922 double ***src_field_buffer, // source field buffer
3923 // [collection_size]
3924 // [num_src_fields]
3925 // [src_field_buffer_size[src_field_idx]]
3926 double ***src_frac_mask_buffer, // source fractional mask buffer
3927 // [collection_size]
3928 // [num_src_fields]
3929 // [src_field_buffer_size[src_field_idx]]
3930 int *send_info,
3931 int *recv_info,
3932 int *ierr ) {
3933
3934 yac_ccheck_field_dimensions(send_field_id, collection_size, -1, NULL);
3935 yac_ccheck_field_dimensions(recv_field_id, collection_size, 1, NULL);
3936
3937 *send_info = NONE;
3938 *ierr = -1;
3939
3940 struct coupling_field * send_cpl_field =
3941 yac_unique_id_to_pointer(send_field_id, "send_field_id");
3942 struct coupling_field * recv_cpl_field =
3943 yac_unique_id_to_pointer(recv_field_id, "recv_field_id");
3944
3945 if (yac_get_coupling_field_exchange_type(recv_cpl_field) != TARGET) {
3947 send_field_id, collection_size, send_field, send_frac_mask,
3948 send_info, ierr);
3949 *recv_info = NONE;
3950 return;
3951 }
3952
3953 int recv_with_frac_mask =
3955
3956 if (yac_get_coupling_field_exchange_type(send_cpl_field) != SOURCE) {
3957 if (recv_with_frac_mask)
3959 recv_field_id, collection_size, src_field_buffer, src_frac_mask_buffer,
3960 recv_info, ierr);
3961 else
3963 recv_field_id, collection_size, src_field_buffer, recv_info, ierr);
3964 *send_info = NONE;
3965 return;
3966 }
3967
3969 recv_with_frac_mask == (src_frac_mask_buffer != NULL),
3970 "ERROR(yac_cexchange_raw_frac): target field \"%s\" was configured %s "
3971 "support for fractional masking, but %s source fractional mask buffer "
3972 "was provided to this call",
3973 yac_get_coupling_field_name(recv_cpl_field),
3974 (recv_with_frac_mask?"with":"without"), (recv_with_frac_mask?"no":"a"))
3975
3976 YAC_ASSERT(
3977 (size_t)collection_size ==
3979 "ERROR(yac_cexchange_raw_frac): "
3980 "collection size does not match with coupling configuration.")
3981
3982 YAC_ASSERT(
3983 yac_get_coupling_field_num_puts(send_cpl_field) == 1,
3984 "ERROR(yac_cexchange_raw_frac): "
3985 "more than one put per field is not supported for yac_cexchange_frac.")
3986
3989 "ERROR(yac_cexchange_raw_frac): "
3990 "source field \"%s\" is not configured for raw data exchange",
3991 yac_get_coupling_field_name(send_cpl_field))
3992
3993 int send_action;
3994 int send_ierr;
3995 double *** send_field_acc;
3996 double *** send_frac_mask_acc;
3997 int send_with_frac_mask;
3998 int use_raw_exchange;
3999 struct yac_interpolation_exchange * put_interpolation_exchange =
4001 send_cpl_field, 0, collection_size, send_field,
4002 &send_field_acc, send_frac_mask, &send_frac_mask_acc,
4003 &send_with_frac_mask, &use_raw_exchange,
4004 &send_action, &send_ierr);
4005
4007 (put_interpolation_exchange == NULL) ||
4008 (send_with_frac_mask == recv_with_frac_mask),
4009 "ERROR(yac_cexchange_raw_frac): fractional mask configuration for "
4010 "source field \"%s\" and target field \"%s\" does not match",
4011 yac_get_coupling_field_name(send_cpl_field),
4012 yac_get_coupling_field_name(recv_cpl_field));
4013
4015 send_with_frac_mask == (send_frac_mask != NULL),
4016 "ERROR(yac_cexchange_raw_frac): source field \"%s\" was configured %s "
4017 "support for fractional masking, but %s fractional mask "
4018 "was provided to this call",
4019 yac_get_coupling_field_name(send_cpl_field),
4020 (send_with_frac_mask?"with":"without"), (send_with_frac_mask?"no":"a"))
4021
4022 *send_info = MAX(*send_info, send_action);
4023 *ierr = MAX(*ierr, send_ierr);
4024
4025 /* ------------------------------------------------------------------
4026 return in case we are already beyond the end of the run for the puts
4027 or there is nothing to be done for the current put
4028 ------------------------------------------------------------------ */
4029 if ((send_action == OUT_OF_BOUND) ||
4030 (send_action == NONE) ||
4031 (send_action == REDUCTION)) {
4032 if (recv_with_frac_mask)
4034 recv_field_id, collection_size, src_field_buffer, src_frac_mask_buffer,
4035 recv_info, ierr);
4036 else
4038 recv_field_id, collection_size, src_field_buffer, recv_info, ierr);
4039 return;
4040 }
4041
4042 /* ------------------------------------------------------------------
4043 check the get
4044 ------------------------------------------------------------------ */
4045
4046 struct yac_interpolation_exchange * get_interpolation_exchange =
4047 yac_cget_pre_processing(recv_field_id, collection_size, recv_info, ierr);
4048
4049 /* ------------------------------------------------------------------
4050 do the required exchanges
4051 ------------------------------------------------------------------ */
4052
4053 if (*ierr == 0) {
4054
4055 size_t num_src_fields;
4057 recv_cpl_field, &num_src_fields, NULL);
4058
4059 double const ** send_field_ptr_ =
4060 xmalloc(
4061 (size_t)(1 + send_with_frac_mask) * (size_t)collection_size *
4062 num_src_fields * sizeof(*send_field_ptr_));
4063 {
4064 size_t k = 0;
4065 for (int i = 0; i < collection_size; ++i)
4066 for (size_t j = 0; j < num_src_fields; ++j, ++k)
4067 send_field_ptr_[k] = send_field_acc[i][j];
4068 if (send_with_frac_mask)
4069 for (int i = 0; i < collection_size; ++i)
4070 for (size_t j = 0; j < num_src_fields; ++j, ++k)
4071 send_field_ptr_[k] = send_frac_mask_acc[i][j];
4072 }
4073
4074 YAC_ASSERT(
4075 get_interpolation_exchange == put_interpolation_exchange,
4076 "ERROR(yac_cexchange_raw_frac): "
4077 "send_field_id and recv_field_id do not match")
4078
4080 recv_with_frac_mask == (src_frac_mask_buffer != NULL),
4081 "ERROR(yac_cexchange_raw_frac): target field \"%s\" was configured %s "
4082 "support for fractional masking, but %s fractional mask buffer"
4083 "was provided to this call",
4084 yac_get_coupling_field_name(recv_cpl_field),
4085 (recv_with_frac_mask?"with":"without"), (recv_with_frac_mask?"no":"a"))
4086
4087 double ** src_field_buffer_ =
4088 xmalloc(
4089 (size_t)(1 + send_with_frac_mask) * (size_t)collection_size *
4090 num_src_fields * sizeof(*src_field_buffer_));
4091 {
4092 size_t k = 0;
4093 for (int i = 0; i < collection_size; ++i)
4094 for (size_t j = 0; j < num_src_fields; ++j, ++k)
4095 src_field_buffer_[k] = src_field_buffer[i][j];
4096 if (recv_with_frac_mask)
4097 for (int i = 0; i < collection_size; ++i)
4098 for (size_t j = 0; j < num_src_fields; ++j, ++k)
4099 src_field_buffer_[k] = src_frac_mask_buffer[i][j];
4100 }
4101
4103 put_interpolation_exchange, send_field_ptr_, src_field_buffer_,
4104 "yac_cexchange_raw_frac");
4105
4106 free(src_field_buffer_);
4107 free(send_field_ptr_);
4108 }
4109}
4110
4111void yac_cexchange ( int const send_field_id,
4112 int const recv_field_id,
4113 int const collection_size,
4114 double *** const send_field, // send_field[collection_size]
4115 // [nPointSets][Points]
4116 double ** recv_field, // recv_field[collection_size][Points]
4117 int *send_info,
4118 int *recv_info,
4119 int *ierr ) {
4120
4122 send_field_id, recv_field_id, collection_size,
4123 send_field, NULL, recv_field, send_info, recv_info, ierr);
4124}
4125
4126void yac_cexchange_raw ( int const send_field_id,
4127 int const recv_field_id,
4128 int const collection_size,
4129 double *** const send_field, // send_field[collection_size]
4130 // [nPointSets][Points]
4131 double ***src_field_buffer, // src_field_buffer
4132 // [collection_size]
4133 // [num_src_fields]
4134 // [src_field_buffer_size[src_field_idx]]
4135 int *send_info,
4136 int *recv_info,
4137 int *ierr ) {
4138
4140 send_field_id, recv_field_id, collection_size,
4141 send_field, NULL, src_field_buffer, NULL, send_info, recv_info, ierr);
4142}
4143
4144/* ---------------------------------------------------------------------- */
4145
4146void yac_csync_def_instance ( int yac_instance_id ){
4148 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id"));
4149}
4150
4155
4156
4157/* ---------------------------------------------------------------------- */
4158
4159void yac_cenddef_instance(int yac_instance_id) {
4160
4162 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id"),
4163 grids, num_grids);
4164}
4165
4166void yac_cenddef (void) {
4167
4168 check_default_instance_id("yac_cenddef");
4170}
4171
4173 int yac_instance_id, int emit_flags, char ** config) {
4174
4175 *config =
4177 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id"),
4178 grids, num_grids, emit_flags);
4179}
4180
4181void yac_cenddef_and_emit_config ( int emit_flags, char ** config ) {
4182
4183 check_default_instance_id("yac_cenddef");
4185 default_instance_id, emit_flags, config);
4186}
4187
4188/* ----------------------------------------------------------------------
4189 query functions
4190 ----------------------------------------------------------------------*/
4191
4192int yac_cget_field_id_instance(int yac_instance_id, const char* comp_name,
4193 const char* grid_name, const char* field_name){
4194 struct yac_instance * instance =
4195 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
4196 struct coupling_field* cpl_field =
4197 yac_instance_get_field(instance, comp_name, grid_name, field_name);
4198 YAC_ASSERT_F(cpl_field != NULL,
4199 "ERROR(yac_cget_field_id_instance): "
4200 "no field '%s' defined on the local process for "
4201 "component '%s' and grid '%s'", field_name, comp_name, grid_name);
4202 return yac_lookup_pointer(cpl_field);
4203}
4204
4205int yac_cget_field_id(const char* comp_name, const char* grid_name, const char* field_name){
4206 check_default_instance_id("yac_cget_field_id");
4208 grid_name, field_name);
4209}
4210
4211/* ---------------------------------------------------------------------- */
4212
4213int yac_cget_nbr_comps_instance ( int yac_instance_id ) {
4214 struct yac_instance * instance =
4215 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
4216 struct yac_couple_config * couple_config =
4218 return yac_couple_config_get_num_components(couple_config);
4219}
4220
4222 check_default_instance_id("yac_cget_nbr_comps");
4224}
4225
4226int yac_cget_nbr_grids_instance ( int yac_instance_id ) {
4227 struct yac_instance * instance =
4228 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
4229 struct yac_couple_config * couple_config =
4231 return yac_couple_config_get_num_grids(couple_config);
4232}
4233
4235 check_default_instance_id("yac_cget_nbr_grids");
4237}
4238
4240 int yac_instance_id, const char* comp_name ) {
4241
4242 struct yac_instance * instance =
4243 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
4244 struct yac_couple_config * couple_config =
4246 size_t nbr_couple_config_grids =
4247 yac_couple_config_get_num_grids(couple_config);
4248
4249 YAC_ASSERT(comp_name != NULL,
4250 "ERROR(yac_cget_comp_grid_names_instance):"
4251 "Invalid comp_name. (NULL is not allowed)");
4252
4253 int nbr_comp_grids = 0;
4254 for(size_t i = 0; i < nbr_couple_config_grids; ++i)
4256 yac_instance_id, comp_name,
4257 yac_couple_config_get_grid_name(couple_config, i)) > 0)
4258 nbr_comp_grids++;
4259 return nbr_comp_grids;
4260}
4261
4262int yac_cget_comp_nbr_grids ( const char* comp_name ){
4263 check_default_instance_id("yac_cget_comp_nbr_grids");
4265}
4266
4267int yac_cget_nbr_fields_instance ( int yac_instance_id, const char* comp_name,
4268 const char* grid_name) {
4269 struct yac_instance * instance =
4270 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
4271 struct yac_couple_config * couple_config =
4273 size_t comp_idx = yac_couple_config_get_component_idx(couple_config, comp_name);
4274 int nbr_fields = 0;
4275 size_t nbr_comp_fields =
4276 yac_couple_config_get_num_fields(couple_config, comp_idx);
4277 for(size_t field_idx=0; field_idx<nbr_comp_fields; ++field_idx)
4278 if(yac_couple_config_field_is_valid(couple_config, comp_idx, field_idx) &&
4279 !strcmp(
4280 grid_name,
4282 couple_config, comp_idx, field_idx)))
4283 nbr_fields++;
4284 return nbr_fields;
4285}
4286
4287int yac_cget_nbr_fields ( const char* comp_name, const char* grid_name ) {
4288 check_default_instance_id("yac_cget_nbr_fields");
4289 return yac_cget_nbr_fields_instance(default_instance_id, comp_name, grid_name);
4290}
4291
4293 int yac_instance_id, int nbr_comps, const char ** comp_names) {
4294
4295 struct yac_instance * instance =
4296 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
4297 struct yac_couple_config * couple_config =
4299 size_t nbr_couple_config_comps =
4301
4303 (size_t)nbr_comps == nbr_couple_config_comps,
4304 "ERROR(yac_cget_comp_names_instance): "
4305 "invalid array size (nbr_comps = %d; nbr_couple_config_comps = %zu)",
4306 nbr_comps, nbr_couple_config_comps);
4307
4308 for(size_t i = 0; i < nbr_couple_config_comps; ++i)
4309 comp_names[i] = yac_couple_config_get_component_name(couple_config, i);
4310}
4311
4312void yac_cget_comp_names ( int nbr_comps, const char ** comp_names ) {
4313 check_default_instance_id("yac_cget_comp_names");
4315 comp_names );
4316}
4317
4319 int yac_instance_id, int nbr_grids, const char ** grid_names ) {
4320
4321 struct yac_instance * instance =
4322 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
4323 struct yac_couple_config * couple_config =
4325 size_t nbr_couple_config_grids =
4326 yac_couple_config_get_num_grids(couple_config);
4327
4329 (size_t)nbr_grids == nbr_couple_config_grids,
4330 "ERROR(yac_cget_grid_names_instance): "
4331 "invalid array size (nbr_grids = %d, nbr_couple_config_grids = %zu)",
4332 nbr_grids, nbr_couple_config_grids);
4333
4334 for(size_t i = 0; i < nbr_couple_config_grids; ++i)
4335 grid_names[i] = yac_couple_config_get_grid_name(couple_config, i);
4336}
4337
4338void yac_cget_grid_names ( int nbr_grids, const char ** grid_names ) {
4339 check_default_instance_id("yac_cget_grid_names");
4340 yac_cget_grid_names_instance(default_instance_id, nbr_grids, grid_names);
4341}
4342
4344 int yac_instance_id, const char* comp_name,
4345 int nbr_grids, const char ** grid_names ) {
4346
4347 struct yac_instance * instance =
4348 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
4349 struct yac_couple_config * couple_config =
4351 size_t nbr_couple_config_grids =
4352 yac_couple_config_get_num_grids(couple_config);
4353
4354 YAC_ASSERT(comp_name != NULL,
4355 "ERROR(yac_cget_comp_grid_names_instance): "
4356 "Invalid comp_name. (NULL is not allowed)");
4357
4358 size_t nbr_comp_grid = 0;
4359 for(size_t i = 0; i < nbr_couple_config_grids; ++i) {
4360
4361 const char* curr_grid_name =
4362 yac_couple_config_get_grid_name(couple_config, i);
4363
4365 yac_instance_id, comp_name, curr_grid_name) > 0) {
4366
4368 nbr_comp_grid < (size_t)nbr_grids,
4369 "ERROR(yac_cget_comp_grid_names_instance): "
4370 "invalid array size (nbr_grids = %d; nbr_comp_grid > %zu)",
4371 nbr_grids, nbr_comp_grid);
4372
4373 grid_names[nbr_comp_grid] = curr_grid_name;
4374 nbr_comp_grid++;
4375 }
4376 }
4377
4379 nbr_comp_grid == (size_t)nbr_grids,
4380 "ERROR(yac_cget_comp_grid_names_instance): "
4381 "invalid array size (nbr_grids = %d; nbr_comp_grid = %zu)",
4382 nbr_grids, nbr_comp_grid);
4383}
4384
4385void yac_cget_comp_grid_names ( const char* comp_name, int nbr_grids,
4386 const char ** grid_names ) {
4387 check_default_instance_id("yac_cget_grid_names");
4388 yac_cget_comp_grid_names_instance(default_instance_id, comp_name, nbr_grids, grid_names);
4389}
4390
4391void yac_cget_field_names_instance ( int yac_instance_id,
4392 const char * comp_name, const char* grid_name,
4393 int nbr_fields, const char ** field_names ) {
4394
4395 struct yac_instance * instance =
4396 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
4397 struct yac_couple_config * couple_config =
4399 size_t comp_idx = yac_couple_config_get_component_idx(couple_config, comp_name);
4400 size_t nbr_comp_fields =
4401 yac_couple_config_get_num_fields(couple_config, comp_idx);
4402
4403 size_t nbr_comp_grid_fields = 0;
4404 for(size_t field_idx = 0; field_idx < nbr_comp_fields; ++field_idx) {
4405 if(yac_couple_config_field_is_valid(couple_config, comp_idx, field_idx) &&
4406 !strcmp(
4407 grid_name,
4409 couple_config, comp_idx, field_idx))) {
4410
4412 (size_t)nbr_fields > nbr_comp_grid_fields,
4413 "ERROR(yac_cget_field_names_instance): "
4414 "invalid array size (nbr_fields = %d; nbr_comp_grid_fields > %zu",
4415 nbr_fields, nbr_comp_fields);
4416
4417 field_names[nbr_comp_grid_fields] =
4418 yac_couple_config_get_field_name(couple_config, comp_idx, field_idx);
4419 nbr_comp_grid_fields++;
4420 }
4421 }
4422
4424 (size_t)nbr_fields == nbr_comp_grid_fields,
4425 "ERROR(yac_cget_field_names_instance): "
4426 "invalid array size (nbr_fields = %d; nbr_comp_grid_fields = %zu",
4427 nbr_fields, nbr_comp_fields);
4428}
4429
4430void yac_cget_field_names ( const char* comp_name, const char* grid_name,
4431 int nbr_fields, const char ** field_names ) {
4432 check_default_instance_id("yac_cget_field_names");
4434 comp_name, grid_name, nbr_fields, field_names );
4435}
4436
4437const char* yac_cget_component_name_from_field_id ( int field_id ) {
4438 struct coupling_field * field =
4439 yac_unique_id_to_pointer(field_id, "field_id");
4440 YAC_ASSERT(field != NULL, "ERROR: field ID not defined!");
4442}
4443
4444const char* yac_cget_grid_name_from_field_id ( int field_id ) {
4445 struct coupling_field * field =
4446 yac_unique_id_to_pointer(field_id, "field_id");
4447 YAC_ASSERT(field != NULL, "ERROR: field ID not defined!");
4449 return yac_basic_grid_get_name(grid);
4450}
4451
4452const char* yac_cget_field_name_from_field_id ( int field_id ) {
4453 struct coupling_field * field =
4454 yac_unique_id_to_pointer(field_id, "field_id");
4455 YAC_ASSERT(field != NULL, "ERROR: field ID not defined!");
4456 return yac_get_coupling_field_name(field);
4457}
4458
4459const char* yac_cget_timestep_from_field_id ( int field_id ){
4460 struct coupling_field * field =
4461 yac_unique_id_to_pointer(field_id, "field_id");
4462 YAC_ASSERT(field != NULL, "ERROR: field ID not defined!");
4463 return yac_get_coupling_field_timestep(field);
4464}
4465
4467 struct coupling_field * field =
4468 yac_unique_id_to_pointer(field_id, "field_id");
4469 YAC_ASSERT(field != NULL, "ERROR: field ID not defined!");
4471}
4472
4473int yac_cget_role_from_field_id ( int field_id ){
4474 struct coupling_field * field =
4475 yac_unique_id_to_pointer(field_id, "field_id");
4476 YAC_ASSERT(field != NULL, "ERROR: field ID not defined!");
4478}
4479
4480/* ---------------------------------------------------------------------- */
4481
4483 int yac_instance_id, const char* comp_name, const char* grid_name,
4484 const char* field_name ) {
4485 struct yac_instance * instance =
4486 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
4487 struct yac_couple_config * couple_config =
4489 return
4491 couple_config, comp_name, grid_name, field_name);
4492}
4493
4494const char* yac_cget_field_timestep ( const char* comp_name, const char* grid_name,
4495 const char* field_name ) {
4496 check_default_instance_id("yac_cget_field_timestep");
4498 grid_name, field_name);
4499}
4500
4502 int yac_instance_id, const char* comp_name, const char* grid_name,
4503 const char* field_name) {
4504 struct yac_instance * instance =
4505 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
4506 return
4509 comp_name, grid_name, field_name);
4510}
4511
4513 const char* comp_name, const char* grid_name, const char* field_name ) {
4514 struct yac_instance * instance =
4515 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
4516 return
4519 comp_name, grid_name, field_name);
4520}
4521
4523 const char* comp_name, const char* grid_name, const char* field_name) {
4524 check_default_instance_id("yac_cget_field_frac_mask_fallback_value");
4525 return
4527 default_instance_id, comp_name, grid_name, field_name);
4528}
4529
4530int yac_cget_field_collection_size ( const char* comp_name,
4531 const char* grid_name, const char* field_name ) {
4532 check_default_instance_id("yac_cget_field_collection_size");
4534 grid_name, field_name);
4535}
4536
4537int yac_cget_field_role_instance ( int yac_instance_id, const char* comp_name,
4538 const char* grid_name, const char* field_name ) {
4539 struct yac_instance * instance =
4540 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
4541 struct yac_couple_config * couple_config =
4543 return
4545 couple_config, comp_name, grid_name, field_name);
4546}
4547
4548int yac_cget_field_role ( const char* comp_name, const char* grid_name,
4549 const char* field_name ) {
4550 check_default_instance_id("yac_cget_field_role");
4552 grid_name, field_name);
4553}
4554
4555void yac_cget_field_source_instance ( int yac_instance_id,
4556 const char* tgt_comp_name, const char* tgt_grid_name,
4557 const char* tgt_field_name, const char** src_comp_name,
4558 const char** src_grid_name, const char** src_field_name ) {
4559 struct yac_instance * instance =
4560 yac_unique_id_to_pointer(yac_instance_id, "yac_instance_id");
4561 struct yac_couple_config * couple_config =
4564 couple_config,
4565 tgt_comp_name, tgt_grid_name, tgt_field_name,
4566 src_comp_name, src_grid_name, src_field_name);
4567}
4568
4570 const char* tgt_comp_name, const char* tgt_grid_name,
4571 const char* tgt_field_name, const char** src_comp_name,
4572 const char** src_grid_name, const char** src_field_name ) {
4573 check_default_instance_id("yac_cget_field_source");
4576 tgt_comp_name, tgt_grid_name, tgt_field_name,
4577 src_comp_name, src_grid_name, src_field_name);
4578}
4579
4580/* ---------------------------------------------------------------------- */
4581
4583 const char * grid_name, int nbr_vertices[2], int cyclic[2],
4584 double *x_vertices, double *y_vertices, int *grid_id) {
4585
4586 size_t nbr_vertices_size_t[2] =
4587 {(size_t)nbr_vertices[0], (size_t)nbr_vertices[1]};
4588
4589 check_x_vertices(x_vertices, nbr_vertices[0], "yac_cdef_grid_reg2d");
4590 check_y_vertices(y_vertices, nbr_vertices[1], "yac_cdef_grid_reg2d");
4591
4592 *grid_id =
4595 nbr_vertices_size_t, cyclic, x_vertices, y_vertices));
4596}
4597
4598/* ---------------------------------------------------------------------- */
4599
4601 const char * grid_name, int nbr_vertices[2], int cyclic[2],
4602 double *x_vertices, double *y_vertices, int *grid_id) {
4603
4604 size_t nbr_vertices_size_t[2] =
4605 {(size_t)nbr_vertices[0], (size_t)nbr_vertices[1]};
4606
4607 check_x_vertices(x_vertices, nbr_vertices[0], "yac_cdef_grid_curve2d");
4608 check_y_vertices(y_vertices, nbr_vertices[1], "yac_cdef_grid_curve2d");
4609
4610 *grid_id =
4613 nbr_vertices_size_t, cyclic, x_vertices, y_vertices));
4614}
4615
4616/* ---------------------------------------------------------------------- */
4617
4619 const char * grid_name, int nbr_vertices,
4620 int nbr_cells, int *num_vertices_per_cell, double *x_vertices,
4621 double *y_vertices, int *cell_to_vertex, int *grid_id) {
4622
4623 check_x_vertices(x_vertices, nbr_vertices, "yac_cdef_grid_unstruct");
4624 check_y_vertices(y_vertices, nbr_vertices, "yac_cdef_grid_unstruct");
4626 cell_to_vertex, num_vertices_per_cell, nbr_cells, nbr_vertices,
4627 "yac_cdef_grid_unstruct");
4628
4629 *grid_id =
4631 grid_name,
4633 (size_t)nbr_vertices, (size_t)nbr_cells, num_vertices_per_cell,
4634 x_vertices, y_vertices, cell_to_vertex));
4635}
4636
4637/* ---------------------------------------------------------------------- */
4638
4640 const char * grid_name, int nbr_vertices,
4641 int nbr_cells, int *num_vertices_per_cell, double *x_vertices,
4642 double *y_vertices, int *cell_to_vertex, int *grid_id) {
4643
4644 check_x_vertices(x_vertices, nbr_vertices, "yac_cdef_grid_unstruct_ll");
4645 check_y_vertices(y_vertices, nbr_vertices, "yac_cdef_grid_unstruct_ll");
4647 cell_to_vertex, num_vertices_per_cell, nbr_cells, nbr_vertices,
4648 "yac_cdef_grid_unstruct_ll");
4649
4650 *grid_id =
4652 grid_name,
4654 (size_t)nbr_vertices, (size_t)nbr_cells, num_vertices_per_cell,
4655 x_vertices, y_vertices, cell_to_vertex));
4656}
4657
4658/* ---------------------------------------------------------------------- */
4659
4661 const char * grid_name, int nbr_vertices, int nbr_cells, int nbr_edges,
4662 int *num_edges_per_cell, double *x_vertices, double *y_vertices,
4663 int *cell_to_edge, int *edge_to_vertex, int *grid_id) {
4664
4665 check_x_vertices(x_vertices, nbr_vertices, "yac_cdef_grid_unstruct_edge");
4666 check_y_vertices(y_vertices, nbr_vertices, "yac_cdef_grid_unstruct_edge");
4668 cell_to_edge, num_edges_per_cell, nbr_cells, nbr_edges,
4669 "yac_cdef_grid_unstruct_edge");
4670
4671 *grid_id =
4673 grid_name,
4675 (size_t)nbr_vertices, (size_t)nbr_cells, (size_t)nbr_edges,
4676 num_edges_per_cell, x_vertices, y_vertices,
4677 cell_to_edge, edge_to_vertex));
4678}
4679
4680/* ---------------------------------------------------------------------- */
4681
4683 const char * grid_name, int nbr_vertices, int nbr_cells, int nbr_edges,
4684 int *num_edges_per_cell, double *x_vertices, double *y_vertices,
4685 int *cell_to_edge, int *edge_to_vertex, int *grid_id) {
4686
4687 check_x_vertices(x_vertices, nbr_vertices, "yac_cdef_grid_unstruct_edge_ll");
4688 check_y_vertices(y_vertices, nbr_vertices, "yac_cdef_grid_unstruct_edge_ll");
4690 cell_to_edge, num_edges_per_cell, nbr_cells, nbr_edges,
4691 "yac_cdef_grid_unstruct_edge_ll");
4692
4693 *grid_id =
4695 grid_name,
4697 (size_t)nbr_vertices, (size_t)nbr_cells, (size_t)nbr_edges,
4698 num_edges_per_cell, x_vertices, y_vertices,
4699 cell_to_edge, edge_to_vertex));
4700}
4701
4702/* ---------------------------------------------------------------------- */
4703
4705 const char * grid_name, int nbr_points,
4706 double *x_points, double *y_points, int *grid_id) {
4707
4708 check_x_vertices(x_points, nbr_points, "yac_cdef_grid_cloud");
4709 check_y_vertices(y_points, nbr_points, "yac_cdef_grid_cloud");
4710
4711 *grid_id =
4713 grid_name,
4715 (size_t)nbr_points, x_points, y_points));
4716}
4717
4718/* ---------------------------------------------------------------------- */
4719
4721 const char * grid_name, int nbr_vertices[2], int cyclic[2],
4722 double *x_vertices, double *y_vertices,
4723 double x_north_pole, double y_north_pole, int *grid_id) {
4724
4725 size_t nbr_vertices_size_t[2] =
4726 {(size_t)nbr_vertices[0], (size_t)nbr_vertices[1]};
4727
4728 check_x_vertices(x_vertices, nbr_vertices[0], "yac_cdef_grid_reg2d_rot");
4729 check_y_vertices(y_vertices, nbr_vertices[1], "yac_cdef_grid_reg2d_rot");
4730
4731 *grid_id =
4734 nbr_vertices_size_t, cyclic, x_vertices, y_vertices,
4735 x_north_pole, y_north_pole));
4736}
4737
4738/* ---------------------------------------------------------------------- */
4739
4741 int const * global_index, int location, int grid_id) {
4742
4743 struct yac_basic_grid_data * grid_data =
4745
4746 yac_int ** grid_global_ids;
4747 size_t count;
4748
4749 YAC_ASSERT(
4750 (location == YAC_LOC_CELL) ||
4751 (location == YAC_LOC_CORNER) ||
4752 (location == YAC_LOC_EDGE),
4753 "ERROR(yac_cset_global_index): invalid location")
4754 switch (location) {
4755 case (YAC_LOC_CELL): {
4756 grid_global_ids = &(grid_data->cell_ids);
4757 count = grid_data->num_cells;
4758 break;
4759 }
4760 case (YAC_LOC_CORNER): {
4761 grid_global_ids = &(grid_data->vertex_ids);
4762 count = grid_data->num_vertices;
4763 break;
4764 }
4765 default:
4766 case (YAC_LOC_EDGE): {
4767 grid_global_ids = &(grid_data->edge_ids);
4768 count = grid_data->num_edges;
4769 break;
4770 }
4771 }
4772
4773 size_t global_ids_size = count * sizeof(**grid_global_ids);
4774 if (*grid_global_ids == NULL) *grid_global_ids = xmalloc(global_ids_size);
4775 for (size_t i = 0; i < count; ++i)
4776 (*grid_global_ids)[i] = (yac_int)(global_index[i]);
4777}
4778
4779/* ---------------------------------------------------------------------- */
4780
4782 int const * is_core, int location, int grid_id) {
4783
4784 struct yac_basic_grid_data * grid_data =
4786
4787 int ** grid_core_mask;
4788 size_t count;
4789
4790 YAC_ASSERT(
4791 (location == YAC_LOC_CELL) ||
4792 (location == YAC_LOC_CORNER) ||
4793 (location == YAC_LOC_EDGE),
4794 "ERROR(yac_cset_core_mask): invalid location")
4795 switch (location) {
4796 case (YAC_LOC_CELL): {
4797 grid_core_mask = &(grid_data->core_cell_mask);
4798 count = grid_data->num_cells;
4799 break;
4800 }
4801 case (YAC_LOC_CORNER): {
4802 grid_core_mask = &(grid_data->core_vertex_mask);
4803 count = grid_data->num_vertices;
4804 break;
4805 }
4806 default:
4807 case (YAC_LOC_EDGE): {
4808 grid_core_mask = &(grid_data->core_edge_mask);
4809 count = grid_data->num_edges;
4810 break;
4811 }
4812 }
4813
4814 size_t core_mask_size = count * sizeof(**grid_core_mask);
4815 if (*grid_core_mask == NULL) *grid_core_mask = xmalloc(core_mask_size);
4816 memcpy(*grid_core_mask, is_core, core_mask_size);
4817}
4818
4819/* ---------------------------------------------------------------------- */
4820
4821size_t yac_cget_grid_size ( int located, int grid_id ) {
4822
4823 struct yac_basic_grid * grid =
4824 yac_unique_id_to_pointer(grid_id, "grid_id");
4825 enum yac_location location = yac_get_location(located);
4826
4827 return yac_basic_grid_get_data_size(grid, location);
4828}
4829
4830/* ---------------------------------------------------------------------- */
4831
4832void yac_ccompute_grid_cell_areas ( int grid_id, double * cell_areas) {
4833
4834 struct yac_basic_grid * grid = yac_unique_id_to_pointer(grid_id, "grid_id");
4835
4836 yac_basic_grid_compute_cell_areas(grid, cell_areas);
4837}
4838
4839/* ---------------------------------------------------------------------- */
4840
4841size_t yac_cget_points_size ( int points_id ) {
4842
4844 yac_unique_id_to_pointer(points_id, "points_id");
4845 struct yac_basic_grid * grid = points->grid;
4846 enum yac_location location = points->location;
4847
4848 return yac_basic_grid_get_data_size(grid, location);
4849}
4850
4851/* ---------------------------------------------------------------------- */
4852
4866
4867void yac_cfree_interp_stack_config(int interp_stack_config_id) {
4868
4869 struct yac_interp_stack_config * interp_stack_config =
4871 interp_stack_config_id, "interp_stack_config_id");
4872 yac_interp_stack_config_delete(interp_stack_config);
4873
4874 int flag = 0;
4875 for (size_t i = 0; i < num_interp_stack_configs; ++i) {
4876 if (interp_stack_configs[i] == interp_stack_config)
4877 interp_stack_configs[i] = NULL;
4878 flag |= (interp_stack_configs[i] != NULL);
4879 }
4880 if (!flag) {
4882 interp_stack_configs = NULL;
4884 }
4885}
4886
4888 int interp_stack_config_id,
4889 int reduction_type, int partial_coverage) {
4890
4891 struct yac_interp_stack_config * interp_stack_config =
4893 interp_stack_config_id, "interp_stack_config_id");
4894
4895 YAC_ASSERT(
4896 (reduction_type == YAC_INTERP_AVG_ARITHMETIC) ||
4897 (reduction_type == YAC_INTERP_AVG_DIST) ||
4898 (reduction_type == YAC_INTERP_AVG_BARY),
4899 "ERROR(yac_add_interp_stack_config_average): invalid reduction type")
4900
4902 interp_stack_config, (enum yac_interp_avg_weight_type)reduction_type,
4903 partial_coverage);
4904}
4905
4907 int interp_stack_config_id,
4908 int weight_type, int partial_coverage) {
4909
4910 struct yac_interp_stack_config * interp_stack_config =
4912 interp_stack_config_id, "interp_stack_config_id");
4913
4914 YAC_ASSERT(
4917 "ERROR(yac_add_interp_stack_config_ncc): invalid reduction type")
4918
4920 interp_stack_config, (enum yac_interp_ncc_weight_type)weight_type,
4921 partial_coverage);
4922}
4923
4925 int interp_stack_config_id,
4926 int type, size_t n, double max_search_distance, double scale) {
4927
4928 struct yac_interp_stack_config * interp_stack_config =
4930 interp_stack_config_id, "interp_stack_config_id");
4931
4932 YAC_ASSERT(
4933 (type == YAC_INTERP_NNN_AVG) ||
4936 (type == YAC_INTERP_NNN_RBF) ||
4938 "ERROR(yac_add_interp_stack_config_nnn): invalid weightening type")
4939
4941 interp_stack_config, (enum yac_interp_nnn_weight_type)type, n,
4942 max_search_distance, scale);
4943}
4944
4946 int interp_stack_config_id,
4947 size_t n, double max_search_distance, double scale) {
4948
4949 struct yac_interp_stack_config * interp_stack_config =
4951 interp_stack_config_id, "interp_stack_config_id");
4952
4954 interp_stack_config, n, max_search_distance, scale);
4955}
4956
4958 int interp_stack_config_id, int order, int enforced_conserv,
4959 int partial_coverage, int normalisation) {
4960
4961 struct yac_interp_stack_config * interp_stack_config =
4963 interp_stack_config_id, "interp_stack_config_id");
4964
4965 YAC_ASSERT(
4966 (normalisation == YAC_INTERP_CONSERV_DESTAREA) ||
4967 (normalisation == YAC_INTERP_CONSERV_FRACAREA),
4968 "ERROR(yac_add_interp_stack_config_conservative):"
4969 "invalid normalisation type")
4970
4972 interp_stack_config, order, enforced_conserv, partial_coverage,
4973 (enum yac_interp_method_conserv_normalisation)normalisation);
4974}
4975
4977 int interp_stack_config_id, double spread_distance,
4978 double max_search_distance, int weight_type, int scale_type,
4979 double src_sphere_radius, char const * src_filename,
4980 char const * src_varname, int src_min_global_id,
4981 double tgt_sphere_radius, char const * tgt_filename,
4982 char const * tgt_varname, int tgt_min_global_id) {
4983
4984 struct yac_interp_stack_config * interp_stack_config =
4986 interp_stack_config_id, "interp_stack_config_id");
4987
4988 YAC_ASSERT(
4991 "ERROR(yac_add_interp_stack_config_spmap):"
4992 "invalid weightening type")
4993
4994 YAC_ASSERT(
4995 (scale_type == YAC_INTERP_SPMAP_NONE) ||
4996 (scale_type == YAC_INTERP_SPMAP_SRCAREA) ||
4997 (scale_type == YAC_INTERP_SPMAP_INVTGTAREA) ||
4998 (scale_type == YAC_INTERP_SPMAP_FRACAREA),
4999 "ERROR(yac_add_interp_stack_config_spmap):"
5000 "invalid scaling type")
5001
5003 interp_stack_config, spread_distance, max_search_distance,
5005 (enum yac_interp_spmap_scale_type)scale_type,
5006 src_sphere_radius, src_filename, src_varname, src_min_global_id,
5007 tgt_sphere_radius, tgt_filename, tgt_varname, tgt_min_global_id);
5008}
5009
5011 int interp_stack_config_id, double spread_distance,
5012 double max_search_distance, int weight_type, int scale_type,
5013 double src_sphere_radius, char const * src_filename,
5014 char const * src_varname, int src_min_global_id,
5015 double tgt_sphere_radius, char const * tgt_filename,
5016 char const * tgt_varname, int tgt_min_global_id) {
5017
5018 if (src_filename && (src_filename[0] == '\0')) src_filename = NULL;
5019 if (src_varname && (src_varname[0] == '\0')) src_varname = NULL;
5020 if (tgt_filename && (tgt_filename[0] == '\0')) tgt_filename = NULL;
5021 if (tgt_varname && (tgt_varname[0] == '\0')) tgt_varname = NULL;
5022
5024 interp_stack_config_id, spread_distance, max_search_distance,
5025 weight_type, scale_type,
5026 src_sphere_radius, src_filename, src_varname, src_min_global_id,
5027 tgt_sphere_radius, tgt_filename, tgt_varname, tgt_min_global_id);
5028}
5029
5030void yac_cadd_interp_stack_config_hcsbb(int interp_stack_config_id) {
5031
5032 struct yac_interp_stack_config * interp_stack_config =
5034 interp_stack_config_id, "interp_stack_config_id");
5035
5036 yac_interp_stack_config_add_hcsbb(interp_stack_config);
5037}
5038
5040 int interp_stack_config_id, char const * filename,
5041 int on_missing_file, int on_succes) {
5042
5043 struct yac_interp_stack_config * interp_stack_config =
5045 interp_stack_config_id, "interp_stack_config_id");
5046
5047 YAC_ASSERT(
5050 "ERROR(yac_cadd_interp_stack_config_user_file_2):"
5051 "invalid on_missing_file value")
5052
5053 YAC_ASSERT(
5054 (on_succes == YAC_INTERP_FILE_SUCCESS_STOP) ||
5055 (on_succes == YAC_INTERP_FILE_SUCCESS_CONT),
5056 "ERROR(yac_cadd_interp_stack_config_user_file_2):"
5057 "invalid on_succes value")
5058
5060 interp_stack_config, filename,
5062 (enum yac_interp_file_on_success)on_succes);
5063}
5064
5066 int interp_stack_config_id, char const * filename) {
5067
5069 interp_stack_config_id, filename,
5072}
5073
5075 int interp_stack_config_id, double value) {
5076
5077 struct yac_interp_stack_config * interp_stack_config =
5079 interp_stack_config_id, "interp_stack_config_id");
5080
5081 yac_interp_stack_config_add_fixed(interp_stack_config, value);
5082}
5083
5085 int interp_stack_config_id, char const * constructor_key,
5086 char const * do_search_key) {
5087
5088 struct yac_interp_stack_config * interp_stack_config =
5090 interp_stack_config_id, "interp_stack_config_id");
5091
5093 interp_stack_config, constructor_key, do_search_key);
5094}
5095
5097 int interp_stack_config_id, int creep_distance) {
5098
5099 struct yac_interp_stack_config * interp_stack_config =
5101 interp_stack_config_id, "interp_stack_config_id");
5102
5103 yac_interp_stack_config_add_creep(interp_stack_config, creep_distance);
5104}
5105
5107 int interp_stack_config_id, char const * func_compute_weights_key) {
5108
5109 struct yac_interp_stack_config * interp_stack_config =
5111 interp_stack_config_id, "interp_stack_config_id");
5112
5114 interp_stack_config, func_compute_weights_key);
5115}
5116
5117/* ---------------------------------------------------------------------- */
5118
5120 yac_func_compute_weights compute_weights_callback,
5121 void * user_data, char const * key) {
5122
5124 compute_weights_callback, user_data, key);
5125}
5126
5127/* ---------------------------------------------------------------------- */
5128
5130 char const * interp_stack_config, int parse_flags) {
5131
5132
5134 xrealloc(
5137
5140 interp_stack_config, parse_flags);
5141
5142 int interp_stack_config_id =
5145
5146 return interp_stack_config_id;
5147}
5148
5150 char const * interp_stack_config, int * interp_stack_config_id) {
5151
5152 *interp_stack_config_id =
5154 interp_stack_config, YAC_YAML_PARSER_DEFAULT);
5155}
5156
5158 char const * interp_stack_config, int * interp_stack_config_id) {
5159
5160 *interp_stack_config_id =
5162 interp_stack_config, YAC_YAML_PARSER_JSON_FORCE);
5163}
struct yac_basic_grid * yac_basic_grid_new(char const *name, struct yac_basic_grid_data grid_data)
Definition basic_grid.c:50
struct yac_basic_grid_data * yac_basic_grid_get_data(struct yac_basic_grid *grid)
Definition basic_grid.c:137
size_t yac_basic_grid_add_mask(struct yac_basic_grid *grid, enum yac_location location, int const *mask, size_t count, char const *mask_name)
Definition basic_grid.c:284
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:208
char const * yac_basic_grid_get_name(struct yac_basic_grid *grid)
Definition basic_grid.c:128
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:147
void yac_basic_grid_delete(struct yac_basic_grid *grid)
Definition basic_grid.c:70
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)
enum yac_interp_file_on_missing_file on_missing_file
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:63
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:64
int const YAC_YAML_PARSER_DEFAULT
default parse flags (YAML format)
Definition config_yaml.c:65
char const * yac_time_to_ISO(char const *time, enum yac_time_unit_type time_unit)
Definition event.c:329
int const YAC_YAML_PARSER_JSON_FORCE
assume JSON format
Definition config_yaml.c:67
@ COUPLING
enum yac_interp_ncc_weight_type weight_type
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:284
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:17
@ REDUCTION
Definition event.h:19
@ RESTART
Definition event.h:21
@ OUT_OF_BOUND
Definition event.h:26
@ GET_FOR_CHECKPOINT
Definition event.h:24
@ NONE
Definition event.h:18
@ PUT_FOR_RESTART
Definition event.h:23
@ GET_FOR_RESTART
Definition event.h:22
@ PUT_FOR_CHECKPOINT
Definition event.h:25
struct yac_interpolation_exchange * yac_get_coupling_field_put_op_interpolation_exchange(struct coupling_field *field, unsigned put_idx)
Definition fields.c:432
unsigned yac_get_coupling_field_collection_size(struct coupling_field *field)
Definition fields.c:93
const char * yac_get_coupling_field_timestep(struct coupling_field *field)
Definition fields.c:98
unsigned yac_get_coupling_field_num_puts(struct coupling_field *field)
Definition fields.c:501
char const * yac_get_coupling_field_comp_name(struct coupling_field *field)
Definition fields.c:126
int yac_get_coupling_field_put_op_time_accumulation_count(struct coupling_field *field, unsigned put_idx)
Definition fields.c:453
double *** yac_get_coupling_field_put_op_send_frac_mask_acc(struct coupling_field *field, unsigned put_idx)
Definition fields.c:216
struct yac_basic_grid * yac_coupling_field_get_basic_grid(struct coupling_field *field)
Definition fields.c:120
size_t yac_coupling_field_get_num_interp_fields(struct coupling_field *field)
Definition fields.c:103
struct yac_interpolation * yac_get_coupling_field_put_op_interpolation(struct coupling_field *field, unsigned put_idx)
Definition fields.c:410
enum yac_location yac_get_coupling_field_get_interp_field_location(struct coupling_field *field, size_t interp_field_idx)
Definition fields.c:109
struct event * yac_get_coupling_field_get_op_event(struct coupling_field *field)
Definition fields.c:510
size_t yac_coupling_field_get_data_size(struct coupling_field *field, enum yac_location location)
Definition fields.c:143
struct yac_interp_field const * yac_coupling_field_get_interp_fields(struct coupling_field *cpl_field)
Definition fields.c:740
int * yac_get_coupling_field_get_mask(struct coupling_field *field)
Definition fields.c:317
struct event * yac_get_coupling_field_put_op_event(struct coupling_field *field, unsigned put_idx)
Definition fields.c:396
char * yac_coupling_field_get_datetime(struct coupling_field *cpl_field)
Definition fields.c:746
void yac_init_coupling_field_put_op_send_field_acc(struct coupling_field *field, unsigned put_idx, double init_value)
Definition fields.c:354
struct yac_interpolation * yac_get_coupling_field_get_op_interpolation(struct coupling_field *field)
Definition fields.c:544
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:611
void yac_set_coupling_field_put_op_time_accumulation_count(struct coupling_field *field, unsigned put_idx, int count)
Definition fields.c:485
int yac_get_coupling_field_get_op_use_raw_exchange(struct coupling_field *field)
Definition fields.c:521
struct yac_interpolation_exchange * yac_get_coupling_field_get_op_interpolation_exchange(struct coupling_field *field)
Definition fields.c:561
int yac_get_coupling_field_get_op_with_frac_mask(struct coupling_field *field)
Definition fields.c:532
enum yac_field_exchange_type yac_get_coupling_field_exchange_type(struct coupling_field *field)
Definition fields.c:132
const char * yac_get_coupling_field_name(struct coupling_field *field)
Definition fields.c:115
int ** yac_get_coupling_field_put_mask(struct coupling_field *field)
Definition fields.c:272
struct yac_interp_weights_data yac_get_coupling_field_get_op_interp_weights_data(struct coupling_field *field)
Definition fields.c:578
void yac_init_coupling_field_put_op_send_frac_mask_acc(struct coupling_field *field, unsigned put_idx, double init_value)
Definition fields.c:375
double *** yac_get_coupling_field_put_op_send_field_acc(struct coupling_field *field, unsigned put_idx)
Definition fields.c:206
int yac_get_coupling_field_put_op_use_raw_exchange(struct coupling_field *field, unsigned put_idx)
Definition fields.c:469
yac_field_exchange_type
Definition fields.h:12
@ SOURCE
Definition fields.h:14
@ TARGET
Definition fields.h:15
@ NOTHING
Definition fields.h:13
static void LLtoXYZ(double lon, double lat, double p_out[])
Definition geometry.h:270
void yac_instance_delete(struct yac_instance *instance)
Definition instance.c:1432
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:1368
int yac_instance_get_comp_rank(struct yac_instance *instance, const char *comp_name)
Definition instance.c:1398
char * yac_instance_get_start_datetime(struct yac_instance *instance)
Definition instance.c:1472
char * yac_instance_get_end_datetime(struct yac_instance *instance)
Definition instance.c:1477
void yac_instance_def_datetime(struct yac_instance *instance, const char *start_datetime, const char *end_datetime)
Definition instance.c:1464
void yac_instance_setup(struct yac_instance *instance, struct yac_basic_grid **grids, size_t num_grids)
Definition instance.c:1344
void yac_instance_sync_def(struct yac_instance *instance)
Definition instance.c:1334
struct yac_instance * yac_instance_new(MPI_Comm comm)
Definition instance.c:1407
int yac_instance_components_are_defined(struct yac_instance *instance)
Definition instance.c:1506
void yac_instance_def_couple(struct yac_instance *instance, char const *src_comp_name, char const *src_grid_name, char const *src_field_name, char const *tgt_comp_name, char const *tgt_grid_name, char const *tgt_field_name, char const *coupling_period, int time_reduction, struct yac_interp_stack_config *interp_stack_config, int src_lag, int tgt_lag, const char *weight_file_name, int weight_file_on_existing, int mapping_on_source, double scale_factor, double scale_summand, size_t num_src_mask_names, char const *const *src_mask_names, char const *tgt_mask_name, char const *yaxt_exchanger_name, int use_raw_exchange)
Definition instance.c:1570
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:1511
void yac_instance_dummy_new(MPI_Comm comm)
Definition instance.c:1426
void yac_instance_def_components(struct yac_instance *instance, char const **comp_names, size_t num_comps)
Definition instance.c:1482
struct yac_couple_config * yac_instance_get_couple_config(struct yac_instance *instance)
Definition instance.c:1449
int yac_instance_get_comp_size(struct yac_instance *instance, const char *comp_name)
Definition instance.c:1389
MPI_Comm yac_instance_get_comps_comm(struct yac_instance *instance, char const **comp_names, size_t num_comp_names)
Definition instance.c:1380
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:1594
#define YAC_INSTANCE_CONFIG_OUTPUT_REF_ENDDEF
Definition instance.h:35
#define YAC_INSTANCE_CONFIG_OUTPUT_REF_COMP
Definition instance.h:33
#define YAC_INSTANCE_CONFIG_OUTPUT_REF_SYNC
Definition instance.h:34
void yac_interp_method_cleanup()
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 @7::@8 value
enum callback_type type
yac_interp_method_conserv_normalisation
@ YAC_INTERP_CONSERV_DESTAREA
@ YAC_INTERP_CONSERV_FRACAREA
#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
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
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_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()
#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)
int yac_interpolation_with_frac_mask(struct yac_interpolation *interpolation)
int yac_interpolation_execute_put_test(struct yac_interpolation *interp)
void yac_interpolation_execute_wait(struct yac_interpolation *interp)
void yac_interpolation_execute_frac(struct yac_interpolation *interp, double ***src_fields, double ***src_frac_masks, double **tgt_field)
void yac_interpolation_execute_get(struct yac_interpolation *interp, double **tgt_field)
void yac_interpolation_execute_get_async(struct yac_interpolation *interp, double **tgt_field)
void yac_interpolation_execute_put_frac(struct yac_interpolation *interp, double ***src_fields, double ***src_frac_masks)
void yac_interpolation_execute_put(struct yac_interpolation *interp, double ***src_fields)
int yac_interpolation_execute_get_test(struct yac_interpolation *interp)
void yac_interpolation_exchange_execute_get_async(struct yac_interpolation_exchange *exchange, double **recv_data, char const *routine_name)
void yac_interpolation_exchange_execute_get(struct yac_interpolation_exchange *exchange, double **recv_data, char const *routine_name)
void yac_interpolation_exchange_wait(struct yac_interpolation_exchange *exchange, char const *routine_name)
void yac_interpolation_exchange_execute_put(struct yac_interpolation_exchange *exchange, double const **send_data, char const *routine_name)
int yac_interpolation_exchange_with_frac_mask(struct yac_interpolation_exchange *exchange)
void yac_interpolation_exchange_execute(struct yac_interpolation_exchange *exchange, double const **send_data_, double **recv_data_, char const *routine_name)
enum yac_location yac_get_location(int const location)
Definition location.c:44
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)
#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:42
int use_raw_exchange
Definition fields.c:44
double *** send_frac_mask_acc
Definition fields.c:43
enum yac_field_exchange_type exchange_type
Definition fields.c:33
unsigned num_puts
Definition fields.c:46
size_t num_interp_fields
Definition fields.c:25
size_t collection_size
number of vertical levels or bundles
Definition fields.c:26
struct yac_interpolation * interpolation
Definition fields.c:39
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:120
enum yac_location location
Definition yac.c:133
struct yac_basic_grid * grid
Definition yac.c:132
enum yac_location location
Definition yac.c:127
struct yac_basic_grid * grid
Definition yac.c:126
size_t coordinates_idx
Definition yac.c:128
size_t num_src_mask_names
Definition yac.c:165
char * weight_file
Definition yac.c:160
char * tgt_mask_name
Definition yac.c:167
char ** src_mask_names
Definition yac.c:166
char * yaxt_exchanger_name
Definition yac.c:168
int weight_file_on_existing
Definition yac.c:161
double scale_summand
Definition yac.c:164
double scale_factor
Definition yac.c:163
enum yac_location location
Definition basic_grid.h:21
size_t coordinates_idx
Definition basic_grid.h:22
#define MAX(a, b)
static char * yac_version
Definition version.h:7
int const YAC_YEAR_OF_365_DAYS
Definition yac.c:64
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:2781
int const YAC_ACTION_PUT_FOR_CHECKPOINT
Definition yac.c:44
int const YAC_REDUCTION_TIME_AVERAGE
Definition yac.c:49
void yac_cenddef_and_emit_config(int emit_flags, char **config)
Definition yac.c:4181
static double *** get_src_field_buffer_pointers(int field_id, size_t collection_size, double *src_field_buffer)
Definition yac.c:2292
static int yac_lookup_pointer(void const *pointer)
Definition yac.c:214
void yac_cget_raw_async(int const field_id, int collection_size, double ***src_field_buffer, int *info, int *ierr)
Definition yac.c:2749
#define NO_CHECK
void yac_ccompute_grid_cell_areas(int grid_id, double *cell_areas)
Definition yac.c:4832
void yac_cinit_comm_dummy(MPI_Comm comm)
Definition yac.c:445
void yac_cget_grid_names(int nbr_grids, const char **grid_names)
Definition yac.c:4338
void yac_cadd_interp_stack_config_ncc(int interp_stack_config_id, int weight_type, int partial_coverage)
Definition yac.c:4906
void yac_cget_ext_couple_config_scale_factor(int ext_couple_config_id, double *scale_factor)
Definition yac.c:1541
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:1395
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:3371
int const YAC_NCC_AVG
Definition yac.c:71
#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:2553
void yac_cenddef(void)
Definition yac.c:4166
static int yac_init(MPI_Comm comm)
Definition yac.c:376
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:3058
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:2886
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:1317
int const YAC_ACTION_OUT_OF_BOUND
put/get is outside of the valid range
Definition yac.c:45
void yac_cget_ext_couple_config_mapping_side(int ext_couple_config_id, int *mapping_side)
Definition yac.c:1518
void yac_cset_config_output_file(const char *filename, int filetype, int sync_location, int include_definitions)
Definition yac.c:542
void yac_cpredef_comp_instance(int yac_instance_id, char const *name, int *comp_id)
Definition yac.c:825
int const YAC_SPMAP_SRCAREA
Definition yac.c:87
int const YAC_CONFIG_OUTPUT_SYNC_LOC_ENDDEF
after end of definitions
Definition yac.c:116
char * yac_cget_start_datetime_instance(int yac_instance_id)
Definition yac.c:688
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:1201
void yac_cset_global_index(int const *global_index, int location, int grid_id)
Definition yac.c:4740
void yac_cset_grid_output_file_instance(int yac_instance_id, const char *gridname, const char *filename)
Definition yac.c:554
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:2016
int const YAC_NNN_RBF
Definition yac.c:77
void yac_cdef_datetime_instance(int yac_instance_id, const char *start_datetime, const char *end_datetime)
Definition yac.c:647
int yac_cget_role_from_field_id(int field_id)
Definition yac.c:4473
void yac_cget_(int const field_id, int const collection_size, double *recv_field, int *info, int *ierr)
Definition yac.c:2514
int yac_cget_nbr_grids_instance(int yac_instance_id)
Definition yac.c:4226
void yac_cfree_ext_couple_config(int ext_couple_config_id)
Definition yac.c:1434
const char * yac_cget_grid_metadata_instance(int yac_instance_id, const char *grid_name)
Definition yac.c:1382
int const YAC_FILE_SUCCESS_CONT
Definition yac.c:96
char * yac_cget_end_datetime_instance(int yac_instance_id)
Definition yac.c:703
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:5039
void yac_cdef_datetime(const char *start_datetime, const char *end_datetime)
Definition yac.c:656
static void * yac_cget_pre_processing(int const field_id, int collection_size, int *info, int *ierr)
Definition yac.c:2353
int const YAC_SPMAP_INVTGTAREA
Definition yac.c:88
void yac_get_comp_comm_f2c(int comp_id, MPI_Fint *comp_comm_f)
Definition yac.c:757
int const YAC_LOCATION_CELL
Definition yac.c:29
int const YAC_REDUCTION_TIME_MINIMUM
Definition yac.c:50
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 use_raw_exchange)
Definition yac.c:1804
void yac_cset_ext_couple_config_tgt_mask_name(int ext_couple_config_id, char const *tgt_mask_name)
Definition yac.c:1612
void yac_cget_ext_couple_config_weight_file_on_existing(int ext_couple_config_id, int *weight_file_on_existing)
Definition yac.c:1492
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)
Definition yac.c:5010
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:1668
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:1135
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:950
void yac_cdef_grid_metadata(const char *grid_name, const char *metadata)
Definition yac.c:1348
int const YAC_FILE_MISSING_CONT
continue on missing file
Definition yac.c:92
int const YAC_TIME_UNIT_MINUTE
Definition yac.c:55
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:4600
void yac_cread_config_json(const char *yaml_filename)
Definition yac.c:504
void * yac_get_field_get_mask_c2f(int field_id)
Definition yac.c:3048
void yac_cget_grid_names_instance(int yac_instance_id, int nbr_grids, const char **grid_names)
Definition yac.c:4318
void yac_cset_ext_couple_config_scale_factor(int ext_couple_config_id, double scale_factor)
Definition yac.c:1534
static void yac_free_masks()
Definition yac.c:279
int const YAC_NCC_DIST
Definition yac.c:72
int const YAC_FILE_MISSING_ERROR
abort on missing file
Definition yac.c:91
int const YAC_ACTION_GET_FOR_CHECKPOINT
Definition yac.c:43
void yac_cset_ext_couple_config_weight_file_on_existing(int ext_couple_config_id, int weight_file_on_existing)
Definition yac.c:1485
void yac_cadd_interp_stack_config_creep(int interp_stack_config_id, int creep_distance)
Definition yac.c:5096
static void check_default_instance_id(char const *routine_name)
Definition yac.c:314
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 use_raw_exchange)
Definition yac.c:1759
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:2856
void yac_cdef_component_metadata(const char *comp_name, const char *metadata)
Definition yac.c:1334
int const YAC_TIME_UNIT_YEAR
Definition yac.c:59
static void yac_free_components()
Definition yac.c:289
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:805
void yac_cget_comp_rank_c2py(int comp_id, int *rank)
Definition yac.c:774
void * yac_get_field_put_mask_c2f(int field_id)
Definition yac.c:3040
int yac_cget_field_role(const char *comp_name, const char *grid_name, const char *field_name)
Definition yac.c:4548
void yac_ccleanup()
Clean-up default YAC instance (see Restarting YAC)
Definition yac.c:606
int const YAC_AVG_ARITHMETIC
Definition yac.c:67
void yac_cget_comp_size_c2py(int comp_id, int *size)
Definition yac.c:767
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:2123
void yac_cadd_compute_weights_callback(yac_func_compute_weights compute_weights_callback, void *user_data, char const *key)
Definition yac.c:5119
void yac_cmpi_handshake(MPI_Comm comm, size_t n, char const **group_names, MPI_Comm *group_comms)
Definition yac.c:360
int const YAC_REDUCTION_TIME_MAXIMUM
Definition yac.c:51
void yac_cset_ext_couple_config_scale_summand_(struct yac_ext_couple_config *ext_couple_config, double scale_summand)
Definition yac.c:1548
int const YAC_WGT_ON_EXISTING_ERROR
Definition yac.c:102
int const YAC_TIME_UNIT_MILLISECOND
Definition yac.c:53
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:3799
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:4192
int yac_cget_comp_nbr_grids_instance(int yac_instance_id, const char *comp_name)
Definition yac.c:4239
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:2431
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:4639
const char * yac_cget_timestep_from_field_id(int field_id)
Definition yac.c:4459
int const YAC_FILE_SUCCESS_STOP
Definition yac.c:94
static struct user_input_data_component ** components
Definition yac.c:147
void yac_cget_raw(int const field_id, int collection_size, double ***src_field_buffer, int *info, int *ierr)
Definition yac.c:2736
int yac_cget_nbr_fields(const char *comp_name, const char *grid_name)
Definition yac.c:4287
#define ASSIGN
int const YAC_NNN_GAUSS
Definition yac.c:76
void yac_cinit_comm_dummy_f2c(MPI_Fint comm_f)
Definition yac.c:455
void yac_csync_def_instance(int yac_instance_id)
Definition yac.c:4146
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:1571
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:4569
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:3533
static void cleanup()
Definition yac.c:615
void yac_cget_interp_stack_config_from_string_json(char const *interp_stack_config, int *interp_stack_config_id)
Definition yac.c:5157
void yac_cpredef_comp(char const *name, int *comp_id)
Definition yac.c:858
int yac_cyaml_get_emitter_flag_default_c2f()
Definition yac.c:470
void yac_csync_def(void)
Definition yac.c:4151
static double ** get_recv_field_pointers(int const field_id, int const collection_size, double *recv_field)
Definition yac.c:2264
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:4720
int const YAC_TIME_UNIT_HOUR
Definition yac.c:56
void yac_cinit(void)
Definition yac.c:435
int const YAC_YEAR_OF_360_DAYS
Definition yac.c:65
void yac_cget_raw_(int const field_id, int const collection_size, double *src_field_buffer, int *info, int *ierr)
Definition yac.c:2623
void yac_cfinalize_instance(int yac_instance_id)
Finalises YAC.
Definition yac.c:626
static struct user_input_data_masks ** masks
Definition yac.c:153
static void init_ext_couple_config(struct yac_ext_couple_config *ext_couple_config)
Definition yac.c:1411
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:2763
void yac_cfinalize()
Finalises YAC.
Definition yac.c:635
const char * yac_cget_field_name_from_field_id(int field_id)
Definition yac.c:4452
void yac_cadd_interp_stack_config_check(int interp_stack_config_id, char const *constructor_key, char const *do_search_key)
Definition yac.c:5084
void yac_cenddef_instance(int yac_instance_id)
Definition yac.c:4159
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:3749
void yac_cget_ext_couple_config_yaxt_exchanger_name(int ext_couple_config_id, char const **yaxt_exchanger_name)
Definition yac.c:1641
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:1587
void yac_cget_raw_async_(int const field_id, int const collection_size, double *src_field_buffer, int *info, int *ierr)
Definition yac.c:2680
int yac_cget_nbr_comps_instance(int yac_instance_id)
Definition yac.c:4213
int yac_cget_nbr_fields_instance(int yac_instance_id, const char *comp_name, const char *grid_name)
Definition yac.c:4267
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:1976
void yac_cget_ext_couple_config(int *ext_couple_config_id)
Definition yac.c:1426
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:2588
static size_t num_masks
Definition yac.c:154
static void yac_get(int const field_id, int collection_size, double **recv_field, int is_async, int *info, int *ierr)
Definition yac.c:2410
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:4660
size_t num_grids
Definition yac.c:145
void yac_cdef_grid_metadata_instance(int yac_instance_id, const char *grid_name, const char *metadata)
Definition yac.c:1339
void yac_cset_ext_couple_config_weight_file(int ext_couple_config_id, char const *weight_file)
Definition yac.c:1454
const char * yac_cget_component_metadata_instance(int yac_instance_id, const char *comp_name)
Definition yac.c:1369
void yac_cread_config_yaml_instance(int yac_instance_id, const char *yaml_filename)
Definition yac.c:481
void yac_cset_ext_couple_config_yaxt_exchanger_name(int ext_couple_config_id, char const *yaxt_exchanger_name)
Definition yac.c:1634
static struct user_input_data_component * get_user_input_data_component(int comp_id, char const *routine)
Definition yac.c:727
int const YAC_LOCATION_CORNER
Definition yac.c:30
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:1713
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:4482
void yac_cset_ext_couple_config_scale_summand(int ext_couple_config_id, double scale_summand)
Definition yac.c:1557
void yac_cget_comp_comm(int comp_id, MPI_Comm *comp_comm)
Definition yac.c:745
const char * yac_cget_field_datetime(int field_id)
Definition yac.c:2206
int const YAC_SPMAP_AVG
Definition yac.c:83
int const YAC_CONSERV_DESTAREA
Definition yac.c:80
void yac_cget(int const field_id, int collection_size, double **recv_field, int *info, int *ierr)
Definition yac.c:2532
static size_t num_components
Definition yac.c:148
int const YAC_EXCHANGE_TYPE_SOURCE
Definition yac.c:34
void yac_cdef_comp_instance(int yac_instance_id, char const *comp_name, int *comp_id)
Definition yac.c:896
void yac_cupdate(int field_id)
Definition yac.c:2226
void yac_cget_action(int field_id, int *action)
Definition yac.c:2163
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:1468
static double *** get_src_field_buffer_pointers_ptr(int field_id, size_t collection_size, double **src_field_buffer)
Definition yac.c:2323
void yac_cset_ext_couple_config_use_raw_exchange_(struct yac_ext_couple_config *ext_couple_config, int use_raw_exchange)
Definition yac.c:1648
static void yac_free_interp_stack_configs()
Definition yac.c:302
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:3501
int const YAC_REDUCTION_TIME_ACCUMULATE
Definition yac.c:48
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:1093
int yac_cget_field_id(const char *comp_name, const char *grid_name, const char *field_name)
Definition yac.c:4205
void yac_cget_ext_couple_config_tgt_mask_name(int ext_couple_config_id, char const **tgt_mask_name)
Definition yac.c:1619
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:1595
const char * yac_cget_grid_name_from_field_id(int field_id)
Definition yac.c:4444
int yac_cget_collection_size_from_field_id(int field_id)
Definition yac.c:4466
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:4582
void yac_cmpi_handshake_f2c(MPI_Fint comm, int n, char const **group_names, MPI_Fint *group_comms)
Definition yac.c:366
void yac_cget_ext_couple_config_use_raw_exchange(int ext_couple_config_id, int *use_raw_exchange)
Definition yac.c:1661
int const YAC_EXCHANGE_TYPE_NONE
Definition yac.c:33
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:1698
void yac_cset_ext_couple_config_use_raw_exchange(int ext_couple_config_id, int use_raw_exchange)
Definition yac.c:1654
static int yac_pointer_to_unique_id(void *pointer)
Definition yac.c:178
void check_mpi_initialised(char const *routine_name)
Definition yac.c:349
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:511
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:992
void yac_cget_comps_comm(const char **comp_names, int num_comps, MPI_Comm *comps_comm)
Definition yac.c:795
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:3651
void yac_cinit_comm_instance(MPI_Comm comm, int *yac_instance_id)
Definition yac.c:397
static struct user_input_data_points ** points
Definition yac.c:150
int const YAC_EXCHANGE_TYPE_TARGET
Definition yac.c:35
void yac_cread_config_json_instance(int yac_instance_id, const char *yaml_filename)
Definition yac.c:495
void yac_cset_ext_couple_config_scale_factor_(struct yac_ext_couple_config *ext_couple_config, double scale_factor)
Definition yac.c:1525
const char * yac_cget_grid_metadata(const char *grid_name)
Definition yac.c:1390
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:1305
char * yac_cget_start_datetime(void)
Definition yac.c:695
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:3915
void yac_ccheck_field_dimensions(int field_id, int collection_size, int num_interp_fields, int const *interp_field_sizes)
Definition yac.c:1828
void yac_cget_interp_stack_config_from_string_yaml(char const *interp_stack_config, int *interp_stack_config_id)
Definition yac.c:5149
int const YAC_TIME_UNIT_MONTH
Definition yac.c:58
int const YAC_CONFIG_OUTPUT_FORMAT_YAML
Definition yac.c:99
int const YAC_TIME_UNIT_SECOND
Definition yac.c:54
int const YAC_ACTION_RESTART
Definition yac.c:40
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:4957
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:2951
void yac_cset_ext_couple_config_mapping_side_(struct yac_ext_couple_config *ext_couple_config, int mapping_side)
Definition yac.c:1499
void yac_cdef_grid_cloud(const char *grid_name, int nbr_points, double *x_points, double *y_points, int *grid_id)
Definition yac.c:4704
static void yac_free_points()
Definition yac.c:269
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:4618
static int yac_instance_count
Definition yac.c:139
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:4111
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:1066
char * yac_cget_version(void)
Definition yac.c:721
static int pointer_lookup_table_size
Definition yac.c:142
int const YAC_LOCATION_EDGE
Definition yac.c:31
void yac_cput(int const field_id, int const collection_size, double ***const send_field, int *info, int *ierr)
Definition yac.c:3487
void yac_cget_async(int const field_id, int collection_size, double **recv_field, int *info, int *ierr)
Definition yac.c:2541
void yac_cread_config_yaml(const char *yaml_filename)
Definition yac.c:490
void yac_cset_ext_couple_config_weight_file_(struct yac_ext_couple_config *ext_couple_config, char const *weight_file)
Definition yac.c:1446
int yac_cget_default_instance_id()
Definition yac.c:392
static size_t num_interp_stack_configs
Definition yac.c:157
void yac_cadd_interp_stack_config_user_file(int interp_stack_config_id, char const *filename)
Definition yac.c:5065
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:3612
const char * yac_cget_component_name_from_field_id(int field_id)
Definition yac.c:4437
void yac_cinit_comm_instance_f2c(MPI_Fint comm, int *yac_instance_id)
Definition yac.c:403
#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:4530
int const YAC_CONFIG_OUTPUT_SYNC_LOC_DEF_COMP
after component definition
Definition yac.c:112
int const YAC_SPMAP_FRACAREA
Definition yac.c:89
void yac_cdef_component_metadata_instance(int yac_instance_id, const char *comp_name, const char *metadata)
Definition yac.c:1326
void yac_cenddef_and_emit_config_instance(int yac_instance_id, int emit_flags, char **config)
Definition yac.c:4172
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:3716
void yac_ccheck_src_field_buffer_size(int field_id, int collection_size, int src_field_buffer_size_)
Definition yac.c:1889
char * yac_cget_end_datetime(void)
Definition yac.c:710
int const YAC_WGT_ON_EXISTING_OVERWRITE
overwrite existing weight file
Definition yac.c:104
int const YAC_ACTION_NONE
no data exchanges
Definition yac.c:37
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:970
int const YAC_WGT_ON_EXISTING_KEEP
keep existing weight file
Definition yac.c:103
int yac_cyaml_get_emitter_flag_json_c2f()
Definition yac.c:474
void yac_cdef_calendar(int calendar)
Definition yac.c:664
int const YAC_SPMAP_NONE
Definition yac.c:86
void yac_cset_core_mask(int const *is_core, int location, int grid_id)
Definition yac.c:4781
void yac_cinit_comm_f2c(MPI_Fint comm_f)
Definition yac.c:418
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:2692
void yac_cwait(int field_id)
Definition yac.c:3008
void yac_cadd_interp_stack_config_rbf(int interp_stack_config_id, size_t n, double max_search_distance, double scale)
Definition yac.c:4945
int yac_cget_calendar()
Definition yac.c:681
int const YAC_CONFIG_OUTPUT_SYNC_LOC_SYNC_DEF
after synchronization of definition
Definition yac.c:114
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:2635
void yac_cget_comp_names(int nbr_comps, const char **comp_names)
Definition yac.c:4312
static int yac_add_grid(const char *grid_name, struct yac_basic_grid_data grid_data)
Definition yac.c:238
void yac_cdef_comps(char const **comp_names, int num_comps, int *comp_ids)
Definition yac.c:888
const char * yac_cget_field_metadata(const char *comp_name, const char *grid_name, const char *field_name)
Definition yac.c:1404
int const YAC_ACTION_REDUCTION
data reduction, but data exchange
Definition yac.c:38
int const YAC_ACTION_GET_FOR_RESTART
last valid get
Definition yac.c:41
void yac_cput_(int const field_id, int const collection_size, double *send_field, int *info, int *ierr)
Definition yac.c:2836
void yac_cget_comps_comm_f2c(char const **comp_names, int num_comps, MPI_Fint *comps_comm_f)
Definition yac.c:815
int const YAC_PROLEPTIC_GREGORIAN
Definition yac.c:63
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:4343
double yac_cget_field_frac_mask_fallback_value(const char *comp_name, const char *grid_name, const char *field_name)
Definition yac.c:4522
void yac_cset_mask(int const *is_valid, int points_id)
Definition yac.c:1182
void yac_cget_async_(int const field_id, int const collection_size, double *recv_field, int *info, int *ierr)
Definition yac.c:2523
void yac_cadd_interp_stack_config_hcsbb(int interp_stack_config_id)
Definition yac.c:5030
void yac_cget_comps_comm_instance(int yac_instance_id, char const **comp_names, int num_comps, MPI_Comm *comps_comm)
Definition yac.c:785
void yac_cadd_interp_stack_config_fixed(int interp_stack_config_id, double value)
Definition yac.c:5074
int const YAC_TIME_UNIT_DAY
Definition yac.c:57
static size_t num_points
Definition yac.c:151
void yac_get_(int const field_id, int const collection_size, double *recv_field, int is_async, int *info, int *ierr)
Definition yac.c:2496
static void yac_cupdate_(struct coupling_field *cpl_field, struct event *event, int is_source)
Definition yac.c:2214
int yac_cget_comp_nbr_grids(const char *comp_name)
Definition yac.c:4262
int const YAC_ACTION_COUPLING
data exchange
Definition yac.c:39
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:4501
static int user_input_data_add_points(struct yac_basic_grid *grid, enum yac_location location, yac_coordinate_pointer coordinates)
Definition yac.c:909
int const YAC_TIME_UNIT_ISO_FORMAT
Definition yac.c:60
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:4555
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:4126
int const YAC_AVG_DIST
Definition yac.c:68
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:3679
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:4537
static void yac_check_version(MPI_Comm comm)
Definition yac.c:323
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:1173
static void * yac_unique_id_to_pointer(int id, char const *id_name)
Definition yac.c:197
int const YAC_CONSERV_FRACAREA
Definition yac.c:81
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:4976
void yac_cadd_interp_stack_config_user_callback(int interp_stack_config_id, char const *func_compute_weights_key)
Definition yac.c:5106
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:4682
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:1028
void yac_cset_ext_couple_config_mapping_side(int ext_couple_config_id, int mapping_side)
Definition yac.c:1511
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:1154
void yac_ccleanup_instance(int yac_instance_id)
Clean-up a YAC instance (see Restarting YAC)
Definition yac.c:598
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:4512
static void check_y_vertices(double const *y_vertices, size_t count, char const *routine_name)
Definition yac.c:939
void yac_cfree_interp_stack_config(int interp_stack_config_id)
Definition yac.c:4867
static double *** get_send_field_pointers(int field_id, size_t collection_size, double *send_field)
Definition yac.c:2801
int const YAC_CALENDAR_NOT_SET
Definition yac.c:62
void yac_cset_grid_output_file(const char *gridname, const char *filename)
Definition yac.c:571
int const YAC_NNN_AVG
Definition yac.c:74
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:4924
void yac_cget_ext_couple_config_scale_summand(int ext_couple_config_id, double *scale_summand)
Definition yac.c:1564
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:1927
int const YAC_CONFIG_OUTPUT_FORMAT_JSON
Definition yac.c:100
size_t yac_cget_grid_size(int located, int grid_id)
Definition yac.c:4821
void yac_cinit_instance(int *yac_instance_id)
Definition yac.c:423
void yac_ctest(int field_id, int *flag)
Definition yac.c:2984
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:1626
void yac_cget_interp_stack_config(int *interp_stack_config_id)
Definition yac.c:4853
static void yac_free_pointer_unique_lookup()
Definition yac.c:229
void yac_cinit_dummy(void)
Definition yac.c:461
@ YAC_CONFIG_OUTPUT_SYNC_LOC_ENDDEF_
Definition yac.c:109
@ YAC_CONFIG_OUTPUT_SYNC_LOC_SYNC_DEF_
Definition yac.c:108
@ YAC_CONFIG_OUTPUT_SYNC_LOC_DEF_COMP_
Definition yac.c:107
void yac_cadd_interp_stack_config_average(int interp_stack_config_id, int reduction_type, int partial_coverage)
Definition yac.c:4887
int const YAC_ACTION_PUT_FOR_RESTART
last valid put
Definition yac.c:42
#define WEIGHT_ACC(ACC, EXTRA_CHECK)
int const YAC_NNN_ZERO
Definition yac.c:78
void yac_cdef_comp(char const *comp_name, int *comp_id)
Definition yac.c:902
static struct yac_interp_stack_config ** interp_stack_configs
Definition yac.c:156
int const YAC_SPMAP_DIST
Definition yac.c:84
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:2720
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:2663
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:1274
size_t yac_cget_points_size(int points_id)
Definition yac.c:4841
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:1728
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:1745
int yac_cget_nbr_comps(void)
Definition yac.c:4221
static int default_instance_id
Definition yac.c:137
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:1353
int const YAC_AVG_BARY
Definition yac.c:69
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:2708
static void check_x_vertices(double const *x_vertices, size_t count, char const *routine_name)
Definition yac.c:929
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:1604
void yac_cput_ptr_(int const field_id, int const collection_size, double **send_field, int *info, int *ierr)
Definition yac.c:2930
struct yac_basic_grid ** grids
Definition yac.c:144
void yac_cget_raw_ptr_(int const field_id, int const collection_size, double **src_field_buffer, int *info, int *ierr)
Definition yac.c:2651
int const YAC_NNN_DIST
Definition yac.c:75
void yac_cget_comp_grid_names(const char *comp_name, int nbr_grids, const char **grid_names)
Definition yac.c:4385
int yac_cget_nbr_grids()
Definition yac.c:4234
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:4391
void yac_cdef_comps_instance(int yac_instance_id, char const **comp_names, int num_comps, int *comp_ids)
Definition yac.c:863
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:3591
int const YAC_REDUCTION_TIME_NONE
Definition yac.c:47
void yac_cget_comp_names_instance(int yac_instance_id, int nbr_comps, const char **comp_names)
Definition yac.c:4292
void yac_cdef_field_metadata(const char *comp_name, const char *grid_name, const char *field_name, const char *metadata)
Definition yac.c:1362
static void yac_ccleanup_instance_(int yac_instance_id)
Definition yac.c:579
const char * yac_cget_component_metadata(const char *comp_name)
Definition yac.c:1377
const char * yac_cget_field_timestep(const char *comp_name, const char *grid_name, const char *field_name)
Definition yac.c:4494
void yac_cget_field_names(const char *comp_name, const char *grid_name, int nbr_fields, const char **field_names)
Definition yac.c:4430
void ** pointer_lookup_table
Definition yac.c:141
static int yac_cget_interp_stack_config_from_string(char const *interp_stack_config, int parse_flags)
Definition yac.c:5129
void yac_cget_ext_couple_config_weight_file(int ext_couple_config_id, char const **weight_file)
Definition yac.c:1461
void yac_cinit_comm(MPI_Comm comm)
Definition yac.c:409
static void yac_free_grids()
Definition yac.c:258
#define YAC_MAX_CHARLEN
Definition yac.h:95
#define YAC_ASSERT_F(exp, format,...)
Definition yac_assert.h:19
#define YAC_ASSERT(exp, msg)
Definition yac_assert.h:16
void yac_mpi_finalize()
Definition yac_mpi.c:108
void yac_mpi_cleanup()
Definition yac_mpi.c:95
int yac_mpi_is_initialised()
Definition yac_mpi.c:32
void yac_yaxt_init(MPI_Comm comm)
Definition yac_mpi.c:40
void yac_mpi_init()
Definition yac_mpi.c:77
#define yac_mpi_call(call, comm)
Xt_int yac_int
Definition yac_types.h:15
double(* yac_coordinate_pointer)[3]
Definition yac_types.h:19