YAC 3.7.0
Yet Another Coupler
Loading...
Searching...
No Matches
config_yaml.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// libfyaml is not very clean...so we have to suppress some warnings
10
11#if defined(__NVCOMPILER)
12# pragma diag_suppress unsigned_compare_with_zero
13#elif defined(__GNUC__)
14# pragma GCC diagnostic push
15# pragma GCC diagnostic ignored "-Wpedantic"
16# pragma GCC diagnostic ignored "-Wall"
17# pragma GCC diagnostic ignored "-Wextra"
18#endif
19#include <libfyaml.h>
20#if defined(__NVCOMPILER)
21# pragma diag_default unsigned_compare_with_zero
22#elif defined(__GNUC__)
23# pragma GCC diagnostic pop
24#endif
25
26#include <stdlib.h>
27#include <string.h>
28#include <stdbool.h>
29
30#include "yac.h"
31#include "utils_mci.h"
32#include "config_yaml.h"
33#include "mtime_calendar.h"
34#include "geometry.h"
35#include "io_utils.h"
36#include "interp_method_avg.h"
38#include "interp_method_check.h"
40#include "interp_method_creep.h"
41#include "interp_method_file.h"
42#include "interp_method_fixed.h"
43#include "interp_method_hcsbb.h"
44#include "interp_method_ncc.h"
45#include "interp_method_nnn.h"
46#include "interp_method_spmap.h"
47#include "interp_stack_config.h"
48#include "instance.h"
49#include "fields.h"
50
51typedef struct fy_document * fy_document_t;
52typedef struct fy_node * fy_node_t;
53typedef struct fy_node_pair * fy_node_pair_t;
54
55enum {
56 EMITTER_DEFAULT = FYECF_DEFAULT,
57 EMITTER_JSON = FYECF_MODE_JSON,
59 PARSER_JSON_AUTO = FYPCF_JSON_AUTO,
60 PARSER_JSON_FORCE = FYPCF_JSON_FORCE,
61};
62
68
69char const * yac_time_to_ISO(
70 char const * time, enum yac_time_unit_type time_unit);
71
73 struct {
74 char const * comp_name;
75 struct {
76 char const ** name;
77 size_t count;
79 int lag;
80 } src, tgt;
81 char const * coupling_period;
84 struct {
85 char const * name;
90
92 char const * src, * tgt;
95
96 char const ** src_mask_names;
98 char const * tgt_mask_name;
99
101
103};
104
113
139
146
153
158
163
172
177
178#define CAST_NAME_TYPE_PAIRS(...) (struct yac_name_type_pair[]) {__VA_ARGS__}
179#define COUNT_NAME_TYPE_PAIRS(...) \
180 sizeof(CAST_NAME_TYPE_PAIRS(__VA_ARGS__)) / sizeof(struct yac_name_type_pair)
181#define DEF_NAME_TYPE_PAIR(NAME, TYPE) {.name = #NAME, .type = (int)(TYPE)}
182#define DEF_NAME_TYPE_PAIRS(NAME, ...) \
183 static const struct yac_name_type_pair NAME [] = {__VA_ARGS__}; \
184 static const size_t num_ ## NAME = COUNT_NAME_TYPE_PAIRS(__VA_ARGS__);
185
187 yaml_base_keys,
188 DEF_NAME_TYPE_PAIR(start_date, START_DATE),
189 DEF_NAME_TYPE_PAIR(end_date, END_DATE),
190 DEF_NAME_TYPE_PAIR(calendar, CALENDAR),
191 DEF_NAME_TYPE_PAIR(timestep_unit, TIMESTEP_UNIT),
192 DEF_NAME_TYPE_PAIR(coupling, COUPLING),
194
196 yaml_couple_keys,
198 DEF_NAME_TYPE_PAIR(src_component, SOURCE_COMPONENT),
201 DEF_NAME_TYPE_PAIR(tgt_component, TARGET_COMPONENT),
204 DEF_NAME_TYPE_PAIR(coupling_period, COUPLING_PERIOD),
205 DEF_NAME_TYPE_PAIR(time_reduction, TIME_REDUCTION),
209 DEF_NAME_TYPE_PAIR(weight_file_name, WEIGHT_FILE_NAME),
210 DEF_NAME_TYPE_PAIR(weight_file_on_existing, WEIGHT_FILE_ON_EXISTING),
211 DEF_NAME_TYPE_PAIR(mapping_side, MAPPING_SIDE),
212 DEF_NAME_TYPE_PAIR(scale_factor, SCALE_FACTOR),
213 DEF_NAME_TYPE_PAIR(scale_summand, SCALE_SUMMAND),
214 DEF_NAME_TYPE_PAIR(interpolation, INTERPOLATION),
215 DEF_NAME_TYPE_PAIR(src_mask_name, SOURCE_MASK_NAME),
216 DEF_NAME_TYPE_PAIR(src_mask_names, SOURCE_MASK_NAMES),
217 DEF_NAME_TYPE_PAIR(tgt_mask_name, TARGET_MASK_NAME),
219 DEF_NAME_TYPE_PAIR(yaxt_exchanger_name, YAXT_EXCHANGER_NAME),
220 DEF_NAME_TYPE_PAIR(use_raw_exchange, USE_RAW_EXCHANGE))
221
223 yaml_debug_sync_loc_keys,
232
234 yaml_debug_output_grid_keys,
237
239 bool_names,
240 DEF_NAME_TYPE_PAIR(true, true),
241 DEF_NAME_TYPE_PAIR(TRUE, true),
242 DEF_NAME_TYPE_PAIR(yes, true),
243 DEF_NAME_TYPE_PAIR(YES, true),
244 DEF_NAME_TYPE_PAIR(false, false),
245 DEF_NAME_TYPE_PAIR(FALSE, false),
246 DEF_NAME_TYPE_PAIR(no, false),
247 DEF_NAME_TYPE_PAIR(NO, false))
248
250 timestep_units,
251 DEF_NAME_TYPE_PAIR(millisecond, C_MILLISECOND),
258 DEF_NAME_TYPE_PAIR(ISO_format, C_ISO_FORMAT))
259
261 time_operations,
267
269 calendar_types,
270 DEF_NAME_TYPE_PAIR(proleptic-gregorian, PROLEPTIC_GREGORIAN),
271 DEF_NAME_TYPE_PAIR(360d, YEAR_OF_360_DAYS),
272 DEF_NAME_TYPE_PAIR(365d, YEAR_OF_365_DAYS))
273
275 mapping_sides,
276 DEF_NAME_TYPE_PAIR(source, 1),
277 DEF_NAME_TYPE_PAIR(target, 0))
278
280 yaml_debug_keys,
281 DEF_NAME_TYPE_PAIR(global_config, GLOBAL_CONFIG),
282 DEF_NAME_TYPE_PAIR(output_grids, OUTPUT_GRIDS),
283 DEF_NAME_TYPE_PAIR(missing_definition_is_fatal, MISSING_DEF))
284
286 config_filetypes,
291
293 role_types,
294 DEF_NAME_TYPE_PAIR(target, TARGET),
295 DEF_NAME_TYPE_PAIR(source, SOURCE),
296 DEF_NAME_TYPE_PAIR(nothing, NOTHING))
297
299 yaml_comp_grid_names_keys,
300 DEF_NAME_TYPE_PAIR(component, COMP_NAME),
302
304 yaml_weight_file_data_keys,
307
309 weight_file_on_existing_types,
313
314typedef
315#if defined __NVCOMPILER && (__NVCOMPILER_MAJOR__ <= 23 || __NVCOMPILER_MAJOR__ == 24 && __NVCOMPILER_MINOR__ <= 3)
316// Older versions of NVHPC have serious problems with unions that contain
317// pointers that are not the first members: versions 23.7 and older fail with
318// 'Internal compiler error. unhandled type', the newer versions produce code
319// that fails at the runtime with
320// 'Segmentation fault: address not mapped to object'.
321struct
322#else
323union
324#endif
326 int enum_value;
327 int int_value;
328 double dble_value;
329 int bool_value;
330 char const * str_value;
332
341
343
344 char const * name;
346
347#if defined __NVCOMPILER && (__NVCOMPILER_MAJOR__ <= 23 || __NVCOMPILER_MAJOR__ == 24 && __NVCOMPILER_MINOR__ <= 3)
348 // Older versions of NVHPC generate invalid LLVM IR for unions that contain
349 // structures with doubles: an attempt to initialize a member of type double
350 // that is not the first member of the respective structure will lead to a
351 // type mismatch.
352 struct
353#else
354 union
355#endif
356 {
357 struct { // enum
361 struct { // integer
362 int valid_min, valid_max;
364 struct { // double
367 struct { // string
370 struct { // bool
371 int dummy;
375};
376
377#define DEF_INTERP_METHOD_ADD_FUNC(NAME, FUNC) \
378 static void add_interp_method_ ## NAME ( \
379 struct yac_interp_stack_config * interp_stack, \
380 interp_method_parameter_value * parameters, \
381 char const * yaml_filename) { \
382 char const * routine_name = "add_interp_method_" #NAME; \
383 (void)parameters; \
384 (void)yaml_filename; \
385 (void)routine_name; \
386 {FUNC} }
387#define DEF_INTERP_METHOD_GET_FUNC(NAME, FUNC) \
388 static void get_interp_method_ ## NAME ( \
389 union yac_interp_stack_config_entry const * interp_stack_entry, \
390 interp_method_parameter_value * parameter_values) { \
391 char const * routine_name = "get_interp_method_" #NAME; \
392 (void)interp_stack_entry; \
393 (void)parameter_values; \
394 (void)routine_name; \
395 {FUNC} }
396
397#define DEF_ENUM_PARAM(NAME, DEFAULT, ...) \
398 {.name = #NAME, \
399 .type = ENUM_PARAM, \
400 .data.enum_param = \
401 {.valid_values = CAST_NAME_TYPE_PAIRS(__VA_ARGS__), \
402 .num_valid_values = COUNT_NAME_TYPE_PAIRS(__VA_ARGS__)}, \
403 .default_value.enum_value = (int)(DEFAULT)}
404#define DEF_INT_PARAM(NAME, DEFAULT, VALID_MIN, VALID_MAX) \
405 {.name = #NAME, \
406 .type = INT_PARAM, \
407 .data.int_param = \
408 {.valid_min = (int)(VALID_MIN), \
409 .valid_max = (int)(VALID_MAX)}, \
410 .default_value.int_value = (int)(DEFAULT)}
411#define DEF_DBLE_PARAM(NAME, DEFAULT, VALID_MIN, VALID_MAX) \
412 {.name = #NAME, \
413 .type = DBLE_PARAM, \
414 .data.dble_param = \
415 {.valid_min = (double)(VALID_MIN), \
416 .valid_max = (double)(VALID_MAX)}, \
417 .default_value.dble_value = (double)(DEFAULT)}
418#define DEF_DEG_PARAM(NAME, DEFAULT, VALID_MIN, VALID_MAX) \
419 {.name = #NAME, \
420 .type = DEG_PARAM, \
421 .data.dble_param = \
422 {.valid_min = (double)(VALID_MIN), \
423 .valid_max = (double)(VALID_MAX)}, \
424 .default_value.dble_value = (double)(DEFAULT)}
425#define DEF_BOOL_PARAM(NAME, DEFAULT) \
426 {.name = #NAME, \
427 .type = BOOL_PARAM, \
428 .default_value.bool_value = (int)(DEFAULT)}
429#define DEF_STR_PARAM(NAME, DEFAULT, MAX_STR_LEN) \
430 {.name = #NAME, \
431 .type = STR_PARAM, \
432 .data.str_param.max_str_len = (MAX_STR_LEN), \
433 .default_value.str_value = (DEFAULT)}
434#define DEF_INTERP_METHOD_PARAM(NAME, ...) \
435 static struct interp_method_parameter \
436 interp_method_parameters_ ## NAME [] = {__VA_ARGS__};
437
438#define YAML_ASSERT(CHECK, MSG) \
439 YAC_ASSERT_F((CHECK), \
440 "ERROR(%s): " MSG " in YAML configuration file \"%s\"", \
441 routine_name, yaml_filename)
442#define YAML_ASSERT_F(CHECK, MSG, ...) \
443 YAC_ASSERT_F((CHECK), \
444 "ERROR(%s): " MSG " in YAML configuration file \"%s\"", \
445 routine_name, __VA_ARGS__, yaml_filename)
446
447#define DEF_INTERP_STACK_ADD(NAME, ...) \
448 yac_interp_stack_config_add_ ## NAME ( \
449 interp_stack, __VA_ARGS__);
450
451#define DEF_INTERP_STACK_ADD_NO_PARAM(NAME) \
452 yac_interp_stack_config_add_ ## NAME ( \
453 interp_stack);
454
455#define DEF_INTERP_STACK_GET(NAME, ...) \
456 yac_interp_stack_config_entry_get_ ## NAME ( \
457 interp_stack_entry, __VA_ARGS__);
458
459#define DEF_INTERP_STACK_GET_NO_PARAM(NAME) \
460 {}
461
462#define DEF_INTERP_METHOD(NAME, FUNC_ADD, FUNC_GET, ...) \
463 DEF_INTERP_METHOD_ADD_FUNC(NAME, FUNC_ADD) \
464 DEF_INTERP_METHOD_GET_FUNC(NAME, FUNC_GET) \
465 DEF_INTERP_METHOD_PARAM(NAME, __VA_ARGS__)
466
467// interpolation method average
469 DEF_INTERP_STACK_ADD(average,
470 (enum yac_interp_avg_weight_type)parameters[0].enum_value,
471 parameters[1].bool_value),
472 enum yac_interp_avg_weight_type reduction_type;
473 DEF_INTERP_STACK_GET(average,
474 &reduction_type, &parameter_values[1].bool_value)
475 parameter_values[0].enum_value = (int)reduction_type;,
478 DEF_NAME_TYPE_PAIR(distance_weighted, YAC_INTERP_AVG_DIST),
480 DEF_NAME_TYPE_PAIR(barycentric_coordinate, YAC_INTERP_AVG_BARY)),
483
484// interpolation method nearest corner cells
487 (enum yac_interp_ncc_weight_type)parameters[0].enum_value,
488 parameters[1].bool_value),
491 &weight_type, &parameter_values[1].bool_value)
492 parameter_values[0].enum_value = (int)weight_type;,
495 DEF_NAME_TYPE_PAIR(arithmetic_average, YAC_INTERP_NCC_AVG),
496 DEF_NAME_TYPE_PAIR(distance_weighted, YAC_INTERP_NCC_DIST)),
499
500// interpolation method n-nearest neighbor
503 (enum yac_interp_nnn_weight_type)parameters[0].enum_value,
504 (size_t)parameters[1].int_value,
505 parameters[2].dble_value,
506 parameters[3].dble_value),
508 size_t n;
510 &type, &n, &parameter_values[2].dble_value,
511 &parameter_values[3].dble_value)
512 parameter_values[0].enum_value = (int)type;
513 parameter_values[1].int_value = (int)n;
514 parameter_values[2].dble_value /= YAC_RAD;,
517 DEF_NAME_TYPE_PAIR(distance_weighted, YAC_INTERP_NNN_DIST),
519 DEF_NAME_TYPE_PAIR(arithmetic_average, YAC_INTERP_NNN_AVG),
524 0.0, 179.9999),
526 gauss_scale, YAC_INTERP_NNN_GAUSS_SCALE_DEFAULT, -DBL_MAX, DBL_MAX))
527
528// interpolation method conservative
529DEF_INTERP_METHOD(conservative,
530 DEF_INTERP_STACK_ADD(conservative,
531 parameters[0].int_value,
532 parameters[1].bool_value,
533 parameters[2].bool_value,
536 DEF_INTERP_STACK_GET(conservative,
537 &parameter_values[0].int_value,
538 &parameter_values[1].bool_value,
539 &parameter_values[2].bool_value, &normalisation)
540 parameter_values[3].enum_value = (int)normalisation;,
543 enforced_conservation, YAC_INTERP_CONSERV_ENFORCED_CONSERV_DEFAULT),
550
551static void get_spmap_parameters(
552 double * sphere_radius, char const * filename, char const * varname,
553 char const * routine_name, char const * yaml_filename, char const * type) {
554
555 // if no cell area configuration is provided
556 if ((*sphere_radius == 0.0) && (filename == NULL) && (varname == NULL)) {
558 }
559 // ensure that only one cell area provider type is given
561 (*sphere_radius != 0.0) ^ ((filename != NULL) || (varname != NULL)),
562 "configurations for the computation and reading of %s cell areas "
563 "were provided (only one is allowed)", type);
564 // ensure that both file name and variable name are provided
566 (*sphere_radius != 0.0) || ((filename != NULL) && (varname != NULL)),
567 "incomplete information for read of %s cell areas "
568 "(filename: \"%s\" varname: \"%s\")",
569 type, filename?filename:"missing", varname?varname:"missing");
570}
571
572// interpolation method source to target mapping
573DEF_INTERP_METHOD(source_to_target_map,
574 double src_sphere_radius = parameters[4].dble_value;
575 char const * src_filename = parameters[5].str_value;
576 char const * src_varname = parameters[6].str_value;
577 int src_min_global_id = parameters[7].int_value;
578 double tgt_sphere_radius = parameters[8].dble_value;
579 char const * tgt_filename = parameters[9].str_value;
580 char const * tgt_varname = parameters[10].str_value;
581 int tgt_min_global_id = parameters[11].int_value;
582 get_spmap_parameters(
583 &src_sphere_radius, src_filename, src_varname,
584 routine_name, yaml_filename, "source");
585 get_spmap_parameters(
586 &tgt_sphere_radius, tgt_filename, tgt_varname,
587 routine_name, yaml_filename, "target");
589 parameters[0].dble_value,
590 parameters[1].dble_value,
591 (enum yac_interp_spmap_weight_type)parameters[2].enum_value,
592 (enum yac_interp_spmap_scale_type)parameters[3].enum_value,
593 src_sphere_radius, src_filename, src_varname, src_min_global_id,
594 tgt_sphere_radius, tgt_filename, tgt_varname, tgt_min_global_id),
596 enum yac_interp_spmap_scale_type scale_type;
598 &parameter_values[0].dble_value,
599 &parameter_values[1].dble_value,
600 &weight_type, &scale_type,
601 &parameter_values[4].dble_value,
602 &parameter_values[5].str_value,
603 &parameter_values[6].str_value,
604 &parameter_values[7].int_value,
605 &parameter_values[8].dble_value,
606 &parameter_values[9].str_value,
607 &parameter_values[10].str_value,
608 &parameter_values[11].int_value)
609 parameter_values[0].dble_value /= YAC_RAD;
610 parameter_values[1].dble_value /= YAC_RAD;
611 parameter_values[2].enum_value = (int)weight_type;
612 parameter_values[3].enum_value = (int)scale_type;,
614 spread_distance, YAC_INTERP_SPMAP_SPREAD_DISTANCE_DEFAULT, 0.0, 89.9999),
616 max_search_distance,
620 DEF_NAME_TYPE_PAIR(distance_weighted, YAC_INTERP_SPMAP_DIST),
621 DEF_NAME_TYPE_PAIR(arithmetic_average, YAC_INTERP_SPMAP_AVG)),
629 src_cell_area:yac:sphere_radius, 0.0, 1e-9, DBL_MAX),
631 src_cell_area:file:filename, NULL, YAC_MAX_FILE_NAME_LENGTH),
632 DEF_STR_PARAM(src_cell_area:file:varname, NULL, 128),
634 src_cell_area:file:min_global_id, YAC_INTERP_SPMAP_MIN_GLOBAL_ID_DEFAULT,
635 -INT_MAX, INT_MAX),
637 tgt_cell_area:yac:sphere_radius, 0.0, 1e-9, DBL_MAX),
639 tgt_cell_area:file:filename, NULL, YAC_MAX_FILE_NAME_LENGTH),
640 DEF_STR_PARAM(tgt_cell_area:file:varname, NULL, 128),
642 tgt_cell_area:file:min_global_id, YAC_INTERP_SPMAP_MIN_GLOBAL_ID_DEFAULT,
643 -INT_MAX, INT_MAX))
644
645// interpolation method fixed
648 parameters[0].dble_value != DBL_MAX,
649 "parameter 'user_value' of interpolation method 'fixed' is unset");
650 DEF_INTERP_STACK_ADD(fixed, parameters[0].dble_value),
652 &parameter_values[0].dble_value),
654 user_value, YAC_INTERP_FIXED_VALUE_DEFAULT, -DBL_MAX, DBL_MAX))
655
656// interpolation method user file
657DEF_INTERP_METHOD(user_file,
659 parameters[0].str_value,
660 "parameter \"filename\" of interpolation method \"user file\" is unset");
662 (char*)(parameters[0].str_value),
664 (enum yac_interp_file_on_success)parameters[2].enum_value),
668 &parameter_values[0].str_value, &on_missing_file, &on_success)
669 parameter_values[1].enum_value = (int)on_missing_file;
670 parameter_values[2].enum_value = (int)on_success;,
684
685// interpolation method check
688 (char*)(parameters[0].str_value),
689 (char*)(parameters[1].str_value)),
691 &parameter_values[0].str_value,
692 &parameter_values[1].str_value),
699
700// interpolation method Bernstein Bezier
701DEF_INTERP_METHOD(bernstein_bezier,
704 DEF_BOOL_PARAM(dummy, 0))
705
706// interpolation method radial basis function
710 (size_t)parameters[0].int_value,
711 parameters[1].dble_value,
712 parameters[2].dble_value),
714 size_t n;
716 &type, &n, &parameter_values[1].dble_value,
717 &parameter_values[2].dble_value)
720 "ERROR(get_interp_method_nnn): n-nearest-neighbor type missmatch");
721 parameter_values[0].int_value = (int)n;
722 parameter_values[1].dble_value /= YAC_RAD;
723 parameter_values[3].enum_value = (int)0;,
727 0.0, 179.9999),
728 DEF_DBLE_PARAM(rbf_scale, YAC_INTERP_RBF_SCALE_DEFAULT, -DBL_MAX, DBL_MAX),
731 DEF_NAME_TYPE_PAIR(gauss_kernel, 0)))
732
733// interpolation method creep
735 DEF_INTERP_STACK_ADD(creep, parameters[0].int_value),
737 &parameter_values[0].int_value),
739 creep_distance, YAC_INTERP_CREEP_DISTANCE_DEFAULT, -1, INT_MAX))
740
741// interpolation method user_callback
742DEF_INTERP_METHOD(user_callback,
744 parameters[0].str_value,
745 "parameter \"func_compute_weights\" "
746 "of interpolation method \"user callback\" is unset")
747 DEF_INTERP_STACK_ADD(user_callback, (char*)(parameters[0].str_value)),
748 DEF_INTERP_STACK_GET(user_callback,
749 &parameter_values[0].str_value),
753
754
755#define ADD_INTERPOLATION(NAME, TYPE) \
756 {.name = #NAME , \
757 .type = TYPE , \
758 .add_interpolation = add_interp_method_ ## NAME , \
759 .get_interpolation = get_interp_method_ ## NAME , \
760 .parameters = interp_method_parameters_ ## NAME , \
761 .num_parameters = \
762 sizeof(interp_method_parameters_ ## NAME ) / \
763 sizeof(interp_method_parameters_ ## NAME [0])}
764#define ADD_INTERPOLATION_NO_PARAM(NAME, TYPE) \
765 {.name = #NAME , \
766 .type = TYPE , \
767 .add_interpolation = add_interp_method_ ## NAME , \
768 .get_interpolation = get_interp_method_ ## NAME , \
769 .parameters = interp_method_parameters_ ## NAME , \
770 .num_parameters = 0}
771
772struct yac_interpolation_method {
773 char const * name;
775 void(*add_interpolation)(
776 struct yac_interp_stack_config * interp_stack,
778 char const * yaml_filename);
779 void(*get_interpolation)(
780 union yac_interp_stack_config_entry const * interp_stack_entry,
781 interp_method_parameter_value * parameter_values);
782 struct interp_method_parameter const * parameters;
783 size_t num_parameters;
788 ADD_INTERPOLATION(conservative, YAC_CONSERVATIVE),
789 ADD_INTERPOLATION(source_to_target_map, YAC_SOURCE_TO_TARGET_MAP),
796 ADD_INTERPOLATION(user_callback, YAC_USER_CALLBACK)};
797enum {
800};
801
802static char const * yaml_parse_string_value(
803 fy_node_t value_node, char const * name, char const * yaml_filename) {
804 char const * routine_name = "yaml_parse_string_value";
805
807 value_node && fy_node_is_scalar(value_node),
808 "unsupported node type for \"%s\" (the node is expected to be scalar)",
809 name);
810
811 return fy_node_get_scalar0(value_node);
812}
813
814static calendarType yaml_parse_calendar_value(
815 fy_node_t value_node, char const * key_name, char const * yaml_filename) {
816 char const * routine_name = "yaml_parse_calendar_value";
817
818 char const * calendar_name =
819 yaml_parse_string_value(value_node, key_name, yaml_filename);
820
821 int calendar_type =
823 calendar_types, num_calendar_types, calendar_name);
824
826 calendar_type != INT_MAX,
827 "\"%s\" is not a valid calendar name", calendar_name);
828
829 return (calendarType)calendar_type;
830}
831
832static char const * yaml_parse_timestep_value(
833 fy_node_t value_node, char const * key_name, char const * yaml_filename,
834 enum yac_time_unit_type time_unit) {
835 char const * routine_name = "yaml_parse_timestep_value";
836
838 time_unit != TIME_UNIT_UNDEFINED, "time unit is not yet defined");
840 value_node && fy_node_is_scalar(value_node),
841 "unsupported node type for \"%s\" (the node is expected to be scalar)",
842 key_name);
843 char const * timestep =
844 yaml_parse_string_value(value_node, key_name, yaml_filename);
845 char const * timestep_iso =
846 yac_time_to_ISO(timestep, time_unit);
847
849 timestep_iso, "valid to convert timestep \"%s\" to ISO 8601 format",
850 timestep);
851
852 return strdup(timestep_iso);
853}
854
856 fy_node_t value_node, char const * key_name, char const * yaml_filename) {
857 char const * routine_name = "yaml_parse_timestep_unit_value";
858
859 char const * timestep_unit_str =
860 yaml_parse_string_value(value_node, key_name, yaml_filename);
861
862 int timestep_unit =
864 timestep_units, num_timestep_units, timestep_unit_str);
865
867 timestep_unit != INT_MAX,
868 "\"%s\" is not a valid time step unit", timestep_unit_str);
869
870 return (enum yac_time_unit_type)timestep_unit;
871}
872
874 fy_node_t value_node, char const * key_name, char const * yaml_filename) {
875 char const * routine_name = "yaml_parse_time_reduction_value";
876
877 char const * time_reduction_str =
878 yaml_parse_string_value(value_node, key_name, yaml_filename);
879
880 int time_reduction =
882 time_operations, num_time_operations, time_reduction_str);
883
885 time_reduction != INT_MAX,
886 "\"%s\" is not a valid time reduction type in", time_reduction_str);
887
888 return (enum yac_reduction_type)time_reduction;
889}
890
892 fy_node_t value_node, char const * key_name, char const * yaml_filename) {
893 char const * routine_name = "yaml_parse_integer_value";
894
895 char const * integer_str =
896 yaml_parse_string_value(value_node, key_name, yaml_filename);
897
898 char * endptr;
899 long int long_value = strtol(integer_str, &endptr, 10);
900
902 (endptr != integer_str) && (*endptr == '\0') &&
903 (long_value >= INT_MIN) && (long_value <= INT_MAX),
904 "\"%s\" is not a valid integer value", integer_str);
905
906 return (int)long_value;
907}
908
910 fy_node_t value_node, char const * key_name, char const * yaml_filename) {
911 char const * routine_name = "yaml_parse_double_value";
912
913 char const * double_str =
914 yaml_parse_string_value(value_node, key_name, yaml_filename);
915
916 char * endptr;
917 double dble_value = strtod(double_str, &endptr);
918
920 (endptr != double_str) && (*endptr == '\0'),
921 "\"%s\" is not a valid double value", double_str);
922
923 return dble_value;
924}
925
927 struct yac_name_type_pair const * valid_values, size_t num_valid_values,
928 fy_node_t value_node, char const * key_name, char const * yaml_filename) {
929 char const * routine_name = "yaml_parse_enum_value";
930
931 char const * value_str =
932 yaml_parse_string_value(value_node, key_name, yaml_filename);
933
934 int value =
936 valid_values, num_valid_values, value_str);
937
939 value != INT_MAX,
940 "\"%s\" is not a valid enum value for \"%s\" ", value_str, key_name);
941
942 return value;
943}
944
946 char const ** interpolation_type_str, fy_node_t * parameter_node,
947 fy_node_t interp_method_node, char const * yaml_filename) {
948 char const * routine_name = "yaml_parse_base_interp_method_node";
949
951 fy_node_is_scalar(interp_method_node) ||
952 fy_node_is_mapping(interp_method_node),
953 "unsupported interpolation method node type "
954 "(interpolation methods are expected to be defined as either scalar "
955 "or maps)");
956
957 switch(fy_node_get_type(interp_method_node)) {
958 default:
959 case (FYNT_SCALAR):
960 *interpolation_type_str =
962 interp_method_node, "interpolation method name", yaml_filename);
963 *parameter_node = NULL;
964 break;
965
966 case (FYNT_MAPPING):
967
969 fy_node_mapping_item_count(interp_method_node) == 1,
970 "base interpolation method node is only allowed to have one pair ");
971
972 fy_node_pair_t base_interp_method_pair =
973 fy_node_mapping_get_by_index(interp_method_node, 0);
974
975 fy_node_t base_interp_method_key_node =
976 fy_node_pair_key(base_interp_method_pair);
977
978 *interpolation_type_str =
980 base_interp_method_key_node, "interpolation method name",
981 yaml_filename);
982
983 fy_node_t base_interp_method_value_node =
984 fy_node_pair_value(base_interp_method_pair);
985
987 fy_node_is_mapping(base_interp_method_value_node),
988 "unsupported base interpolation method value node type "
989 "for interpolation method \"%s\" "
990 "(interpolation method parameters are expected to be "
991 "defined as maps)", *interpolation_type_str);
992
993 *parameter_node = base_interp_method_value_node;
994 break;
995 }
996}
997
1000 struct interp_method_parameter const * parameter,
1001 fy_node_t value_node, char const * interpolation_name,
1002 char const * yaml_filename) {
1003 char const * routine_name = "yaml_parse_interp_method_parameter_value";
1004
1006 (parameter->type == ENUM_PARAM) ||
1007 (parameter->type == INT_PARAM) ||
1008 (parameter->type == DBLE_PARAM) ||
1009 (parameter->type == DEG_PARAM) ||
1010 (parameter->type == BOOL_PARAM) ||
1011 (parameter->type == STR_PARAM),
1012 "unsupported parameter type for interpolation method \"%s\"",
1013 interpolation_name);
1014
1015 interp_method_parameter_value parameter_value;
1016
1017 switch(parameter->type) {
1018 default:
1019 case (ENUM_PARAM):
1020 parameter_value.enum_value =
1022 parameter->data.enum_param.valid_values,
1023 parameter->data.enum_param.num_valid_values,
1024 value_node, "interpolation method enum parameter value",
1025 yaml_filename);
1026 break;
1027 case (INT_PARAM):
1028 parameter_value.int_value =
1030 value_node, "interpolation method integer parameter value",
1031 yaml_filename);
1033 (parameter_value.int_value >= parameter->data.int_param.valid_min) &&
1034 (parameter_value.int_value <= parameter->data.int_param.valid_max),
1035 "\"%d\" is not a valid integer parameter value for parameter \"%s\" "
1036 "of interpolation method \"%s\" "
1037 "(valid range: %d <= value <= %d)",
1038 parameter_value.int_value, parameter->name, interpolation_name,
1039 parameter->data.int_param.valid_min,
1040 parameter->data.int_param.valid_max);
1041 break;
1042 case (DBLE_PARAM):
1043 parameter_value.dble_value =
1045 value_node, "interpolation method double parameter value",
1046 yaml_filename);
1048 (parameter_value.dble_value >= parameter->data.dble_param.valid_min) &&
1049 (parameter_value.dble_value <= parameter->data.dble_param.valid_max),
1050 "\"%lf\" is not a valid double parameter value for parameter \"%s\" "
1051 "of interpolation method \"%s\" "
1052 "(valid range: %e <= value <= %e)",
1053 parameter_value.dble_value, parameter->name, interpolation_name,
1054 parameter->data.dble_param.valid_min,
1055 parameter->data.dble_param.valid_max);
1056 break;
1057 case (DEG_PARAM):
1058 parameter_value.dble_value =
1060 value_node, "interpolation method degree parameter value",
1061 yaml_filename);
1063 (parameter_value.dble_value >= parameter->data.dble_param.valid_min) &&
1064 (parameter_value.dble_value <= parameter->data.dble_param.valid_max),
1065 "\"%lf\" is not a valid degree parameter value for parameter \"%s\" "
1066 "of interpolation method \"%s\" "
1067 "(valid range: %e <= value <= %e)",
1068 parameter_value.dble_value, parameter->name, interpolation_name,
1069 parameter->data.dble_param.valid_min,
1070 parameter->data.dble_param.valid_max);
1071 parameter_value.dble_value *= YAC_RAD;
1072 break;
1073 case (BOOL_PARAM):
1074 parameter_value.bool_value =
1076 bool_names, num_bool_names, value_node,
1077 "interpolation method bool parameter value", yaml_filename);
1078 break;
1079 case (STR_PARAM):
1080 parameter_value.str_value =
1082 value_node, "interpolation method string parameter value",
1083 yaml_filename);
1085 strlen(parameter_value.str_value) <
1086 parameter->data.str_param.max_str_len,
1087 "\"%s\" is not a valid string parameter value for parameter \"%s\" "
1088 "of interpolation method \"%s\" "
1089 "(maximum string length: %d)",
1090 parameter_value.str_value, parameter->name, interpolation_name,
1091 (int)(parameter->data.str_param.max_str_len - 1));
1092 break;
1093 };
1094
1095 return parameter_value;
1096}
1097
1099 interp_method_parameter_value * parameter_values,
1100 struct interp_method_parameter const * parameters, size_t num_parameters,
1101 fy_node_pair_t parameter_pair, char const * interpolation_name,
1102 char const * parameter_name_prefix, char const * yaml_filename) {
1103 char const * routine_name = "yaml_parse_interp_method_parameter";
1104
1105 char const * parameter_name_ =
1107 fy_node_pair_key(parameter_pair),
1108 "interpolation method parameter name", yaml_filename);
1109
1110 char const * parameter_name;
1111 if (parameter_name_prefix) {
1112 parameter_name =
1113 xmalloc(strlen(parameter_name_prefix) + strlen(parameter_name_) + 2);
1114 sprintf(
1115 (char*)parameter_name, "%s:%s", parameter_name_prefix, parameter_name_);
1116 } else {
1117 parameter_name = parameter_name_;
1118 }
1119
1120 fy_node_t parameter_value_node =
1121 fy_node_pair_value(parameter_pair);
1122
1124 parameter_value_node &&
1125 (fy_node_is_scalar(parameter_value_node) ||
1126 fy_node_is_mapping(parameter_value_node)),
1127 "unsupported parameter node type for interpolation \"%s\" "
1128 "(the node is expected to be either scalar or a map)", interpolation_name);
1129
1130 if (fy_node_is_scalar(parameter_value_node)) {
1131
1132 int found_flag = 0;
1133 for (size_t i = 0; (i < num_parameters) && !found_flag; ++i)
1134 if ((found_flag = !strcmp(parameter_name, parameters[i].name)))
1135 parameter_values[i] =
1137 &parameters[i], fy_node_pair_value(parameter_pair),
1138 interpolation_name, yaml_filename);
1139
1141 found_flag,
1142 "\"%s\" is not a valid parameter for interpolation method \"%s\"",
1143 parameter_name, interpolation_name);
1144
1145 } else {
1146
1147 // parse parameter
1148 void * iter = NULL;
1149 fy_node_pair_t pair;
1150 while ((pair = fy_node_mapping_iterate(parameter_value_node, &iter)))
1152 parameter_values, parameters, num_parameters, pair, interpolation_name,
1153 parameter_name, yaml_filename);
1154 }
1155
1156 if (parameter_name_prefix) free((void*)parameter_name);
1157}
1158
1160 interp_method_parameter_value * parameter_values,
1161 struct yac_interpolation_method const * interp_method,
1162 fy_node_t parameter_node, char const * yaml_filename) {
1163 char const * routine_name = "yaml_parse_interp_method_parameters";
1164
1165 // set default parameter values
1166 for (size_t i = 0; i < interp_method->num_parameters; ++i)
1167 parameter_values[i] = interp_method->parameters[i].default_value;
1168
1169 // if there are no parameters
1170 if (!parameter_node) return;
1171
1173 fy_node_is_mapping(parameter_node),
1174 "unsupported interpolation method parameter node type "
1175 "for interpolation method \"%s\" "
1176 "(interpolation method parameters are expected to be defined as maps)",
1177 interp_method->name);
1178
1179 // parse parameter
1180 void * iter = NULL;
1181 fy_node_pair_t pair;
1182 while ((pair = fy_node_mapping_iterate(parameter_node, &iter)))
1184 parameter_values, interp_method->parameters,
1185 interp_method->num_parameters, pair, interp_method->name, NULL,
1186 yaml_filename);
1187}
1188
1190 struct yac_interp_stack_config * interp_stack,
1191 fy_node_t interp_method_node, char const * yaml_filename) {
1192 char const * routine_name = "yaml_parse_interp_method";
1193
1194 char const * interpolation_type_str;
1195 fy_node_t parameter_node;
1196
1198 &interpolation_type_str, &parameter_node,
1199 interp_method_node, yaml_filename);
1200
1201 struct yac_interpolation_method const * interp_method = NULL;
1202
1203 for (int i = 0; (i < NUM_INTERPOLATION_METHODS) && (!interp_method); ++i)
1204 if (!strcmp(interpolation_type_str, interpolation_methods[i].name))
1206
1209 "\"%s\" is not a valid interpolation method",
1210 interpolation_type_str);
1211
1213 interp_method_paramter_values[interp_method->num_parameters];
1215 interp_method_paramter_values, interp_method,
1216 parameter_node, yaml_filename);
1217 interp_method->add_interpolation(
1218 interp_stack, interp_method_paramter_values, yaml_filename);
1219}
1220
1222 struct yac_interp_stack_config * interp_stack,
1223 fy_node_t interp_stack_node, char const * yaml_filename) {
1224 char const * routine_name = "yaml_parse_interp_stack_value";
1225
1227 fy_node_is_sequence(interp_stack_node),
1228 "unsupported interpolation stack node type"
1229 "(interpolation stacks are expected to be defined as a sequence)");
1230
1231 // parse couplings
1232 void * iter = NULL;
1233 fy_node_t interp_stack_item;
1234 while ((interp_stack_item =
1235 fy_node_sequence_iterate(interp_stack_node, &iter)))
1237 interp_stack, interp_stack_item, yaml_filename);
1238}
1239
1240static struct field_couple_field_names yaml_parse_field_name(
1241 fy_node_t field_node, const char * yaml_filename) {
1242 char const * routine_name = "yaml_parse_field_name";
1243
1245 fy_node_is_scalar(field_node) ||
1246 fy_node_is_mapping(field_node),
1247 "unsupported field name node type "
1248 "(field name is either scalars or a map)");
1249
1250 struct field_couple_field_names field_name;
1251
1252 // if the node contains one name for both source and target field
1253 if (fy_node_is_scalar(field_node)) {
1254
1255 field_name.src =
1256 ((field_name.tgt =
1257 yaml_parse_string_value(field_node, "field name", yaml_filename)));
1258
1259 // if the node contains different names for the source and target field
1260 } else {
1261 field_name.src =
1262 fy_node_mapping_lookup_scalar0_by_simple_key(
1263 field_node, "src", (size_t)-1);
1264 field_name.tgt =
1265 fy_node_mapping_lookup_scalar0_by_simple_key(
1266 field_node, "tgt", (size_t)-1);
1267
1269 field_name.src && field_name.tgt &&
1270 (fy_node_mapping_item_count(field_node) == 2),
1271 "invalid field name mapping node "
1272 "(field name mapping node has to contain two maps "
1273 "with the keys \"src\" and \"tgt\")")
1274 }
1275
1276 return field_name;
1277}
1278
1280 char const *** values, size_t * num_values,
1281 fy_node_t values_node, char const * sequence_name,
1282 const char * yaml_filename) {
1283 char const * routine_name = "yaml_parse_string_sequence";
1284
1286 (*values == NULL) && (*num_values == 0),
1287 "values have already been set for sequence \"%s\"",
1288 sequence_name);
1289
1290 // if the field node contains multiple fields
1291 if (fy_node_is_sequence(values_node)) {
1292
1293 *num_values = (size_t)fy_node_sequence_item_count(values_node);
1294 *values = xmalloc(*num_values * sizeof(**values));
1295 for (size_t value_idx = 0; value_idx < *num_values; ++value_idx)
1296 (*values)[value_idx] =
1298 fy_node_sequence_get_by_index(values_node, value_idx),
1299 sequence_name, yaml_filename);
1300 } else {
1301 *num_values = 1;
1302 *values = xmalloc(sizeof(**values));
1303 **values =
1305 values_node, sequence_name, yaml_filename);
1306 }
1307}
1308
1310 struct field_couple_field_names ** field_names,
1311 size_t * num_field_names, fy_node_t fields_node,
1312 const char * yaml_filename) {
1313
1314 // if the field node contains multiple fields
1315 if (fy_node_is_sequence(fields_node)) {
1316
1317 size_t start_idx = *num_field_names;
1318 *num_field_names += (size_t)fy_node_sequence_item_count(fields_node);
1319 *field_names =
1320 xrealloc(*field_names, *num_field_names * sizeof(**field_names));
1321 for (size_t i = start_idx; i < *num_field_names; ++i)
1322 (*field_names)[i] =
1324 fy_node_sequence_get_by_index(fields_node, i), yaml_filename);
1325 } else {
1326 ++*num_field_names;
1327 *field_names =
1328 xrealloc(*field_names, *num_field_names * sizeof(**field_names));
1329 (*field_names)[*num_field_names-1] =
1330 yaml_parse_field_name(fields_node, yaml_filename);
1331 }
1332}
1333
1335 char const ** comp_name, char const *** grid_names, size_t * num_grid_names,
1336 fy_node_t values_node, char const * type_name, const char * yaml_filename) {
1337 char const * routine_name = "yaml_parse_comp_grids_names";
1338
1340 *comp_name == NULL, "%s component name already set", type_name);
1342 (*grid_names == NULL) && (*num_grid_names == 0),
1343 "%s grid names already set", type_name);
1344
1346 fy_node_is_mapping(values_node),
1347 "unsupported component/grid names node type (has to be a map)");
1348
1349 // parse component/grid names
1350 void * iter = NULL;
1351 fy_node_pair_t pair;
1352 while((pair = fy_node_mapping_iterate(values_node, &iter))) {
1353
1354 enum yaml_comp_grid_names_key_types comp_grid_names_key_type =
1357 yaml_comp_grid_names_keys, num_yaml_comp_grid_names_keys,
1358 fy_node_pair_key(pair),
1359 "component/grid names parameter name", yaml_filename);
1360 char const * comp_grid_names_key_name =
1362 yaml_comp_grid_names_keys, num_yaml_comp_grid_names_keys,
1363 comp_grid_names_key_type);
1364
1365 fy_node_t name_node = fy_node_pair_value(pair);
1366
1367 switch(comp_grid_names_key_type) {
1368 default:
1369 case(COMP_NAME):
1370 *comp_name =
1372 name_node, comp_grid_names_key_name, yaml_filename);
1373 break;
1374 case(GRID_NAMES):
1376 grid_names, num_grid_names,
1377 name_node, comp_grid_names_key_name, yaml_filename);
1378 break;
1379 }
1380 }
1381}
1382
1384 char const ** weight_file_name,
1385 enum yac_weight_file_on_existing * on_existing,
1386 fy_node_t values_node, char const * type_name, const char * yaml_filename) {
1387 char const * routine_name = "yaml_parse_weight_file";
1388
1390 *weight_file_name == NULL, "%s weight file name already set", type_name);
1392 *on_existing == YAC_WEIGHT_FILE_UNDEFINED,
1393 "%s \"on existing\" already set ", type_name);
1394
1396 fy_node_is_mapping(values_node),
1397 "unsupported weight file data node type (has to be a map)");
1398
1399 // parse component/grid names
1400 void * iter = NULL;
1401 fy_node_pair_t pair;
1402 while((pair = fy_node_mapping_iterate(values_node, &iter))) {
1403
1404 enum yaml_weight_file_data_key_types weight_file_data_key_type =
1407 yaml_weight_file_data_keys, num_yaml_weight_file_data_keys,
1408 fy_node_pair_key(pair),
1409 "weight file data parameter name", yaml_filename);
1410 char const * weight_file_data_key_name =
1412 yaml_weight_file_data_keys, num_yaml_weight_file_data_keys,
1413 weight_file_data_key_type);
1414
1415 fy_node_t weight_file_data_node = fy_node_pair_value(pair);
1416
1417 switch(weight_file_data_key_type) {
1418 default:
1420 *weight_file_name =
1422 weight_file_data_node, weight_file_data_key_name, yaml_filename);
1423 break;
1425 *on_existing =
1428 weight_file_on_existing_types,
1429 num_weight_file_on_existing_types,
1430 weight_file_data_node, weight_file_data_key_name,
1431 yaml_filename);
1432 break;
1433 }
1434 }
1435}
1436
1438 struct field_couple_buffer * field_buffer,
1439 fy_node_pair_t couple_pair, const char * yaml_filename,
1440 enum yac_time_unit_type time_unit) {
1441
1442 enum yaml_couple_key_types couple_key_type =
1445 yaml_couple_keys, num_yaml_couple_keys,
1446 fy_node_pair_key(couple_pair),
1447 "couple configuration parameter name", yaml_filename);
1448 char const * couple_key_name =
1450 yaml_couple_keys, num_yaml_couple_keys, couple_key_type);
1451
1452 fy_node_t value_node = fy_node_pair_value(couple_pair);
1453
1454 switch (couple_key_type) {
1455 default:
1456 case (SOURCE_NAMES):
1458 &(field_buffer->src.comp_name),
1459 &(field_buffer->src.grid.name),
1460 &(field_buffer->src.grid.count),
1461 value_node, couple_key_name, yaml_filename);
1462 break;
1463 case (SOURCE_COMPONENT):
1464 field_buffer->src.comp_name =
1465 yaml_parse_string_value(value_node, couple_key_name, yaml_filename);
1466 break;
1467 case (SOURCE_GRID):
1469 &field_buffer->src.grid.name, &field_buffer->src.grid.count,
1470 value_node, couple_key_name, yaml_filename);
1471 break;
1472 case (TARGET_NAMES):
1474 &(field_buffer->tgt.comp_name),
1475 &(field_buffer->tgt.grid.name),
1476 &(field_buffer->tgt.grid.count),
1477 value_node, couple_key_name, yaml_filename);
1478 break;
1479 case (TARGET_COMPONENT):
1480 field_buffer->tgt.comp_name =
1481 yaml_parse_string_value(value_node, couple_key_name, yaml_filename);
1482 break;
1483 case (TARGET_GRID):
1485 &field_buffer->tgt.grid.name, &field_buffer->tgt.grid.count,
1486 value_node, couple_key_name, yaml_filename);
1487 break;
1488 case (FIELD):
1490 &(field_buffer->field_names),
1491 &(field_buffer->num_field_names),
1492 value_node, yaml_filename);
1493 break;
1494 case (COUPLING_PERIOD):
1495 field_buffer->coupling_period =
1497 value_node, couple_key_name, yaml_filename, time_unit);
1498 break;
1499 case (TIME_REDUCTION):
1500 field_buffer->time_reduction =
1502 value_node, couple_key_name, yaml_filename);
1503 break;
1504 case (SOURCE_LAG):
1505 field_buffer->src.lag =
1507 value_node, couple_key_name, yaml_filename);
1508 break;
1509 case (TARGET_LAG):
1510 field_buffer->tgt.lag =
1512 value_node, couple_key_name, yaml_filename);
1513 break;
1514 case (WEIGHT_FILE_NAME):
1515 field_buffer->weight_file.name =
1517 value_node, couple_key_name, yaml_filename);
1518 break;
1520 field_buffer->weight_file.on_existing =
1523 weight_file_on_existing_types,
1524 num_weight_file_on_existing_types,
1525 value_node, couple_key_name, yaml_filename);
1526 break;
1527 case (WEIGHT_FILE_DATA):
1529 &(field_buffer->weight_file.name),
1530 &(field_buffer->weight_file.on_existing),
1531 value_node, couple_key_name, yaml_filename);
1532 break;
1533 case (MAPPING_SIDE):
1534 field_buffer->mapping_on_source =
1536 mapping_sides, num_mapping_sides,
1537 value_node, couple_key_name, yaml_filename);
1538 break;
1539 case (SCALE_FACTOR):
1540 field_buffer->scale_factor =
1542 value_node, couple_key_name, yaml_filename);
1543 break;
1544 case (SCALE_SUMMAND):
1545 field_buffer->scale_summand =
1547 value_node, couple_key_name, yaml_filename);
1548 break;
1549 case (INTERPOLATION):
1551 field_buffer->interp_stack, value_node, yaml_filename);
1552 break;
1553 case (SOURCE_MASK_NAME):
1554 case (SOURCE_MASK_NAMES):
1556 &(field_buffer->src_mask_names),
1557 &(field_buffer->num_src_mask_names),
1558 value_node, couple_key_name, yaml_filename);
1559 break;
1560 case (TARGET_MASK_NAME):
1561 field_buffer->tgt_mask_name =
1563 value_node, couple_key_name, yaml_filename);
1564 break;
1565 case (YAXT_EXCHANGER_NAME):
1566 field_buffer->yaxt_exchanger_name =
1568 value_node, couple_key_name, yaml_filename);
1569 break;
1570 case (USE_RAW_EXCHANGE):
1571 field_buffer->use_raw_exchange =
1573 bool_names, num_bool_names,
1574 value_node, couple_key_name, yaml_filename);
1575 break;
1576 }
1577}
1578
1580 struct yac_couple_config * couple_config, fy_node_t couple_node,
1581 char const * yaml_filename, enum yac_time_unit_type time_unit) {
1582 char const * routine_name = "yaml_parse_couple";
1583
1585 fy_node_is_mapping(couple_node),
1586 "unsupported couple node type "
1587 "(couples are expected to be defined as a mapping)");
1588
1589 // initialise field configuration buffer with default values
1590 struct field_couple_buffer field_buffer = {
1591 .src.comp_name = NULL,
1592 .src.grid.name = NULL,
1593 .src.grid.count = 0,
1594 .tgt.comp_name = NULL,
1595 .tgt.grid.name = NULL,
1596 .tgt.grid.count = 0,
1597 .field_names = NULL,
1598 .num_field_names = 0,
1599 .coupling_period = NULL,
1600 .time_reduction = TIME_NONE,
1601 .interp_stack = yac_interp_stack_config_new(),
1602 .src.lag = 0,
1603 .tgt.lag = 0,
1604 .weight_file.name = NULL,
1605 .weight_file.on_existing = YAC_WEIGHT_FILE_UNDEFINED,
1606 .mapping_on_source = 1,
1607 .scale_factor = 1.0,
1608 .scale_summand = 0.0,
1609 .src_mask_names = NULL,
1610 .num_src_mask_names = 0,
1611 .tgt_mask_name = NULL,
1612 .yaxt_exchanger_name = NULL,
1613 .use_raw_exchange = 0};
1614
1615 // parse couple
1616 void * iter = NULL;
1617 fy_node_pair_t pair;
1618 while ((pair = fy_node_mapping_iterate(couple_node, &iter)))
1620 &field_buffer, pair, yaml_filename, time_unit);
1621
1623 field_buffer.src.comp_name, "missing source component name");
1625 field_buffer.src.grid.count > 0,
1626 "missing source grid name (component \"%s\")",
1627 field_buffer.src.comp_name);
1628 for (size_t i = 0; i < field_buffer.src.grid.count; ++i)
1630 (field_buffer.src.grid.name[i] != NULL) &&
1631 (field_buffer.src.grid.name[i][0] != '\0'),
1632 "invalid source grid name (component \"%s\" grid idx %zu)",
1633 field_buffer.src.comp_name, i);
1635 field_buffer.tgt.comp_name,
1636 "missing target component name");
1638 field_buffer.tgt.grid.count > 0,
1639 "missing target grid name (component \"%s\")",
1640 field_buffer.tgt.comp_name);
1641 for (size_t i = 0; i < field_buffer.tgt.grid.count; ++i)
1643 (field_buffer.tgt.grid.name[i] != NULL) &&
1644 (field_buffer.tgt.grid.name[i][0] != '\0'),
1645 "invalid target grid name (component \"%s\" grid idx %zu)",
1646 field_buffer.tgt.comp_name, i);
1648 field_buffer.num_field_names > 0,
1649 "missing field names "
1650 "(source component \"%s\" source grid \"%s\" "
1651 "target component \"%s\" target grid \"%s\")",
1652 field_buffer.src.comp_name, field_buffer.src.grid.name[0],
1653 field_buffer.tgt.comp_name, field_buffer.tgt.grid.name[0]);
1655 field_buffer.coupling_period,
1656 "missing coupling period "
1657 "(source component \"%s\" source grid \"%s\" "
1658 "target component \"%s\" target grid \"%s\")",
1659 field_buffer.src.comp_name, field_buffer.src.grid.name[0],
1660 field_buffer.tgt.comp_name, field_buffer.tgt.grid.name[0]);
1661
1662 for (size_t i = 0; i < field_buffer.num_field_names; ++i)
1663 for (size_t j = 0; j < field_buffer.src.grid.count; ++j)
1664 for (size_t k = 0; k < field_buffer.tgt.grid.count; ++k)
1666 couple_config,
1667 field_buffer.src.comp_name,
1668 field_buffer.src.grid.name[j],
1669 field_buffer.field_names[i].src,
1670 field_buffer.tgt.comp_name,
1671 field_buffer.tgt.grid.name[k],
1672 field_buffer.field_names[i].tgt,
1673 field_buffer.coupling_period,
1674 field_buffer.time_reduction,
1675 field_buffer.interp_stack,
1676 field_buffer.src.lag,
1677 field_buffer.tgt.lag,
1678 field_buffer.weight_file.name,
1681 field_buffer.weight_file.on_existing,
1682 field_buffer.mapping_on_source,
1683 field_buffer.scale_factor,
1684 field_buffer.scale_summand,
1685 field_buffer.num_src_mask_names,
1686 field_buffer.src_mask_names,
1687 field_buffer.tgt_mask_name,
1688 field_buffer.yaxt_exchanger_name,
1689 field_buffer.use_raw_exchange);
1690
1691 // cleanup
1692 free((void*)field_buffer.src.grid.name);
1693 free((void*)field_buffer.tgt.grid.name);
1694 free((void*)field_buffer.field_names);
1695 free((void*)field_buffer.coupling_period);
1697 free((void*)field_buffer.src_mask_names);
1698}
1699
1701 struct yac_couple_config * couple_config,
1702 fy_node_t coupling_node, char const * yaml_filename,
1703 enum yac_time_unit_type time_unit) {
1704 char const * routine_name = "yaml_parse_coupling";
1705
1706 // check if the coupling node is empty -> nothing to be read
1707 if (!coupling_node) return;
1708
1710 fy_node_is_sequence(coupling_node),
1711 "unsupported coupling node type "
1712 "(couplings are expected to be defined as a sequence)");
1713
1714 // parse couplings
1715 void * iter = NULL;
1716 fy_node_t couple_node;
1717 while ((couple_node = fy_node_sequence_iterate(coupling_node, &iter)))
1718 yaml_parse_couple(couple_config, couple_node, yaml_filename, time_unit);
1719}
1720
1721static struct debug_config_file yaml_parse_config_file_value(
1722 fy_node_t config_file_node, char const * file_type_name,
1723 const char * yaml_filename) {
1724 char const * routine_name = "yaml_parse_config_file_value";
1725
1727 fy_node_is_scalar(config_file_node) ||
1728 fy_node_is_mapping(config_file_node),
1729 "unsupported config file node type "
1730 "(%s is either scalar or a map)", file_type_name);
1731
1732 struct debug_config_file config_file =
1733 {.name = NULL, .type = YAC_TEXT_FILETYPE_YAML, .include_definitions = 0};
1734
1735 char * str_buffer = xmalloc(strlen(file_type_name) + 32);
1736
1737 // if the node contains only the filename
1738 if (fy_node_is_scalar(config_file_node)) {
1739
1740 config_file.name =
1742 config_file_node,
1743 strcat(strcpy(str_buffer, file_type_name), " name"),
1744 yaml_filename);
1745
1746 // if the node contains the name and the type
1747 } else {
1748
1749 fy_node_t filename_node =
1750 fy_node_mapping_lookup_by_string(
1751 config_file_node, "filename", (size_t)-1);
1752 fy_node_t filetype_node =
1753 fy_node_mapping_lookup_by_string(
1754 config_file_node, "filetype", (size_t)-1);
1755 fy_node_t include_definitions_node =
1756 fy_node_mapping_lookup_by_string(
1757 config_file_node, "include_definitions", (size_t)-1);
1758
1760 filename_node,
1761 "invalid %s mapping node "
1762 "(global config file mapping node has to include a map "
1763 "with the keys \"filename\")", file_type_name)
1764
1765 config_file.name =
1767 filename_node, strcat(strcpy(str_buffer, file_type_name), " name"),
1768 yaml_filename);
1769 config_file.type =
1770 (filetype_node)?
1771 (enum yac_text_filetype)
1773 config_filetypes, num_config_filetypes,
1774 filetype_node, strcat(strcpy(str_buffer, file_type_name), " type"),
1775 yaml_filename):YAC_TEXT_FILETYPE_YAML;
1776 config_file.include_definitions =
1777 (include_definitions_node)?
1779 bool_names, num_bool_names,
1780 include_definitions_node,
1781 strcat(strcpy(str_buffer, file_type_name), " include definitions"),
1782 yaml_filename):0;
1783 }
1784
1786 config_file.name, "missing filename for %s", file_type_name);
1787
1788 free(str_buffer);
1789
1790 return config_file;
1791}
1792
1794 struct debug_config_file_buffer * config_file_buffer,
1795 fy_node_pair_t config_file_pair, char const * config_file_type_name,
1796 const char * yaml_filename) {
1797
1799 debug_sync_loc_key_type =
1802 yaml_debug_sync_loc_keys,
1803 num_yaml_debug_sync_loc_keys,
1804 fy_node_pair_key(config_file_pair),
1805 "config synchronisation location parameter name",
1806 yaml_filename);
1807 char const * debug_sync_loc_key_name =
1809 yaml_debug_sync_loc_keys, num_yaml_debug_sync_loc_keys,
1810 debug_sync_loc_key_type);
1811
1812 fy_node_t value_node = fy_node_pair_value(config_file_pair);
1813
1814 char config_file_type_name_sync[
1815 strlen(config_file_type_name) + strlen(debug_sync_loc_key_name) + 8];
1816 sprintf(
1817 config_file_type_name_sync, "%s (%s)",
1818 config_file_type_name, debug_sync_loc_key_name);
1819
1820 config_file_buffer->config_file[debug_sync_loc_key_type] =
1822 value_node, config_file_type_name_sync, yaml_filename);
1823}
1824
1826 fy_node_t config_file_node, char const * config_file_type_name,
1827 char const * yaml_filename) {
1828 char const * routine_name = "yaml_parse_debug_config_file_buffer";
1829
1831 fy_node_is_mapping(config_file_node),
1832 "unsupported %s node type "
1833 "(%s is expected to be defined as a mapping)",
1834 config_file_type_name, config_file_type_name);
1835
1836 struct debug_config_file_buffer config_file_buffer;
1837 config_file_buffer.sync_loc_ref[SYNC_LOC_DEF_COMP] =
1839 config_file_buffer.sync_loc_ref[SYNC_LOC_SYNC_DEF] =
1841 config_file_buffer.sync_loc_ref[SYNC_LOC_ENDDEF] =
1843 for (int i = 0; i < SYNC_LOC_COUNT; ++i) {
1844 config_file_buffer.config_file[i].name = NULL;
1845 config_file_buffer.config_file[i].type = YAC_TEXT_FILETYPE_YAML;
1846 config_file_buffer.config_file[i].include_definitions = 0;
1848 config_file_buffer.sync_loc_ref[i] != NULL,
1849 "invalid unsupported synchronisation location (%d) for %s",
1850 i, config_file_type_name);
1851 }
1852
1853 // parse couplings
1854 void * iter = NULL;
1855 fy_node_pair_t pair;
1856 while ((pair = fy_node_mapping_iterate(config_file_node, &iter)))
1858 &config_file_buffer, pair, config_file_type_name, yaml_filename);
1859
1860 return config_file_buffer;
1861}
1862
1864 struct yac_couple_config * couple_config, fy_node_t global_config_node,
1865 char const * yaml_filename) {
1866 char const * routine_name = "yaml_parse_debug_global_config";
1867
1868 char const * config_file_type_name = "debug global config file";
1869
1871 fy_node_is_mapping(global_config_node),
1872 "unsupported %s node type "
1873 "(%s is expected to be defined as a mapping)",
1874 config_file_type_name, config_file_type_name);
1875
1876 struct debug_config_file_buffer global_config_buffer =
1878 global_config_node, config_file_type_name, yaml_filename);
1879
1880
1881 for (int i = 0; i < SYNC_LOC_COUNT; ++i)
1882 if (global_config_buffer.config_file[i].name != NULL)
1884 couple_config, global_config_buffer.config_file[i].name,
1885 global_config_buffer.config_file[i].type,
1886 global_config_buffer.sync_loc_ref[i],
1887 global_config_buffer.config_file[i].include_definitions);
1888}
1889
1891 char const ** grid_name, char const ** file_name,
1892 fy_node_pair_t output_grid_pair, char const * yaml_filename) {
1893
1894 enum yaml_debug_output_grid_key_types output_grid_key_type =
1897 yaml_debug_output_grid_keys, num_yaml_debug_output_grid_keys,
1898 fy_node_pair_key(output_grid_pair),
1899 "output grid parameter name", yaml_filename);
1900 char const * debug_output_key_name =
1902 yaml_debug_output_grid_keys, num_yaml_debug_output_grid_keys,
1903 output_grid_key_type);
1904
1905 fy_node_t value_node = fy_node_pair_value(output_grid_pair);
1906
1907 switch(output_grid_key_type) {
1908 default:
1909 case(OUTPUT_GRID_GRID_NAME): {
1910 *grid_name =
1911 yaml_parse_string_value(value_node, debug_output_key_name, yaml_filename);
1912 break;
1913 }
1914 case(OUTPUT_GRID_FILE_NAME): {
1915 *file_name =
1916 yaml_parse_string_value(value_node, debug_output_key_name, yaml_filename);
1917 break;
1918 }
1919 };
1920}
1921
1923 struct yac_couple_config * couple_config, fy_node_t output_grid_node,
1924 char const * yaml_filename) {
1925 char const * routine_name = "yaml_parse_output_grid";
1926
1928 fy_node_is_mapping(output_grid_node),
1929 "unsupported output grid node type "
1930 "(output grids are expected to be defined as a mapping)");
1931
1932 char const * grid_name = NULL;
1933 char const * file_name = NULL;
1934
1935 // parse output grid
1936 void * iter = NULL;
1937 fy_node_pair_t pair;
1938 while ((pair = fy_node_mapping_iterate(output_grid_node, &iter)))
1939 yaml_parse_output_grid_pair(&grid_name, &file_name, pair, yaml_filename);
1940
1941 YAML_ASSERT(grid_name, "missing grid name");
1942 YAML_ASSERT_F(file_name, "missing file name for grid \"%s\"", grid_name);
1943
1944 yac_couple_config_add_grid(couple_config, grid_name);
1946 couple_config, grid_name, file_name);
1947}
1948
1950 struct yac_couple_config * couple_config, fy_node_t output_grids_node,
1951 char const * yaml_filename) {
1952 char const * routine_name = "yaml_parse_debug_output_grids";
1953
1955 fy_node_is_sequence(output_grids_node),
1956 "unsupported debug output grids node type "
1957 "(debug output grids is expected to be defined as a sequence)");
1958
1959 // parse output grids
1960 void * iter = NULL;
1961 fy_node_t output_grid_node;
1962 while ((output_grid_node =
1963 fy_node_sequence_iterate(output_grids_node, &iter)))
1965 couple_config, output_grid_node, yaml_filename);
1966}
1967
1969 struct yac_couple_config * couple_config, fy_node_pair_t debug_pair,
1970 const char * yaml_filename) {
1971
1972 enum yaml_debug_key_types debug_key_type =
1975 yaml_debug_keys, num_yaml_debug_keys,
1976 fy_node_pair_key(debug_pair),
1977 "debug configuration parameter name", yaml_filename);
1978
1979 fy_node_t value_node = fy_node_pair_value(debug_pair);
1980
1981 switch (debug_key_type) {
1982 default:
1983 case(GLOBAL_CONFIG):
1985 couple_config, value_node, yaml_filename);
1986 break;
1987 case(OUTPUT_GRIDS):
1989 couple_config, value_node, yaml_filename);
1990 break;
1991 case(MISSING_DEF):
1993 couple_config,
1995 bool_names, num_bool_names, value_node,
1996 "\"missing definition is fatal\" bool value", yaml_filename));
1997 break;
1998 };
1999}
2000
2002 struct yac_couple_config * couple_config,
2003 fy_node_t debug_node, char const * yaml_filename) {
2004 char const * routine_name = "yaml_parse_debug";
2005
2006 // check if the debug node is empty -> nothing to be read
2007 if (!debug_node) return;
2008
2010 fy_node_is_mapping(debug_node),
2011 "unsupported debug node type "
2012 "(debug is expected to be defined as a mapping)");
2013
2014 // parse couplings
2015 void * iter = NULL;
2016 fy_node_pair_t pair;
2017 while ((pair = fy_node_mapping_iterate(debug_node, &iter)))
2018 yaml_parse_debug_map_pair(couple_config, pair, yaml_filename);
2019}
2020
2022 struct yac_couple_config * couple_config, fy_node_pair_t base_pair,
2023 const char * yaml_filename, enum yac_time_unit_type * time_unit,
2024 char const ** start_datetime, char const ** end_datetime) {
2025 char const * routine_name = "yaml_parse_base_map_pair";
2026
2027 fy_node_t key_node = fy_node_pair_key(base_pair);
2028
2030 fy_node_is_scalar(key_node),
2031 "unsupported key node type "
2032 "(key nodes are expected to be scalar nodes)");
2033
2034 char const * base_key_name = fy_node_get_scalar0(key_node);
2035 int base_key_type =
2037 yaml_base_keys, num_yaml_base_keys, base_key_name);
2038
2040 (base_key_type == INT_MAX) || // for unknown keys, which are skipped
2041 (base_key_type == START_DATE) ||
2042 (base_key_type == END_DATE) ||
2043 (base_key_type == CALENDAR) ||
2044 (base_key_type == TIMESTEP_UNIT) ||
2045 (base_key_type == COUPLING) ||
2046 (base_key_type == DEBUG),
2047 "unsupported base key name \"%s\"",
2048 base_key_name);
2049
2050 fy_node_t value_node = fy_node_pair_value(base_pair);
2051
2052 switch (base_key_type) {
2053 case (START_DATE):
2054 *start_datetime =
2056 value_node, base_key_name, yaml_filename);
2057 break;
2058 case (END_DATE):
2059 *end_datetime =
2061 value_node, base_key_name, yaml_filename);
2062 break;
2063 case (CALENDAR):
2066 value_node, base_key_name, yaml_filename));
2067 break;
2068 case (TIMESTEP_UNIT): {
2069 enum yac_time_unit_type time_unit_ =
2071 value_node, base_key_name, yaml_filename);
2073 (*time_unit == TIME_UNIT_UNDEFINED) || (*time_unit == time_unit_),
2074 "inconsistent redefinition of time unit")
2075 *time_unit = time_unit_;
2076 break;
2077 }
2078 case (COUPLING):
2080 (*time_unit != TIME_UNIT_UNDEFINED),
2081 "time unit has to be defined before the couplings")
2083 couple_config, value_node, yaml_filename, *time_unit);
2084 break;
2085 case (DEBUG):
2087 couple_config, value_node, yaml_filename);
2088 default:
2089 // nothing to be done
2090 break;
2091 }
2092}
2093
2095 struct yac_couple_config * couple_config, fy_document_t document,
2096 const char * yaml_filename) {
2097 char const * routine_name = "yaml_parse_document";
2098
2099 // get root node of document
2100 fy_node_t root_node = fy_document_root(document);
2101
2102 // if the configuration file is empty
2103 if (!root_node) return;
2104
2106 fy_node_is_mapping(root_node),
2107 "unsupported root node type (root node is expected to be a mapping node)");
2108
2109 char const * start_datetime = NULL;
2110 char const * end_datetime = NULL;
2111
2112 // parse base root mappings
2113 enum yac_time_unit_type time_unit = TIME_UNIT_UNDEFINED;
2114 void * iter = NULL;
2115 fy_node_pair_t pair;
2116 while ((pair = fy_node_mapping_iterate(root_node, &iter)))
2118 couple_config, pair, yaml_filename, &time_unit,
2119 &start_datetime, &end_datetime);
2120
2121 if ((start_datetime != NULL) || (end_datetime != NULL)) {
2122
2123 YAC_ASSERT(
2125 "ERROR(yaml_parse_document): "
2126 "cannot set start/end datetime because calendar has not yet been set");
2127
2129 couple_config, start_datetime, end_datetime);
2130 }
2131}
2132
2134 struct yac_couple_config * couple_config, const char * yaml_filename,
2135 int parse_flags) {
2136 char const * routine_name = "yac_yaml_read_coupling";
2137
2138 // check whether the yaml configuration file exists
2140 yac_file_exists(yaml_filename),
2141 "ERROR(%s): YAML configuration file could not be found \"%s\"",
2142 routine_name, yaml_filename);
2143
2144 // open yaml configuration file
2145 FILE * config_file = xfopen(yaml_filename, "r");
2148 "ERROR(%s): could not open YAML configuration file \"%s\"",
2149 routine_name, yaml_filename);
2150
2151 // parse yaml configuration file into document
2152 struct fy_parse_cfg parse_config =
2153 {.search_path = ".",
2154 .userdata = NULL,
2155 .diag = NULL};
2156 parse_config.flags =
2157 (enum fy_parse_cfg_flags)parse_flags;
2158
2159 fy_document_t document =
2160 fy_document_build_from_fp(&parse_config, config_file);
2162 document,
2163 "ERROR(%s): could not parse YAML configuration file \"%s\"",
2164 routine_name, yaml_filename);
2165
2166 // resolve anchors and merge keys
2168 !fy_document_resolve(document),
2169 "could not resolve anchors and merge keys");
2170
2171 // parse document into couple configuration
2172 yaml_parse_document(couple_config, document, yaml_filename);
2173
2174 // cleanup
2175 fy_document_destroy(document);
2176 xfclose(config_file);
2177
2178 return;
2179}
2180
2183 char const * str_interp_stack_config, int parse_flags) {
2184 char const * routine_name =
2185 "yac_yaml_parse_interp_stack_config_string";
2186 char const * yaml_filename =
2187 "user provided interp stack config string";
2188
2190 str_interp_stack_config != NULL, "interpolation stack string is NULL");
2191
2192 // parse string into document
2193 struct fy_parse_cfg parse_config =
2194 {.search_path = ".",
2195 .userdata = NULL,
2196 .diag = NULL};
2197 parse_config.flags =
2198 (enum fy_parse_cfg_flags)parse_flags;
2199
2200 fy_document_t document =
2201 fy_document_build_from_string(
2202 &parse_config, str_interp_stack_config, (size_t)-1);
2203 YAML_ASSERT(document, "failed parsing");
2204
2205 // resolve anchors and merge keys
2207 !fy_document_resolve(document),
2208 "could not resolve anchors and merge keys");
2209
2210 fy_node_t interp_stack_config_node = fy_document_root(document);
2211 YAML_ASSERT(interp_stack_config_node, "invalid root node");
2212
2213 struct yac_interp_stack_config * interp_stack_config =
2215
2217 interp_stack_config, interp_stack_config_node,
2218 yaml_filename);
2219
2220 // cleanup
2221 fy_document_destroy(document);
2222
2223 return interp_stack_config;
2224}
2225
2227 fy_document_t document, char const * value) {
2228
2229 // return NULL if value is empty
2230 if (!value) return (fy_node_t)NULL;
2231
2232 fy_node_t scalar_node =
2233 fy_node_create_scalar_copy(document, value, strlen(value));
2234 YAC_ASSERT(
2235 scalar_node,
2236 "ERROR(yac_yaml_create_scalar): failed to create scalar node");
2237
2238 return scalar_node;
2239}
2240
2242 fy_document_t document, int value) {
2243
2244 char str_value[16];
2245 int value_size = snprintf(str_value, sizeof(str_value), "%d", value);
2247 (value_size >= 0) && ((size_t)value_size < sizeof(str_value)),
2248 "ERROR(yac_yaml_create_scalar_int): "
2249 "could not write \"%d\" to string buffer of size %zu",
2250 value, sizeof(str_value));
2251
2252 return yac_yaml_create_scalar(document, str_value);
2253}
2254
2256 fy_document_t document, double value) {
2257
2258 char str_value[32];
2259 int value_size = snprintf(str_value, sizeof(str_value), "%g", value);
2261 (value_size >= 0) && ((size_t)value_size < sizeof(str_value)),
2262 "ERROR(yac_yaml_create_scalar_dble): "
2263 "could not write \"%g\" to string buffer of size %zu",
2264 value, sizeof(str_value));
2265
2266 return yac_yaml_create_scalar(document, str_value);
2267}
2268
2270 fy_document_t document, char const * const * values, size_t num_values) {
2271
2272 // return NULL if sequence is empty
2273 if (num_values == 0) return (fy_node_t)NULL;
2274
2275 YAC_ASSERT(
2276 values, "ERROR(yac_yaml_create_sequence_scalar): no values provided");
2277
2278 // create sequence node
2279 fy_node_t sequence_node = fy_node_create_sequence(document);
2280 YAC_ASSERT(
2281 sequence_node, "ERROR(yac_yaml_create_sequence_scalar): "
2282 "failed to create sequence node");
2283
2284 for (size_t value_idx = 0; value_idx < num_values; ++value_idx) {
2285 char const * value = values[value_idx];
2287 value, "ERROR(yac_yaml_create_sequence_scalar): "
2288 "invalid value at idx %zu", value_idx);
2289 int appending_failed =
2290 fy_node_sequence_append(
2291 sequence_node, yac_yaml_create_scalar(document, value));
2292 YAC_ASSERT(
2293 !appending_failed, "ERROR(yac_yaml_create_sequence_scalar): "
2294 "failed to append interpolation node");
2295 }
2296
2297 return sequence_node;
2298}
2299
2301 fy_node_t map, char const * key, fy_node_t value) {
2302
2303 // if the value node is empty, return
2304 if (!value) return;
2305
2306 YAC_ASSERT(
2307 key, "ERROR(yac_yaml_map_append): NULL key is not supported");
2308
2309 fy_document_t document = fy_node_document(map);
2310 YAC_ASSERT(
2311 document,
2312 "ERROR(yac_yaml_map_append): failed to get document from node");
2313
2314 // set key and value for root node
2315 int appending_failed =
2316 fy_node_mapping_append(
2317 map, yac_yaml_create_scalar(document, key), value);
2318 YAC_ASSERT(
2319 !appending_failed,
2320 "ERROR(yac_yaml_map_append): failed to append mapping node pair");
2321}
2322
2324 fy_node_t map, char const * key, char const * value) {
2325
2326 fy_document_t document = fy_node_document(map);
2327 YAC_ASSERT(
2328 document, "ERROR(yac_yaml_map_append_scalar): "
2329 "failed to get document from node");
2330
2332}
2333
2335 fy_node_t map, char const * key, int value) {
2336
2337 fy_document_t document = fy_node_document(map);
2338 YAC_ASSERT(
2339 document, "ERROR(yac_yaml_map_append_scalar_int): "
2340 "failed to get document from node");
2341
2343 map, key, yac_yaml_create_scalar_int(document, value));
2344}
2345
2347 fy_node_t map, char const * key, double value) {
2348
2349 fy_document_t document = fy_node_document(map);
2350 YAC_ASSERT(
2351 document, "ERROR(yac_yaml_map_append_scalar_dble): "
2352 "failed to get document from node");
2353
2355 map, key, yac_yaml_create_scalar_dble(document, value));
2356}
2357
2359 fy_document_t document, struct yac_couple_config * couple_config,
2360 size_t couple_idx, size_t field_couple_idx) {
2361
2362 const char * src_field_name;
2363 const char * tgt_field_name;
2365 couple_config, couple_idx, field_couple_idx,
2366 &src_field_name, &tgt_field_name);
2367
2368 // if both names are identical
2369 if (!strcmp(src_field_name, tgt_field_name))
2370 return yac_yaml_create_scalar(document, src_field_name);
2371
2372 // create field name node
2373 fy_node_t field_name_node = fy_node_create_mapping(document);
2374 YAC_ASSERT(
2375 field_name_node, "ERROR(yac_yaml_create_field_name_node): "
2376 "failed to create mapping node");
2377
2378 // add source field name
2379 yac_yaml_map_append_scalar(field_name_node, "src", src_field_name);
2380
2381 // add target field name
2382 yac_yaml_map_append_scalar(field_name_node, "tgt", tgt_field_name);
2383
2384 return field_name_node;
2385}
2386
2388 fy_node_t map,
2389 struct interp_method_parameter const * parameter,
2391
2392 YAC_ASSERT(
2393 (parameter->type == ENUM_PARAM) ||
2394 (parameter->type == INT_PARAM) ||
2395 (parameter->type == DBLE_PARAM) ||
2396 (parameter->type == BOOL_PARAM) ||
2397 (parameter->type == STR_PARAM) ||
2398 (parameter->type == DEG_PARAM),
2399 "ERROR(yac_yaml_map_append_parameter): unsupported parameter type");
2400
2401 char const * key = parameter->name;
2402
2403 switch (parameter->type) {
2404 default:
2405 case (ENUM_PARAM): {
2407 map, key,
2409 parameter->data.enum_param.valid_values,
2410 parameter->data.enum_param.num_valid_values,
2411 value.enum_value));
2412 break;
2413 }
2414 case (INT_PARAM): {
2415 yac_yaml_map_append_scalar_int(map, key, value.int_value);
2416 break;
2417 }
2418 case (DEG_PARAM):
2419 case (DBLE_PARAM): {
2420 yac_yaml_map_append_scalar_dble(map, key, value.dble_value);
2421 break;
2422 }
2423 case (BOOL_PARAM): {
2425 map, key,
2427 bool_names, num_bool_names, value.bool_value));
2428 break;
2429 }
2430 case (STR_PARAM): {
2431 yac_yaml_map_append_scalar(map, key, value.str_value);
2432 break;
2433 }
2434 };
2435}
2436
2441
2442 YAC_ASSERT(
2443 (type == ENUM_PARAM) ||
2444 (type == INT_PARAM) ||
2445 (type == DBLE_PARAM) ||
2446 (type == BOOL_PARAM) ||
2447 (type == STR_PARAM) ||
2448 (type == DEG_PARAM),
2449 "ERROR(compare_parameter_values): "
2450 "invalid interpolation method parameter value type");
2451
2452 switch (type) {
2453 default:
2454 case (ENUM_PARAM):
2455 return
2456 (a->enum_value > b->enum_value) - (a->enum_value < b->enum_value);
2457 case (INT_PARAM):
2458 return
2459 (a->int_value > b->int_value) - (a->int_value < b->int_value);
2460 case (DEG_PARAM):
2461 case (DBLE_PARAM):
2462 return
2463 (a->dble_value > b->dble_value) - (a->dble_value < b->dble_value);
2464 case (BOOL_PARAM):
2465 return
2466 (a->bool_value > b->bool_value) - (a->bool_value < b->bool_value);
2467 case (STR_PARAM):
2468 if ((a->str_value != NULL) && (b->str_value != NULL))
2469 return strcmp(a->str_value, b->str_value);
2470 else
2471 return (a->str_value != NULL) - (b->str_value != NULL);
2472 }
2473}
2474
2476 fy_document_t document,
2477 union yac_interp_stack_config_entry const * interp_stack_entry) {
2478
2479 enum yac_interpolation_list interp_type =
2480 yac_interp_stack_config_entry_get_type(interp_stack_entry);
2481
2482 struct yac_interpolation_method const * interp_method = NULL;
2483 for (size_t i = 0;
2485 if (interpolation_methods[i].type == interp_type)
2487
2488 struct interp_method_parameter const * parameters =
2489 interp_method->parameters;
2490 size_t num_parameters = interp_method->num_parameters;
2491
2493 parameter_values[MAX(num_parameters,1)];
2494 for (size_t param_idx = 0; param_idx < num_parameters; ++param_idx)
2495 parameter_values[param_idx] = parameters[param_idx].default_value;
2496
2497 interp_method->get_interpolation(interp_stack_entry, parameter_values);
2498
2499 // create parameter node
2500 fy_node_t parameter_node = fy_node_create_mapping(document);
2501 YAC_ASSERT(
2502 parameter_node, "ERROR(yac_yaml_create_interpolation_node): "
2503 "failed to create mapping node");
2504
2505 size_t num_non_default_parameters = 0;
2506 for (size_t param_idx = 0; param_idx < num_parameters; ++param_idx) {
2508 &parameters[param_idx].default_value,
2509 parameter_values + param_idx, parameters[param_idx].type)) {
2510 ++num_non_default_parameters;
2512 parameter_node, parameters + param_idx,
2513 parameter_values[param_idx]);
2514 }
2515 }
2516
2517 fy_node_t interpolation_node;
2518 if (num_non_default_parameters) {
2519
2520 // create interpolation node
2521 interpolation_node = fy_node_create_mapping(document);
2522 YAC_ASSERT(
2523 interpolation_node, "ERROR(yac_yaml_create_interpolation_node): "
2524 "failed to create mapping node");
2525
2527 interpolation_node, interp_method->name, parameter_node);
2528 } else {
2529
2530 // free parameter node
2531 fy_node_free(parameter_node);
2532
2533 interpolation_node =
2534 yac_yaml_create_scalar(document, interp_method->name);
2535 }
2536
2537 return interpolation_node;
2538}
2539
2541 fy_document_t document, struct yac_couple_config * couple_config,
2542 size_t couple_idx, size_t field_couple_idx) {
2543
2544 struct yac_interp_stack_config * interp_stack =
2546 couple_config, couple_idx, field_couple_idx);
2547
2548 YAC_ASSERT(
2549 interp_stack, "ERROR(yac_yaml_create_interpolation_stack_node): "
2550 "invalid interpolation stack");
2551
2552 // create interpolation stack node
2553 fy_node_t interp_stack_node = fy_node_create_sequence(document);
2554 YAC_ASSERT(
2555 interp_stack_node, "ERROR(yac_yaml_create_interpolation_stack_node): "
2556 "failed to create sequence node");
2557
2558 size_t interp_stack_size =
2560 YAC_ASSERT(
2561 interp_stack_size, "ERROR(yac_yaml_create_interpolation_stack_node): "
2562 "invalid interpolation stack size");
2563
2564 for (size_t interp_stack_idx = 0; interp_stack_idx < interp_stack_size;
2565 ++interp_stack_idx) {
2566 int appending_failed =
2567 fy_node_sequence_append(
2568 interp_stack_node,
2570 document,
2572 interp_stack, interp_stack_idx)));
2573 YAC_ASSERT(
2574 !appending_failed,
2575 "ERROR(yac_yaml_create_interpolation_stack_node): "
2576 "failed to append interpolation node");
2577 }
2578
2579 return interp_stack_node;
2580}
2581
2583 fy_node_t coupling_node, struct yac_couple_config * couple_config,
2584 size_t couple_idx, size_t field_couple_idx) {
2585
2586 fy_document_t document = fy_node_document(coupling_node);
2587 YAC_ASSERT(
2588 document, "ERROR(yac_yaml_append_couple_field_nodes): "
2589 "failed to get document from node");
2590
2591 // create couple node
2592 fy_node_t field_couple_node = fy_node_create_mapping(document);
2593 YAC_ASSERT(
2594 coupling_node, "ERROR(yac_yaml_append_couple_field_nodes): "
2595 "failed to create mapping node");
2596
2597 // get component names
2598 char const * src_component_name;
2599 char const * tgt_component_name;
2601 couple_config, couple_idx, field_couple_idx,
2602 &src_component_name, &tgt_component_name);
2603
2604 // add source component name
2606 field_couple_node,
2608 yaml_couple_keys, num_yaml_couple_keys, SOURCE_COMPONENT),
2609 src_component_name);
2610
2611 // add target component name
2613 field_couple_node,
2615 yaml_couple_keys, num_yaml_couple_keys, TARGET_COMPONENT),
2616 tgt_component_name);
2617
2618 // get grid names
2619 char const * src_grid_name;
2620 char const * tgt_grid_name;
2622 couple_config, couple_idx, field_couple_idx,
2623 &src_grid_name, &tgt_grid_name);
2624
2625 // add source grid name
2627 field_couple_node,
2629 yaml_couple_keys, num_yaml_couple_keys, SOURCE_GRID),
2630 src_grid_name);
2631
2632 // add target grid name
2634 field_couple_node,
2636 yaml_couple_keys, num_yaml_couple_keys, TARGET_GRID),
2637 tgt_grid_name);
2638
2639 // add field names
2641 field_couple_node,
2643 yaml_couple_keys, num_yaml_couple_keys, FIELD),
2645 document, couple_config, couple_idx, field_couple_idx));
2646
2647 // add coupling period
2649 field_couple_node,
2651 yaml_couple_keys, num_yaml_couple_keys, COUPLING_PERIOD),
2653 couple_config, couple_idx, field_couple_idx));
2654
2655 // add time reduction
2657 field_couple_node,
2659 yaml_couple_keys, num_yaml_couple_keys, TIME_REDUCTION),
2661 time_operations, num_time_operations,
2663 couple_config, couple_idx, field_couple_idx)));
2664
2665 // add source lag
2667 field_couple_node,
2669 yaml_couple_keys, num_yaml_couple_keys, SOURCE_LAG),
2671 couple_config, couple_idx, field_couple_idx));
2672
2673 // add target lag
2675 field_couple_node,
2677 yaml_couple_keys, num_yaml_couple_keys, TARGET_LAG),
2679 couple_config, couple_idx, field_couple_idx));
2680
2681 // add weight file name
2683 couple_config, couple_idx, field_couple_idx)) {
2685 field_couple_node,
2687 yaml_couple_keys, num_yaml_couple_keys, WEIGHT_FILE_NAME),
2689 couple_config, couple_idx, field_couple_idx));
2691 field_couple_node,
2693 yaml_couple_keys, num_yaml_couple_keys, WEIGHT_FILE_ON_EXISTING),
2695 weight_file_on_existing_types, num_weight_file_on_existing_types,
2697 couple_config, couple_idx, field_couple_idx)));
2698 }
2699
2700 // add mapping side
2702 field_couple_node,
2704 yaml_couple_keys, num_yaml_couple_keys, MAPPING_SIDE),
2706 mapping_sides, num_mapping_sides,
2708 couple_config, couple_idx, field_couple_idx)));
2709
2710 // add scale factor
2712 field_couple_node,
2714 yaml_couple_keys, num_yaml_couple_keys, SCALE_FACTOR),
2716 couple_config, couple_idx, field_couple_idx));
2717
2718 // add scale summand
2720 field_couple_node,
2722 yaml_couple_keys, num_yaml_couple_keys, SCALE_SUMMAND),
2724 couple_config, couple_idx, field_couple_idx));
2725
2726 // add interpolation
2728 field_couple_node,
2730 yaml_couple_keys, num_yaml_couple_keys, INTERPOLATION),
2732 document, couple_config, couple_idx, field_couple_idx));
2733
2734 // add source mask names
2735 char const * const * src_mask_names;
2736 size_t num_src_mask_names;
2738 couple_config, couple_idx, field_couple_idx,
2739 &src_mask_names, &num_src_mask_names);
2740 if (num_src_mask_names == 1)
2742 field_couple_node,
2744 yaml_couple_keys, num_yaml_couple_keys, SOURCE_MASK_NAME),
2745 src_mask_names[0]);
2746 else if (num_src_mask_names > 1)
2748 field_couple_node,
2750 yaml_couple_keys, num_yaml_couple_keys, SOURCE_MASK_NAMES),
2752 document, src_mask_names, num_src_mask_names));
2753
2754 // add target mask name
2755 char const * tgt_mask_name =
2757 couple_config, couple_idx, field_couple_idx);
2758 if (tgt_mask_name)
2760 field_couple_node,
2762 yaml_couple_keys, num_yaml_couple_keys, TARGET_MASK_NAME),
2763 tgt_mask_name);
2764
2765 // add yaxt exchanger name
2766 char const * yaxt_exchanger_name =
2768 couple_config, couple_idx, field_couple_idx);
2769 if (yaxt_exchanger_name)
2771 field_couple_node,
2773 yaml_couple_keys, num_yaml_couple_keys, YAXT_EXCHANGER_NAME),
2774 yaxt_exchanger_name);
2775
2776 // add use raw exchange
2778 field_couple_node,
2780 yaml_couple_keys, num_yaml_couple_keys, USE_RAW_EXCHANGE),
2782 bool_names, num_bool_names,
2784 couple_config, couple_idx, field_couple_idx)));
2785
2786 int appending_failed =
2787 fy_node_sequence_append(coupling_node, field_couple_node);
2788 YAC_ASSERT(
2789 !appending_failed,
2790 "ERROR(yac_yaml_append_couple_field_nodes): "
2791 "failed to append field couple node");
2792}
2793
2795 fy_node_t coupling_node, struct yac_couple_config * couple_config,
2796 size_t couple_idx) {
2797
2798 size_t num_couple_fields =
2799 yac_couple_config_get_num_couple_fields(couple_config, couple_idx);
2800
2801 for (size_t field_couple_idx = 0;
2802 field_couple_idx < num_couple_fields; ++field_couple_idx)
2804 coupling_node, couple_config, couple_idx, field_couple_idx);
2805}
2806
2808 fy_document_t document, char const * grid_name, char const * file_name) {
2809
2810 fy_node_t output_grid_node = fy_node_create_mapping(document);
2811 YAC_ASSERT(
2812 output_grid_node, "ERROR(yac_yaml_create_output_grid_node): "
2813 "failed to create mapping node");
2814
2816 output_grid_node,
2818 yaml_debug_output_grid_keys, num_yaml_debug_output_grid_keys,
2820 grid_name);
2822 output_grid_node,
2824 yaml_debug_output_grid_keys, num_yaml_debug_output_grid_keys,
2826 file_name);
2827
2828 return output_grid_node;
2829}
2830
2832 fy_document_t document, struct yac_couple_config * couple_config) {
2833
2834 // count the number of output grids
2835 size_t num_output_grids = 0;
2836 size_t num_grids =
2837 yac_couple_config_get_num_grids(couple_config);
2838 for (size_t grid_idx = 0; grid_idx < num_grids; ++grid_idx)
2840 couple_config,
2841 yac_couple_config_get_grid_name(couple_config, grid_idx)) != NULL)
2842 ++num_output_grids;
2843
2844 fy_node_t output_grids_node = NULL;
2845
2846 if (num_output_grids > 0) {
2847
2848 // create output grids node
2849 output_grids_node = fy_node_create_sequence(document);
2850 YAC_ASSERT(
2851 output_grids_node, "ERROR(yac_yaml_create_output_grids_node): "
2852 "failed to create sequence node");
2853
2854 // for all output grids
2855 for (size_t grid_idx = 0; grid_idx < num_grids; ++grid_idx) {
2856
2857 char const * grid_name =
2858 yac_couple_config_get_grid_name(couple_config, grid_idx);
2859 char const * file_name =
2860 yac_couple_config_grid_get_output_filename(couple_config, grid_name);
2861
2862 if (file_name != NULL) {
2863 int appending_failed =
2864 fy_node_sequence_append(
2865 output_grids_node,
2866 yac_yaml_create_output_grid_node(document, grid_name, file_name));
2867 YAC_ASSERT(
2868 !appending_failed, "ERROR(yac_yaml_create_output_grids_node): "
2869 "failed to append output grid node");
2870 }
2871 }
2872 }
2873
2874 return output_grids_node;
2875}
2876
2878 fy_document_t document, struct yac_couple_config * couple_config) {
2879
2880 // create debug node
2881 fy_node_t debug_node = fy_node_create_mapping(document);
2882 YAC_ASSERT(
2883 debug_node, "ERROR(yac_yaml_create_debug_node): "
2884 "failed to create mapping node");
2885
2886 // add output grids node
2888 debug_node,
2890 yaml_debug_keys, num_yaml_debug_keys, OUTPUT_GRIDS),
2891 yac_yaml_create_output_grids_node(document, couple_config));
2892
2893 // add "missing_definition_is_fatal" node
2895 debug_node,
2897 yaml_debug_keys, num_yaml_debug_keys, MISSING_DEF),
2899 bool_names, num_bool_names,
2901
2902 return debug_node;
2903}
2904
2906 fy_document_t document, struct yac_couple_config * couple_config) {
2907
2908 size_t num_couples =
2909 yac_couple_config_get_num_couples(couple_config);
2910
2911 if (!num_couples) return NULL;
2912
2913 // create coupling node
2914 fy_node_t coupling_node = fy_node_create_sequence(document);
2915 YAC_ASSERT(
2916 coupling_node, "ERROR(yac_yaml_create_coupling_node): "
2917 "failed to create sequence node");
2918
2919 // for all couples
2920 for (size_t couple_idx = 0; couple_idx < num_couples; ++couple_idx)
2922 coupling_node, couple_config, couple_idx);
2923
2924 return coupling_node;
2925}
2926
2928 fy_document_t document, struct yac_couple_config * couple_config,
2929 size_t component_idx, size_t field_idx) {
2930
2931 fy_node_t field_node = fy_node_create_mapping(document);
2932 YAC_ASSERT(
2933 field_node, "ERROR(yac_yaml_create_field_node): "
2934 "failed to create mapping node");
2935
2936 // get field parameters
2937 char const * component_name =
2939 couple_config, component_idx);
2940 char const * field_name =
2942 couple_config, component_idx, field_idx);
2943 char const * grid_name =
2945 couple_config, component_idx, field_idx);
2946 char const * metadata =
2948 couple_config, component_name, grid_name, field_name);
2949 size_t collection_size =
2951 couple_config, component_name, grid_name, field_name);
2952 char const * timestep =
2954 couple_config, component_name, grid_name, field_name);
2955 int role =
2957 couple_config, component_name, grid_name, field_name);
2958 double frac_mask_fallback_value =
2960 couple_config, component_name, grid_name, field_name);
2961
2962 // add field name
2963 yac_yaml_map_append_scalar(field_node, "name", field_name);
2964
2965 // add grid name
2966 yac_yaml_map_append_scalar(field_node, "grid_name", grid_name);
2967
2968 // add metadata
2969 if (metadata)
2970 yac_yaml_map_append_scalar(field_node, "metadata", metadata);
2971
2972 // add collection_size
2973 if (collection_size != SIZE_MAX)
2975 field_node, "collection_size", (int)collection_size);
2976
2977 // add timestep
2978 if (timestep)
2979 yac_yaml_map_append_scalar(field_node, "timestep", timestep);
2980
2981 // add role
2983 field_node, "role",
2985 role_types, num_role_types, (enum yac_field_exchange_type)role));
2986
2987 // add fractional fallback value
2988 if (YAC_FRAC_MASK_VALUE_IS_VALID(frac_mask_fallback_value))
2990 field_node, "frac_mask_fallback_value", frac_mask_fallback_value);
2991
2992 return field_node;
2993}
2994
2996 fy_document_t document, struct yac_couple_config * couple_config,
2997 size_t component_idx) {
2998
2999 size_t num_fields =
3000 yac_couple_config_get_num_fields(couple_config, component_idx);
3001
3002 if (num_fields == 0) return (fy_node_t)NULL;
3003
3004 fy_node_t fields_node = fy_node_create_sequence(document);
3005 YAC_ASSERT(
3006 fields_node, "ERROR(yac_yaml_create_fields_node): "
3007 "failed to create sequence node");
3008
3009 for (size_t field_idx = 0; field_idx < num_fields; ++field_idx) {
3010
3011 int appending_failed =
3012 fy_node_sequence_append(
3013 fields_node,
3015 document, couple_config, component_idx, field_idx));
3016 YAC_ASSERT(
3017 !appending_failed, "ERROR(yac_yaml_create_fields_node): "
3018 "failed to append field node");
3019 }
3020
3021 return fields_node;
3022}
3023
3025 fy_document_t document, struct yac_couple_config * couple_config,
3026 size_t component_idx) {
3027
3028 fy_node_t component_node = fy_node_create_mapping(document);
3029 YAC_ASSERT(
3030 component_node, "ERROR(yac_yaml_create_component_node): "
3031 "failed to create mapping node");
3032
3033 // get component name, component metadata, and fields
3034 char const * component_name =
3035 yac_couple_config_get_component_name(couple_config, component_idx);
3036 char const * metadata =
3037 yac_couple_config_component_get_metadata(couple_config, component_name);
3038 fy_node_t fields_node =
3040 document, couple_config, component_idx);
3041
3042 // add component name
3043 yac_yaml_map_append_scalar(component_node, "name", component_name);
3044
3045 // add metadata
3046 if (metadata)
3047 yac_yaml_map_append_scalar(component_node, "metadata", metadata);
3048
3049 // add fields
3050 yac_yaml_map_append(component_node, "fields", fields_node);
3051
3052 return component_node;
3053}
3054
3056 fy_document_t document, struct yac_couple_config * couple_config) {
3057
3058 // get number of components in coupling configuration
3060
3061 if (num_components == 0) return (fy_node_t)NULL;
3062
3063 // create sequence node
3064 fy_node_t components_node = fy_node_create_sequence(document);
3065 YAC_ASSERT(
3066 components_node, "ERROR(yac_yaml_create_components_node): "
3067 "failed to create sequence node");
3068
3069 for (size_t component_idx = 0; component_idx < num_components;
3070 ++component_idx) {
3071
3072 int appending_failed =
3073 fy_node_sequence_append(
3074 components_node,
3075 yac_yaml_create_component_node(document, couple_config, component_idx));
3076 YAC_ASSERT(
3077 !appending_failed, "ERROR(yac_yaml_create_components_node): "
3078 "failed to append component node");
3079 }
3080
3081 return components_node;
3082}
3083
3085 fy_document_t document, struct yac_couple_config * couple_config,
3086 size_t grid_idx) {
3087
3088 fy_node_t grid_node = fy_node_create_mapping(document);
3089 YAC_ASSERT(
3090 grid_node, "ERROR(yac_yaml_create_grid_node): "
3091 "failed to create mapping node");
3092
3093 // get grid name and metadata
3094 char const * grid_name =
3095 yac_couple_config_get_grid_name(couple_config, grid_idx);
3096 char const * metadata =
3097 yac_couple_config_grid_get_metadata(couple_config, grid_name);
3098
3099 // add grid name
3100 yac_yaml_map_append_scalar(grid_node, "name", grid_name);
3101
3102 // add metadata
3103 if (metadata)
3104 yac_yaml_map_append_scalar(grid_node, "metadata", metadata);
3105
3106 return grid_node;
3107}
3108
3110 fy_document_t document, struct yac_couple_config * couple_config) {
3111
3112 // get number of grids in coupling configuration
3113 size_t num_grids = yac_couple_config_get_num_grids(couple_config);
3114
3115 if (num_grids == 0) return (fy_node_t)NULL;
3116
3117 // create sequence node
3118 fy_node_t grids_node = fy_node_create_sequence(document);
3119 YAC_ASSERT(
3120 grids_node, "ERROR(yac_yaml_create_grids_node): "
3121 "failed to create sequence node");
3122
3123 for (size_t grids_idx = 0; grids_idx < num_grids; ++grids_idx) {
3124
3125 int appending_failed =
3126 fy_node_sequence_append(
3127 grids_node,
3128 yac_yaml_create_grid_node(document, couple_config, grids_idx));
3129 YAC_ASSERT(
3130 !appending_failed, "ERROR(yac_yaml_create_grids_node): "
3131 "failed to append grid node");
3132 }
3133
3134 return grids_node;
3135}
3136
3138 fy_document_t document, struct yac_couple_config * couple_config) {
3139
3140 // create definition
3141 fy_node_t definition_node = fy_node_create_mapping(document);
3142 YAC_ASSERT(
3143 definition_node,
3144 "ERROR(yac_yaml_create_definitions_node): "
3145 "failed to create mapping node");
3146
3147 // add components
3149 definition_node,
3150 "components", yac_yaml_create_components_node(document, couple_config));
3151
3152 // add grids
3154 definition_node, "grids", yac_yaml_create_grids_node(document, couple_config));
3155
3156 return definition_node;
3157}
3158
3160 fy_document_t document, struct yac_couple_config * couple_config,
3161 int include_definitions) {
3162
3163 // create root node
3164 fy_node_t root_node = fy_node_create_mapping(document);
3165 YAC_ASSERT(
3166 root_node,
3167 "ERROR(yac_yaml_create_couple_config_nodes): "
3168 "failed to create mapping node");
3169
3170 // add debug
3172 root_node,
3174 yaml_base_keys, num_yaml_base_keys, DEBUG),
3175 yac_yaml_create_debug_node(document, couple_config));
3176
3177 // add user definitions (components, grids, and fields)
3178 if (include_definitions)
3180 root_node, "definitions",
3181 yac_yaml_create_definitions_node(document, couple_config));
3182
3183 // add start datetime
3184 char * start_datetime = yac_couple_config_get_start_datetime(couple_config);
3186 root_node,
3188 yaml_base_keys, num_yaml_base_keys, START_DATE), start_datetime);
3189 free(start_datetime);
3190
3191 // add end datetime
3192 char * end_datetime = yac_couple_config_get_end_datetime(couple_config);
3194 root_node,
3196 yaml_base_keys, num_yaml_base_keys, END_DATE), end_datetime);
3197 free(end_datetime);
3198
3199 // add calendar
3201 root_node,
3203 yaml_base_keys, num_yaml_base_keys, CALENDAR),
3205 calendar_types, num_calendar_types, getCalendarType()));
3206
3207 // add timestep unit
3209 root_node,
3211 yaml_base_keys, num_yaml_base_keys, TIMESTEP_UNIT),
3213 timestep_units, num_timestep_units, C_ISO_FORMAT));
3214
3215 // add couplings
3217 root_node,
3219 yaml_base_keys, num_yaml_base_keys, COUPLING),
3220 yac_yaml_create_coupling_node(document, couple_config));
3221
3222 return root_node;
3223}
3224
3226 struct yac_couple_config * couple_config, int emit_flags,
3227 int include_definitions) {
3228
3229 // create an empty document
3230 fy_document_t document = fy_document_create(NULL);
3231 YAC_ASSERT(
3232 document, "ERROR(yac_yaml_emit): failed to create document");
3233
3234 // create nodes from coupling configuration
3235 fy_node_t root_node =
3237 document, couple_config, include_definitions);
3238
3239 // set root node of the document
3240 int setting_root_failed =
3241 fy_document_set_root(document, root_node);
3242 YAC_ASSERT(
3243 !setting_root_failed,
3244 "ERROR(yac_yaml_emit): failed to add root node to document");
3245
3246 // emit document to string
3247 char * str_document =
3248 fy_emit_document_to_string(
3249 document, (enum fy_emitter_cfg_flags)emit_flags);
3250
3251 YAC_ASSERT(
3252 str_document, "ERROR(yac_yaml_emit): failed to emit document to string");
3253
3254 // destroy document
3255 fy_document_destroy(document);
3256
3257 return str_document;
3258}
static double yaml_parse_double_value(fy_node_t value_node, char const *key_name, char const *yaml_filename)
yaml_debug_sync_loc_key_types
@ SYNC_LOC_COUNT
@ SYNC_LOC_ENDDEF
@ SYNC_LOC_DEF_COMP
@ SYNC_LOC_SYNC_DEF
#define DEF_DEG_PARAM(NAME, DEFAULT, VALID_MIN, VALID_MAX)
#define DEF_ENUM_PARAM(NAME, DEFAULT,...)
static void yaml_parse_couple(struct yac_couple_config *couple_config, fy_node_t couple_node, char const *yaml_filename, enum yac_time_unit_type time_unit)
#define DEF_INTERP_STACK_GET_NO_PARAM(NAME)
static void yaml_parse_interp_method_parameter(interp_method_parameter_value *parameter_values, struct interp_method_parameter const *parameters, size_t num_parameters, fy_node_pair_t parameter_pair, char const *interpolation_name, char const *parameter_name_prefix, char const *yaml_filename)
#define DEF_STR_PARAM(NAME, DEFAULT, MAX_STR_LEN)
enum yac_interp_file_on_missing_file on_missing_file
#define DEF_INTERP_STACK_ADD_NO_PARAM(NAME)
struct yac_interp_stack_config * yac_yaml_parse_interp_stack_config_string(char const *str_interp_stack_config, int parse_flags)
static void yaml_parse_field_names(struct field_couple_field_names **field_names, size_t *num_field_names, fy_node_t fields_node, const char *yaml_filename)
static void yac_yaml_append_couple_nodes(fy_node_t coupling_node, struct yac_couple_config *couple_config, size_t couple_idx)
interp_method_parameter_value
static fy_node_t yac_yaml_create_scalar_dble(fy_document_t document, double value)
static interp_method_parameter_value yaml_parse_interp_method_parameter_value(struct interp_method_parameter const *parameter, fy_node_t value_node, char const *interpolation_name, char const *yaml_filename)
#define DEF_INTERP_STACK_ADD(NAME,...)
static fy_node_t yac_yaml_create_interpolation_node(fy_document_t document, union yac_interp_stack_config_entry const *interp_stack_entry)
struct fy_node_pair * fy_node_pair_t
Definition config_yaml.c:53
static fy_node_t yac_yaml_create_field_node(fy_document_t document, struct yac_couple_config *couple_config, size_t component_idx, size_t field_idx)
interp_method_parameter_value_type
@ ENUM_PARAM
@ DBLE_PARAM
@ DEG_PARAM
@ INT_PARAM
@ BOOL_PARAM
@ STR_PARAM
static calendarType yaml_parse_calendar_value(fy_node_t value_node, char const *key_name, char const *yaml_filename)
static fy_node_t yac_yaml_create_grids_node(fy_document_t document, struct yac_couple_config *couple_config)
static void yaml_parse_base_map_pair(struct yac_couple_config *couple_config, fy_node_pair_t base_pair, const char *yaml_filename, enum yac_time_unit_type *time_unit, char const **start_datetime, char const **end_datetime)
enum yac_interp_file_on_success on_success
static void yaml_parse_string_sequence(char const ***values, size_t *num_values, fy_node_t values_node, char const *sequence_name, const char *yaml_filename)
static fy_node_t yac_yaml_create_output_grids_node(fy_document_t document, struct yac_couple_config *couple_config)
static int compare_parameter_values(interp_method_parameter_value const *a, interp_method_parameter_value const *b, enum interp_method_parameter_value_type type)
int const YAC_YAML_PARSER_JSON_AUTO
Definition config_yaml.c:66
yaml_debug_key_types
@ GLOBAL_CONFIG
@ GLOBAL_DEFS
@ OUTPUT_GRIDS
@ MISSING_DEF
char * yac_yaml_emit_coupling(struct yac_couple_config *couple_config, int emit_flags, int include_definitions)
static fy_node_t yac_yaml_create_components_node(fy_document_t document, struct yac_couple_config *couple_config)
static fy_node_t yac_yaml_create_couple_config_nodes(fy_document_t document, struct yac_couple_config *couple_config, int include_definitions)
static fy_node_t yac_yaml_create_grid_node(fy_document_t document, struct yac_couple_config *couple_config, size_t grid_idx)
static void yac_yaml_map_append_scalar_dble(fy_node_t map, char const *key, double value)
static void yaml_parse_document(struct yac_couple_config *couple_config, fy_document_t document, const char *yaml_filename)
parameter_values[2] enum_value
static int yaml_parse_enum_value(struct yac_name_type_pair const *valid_values, size_t num_valid_values, fy_node_t value_node, char const *key_name, char const *yaml_filename)
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)
yaml_couple_key_types
@ WEIGHT_FILE_NAME
@ SCALE_SUMMAND
@ TARGET_COMPONENT
@ SOURCE_GRID
@ SOURCE_MASK_NAME
@ INTERPOLATION
@ SOURCE_MASK_NAMES
@ YAXT_EXCHANGER_NAME
@ MAPPING_SIDE
@ TIME_REDUCTION
@ SOURCE_LAG
@ WEIGHT_FILE_ON_EXISTING
@ FIELD
@ TARGET_GRID
@ COUPLING_PERIOD
@ TARGET_NAMES
@ WEIGHT_FILE_DATA
@ SOURCE_COMPONENT
@ SCALE_FACTOR
@ TARGET_LAG
@ TARGET_MASK_NAME
@ USE_RAW_EXCHANGE
@ SOURCE_NAMES
static int yaml_parse_integer_value(fy_node_t value_node, char const *key_name, char const *yaml_filename)
static void yaml_parse_debug_output_grids(struct yac_couple_config *couple_config, fy_node_t output_grids_node, char const *yaml_filename)
int const YAC_YAML_EMITTER_JSON
emit to JSON format
Definition config_yaml.c:64
static enum yac_time_unit_type yaml_parse_timestep_unit_value(fy_node_t value_node, char const *key_name, char const *yaml_filename)
static void yac_yaml_map_append_scalar(fy_node_t map, char const *key, char const *value)
struct fy_document * fy_document_t
Definition config_yaml.c:51
int const YAC_YAML_PARSER_DEFAULT
default parse flags (YAML format)
Definition config_yaml.c:65
static fy_node_t yac_yaml_create_output_grid_node(fy_document_t document, char const *grid_name, char const *file_name)
#define DEF_INTERP_STACK_GET(NAME,...)
static struct field_couple_field_names yaml_parse_field_name(fy_node_t field_node, const char *yaml_filename)
static void yaml_parse_base_interp_method_node(char const **interpolation_type_str, fy_node_t *parameter_node, fy_node_t interp_method_node, char const *yaml_filename)
static void yaml_parse_weight_file_data(char const **weight_file_name, enum yac_weight_file_on_existing *on_existing, fy_node_t values_node, char const *type_name, const char *yaml_filename)
yaml_weight_file_data_key_types
@ WEIGHT_FILE_DATA_ON_EXISTING
@ WEIGHT_FILE_DATA_NAME
static fy_node_t yac_yaml_create_field_name_node(fy_document_t document, struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx)
static char const * yaml_parse_timestep_value(fy_node_t value_node, char const *key_name, char const *yaml_filename, enum yac_time_unit_type time_unit)
#define ADD_INTERPOLATION(NAME, TYPE)
#define DEF_DBLE_PARAM(NAME, DEFAULT, VALID_MIN, VALID_MAX)
static struct debug_config_file_buffer yaml_parse_debug_config_file_buffer(fy_node_t config_file_node, char const *config_file_type_name, char const *yaml_filename)
#define DEF_NAME_TYPE_PAIR(NAME, TYPE)
#define YAML_ASSERT_F(CHECK, MSG,...)
static fy_node_t yac_yaml_create_component_node(fy_document_t document, struct yac_couple_config *couple_config, size_t component_idx)
static void yac_yaml_map_append_parameter(fy_node_t map, struct interp_method_parameter const *parameter, interp_method_parameter_value value)
yaml_debug_output_grid_key_types
@ OUTPUT_GRID_FILE_NAME
@ OUTPUT_GRID_GRID_NAME
static void yaml_parse_coupling(struct yac_couple_config *couple_config, fy_node_t coupling_node, char const *yaml_filename, enum yac_time_unit_type time_unit)
static fy_node_t yac_yaml_create_coupling_node(fy_document_t document, struct yac_couple_config *couple_config)
static void yaml_parse_interp_method_parameters(interp_method_parameter_value *parameter_values, struct yac_interpolation_method const *interp_method, fy_node_t parameter_node, char const *yaml_filename)
#define DEF_INT_PARAM(NAME, DEFAULT, VALID_MIN, VALID_MAX)
static void yaml_parse_output_grid_pair(char const **grid_name, char const **file_name, fy_node_pair_t output_grid_pair, char const *yaml_filename)
static fy_node_t yac_yaml_create_interpolation_stack_node(fy_document_t document, struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx)
static enum yac_reduction_type yaml_parse_time_reduction_value(fy_node_t value_node, char const *key_name, char const *yaml_filename)
static void yaml_parse_debug_global_config(struct yac_couple_config *couple_config, fy_node_t global_config_node, char const *yaml_filename)
#define DEF_INTERP_METHOD(NAME, FUNC_ADD, FUNC_GET,...)
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
static void yac_yaml_append_couple_field_nodes(fy_node_t coupling_node, struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx)
static void yaml_parse_interp_stack_value(struct yac_interp_stack_config *interp_stack, fy_node_t interp_stack_node, char const *yaml_filename)
static fy_node_t yac_yaml_create_debug_node(fy_document_t document, struct yac_couple_config *couple_config)
struct fy_node * fy_node_t
Definition config_yaml.c:52
static void yaml_parse_debug(struct yac_couple_config *couple_config, fy_node_t debug_node, char const *yaml_filename)
static void yac_yaml_map_append(fy_node_t map, char const *key, fy_node_t value)
static fy_node_t yac_yaml_create_sequence_scalar(fy_document_t document, char const *const *values, size_t num_values)
const interpolation_methods[]
static char const * yaml_parse_string_value(fy_node_t value_node, char const *name, char const *yaml_filename)
static void yaml_parse_debug_map_pair(struct yac_couple_config *couple_config, fy_node_pair_t debug_pair, const char *yaml_filename)
static void yac_yaml_map_append_scalar_int(fy_node_t map, char const *key, int value)
#define ADD_INTERPOLATION_NO_PARAM(NAME, TYPE)
static void yaml_parse_comp_grid_names(char const **comp_name, char const ***grid_names, size_t *num_grid_names, fy_node_t values_node, char const *type_name, const char *yaml_filename)
#define YAML_ASSERT(CHECK, MSG)
static fy_node_t yac_yaml_create_fields_node(fy_document_t document, struct yac_couple_config *couple_config, size_t component_idx)
static void yaml_parse_debug_config_file_map_pair(struct debug_config_file_buffer *config_file_buffer, fy_node_pair_t config_file_pair, char const *config_file_type_name, const char *yaml_filename)
yaml_base_key_types
@ DEBUG
@ TIMESTEP_UNIT
@ START_DATE
@ COUPLING
@ CALENDAR
@ END_DATE
enum yac_interp_ncc_weight_type weight_type
static void yaml_parse_interp_method(struct yac_interp_stack_config *interp_stack, fy_node_t interp_method_node, char const *yaml_filename)
#define DEF_NAME_TYPE_PAIRS(NAME,...)
yaml_comp_grid_names_key_types
@ COMP_NAME
@ GRID_NAMES
static fy_node_t yac_yaml_create_scalar(fy_document_t document, char const *value)
static void yaml_parse_output_grid(struct yac_couple_config *couple_config, fy_node_t output_grid_node, char const *yaml_filename)
static fy_node_t yac_yaml_create_scalar_int(fy_document_t document, int value)
static struct debug_config_file yaml_parse_config_file_value(fy_node_t config_file_node, char const *file_type_name, const char *yaml_filename)
#define DEF_BOOL_PARAM(NAME, DEFAULT)
static void yaml_parse_couple_map_pair(struct field_couple_buffer *field_buffer, fy_node_pair_t couple_pair, const char *yaml_filename, enum yac_time_unit_type time_unit)
@ EMITTER_DEFAULT
Definition config_yaml.c:56
@ PARSER_JSON_AUTO
Definition config_yaml.c:59
@ EMITTER_JSON
Definition config_yaml.c:57
@ PARSER_JSON_FORCE
Definition config_yaml.c:60
@ PARSER_DEFAULT
Definition config_yaml.c:58
@ NUM_INTERPOLATION_METHODS
static fy_node_t yac_yaml_create_definitions_node(fy_document_t document, struct yac_couple_config *couple_config)
char const * yac_couple_config_get_yaxt_exchanger_name(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx)
size_t yac_couple_config_get_num_fields(struct yac_couple_config *couple_config, size_t component_idx)
void yac_couple_config_get_field_grid_names(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx, char const **src_grid_name, char const **tgt_grid_name)
const char * yac_couple_config_grid_get_output_filename(struct yac_couple_config *couple_config, const char *grid_name)
char * yac_couple_config_get_start_datetime(struct yac_couple_config *couple_config)
void yac_couple_config_set_datetime(struct yac_couple_config *couple_config, char const *start, char const *end)
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)
void yac_couple_config_def_couple(struct yac_couple_config *couple_config, char const *src_comp_name, char const *src_grid_name, char const *src_field_name, char const *tgt_comp_name, char const *tgt_grid_name, char const *tgt_field_name, char const *coupling_period, int time_reduction, struct yac_interp_stack_config *interp_stack, int src_lag, int tgt_lag, const char *weight_file_name, int weight_file_on_existing, int mapping_on_source, double scale_factor, double scale_summand, size_t num_src_mask_names, char const *const *src_mask_names, char const *tgt_mask_name, char const *yaxt_exchanger_name, int use_raw_exchange)
int yac_couple_config_mapping_on_source(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx)
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)
char const * yac_couple_config_get_coupling_period(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx)
struct yac_interp_stack_config * yac_couple_config_get_interp_stack(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx)
enum yac_weight_file_on_existing yac_couple_config_get_weight_file_on_existing(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx)
char const * yac_couple_config_get_field_name(struct yac_couple_config *couple_config, size_t component_idx, size_t field_idx)
size_t yac_couple_config_get_field_collection_size(struct yac_couple_config *couple_config, char const *component_name, char const *grid_name, char const *field_name)
size_t yac_couple_config_get_num_couple_fields(struct yac_couple_config *couple_config, size_t couple_idx)
void yac_couple_config_get_src_mask_names(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx, char const *const **mask_names, size_t *num_mask_names)
int yac_couple_config_get_use_raw_exchange(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx)
size_t yac_couple_config_get_num_couples(struct yac_couple_config *couple_config)
int yac_couple_config_get_target_lag(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx)
double yac_couple_config_get_frac_mask_fallback_value(struct yac_couple_config *couple_config, char const *component_name, char const *grid_name, char const *field_name)
int yac_couple_config_get_source_lag(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx)
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)
double yac_couple_config_get_scale_factor(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx)
char const * yac_couple_config_get_tgt_mask_name(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx)
void yac_couple_config_add_grid(struct yac_couple_config *couple_config, char const *name)
char const * yac_couple_config_get_grid_name(struct yac_couple_config *couple_config, size_t grid_idx)
double yac_couple_config_get_scale_summand(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx)
enum yac_reduction_type yac_couple_config_get_coupling_period_operation(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx)
int yac_couple_config_enforce_write_weight_file(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx)
void yac_couple_config_grid_set_output_filename(struct yac_couple_config *couple_config, char const *grid_name, const char *output_filename)
void yac_couple_config_get_field_names(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx, char const **src_field_name, const char **tgt_field_name)
char const * yac_couple_config_get_weight_file_name(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx)
int yac_couple_config_get_missing_definition_is_fatal(struct yac_couple_config *couple_config)
void yac_couple_config_get_field_couple_component_names(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx, char const **src_component_name, char const **tgt_component_name)
char const * yac_couple_config_get_component_name(struct yac_couple_config *couple_config, size_t component_idx)
void yac_couple_config_set_missing_definition_is_fatal(struct yac_couple_config *couple_config, int missing_definition_is_fatal)
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)
char * yac_couple_config_get_end_datetime(struct yac_couple_config *couple_config)
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.
yac_reduction_type
@ TIME_NONE
@ TIME_ACCUMULATE
@ TIME_MAXIMUM
@ TIME_MINIMUM
@ TIME_AVERAGE
yac_time_unit_type
@ C_SECOND
@ TIME_UNIT_UNDEFINED
@ C_HOUR
@ C_DAY
@ C_MILLISECOND
@ C_MINUTE
@ C_MONTH
@ C_ISO_FORMAT
@ C_YEAR
yac_field_exchange_type
Definition fields.h:12
@ SOURCE
Definition fields.h:14
@ TARGET
Definition fields.h:15
@ NOTHING
Definition fields.h:13
#define YAC_RAD
Definition geometry.h:30
#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
int(* func_compute_weights)(double[3], size_t, yac_const_coordinate_pointer, int *, double *, enum yac_cell_type cell_type)
#define YAC_INTERP_AVG_PARTIAL_COVERAGE_DEFAULT
yac_interp_avg_weight_type
@ YAC_INTERP_AVG_DIST
@ YAC_INTERP_AVG_ARITHMETIC
@ YAC_INTERP_AVG_BARY
#define YAC_INTERP_AVG_WEIGHT_TYPE_DEFAULT
char * key
#define YAC_INTERP_CALLBACK_COMPUTE_WEIGHTS_KEY_DEFAULT
struct @7::@8 value
enum callback_type type
#define YAC_INTERP_CHECK_CONSTRUCTOR_KEY_DEFAULT
#define YAC_INTERP_CHECK_DO_SEARCH_KEY_DEFAULT
#define YAC_INTERP_CONSERV_NORMALISATION_DEFAULT
#define YAC_INTERP_CONSERV_ENFORCED_CONSERV_DEFAULT
#define YAC_INTERP_CONSERV_PARTIAL_COVERAGE_DEFAULT
#define YAC_INTERP_CONSERV_ORDER_DEFAULT
yac_interp_method_conserv_normalisation
@ YAC_INTERP_CONSERV_DESTAREA
@ YAC_INTERP_CONSERV_FRACAREA
#define YAC_INTERP_CREEP_DISTANCE_DEFAULT
#define YAC_INTERP_FILE_ON_SUCCESS_DEFAULT
#define YAC_INTERP_FILE_WEIGHT_FILE_NAME_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
#define YAC_INTERP_FIXED_VALUE_DEFAULT
#define YAC_INTERP_NCC_PARTIAL_COVERAGE_DEFAULT
#define YAC_INTERP_NCC_WEIGHT_TYPE_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
#define YAC_INTERP_NNN_WEIGHTED_DEFAULT
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
#define YAC_INTERP_RBF_MAX_SEARCH_DISTANCE_DEFAULT
#define YAC_INTERP_RBF_N_DEFAULT
#define YAC_INTERP_NNN_MAX_SEARCH_DISTANCE_DEFAULT
#define YAC_INTERP_NNN_GAUSS_SCALE_DEFAULT
#define YAC_INTERP_RBF_SCALE_DEFAULT
#define YAC_INTERP_NNN_N_DEFAULT
#define YAC_INTERP_RBF_KERNEL_DEFAULT
#define YAC_INTERP_SPMAP_MAX_SEARCH_DISTANCE_DEFAULT
yac_interp_spmap_scale_type
@ YAC_INTERP_SPMAP_NONE
weights are not scaled
@ YAC_INTERP_SPMAP_INVTGTAREA
@ YAC_INTERP_SPMAP_SRCAREA
@ YAC_INTERP_SPMAP_FRACAREA
#define YAC_INTERP_SPMAP_WEIGHTED_DEFAULT
#define YAC_INTERP_SPMAP_SPREAD_DISTANCE_DEFAULT
#define YAC_INTERP_SPMAP_SPHERE_RADIUS_DEFAULT
#define YAC_INTERP_SPMAP_SCALE_TYPE_DEFAULT
yac_interp_spmap_weight_type
@ YAC_INTERP_SPMAP_AVG
@ YAC_INTERP_SPMAP_DIST
#define YAC_INTERP_SPMAP_MIN_GLOBAL_ID_DEFAULT
size_t yac_interp_stack_config_get_size(struct yac_interp_stack_config *interp_stack)
union yac_interp_stack_config_entry const * yac_interp_stack_config_get_entry(struct yac_interp_stack_config *interp_stack, size_t interp_stack_idx)
enum yac_interpolation_list yac_interp_stack_config_entry_get_type(union yac_interp_stack_config_entry const *interp_stack_entry)
void yac_interp_stack_config_delete(struct yac_interp_stack_config *interp_stack_config)
struct yac_interp_stack_config * yac_interp_stack_config_new()
yac_interpolation_list
@ YAC_N_NEAREST_NEIGHBOR
@ YAC_CREEP
@ YAC_USER_FILE
@ YAC_USER_CALLBACK
@ YAC_SOURCE_TO_TARGET_MAP
@ YAC_CONSERVATIVE
@ YAC_FIXED_VALUE
@ YAC_CHECK
@ YAC_BERNSTEIN_BEZIER
@ YAC_NEAREST_CORNER_CELLS
@ YAC_RADIAL_BASIS_FUNCTION
@ YAC_AVERAGE
#define YAC_MAX_ROUTINE_NAME_LENGTH
#define YAC_MAX_FILE_NAME_LENGTH
#define YAC_WEIGHT_FILE_ON_EXISTING_DEFAULT_VALUE
yac_weight_file_on_existing
@ YAC_WEIGHT_FILE_KEEP
keep existing weight file
@ YAC_WEIGHT_FILE_UNDEFINED
@ YAC_WEIGHT_FILE_OVERWRITE
overwrite existing weight file
@ YAC_WEIGHT_FILE_ERROR
error when weight file existis already
#define YAC_FRAC_MASK_VALUE_IS_VALID(value)
int yac_file_exists(const char *filename)
Definition utils_core.c:12
#define xrealloc(ptr, size)
Definition ppm_xfuncs.h:67
#define xmalloc(size)
Definition ppm_xfuncs.h:66
#define xfclose(fp)
Definition ppm_xfuncs.h:79
#define xfopen(path, mode)
Definition ppm_xfuncs.h:74
struct debug_config_file_buffer::debug_config_file config_file[SYNC_LOC_COUNT]
char const * sync_loc_ref[SYNC_LOC_COUNT]
char const ** src_mask_names
Definition config_yaml.c:96
char const * yaxt_exchanger_name
char const * coupling_period
Definition config_yaml.c:81
enum yac_weight_file_on_existing on_existing
Definition config_yaml.c:86
struct field_couple_buffer::@52 tgt
char const * name
Definition config_yaml.c:85
struct field_couple_buffer::@52::@54 grid
char const * tgt_mask_name
Definition config_yaml.c:98
char const * comp_name
Definition config_yaml.c:74
struct yac_interp_stack_config * interp_stack
Definition config_yaml.c:83
struct field_couple_buffer::@53 weight_file
struct field_couple_buffer::@52 src
struct field_couple_buffer::field_couple_field_names * field_names
char const ** name
Definition config_yaml.c:76
enum yac_reduction_type time_reduction
Definition config_yaml.c:82
struct interp_method_parameter::@55::@60 bool_param
struct interp_method_parameter::@55::@57 int_param
struct yac_name_type_pair const * valid_values
struct interp_method_parameter::@55::@58 dble_param
enum interp_method_parameter_value_type type
union interp_method_parameter::@55 data
struct interp_method_parameter::@55::@56 enum_param
struct interp_method_parameter::@55::@59 str_param
interp_method_parameter_value const default_value
int yac_name_type_pair_get_type(struct yac_name_type_pair const *pairs, size_t count, char const *name)
Definition utils_core.c:26
char const * yac_name_type_pair_get_name(struct yac_name_type_pair const *pairs, size_t count, int type)
Definition utils_core.c:17
#define MAX(a, b)
size_t num_grids
Definition yac.c:145
static size_t num_components
Definition yac.c:148
void yac_cdef_calendar(int calendar)
Definition yac.c:664
int yac_cget_calendar()
Definition yac.c:681
int const YAC_CALENDAR_NOT_SET
Definition yac.c:62
#define YAC_ASSERT_F(exp, format,...)
Definition yac_assert.h:19
#define YAC_ASSERT(exp, msg)
Definition yac_assert.h:16