YetAnotherCoupler 3.2.0_a
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#include <libfyaml.h>
10
11#include <stdlib.h>
12#include <string.h>
13#include <stdbool.h>
14
15#include "yac.h"
16#include "utils_mci.h"
17#include "config_yaml.h"
18#include "mtime_calendar.h"
19#include "geometry.h"
20#include "io_utils.h"
21#include "interp_method_avg.h"
23#include "interp_method_check.h"
25#include "interp_method_creep.h"
26#include "interp_method_file.h"
27#include "interp_method_fixed.h"
28#include "interp_method_hcsbb.h"
29#include "interp_method_ncc.h"
30#include "interp_method_nnn.h"
31#include "interp_method_spmap.h"
32#include "interp_stack_config.h"
33
34typedef struct fy_document * fy_document_t;
35typedef struct fy_node * fy_node_t;
36typedef struct fy_node_pair * fy_node_pair_t;
37
38enum {
39 EMITTER_DEFAULT = FYECF_DEFAULT,
40 EMITTER_JSON = FYECF_MODE_JSON,
42 PARSER_JSON_AUTO = FYPCF_JSON_AUTO,
43 PARSER_JSON_FORCE = FYPCF_JSON_FORCE,
44};
45
51
52char const * yac_time_to_ISO(
53 char const * time, enum yac_time_unit_type time_unit);
54
77
85
105
106#define CAST_NAME_TYPE_PAIRS(...) (struct yac_name_type_pair[]) {__VA_ARGS__}
107#define COUNT_NAME_TYPE_PAIRS(...) \
108 sizeof(CAST_NAME_TYPE_PAIRS(__VA_ARGS__)) / sizeof(struct yac_name_type_pair)
109#define DEF_NAME_TYPE_PAIR(NAME, TYPE) {.name = #NAME, .type = (int)(TYPE)}
110#define DEF_NAME_TYPE_PAIRS(NAME, ...) \
111 static const struct yac_name_type_pair NAME [] = {__VA_ARGS__}; \
112 static const size_t num_ ## NAME = COUNT_NAME_TYPE_PAIRS(__VA_ARGS__);
113
115 yaml_base_keys,
116 DEF_NAME_TYPE_PAIR(start_date, START_DATE),
117 DEF_NAME_TYPE_PAIR(end_date, END_DATE),
118 DEF_NAME_TYPE_PAIR(calendar, CALENDAR),
119 DEF_NAME_TYPE_PAIR(timestep_unit, TIMESTEP_UNIT),
120 DEF_NAME_TYPE_PAIR(coupling, COUPLING));
121
123 yaml_couple_keys,
124 DEF_NAME_TYPE_PAIR(src_component, SOURCE_COMPONENT),
126 DEF_NAME_TYPE_PAIR(tgt_component, TARGET_COMPONENT),
129 DEF_NAME_TYPE_PAIR(coupling_period, COUPLING_PERIOD),
130 DEF_NAME_TYPE_PAIR(time_reduction, TIME_REDUCTION),
133 DEF_NAME_TYPE_PAIR(weight_file_name, WEIGHT_FILE_NAME),
134 DEF_NAME_TYPE_PAIR(mapping_side, MAPPING_SIDE),
135 DEF_NAME_TYPE_PAIR(scale_factor, SCALE_FACTOR),
136 DEF_NAME_TYPE_PAIR(scale_summand, SCALE_SUMMAND),
137 DEF_NAME_TYPE_PAIR(interpolation, INTERPOLATION),
138 DEF_NAME_TYPE_PAIR(src_mask_name, SOURCE_MASK_NAME),
139 DEF_NAME_TYPE_PAIR(src_mask_names, SOURCE_MASK_NAMES),
140 DEF_NAME_TYPE_PAIR(tgt_mask_name, TARGET_MASK_NAME));
141
143 bool_names,
144 DEF_NAME_TYPE_PAIR(true, true),
145 DEF_NAME_TYPE_PAIR(TRUE, true),
146 DEF_NAME_TYPE_PAIR(yes, true),
147 DEF_NAME_TYPE_PAIR(YES, true),
148 DEF_NAME_TYPE_PAIR(false, false),
149 DEF_NAME_TYPE_PAIR(FALSE, false),
150 DEF_NAME_TYPE_PAIR(no, false),
151 DEF_NAME_TYPE_PAIR(NO, false));
152
154 timestep_units,
155 DEF_NAME_TYPE_PAIR(millisecond, C_MILLISECOND),
162 DEF_NAME_TYPE_PAIR(ISO_format, C_ISO_FORMAT));
163
165 time_operations,
171
173 calendar_types,
174 DEF_NAME_TYPE_PAIR(proleptic-gregorian, PROLEPTIC_GREGORIAN),
175 DEF_NAME_TYPE_PAIR(360d, YEAR_OF_360_DAYS),
176 DEF_NAME_TYPE_PAIR(365d, YEAR_OF_365_DAYS));
177
179 mapping_sides,
180 DEF_NAME_TYPE_PAIR(source, 1),
181 DEF_NAME_TYPE_PAIR(target, 0));
182
183typedef
184#if defined __NVCOMPILER && __NVCOMPILER_MAJOR__ <= 24
185// Older versions of NVHPC have serious problems with unions that contain
186// pointers that are not the first members: versions 23.7 and older fail with
187// 'Internal compiler error. unhandled type', the newer versions produce code
188// that fails at the runtime with
189// 'Segmentation fault: address not mapped to object'.
190struct
191#else
192union
193#endif
199 char const * str_value;
201
210
212
213 char const * name;
215
216#if defined __NVCOMPILER && __NVCOMPILER_MAJOR__ <= 24
217 // Older versions of NVHPC generate invalid LLVM IR for unions that contain
218 // structures with doubles: an attempt to initialize a member of type double
219 // that is not the first member of the respective structure will lead to a
220 // type mismatch.
221 struct
222#else
223 union
224#endif
225 {
226 struct { // enum
230 struct { // integer
231 int valid_min, valid_max;
233 struct { // double
236 struct { // string
239 // Note that NVHPC 24.1 and older fail to compile this file with
240 // 'Internal compiler error. dinit: initialization of undefined struct' if
241 // the following empty structure is not the last member of the parent
242 // structure/union.
243 struct { // bool
247};
248
249#define DEF_INTERP_METHOD_ADD_FUNC(NAME, FUNC) \
250 static void add_interp_method_ ## NAME ( \
251 struct field_couple_buffer * field_buffer, \
252 interp_method_parameter_value * parameters, \
253 char const * yaml_filename) { \
254 char const * routine_name = "add_interp_method_" #NAME; \
255 (void)parameters; \
256 (void)yaml_filename; \
257 (void)routine_name; \
258 {FUNC} }
259#define DEF_INTERP_METHOD_GET_FUNC(NAME, FUNC) \
260 static void get_interp_method_ ## NAME ( \
261 union yac_interp_stack_config_entry const * interp_stack_entry, \
262 interp_method_parameter_value * parameter_values) { \
263 char const * routine_name = "get_interp_method_" #NAME; \
264 (void)interp_stack_entry; \
265 (void)parameter_values; \
266 (void)routine_name; \
267 {FUNC} }
268
269#define DEF_ENUM_PARAM(NAME, DEFAULT, ...) \
270 {.name = #NAME, \
271 .type = ENUM_PARAM, \
272 .data.enum_param.valid_values = CAST_NAME_TYPE_PAIRS(__VA_ARGS__), \
273 .data.enum_param.num_valid_values = COUNT_NAME_TYPE_PAIRS(__VA_ARGS__), \
274 .default_value.enum_value = (int)(DEFAULT)}
275#define DEF_INT_PARAM(NAME, DEFAULT, VALID_MIN, VALID_MAX) \
276 {.name = #NAME, \
277 .type = INT_PARAM, \
278 .data.int_param.valid_min = (int)(VALID_MIN), \
279 .data.int_param.valid_max = (int)(VALID_MAX), \
280 .default_value.int_value = (int)(DEFAULT)}
281#define DEF_DBLE_PARAM(NAME, DEFAULT, VALID_MIN, VALID_MAX) \
282 {.name = #NAME, \
283 .type = DBLE_PARAM, \
284 .data.dble_param.valid_min = (double)(VALID_MIN), \
285 .data.dble_param.valid_max = (double)(VALID_MAX), \
286 .default_value.dble_value = (double)(DEFAULT)}
287#define DEF_DEG_PARAM(NAME, DEFAULT, VALID_MIN, VALID_MAX) \
288 {.name = #NAME, \
289 .type = DEG_PARAM, \
290 .data.dble_param.valid_min = (double)(VALID_MIN), \
291 .data.dble_param.valid_max = (double)(VALID_MAX), \
292 .default_value.dble_value = (double)(DEFAULT)}
293#define DEF_BOOL_PARAM(NAME, DEFAULT) \
294 {.name = #NAME, \
295 .type = BOOL_PARAM, \
296 .default_value.bool_value = (int)(DEFAULT)}
297#define DEF_STR_PARAM(NAME, DEFAULT, MAX_STR_LEN) \
298 {.name = #NAME, \
299 .type = STR_PARAM, \
300 .data.str_param.max_str_len = (MAX_STR_LEN), \
301 .default_value.str_value = (DEFAULT)}
302#define DEF_INTERP_METHOD_PARAM(NAME, ...) \
303 static struct interp_method_parameter \
304 interp_method_parameters_ ## NAME [] = {__VA_ARGS__};
305
306#define YAML_ASSERT(CHECK, MSG) \
307 YAC_ASSERT_F((CHECK), \
308 "ERROR(%s): " MSG " in YAML configuration file \"%s\"", \
309 routine_name, yaml_filename)
310#define YAML_ASSERT_F(CHECK, MSG, ...) \
311 YAC_ASSERT_F((CHECK), \
312 "ERROR(%s): " MSG " in YAML configuration file \"%s\"", \
313 routine_name, __VA_ARGS__, yaml_filename)
314
315#define DEF_INTERP_STACK_ADD(NAME, ...) \
316 yac_interp_stack_config_add_ ## NAME ( \
317 field_buffer->interp_stack, __VA_ARGS__);
318
319#define DEF_INTERP_STACK_ADD_NO_PARAM(NAME) \
320 yac_interp_stack_config_add_ ## NAME ( \
321 field_buffer->interp_stack);
322
323#define DEF_INTERP_STACK_GET(NAME, ...) \
324 yac_interp_stack_config_entry_get_ ## NAME ( \
325 interp_stack_entry, __VA_ARGS__);
326
327#define DEF_INTERP_STACK_GET_NO_PARAM(NAME) \
328 {}
329
330#define DEF_INTERP_METHOD(NAME, FUNC_ADD, FUNC_GET, ...) \
331 DEF_INTERP_METHOD_ADD_FUNC(NAME, FUNC_ADD); \
332 DEF_INTERP_METHOD_GET_FUNC(NAME, FUNC_GET); \
333 DEF_INTERP_METHOD_PARAM(NAME, __VA_ARGS__)
334
335// interpolation method average
337 DEF_INTERP_STACK_ADD(average,
338 (enum yac_interp_avg_weight_type)parameters[0].enum_value,
339 parameters[1].bool_value),
340 enum yac_interp_avg_weight_type reduction_type;
341 DEF_INTERP_STACK_GET(average,
342 &reduction_type, &parameter_values[1].bool_value)
343 parameter_values[0].enum_value = (int)reduction_type;,
346 DEF_NAME_TYPE_PAIR(distance_weighted, YAC_INTERP_AVG_DIST),
348 DEF_NAME_TYPE_PAIR(barycentric_coordinate, YAC_INTERP_AVG_BARY)),
350 partial_coverage, YAC_INTERP_AVG_PARTIAL_COVERAGE_DEFAULT));
351
352// interpolation method nearest corner cells
355 (enum yac_interp_ncc_weight_type)parameters[0].enum_value,
356 parameters[1].bool_value),
357 enum yac_interp_ncc_weight_type weight_type;
359 &weight_type, &parameter_values[1].bool_value)
360 parameter_values[0].enum_value = (int)weight_type;,
363 DEF_NAME_TYPE_PAIR(arithmetic_average, YAC_INTERP_NCC_AVG),
364 DEF_NAME_TYPE_PAIR(distance_weighted, YAC_INTERP_NCC_DIST)),
366 partial_coverage, YAC_INTERP_NCC_PARTIAL_COVERAGE_DEFAULT));
367
368// interpolation method n-nearest neighbor
371 (enum yac_interp_nnn_weight_type)parameters[0].enum_value,
372 (size_t)parameters[1].int_value,
373 parameters[2].dble_value),
375 size_t n;
377 &type, &n, &parameter_values[2].dble_value)
378 parameter_values[0].enum_value = (int)type;
379 parameter_values[1].int_value = (int)n;,
382 DEF_NAME_TYPE_PAIR(distance_weighted, YAC_INTERP_NNN_DIST),
384 DEF_NAME_TYPE_PAIR(arithmetic_average, YAC_INTERP_NNN_AVG),
388 gauss_scale, YAC_INTERP_NNN_GAUSS_SCALE_DEFAULT, -DBL_MAX, DBL_MAX));
389
390// interpolation method conservative
391DEF_INTERP_METHOD(conservative,
392 DEF_INTERP_STACK_ADD(conservative,
393 parameters[0].int_value,
394 parameters[1].bool_value,
395 parameters[2].bool_value,
396 (enum yac_interp_method_conserv_normalisation)parameters[3].enum_value),
398 DEF_INTERP_STACK_GET(conservative,
399 &parameter_values[0].int_value,
400 &parameter_values[1].bool_value,
401 &parameter_values[2].bool_value, &normalisation)
402 parameter_values[3].enum_value = (int)normalisation;,
405 enforced_conservation, YAC_INTERP_CONSERV_ENFORCED_CONSERV_DEFAULT),
412
413// interpolation method source to target mapping
414DEF_INTERP_METHOD(source_to_target_map,
416 parameters[0].dble_value,
417 parameters[1].dble_value,
418 (enum yac_interp_spmap_weight_type)parameters[2].enum_value,
419 (enum yac_interp_spmap_scale_type)parameters[3].enum_value,
420 parameters[4].dble_value,
421 parameters[5].dble_value),
422 enum yac_interp_spmap_weight_type weight_type;
423 enum yac_interp_spmap_scale_type scale_type;
425 &parameter_values[0].dble_value,
426 &parameter_values[1].dble_value,
427 &weight_type, &scale_type,
428 &parameter_values[4].dble_value,
429 &parameter_values[5].dble_value)
430 parameter_values[0].dble_value /= YAC_RAD;
431 parameter_values[1].dble_value /= YAC_RAD;
432 parameter_values[2].enum_value = (int)weight_type;
433 parameter_values[3].enum_value = (int)scale_type;,
435 spread_distance, YAC_INTERP_SPMAP_SPREAD_DISTANCE_DEFAULT, 0.0, 89.9999),
437 max_search_distance,
441 DEF_NAME_TYPE_PAIR(distance_weighted, YAC_INTERP_SPMAP_DIST),
442 DEF_NAME_TYPE_PAIR(arithmetic_average, YAC_INTERP_SPMAP_AVG)),
450 src_sphere_radius,
453 tgt_sphere_radius,
455
456// interpolation method fixed
459 parameters[0].dble_value != DBL_MAX,
460 "parameter 'user_value' of interpolation method 'fixed' is unset");
461 DEF_INTERP_STACK_ADD(fixed, parameters[0].dble_value),
463 &parameter_values[0].dble_value),
465 user_value, YAC_INTERP_FIXED_VALUE_DEFAULT, -DBL_MAX, DBL_MAX));
466
467// interpolation method user file
470 parameters[0].str_value,
471 "parameter \"filename\" of interpolation method \"user file\" is unset")
473 field_buffer->src.grid_name,
474 "source grid name has to be defined before "
475 "the definition of interpolation method \"user_file\"")
477 field_buffer->tgt.grid_name,
478 "target grid name has to be defined before "
479 "the definition of interpolation method \"user_file\"")
480 DEF_INTERP_STACK_ADD(user_file,
481 (char*)(parameters[0].str_value),
482 (char*)(field_buffer->src.grid_name),
483 (char*)(field_buffer->tgt.grid_name)),
484 char const * src_grid_name;
485 char const * tgt_grid_name;
486 DEF_INTERP_STACK_GET(user_file,
487 &parameter_values[0].str_value,
488 &src_grid_name, &tgt_grid_name),
492
493// interpolation method check
496 (char*)(parameters[0].str_value),
497 (char*)(parameters[1].str_value)),
499 &parameter_values[0].str_value,
500 &parameter_values[1].str_value),
507
508// interpolation method Bernstein Bezier
509DEF_INTERP_METHOD(bernstein_bezier,
512
513// interpolation method radial basis function
517 (size_t)parameters[0].int_value,
518 parameters[1].dble_value),
520 size_t n;
522 &type, &n, &parameter_values[1].dble_value)
525 "ERROR(get_interp_method_nnn): n-nearest-neighbor type missmatch");
526 parameter_values[0].int_value = (int)n;
527 parameter_values[2].enum_value = (int)0;,
529 DEF_DBLE_PARAM(rbf_scale, YAC_INTERP_RBF_SCALE_DEFAULT, -DBL_MAX, DBL_MAX),
532 DEF_NAME_TYPE_PAIR(gauss_kernel, 0)));
533
534// interpolation method creep
536 DEF_INTERP_STACK_ADD(creep, parameters[0].int_value),
538 &parameter_values[0].int_value),
540 creep_distance, YAC_INTERP_CREEP_DISTANCE_DEFAULT, -1, INT_MAX));
541
542// interpolation method user_callback
543DEF_INTERP_METHOD(user_callback,
545 parameters[0].str_value,
546 "parameter \"func_compute_weights\" "
547 "of interpolation method \"user callback\" is unset")
548 DEF_INTERP_STACK_ADD(user_callback, (char*)(parameters[0].str_value)),
549 DEF_INTERP_STACK_GET(user_callback,
550 &parameter_values[0].str_value),
554
555
556#define ADD_INTERPOLATION(NAME, TYPE) \
557 {.name = #NAME , \
558 .type = TYPE , \
559 .add_interpolation = add_interp_method_ ## NAME , \
560 .get_interpolation = get_interp_method_ ## NAME , \
561 .parameters = interp_method_parameters_ ## NAME , \
562 .num_parameters = \
563 sizeof(interp_method_parameters_ ## NAME ) / \
564 sizeof(interp_method_parameters_ ## NAME [0])}
565
566struct yac_interpolation_method {
567 char const * name;
569 void(*add_interpolation)(
570 struct field_couple_buffer * field_buffer,
572 char const * yaml_filename);
573 void(*get_interpolation)(
574 union yac_interp_stack_config_entry const * interp_stack_entry,
575 interp_method_parameter_value * parameter_values);
576 struct interp_method_parameter const * parameters;
577 size_t num_parameters;
582 ADD_INTERPOLATION(conservative, YAC_CONSERVATIVE),
583 ADD_INTERPOLATION(source_to_target_map, YAC_SOURCE_TO_TARGET_MAP),
587 ADD_INTERPOLATION(bernstein_bezier, YAC_BERNSTEIN_BEZIER),
590 ADD_INTERPOLATION(user_callback, YAC_USER_CALLBACK)};
593
594static char const * yaml_parse_string_value(
595 fy_node_t value_node, char const * name, char const * yaml_filename) {
596 char const * routine_name = "yaml_parse_string_value";
597
599 value_node && fy_node_is_scalar(value_node),
600 "unsupported node type for \"%s\" (the node is expected to be scalar)",
601 name);
602
603 return fy_node_get_scalar0(value_node);
604}
605
606static calendarType yaml_parse_calendar_value(
607 fy_node_t value_node, char const * key_name, char const * yaml_filename) {
608 char const * routine_name = "yaml_parse_calendar_value";
609
610 char const * calendar_name =
611 yaml_parse_string_value(value_node, key_name, yaml_filename);
612
613 int calendar_type =
615 calendar_types, num_calendar_types, calendar_name);
616
618 calendar_type != INT_MAX,
619 "\"%s\" is not a valid calendar name", calendar_name);
620
621 return (calendarType)calendar_type;
622}
623
624static char const * yaml_parse_timestep_value(
625 fy_node_t value_node, char const * key_name, char const * yaml_filename,
626 enum yac_time_unit_type time_unit) {
627 char const * routine_name = "yaml_parse_timestep_value";
628
630 time_unit != TIME_UNIT_UNDEFINED, "time unit is not yet defined");
632 value_node && fy_node_is_scalar(value_node),
633 "unsupported node type for \"%s\" (the node is expected to be scalar)",
634 key_name);
635 char const * timestep =
636 yaml_parse_string_value(value_node, key_name, yaml_filename);
637 char const * timestep_iso =
638 yac_time_to_ISO(timestep, time_unit);
639
641 timestep_iso, "valid to convert timestep \"%s\" to ISO 8601 format",
642 timestep);
643
644 return strdup(timestep_iso);
645}
646
648 fy_node_t value_node, char const * key_name, char const * yaml_filename) {
649 char const * routine_name = "yaml_parse_timestep_unit_value";
650
651 char const * timestep_unit_str =
652 yaml_parse_string_value(value_node, key_name, yaml_filename);
653
654 int timestep_unit =
656 timestep_units, num_timestep_units, timestep_unit_str);
657
659 timestep_unit != INT_MAX,
660 "\"%s\" is not a valid time step unit", timestep_unit_str);
661
662 return (enum yac_time_unit_type)timestep_unit;
663}
664
666 fy_node_t value_node, char const * key_name, char const * yaml_filename) {
667 char const * routine_name = "yaml_parse_time_reduction_value";
668
669 char const * time_reduction_str =
670 yaml_parse_string_value(value_node, key_name, yaml_filename);
671
672 int time_reduction =
674 time_operations, num_time_operations, time_reduction_str);
675
677 time_reduction != INT_MAX,
678 "\"%s\" is not a valid time reduction type in", time_reduction_str);
679
680 return (enum yac_reduction_type)time_reduction;
681}
682
684 fy_node_t value_node, char const * key_name, char const * yaml_filename) {
685 char const * routine_name = "yaml_parse_integer_value";
686
687 char const * integer_str =
688 yaml_parse_string_value(value_node, key_name, yaml_filename);
689
690 char * endptr;
691 long int long_value = strtol(integer_str, &endptr, 10);
692
694 (endptr != integer_str) && (*endptr == '\0') &&
695 (long_value >= INT_MIN) && (long_value <= INT_MAX),
696 "\"%s\" is not a valid integer value", integer_str);
697
698 return (int)long_value;
699}
700
702 fy_node_t value_node, char const * key_name, char const * yaml_filename) {
703 char const * routine_name = "yaml_parse_double_value";
704
705 char const * double_str =
706 yaml_parse_string_value(value_node, key_name, yaml_filename);
707
708 char * endptr;
709 double dble_value = strtod(double_str, &endptr);
710
712 (endptr != double_str) && (*endptr == '\0'),
713 "\"%s\" is not a valid double value", double_str);
714
715 return dble_value;
716}
717
719 struct yac_name_type_pair const * valid_values, size_t num_valid_values,
720 fy_node_t value_node, char const * key_name, char const * yaml_filename) {
721 char const * routine_name = "yaml_parse_enum_value";
722
723 char const * value_str =
724 yaml_parse_string_value(value_node, key_name, yaml_filename);
725
726 int value =
728 valid_values, num_valid_values, value_str);
729
731 value != INT_MAX,
732 "\"%s\" is not a valid enum value for \"%s\" ", value_str, key_name);
733
734 return value;
735}
736
738 char const ** interpolation_type_str, fy_node_t * parameter_node,
739 fy_node_t interp_method_node, char const * yaml_filename) {
740 char const * routine_name = "yaml_parse_base_interp_method_node";
741
743 fy_node_is_scalar(interp_method_node) ||
744 fy_node_is_mapping(interp_method_node),
745 "unsupported interpolation method node type "
746 "(interpolation methods are expected to be defined as either scalar "
747 "or maps)");
748
749 switch(fy_node_get_type(interp_method_node)) {
750 default:
751 case (FYNT_SCALAR):
752 *interpolation_type_str =
754 interp_method_node, "interpolation method name", yaml_filename);
755 *parameter_node = NULL;
756 break;
757
758 case (FYNT_MAPPING):
759
761 fy_node_mapping_item_count(interp_method_node) == 1,
762 "base interpolation method node is only allowed to have one pair ");
763
764 fy_node_pair_t base_interp_method_pair =
765 fy_node_mapping_get_by_index(interp_method_node, 0);
766
767 fy_node_t base_interp_method_key_node =
768 fy_node_pair_key(base_interp_method_pair);
769
770 *interpolation_type_str =
772 base_interp_method_key_node, "interpolation method name",
773 yaml_filename);
774
775 fy_node_t base_interp_method_value_node =
776 fy_node_pair_value(base_interp_method_pair);
777
779 fy_node_is_mapping(base_interp_method_value_node),
780 "unsupported base interpolation method value node type "
781 "for interpolation method \"%s\" "
782 "(interpolation method parameters are expected to be "
783 "defined as maps)", *interpolation_type_str);
784
785 *parameter_node = base_interp_method_value_node;
786 break;
787 }
788}
789
792 struct interp_method_parameter const * parameter,
793 fy_node_t value_node, char const * interpolation_name,
794 char const * yaml_filename) {
795 char const * routine_name = "yaml_parse_interp_method_parameter_value";
796
798 (parameter->type == ENUM_PARAM) ||
799 (parameter->type == INT_PARAM) ||
800 (parameter->type == DBLE_PARAM) ||
801 (parameter->type == DEG_PARAM) ||
802 (parameter->type == BOOL_PARAM) ||
803 (parameter->type == STR_PARAM),
804 "unsupported parameter type for interpolation method \"%s\"",
805 interpolation_name);
806
807 interp_method_parameter_value parameter_value;
808
809 switch(parameter->type) {
810 default:
811 case (ENUM_PARAM):
812 parameter_value.enum_value =
814 parameter->data.enum_param.valid_values,
816 value_node, "interpolation method enum parameter value",
817 yaml_filename);
818 break;
819 case (INT_PARAM):
820 parameter_value.int_value =
822 value_node, "interpolation method integer parameter value",
823 yaml_filename);
825 (parameter_value.int_value >= parameter->data.int_param.valid_min) &&
826 (parameter_value.int_value <= parameter->data.int_param.valid_max),
827 "\"%d\" is not a valid integer parameter value for parameter \"%s\" "
828 "of interpolation method \"%s\" "
829 "(valid range: %d <= value <= %d)",
830 parameter_value.int_value, parameter->name, interpolation_name,
831 parameter->data.int_param.valid_min,
832 parameter->data.int_param.valid_max);
833 break;
834 case (DBLE_PARAM):
835 parameter_value.dble_value =
837 value_node, "interpolation method double parameter value",
838 yaml_filename);
840 (parameter_value.dble_value >= parameter->data.dble_param.valid_min) &&
841 (parameter_value.dble_value <= parameter->data.dble_param.valid_max),
842 "\"%lf\" is not a valid double parameter value for parameter \"%s\" "
843 "of interpolation method \"%s\" "
844 "(valid range: %e <= value <= %e)",
845 parameter_value.dble_value, parameter->name, interpolation_name,
846 parameter->data.dble_param.valid_min,
847 parameter->data.dble_param.valid_max);
848 break;
849 case (DEG_PARAM):
850 parameter_value.dble_value =
852 value_node, "interpolation method double parameter value",
853 yaml_filename);
855 (parameter_value.dble_value >= parameter->data.dble_param.valid_min) &&
856 (parameter_value.dble_value <= parameter->data.dble_param.valid_max),
857 "\"%lf\" is not a valid double parameter value for parameter \"%s\" "
858 "of interpolation method \"%s\" "
859 "(valid range: %e <= value <= %e)",
860 parameter_value.dble_value, parameter->name, interpolation_name,
861 parameter->data.dble_param.valid_min,
862 parameter->data.dble_param.valid_max);
863 parameter_value.dble_value *= YAC_RAD;
864 break;
865 case (BOOL_PARAM):
866 parameter_value.bool_value =
868 bool_names, num_bool_names, value_node,
869 "interpolation method bool parameter value", yaml_filename);
870 break;
871 case (STR_PARAM):
872 parameter_value.str_value =
874 value_node, "interpolation method string parameter value",
875 yaml_filename);
877 strlen(parameter_value.str_value) <
878 parameter->data.str_param.max_str_len,
879 "\"%s\" is not a valid string parameter value for parameter \"%s\" "
880 "of interpolation method \"%s\" "
881 "(maximum string length: %d)",
882 parameter_value.str_value, parameter->name, interpolation_name,
883 (int)(parameter->data.str_param.max_str_len - 1));
884 break;
885 };
886
887 return parameter_value;
888}
889
891 interp_method_parameter_value * parameter_values,
892 struct interp_method_parameter const * parameters, size_t num_parameters,
893 fy_node_pair_t parameter_pair, char const * interpolation_name,
894 char const * yaml_filename) {
895 char const * routine_name = "yaml_parse_interp_method_parameter";
896
897 char const * parameter_name =
899 fy_node_pair_key(parameter_pair),
900 "interpolation method parameter name", yaml_filename);
901
902 int found_flag = 0;
903 for (int i = 0; (i < num_parameters) && !found_flag; ++i)
904 if ((found_flag = !strcmp(parameter_name, parameters[i].name)))
905 parameter_values[i] =
907 &parameters[i], fy_node_pair_value(parameter_pair),
908 interpolation_name, yaml_filename);
909
911 found_flag,
912 "\"%s\" is not a valid parameter for interpolation method \"%s\"",
913 parameter_name, interpolation_name);
914}
915
917 interp_method_parameter_value * parameter_values,
918 struct yac_interpolation_method const * interp_method,
919 fy_node_t parameter_node, char const * yaml_filename) {
920 char const * routine_name = "yaml_parse_interp_method_parameters";
921
922 // set default parameter values
923 for (size_t i = 0; i < interp_method->num_parameters; ++i)
924 parameter_values[i] = interp_method->parameters[i].default_value;
925
926 // if there are no parameters
927 if (!parameter_node) return;
928
930 fy_node_is_mapping(parameter_node),
931 "unsupported interpolation method parameter node type "
932 "for interpolation method \"%s\" "
933 "(interpolation method parameters are expected to be defined as maps)",
934 interp_method->name);
935
936 // parse parameter
937 void * iter = NULL;
938 fy_node_pair_t pair;
939 while ((pair = fy_node_mapping_iterate(parameter_node, &iter)))
941 parameter_values, interp_method->parameters,
942 interp_method->num_parameters, pair, interp_method->name,
943 yaml_filename);
944}
945
947 struct field_couple_buffer * field_buffer,
948 fy_node_t interp_method_node, char const * yaml_filename) {
949 char const * routine_name = "yaml_parse_interp_method";
950
951 char const * interpolation_type_str;
952 fy_node_t parameter_node;
953
955 &interpolation_type_str, &parameter_node,
956 interp_method_node, yaml_filename);
957
958 struct yac_interpolation_method const * interp_method = NULL;
959
960 for (int i = 0; (i < num_interpolation_methods) && (!interp_method); ++i)
961 if (!strcmp(interpolation_type_str, interpolation_methods[i].name))
963
966 "\"%s\" is not a valid interpolation method",
967 interpolation_type_str);
968
970 interp_method_paramter_values[interp_method->num_parameters];
972 interp_method_paramter_values, interp_method,
973 parameter_node, yaml_filename);
974 interp_method->add_interpolation(
975 field_buffer, interp_method_paramter_values, yaml_filename);
976}
977
979 struct field_couple_buffer * field_buffer,
980 fy_node_t interp_stack_node, char const * yaml_filename) {
981 char const * routine_name = "yaml_parse_interp_stack_value";
982
984 fy_node_is_sequence(interp_stack_node),
985 "unsupported interpolation stack node type"
986 "(interpolation stacks are expected to be defined as a sequence)");
987
988 // parse couplings
989 void * iter = NULL;
990 fy_node_t interp_stack_item;
991 while ((interp_stack_item =
992 fy_node_sequence_iterate(interp_stack_node, &iter)))
994 field_buffer, interp_stack_item, yaml_filename);
995}
996
997static struct field_couple_field_names yaml_parse_field_name(
998 fy_node_t field_node, const char * yaml_filename) {
999 char const * routine_name = "yaml_parse_field_name";
1000
1002 fy_node_is_scalar(field_node) ||
1003 fy_node_is_mapping(field_node),
1004 "unsupported field name node type "
1005 "(field name is either scalars or a map)");
1006
1007 struct field_couple_field_names field_name;
1008
1009 // if the node contains one name for both source and target field
1010 if (fy_node_is_scalar(field_node)) {
1011
1012 field_name.src =
1013 ((field_name.tgt =
1014 yaml_parse_string_value(field_node, "field name", yaml_filename)));
1015
1016 // if the node contains different names for the source and target field
1017 } else {
1018 field_name.src =
1019 fy_node_mapping_lookup_scalar0_by_simple_key(
1020 field_node, "src", (size_t)-1);
1021 field_name.tgt =
1022 fy_node_mapping_lookup_scalar0_by_simple_key(
1023 field_node, "tgt", (size_t)-1);
1024
1026 field_name.src && field_name.tgt &&
1027 (fy_node_mapping_item_count(field_node) == 2),
1028 "invalid field name mapping node "
1029 "(field name mapping node has to contain two maps "
1030 "with the keys \"src\" and \"tgt\")")
1031 }
1032
1033 return field_name;
1034}
1035
1037 char const *** values, size_t * num_values,
1038 fy_node_t values_node, char const * sequence_name,
1039 const char * yaml_filename) {
1040 char const * routine_name = "yaml_parse_string_sequence";
1041
1043 (*values == NULL) && (*num_values == 0),
1044 "values have already been set for sequence \"%s\"",
1045 sequence_name);
1046
1047 // if the field node contains multiple fields
1048 if (fy_node_is_sequence(values_node)) {
1049
1050 *num_values = (size_t)fy_node_sequence_item_count(values_node);
1051 *values = xmalloc(*num_values * sizeof(**values));
1052 for (size_t value_idx = 0; value_idx < *num_values; ++value_idx)
1053 (*values)[value_idx] =
1055 fy_node_sequence_get_by_index(values_node, value_idx),
1056 sequence_name, yaml_filename);
1057 } else {
1058 *num_values = 1;
1059 *values = xmalloc(sizeof(**values));
1060 **values =
1062 values_node, sequence_name, yaml_filename);
1063 }
1064}
1065
1067 struct field_couple_field_names ** field_names,
1068 size_t * num_field_names, fy_node_t fields_node,
1069 const char * yaml_filename) {
1070
1071 // if the field node contains multiple fields
1072 if (fy_node_is_sequence(fields_node)) {
1073
1074 size_t start_idx = *num_field_names;
1075 *num_field_names += (size_t)fy_node_sequence_item_count(fields_node);
1076 *field_names =
1077 xrealloc(*field_names, *num_field_names * sizeof(**field_names));
1078 for (size_t i = start_idx; i < *num_field_names; ++i)
1079 (*field_names)[i] =
1081 fy_node_sequence_get_by_index(fields_node, i), yaml_filename);
1082 } else {
1083 ++*num_field_names;
1084 *field_names =
1085 xrealloc(*field_names, *num_field_names * sizeof(**field_names));
1086 (*field_names)[*num_field_names-1] =
1087 yaml_parse_field_name(fields_node, yaml_filename);
1088 }
1089}
1090
1092 struct field_couple_buffer * field_buffer,
1093 fy_node_pair_t couple_pair, const char * yaml_filename,
1094 enum yac_time_unit_type time_unit) {
1095
1096 enum yaml_couple_key_types couple_key_type =
1099 yaml_couple_keys, num_yaml_couple_keys,
1100 fy_node_pair_key(couple_pair),
1101 "couple configuration parameter name", yaml_filename);
1102 char const * couple_key_name =
1104 yaml_couple_keys, num_yaml_couple_keys, couple_key_type);
1105
1106 fy_node_t value_node = fy_node_pair_value(couple_pair);
1107
1108 switch (couple_key_type) {
1109 default:
1110 case (SOURCE_COMPONENT):
1111 field_buffer->src.comp_name =
1112 yaml_parse_string_value(value_node, couple_key_name, yaml_filename);
1113 break;
1114 case (SOURCE_GRID):
1115 field_buffer->src.grid_name =
1116 yaml_parse_string_value(value_node, couple_key_name, yaml_filename);
1117 break;
1118 case (TARGET_COMPONENT):
1119 field_buffer->tgt.comp_name =
1120 yaml_parse_string_value(value_node, couple_key_name, yaml_filename);
1121 break;
1122 case (TARGET_GRID):
1123 field_buffer->tgt.grid_name =
1124 yaml_parse_string_value(value_node, couple_key_name, yaml_filename);
1125 break;
1126 case (FIELD):
1128 &(field_buffer->field_names),
1129 &(field_buffer->num_field_names),
1130 value_node, yaml_filename);
1131 break;
1132 case (COUPLING_PERIOD):
1133 field_buffer->coupling_period =
1135 value_node, couple_key_name, yaml_filename, time_unit);
1136 break;
1137 case (TIME_REDUCTION):
1138 field_buffer->time_reduction =
1140 value_node, couple_key_name, yaml_filename);
1141 break;
1142 case (SOURCE_LAG):
1143 field_buffer->src.lag =
1145 value_node, couple_key_name, yaml_filename);
1146 break;
1147 case (TARGET_LAG):
1148 field_buffer->tgt.lag =
1150 value_node, couple_key_name, yaml_filename);
1151 break;
1152 case (WEIGHT_FILE_NAME):
1153 field_buffer->weight_file_name =
1155 value_node, couple_key_name, yaml_filename);
1156 break;
1157 case (MAPPING_SIDE):
1158 field_buffer->mapping_on_source =
1160 mapping_sides, num_mapping_sides,
1161 value_node, couple_key_name, yaml_filename);
1162 break;
1163 case (SCALE_FACTOR):
1164 field_buffer->scale_factor =
1166 value_node, couple_key_name, yaml_filename);
1167 break;
1168 case (SCALE_SUMMAND):
1169 field_buffer->scale_summand =
1171 value_node, couple_key_name, yaml_filename);
1172 break;
1173 case (INTERPOLATION):
1175 field_buffer, value_node, yaml_filename);
1176 break;
1177 case (SOURCE_MASK_NAME):
1178 case (SOURCE_MASK_NAMES):
1180 &(field_buffer->src_mask_names),
1181 &(field_buffer->num_src_mask_names),
1182 value_node, couple_key_name, yaml_filename);
1183 break;
1184 case (TARGET_MASK_NAME):
1185 field_buffer->tgt_mask_name =
1187 value_node, couple_key_name, yaml_filename);
1188 break;
1189 }
1190}
1191
1193 struct yac_couple_config * couple_config, fy_node_t couple_node,
1194 char const * yaml_filename, enum yac_time_unit_type time_unit) {
1195 char const * routine_name = "yaml_parse_couple";
1196
1198 fy_node_is_mapping(couple_node),
1199 "unsupported couple node type "
1200 "(couples are expected to be defined as a mapping)");
1201
1202 // initialise field configuration buffer with default values
1203 struct field_couple_buffer field_buffer = {
1204 .src.comp_name = NULL,
1205 .src.grid_name = NULL,
1206 .tgt.comp_name = NULL,
1207 .tgt.grid_name = NULL,
1208 .field_names = NULL,
1209 .num_field_names = 0,
1210 .coupling_period = NULL,
1211 .time_reduction = TIME_NONE,
1212 .interp_stack = yac_interp_stack_config_new(),
1213 .src.lag = 0,
1214 .tgt.lag = 0,
1215 .weight_file_name = NULL,
1216 .mapping_on_source = 1,
1217 .scale_factor = 1.0,
1218 .scale_summand = 0.0,
1219 .src_mask_names = NULL,
1220 .num_src_mask_names = 0,
1221 .tgt_mask_name = NULL};
1222
1223 // parse couple
1224 void * iter = NULL;
1225 fy_node_pair_t pair;
1226 while ((pair = fy_node_mapping_iterate(couple_node, &iter)))
1228 &field_buffer, pair, yaml_filename, time_unit);
1229
1231 field_buffer.src.comp_name, "missing source component name");
1233 field_buffer.src.grid_name,
1234 "missing source grid name (component \"%s\")",
1235 field_buffer.src.comp_name);
1237 field_buffer.tgt.comp_name,
1238 "missing target component name");
1240 field_buffer.tgt.grid_name,
1241 "missing target grid name (component \"%s\")",
1242 field_buffer.tgt.comp_name);
1244 field_buffer.num_field_names > 0,
1245 "missing field names "
1246 "(source component \"%s\" source grid \"%s\" "
1247 "target component \"%s\" target grid \"%s\")",
1248 field_buffer.src.comp_name, field_buffer.src.grid_name,
1249 field_buffer.tgt.comp_name, field_buffer.tgt.grid_name);
1251 field_buffer.coupling_period,
1252 "missing coupling period "
1253 "(source component \"%s\" source grid \"%s\" "
1254 "target component \"%s\" target grid \"%s\")",
1255 field_buffer.src.comp_name, field_buffer.src.grid_name,
1256 field_buffer.tgt.comp_name, field_buffer.tgt.grid_name);
1257
1258 for (size_t i = 0; i < field_buffer.num_field_names; ++i)
1260 couple_config,
1261 field_buffer.src.comp_name,
1262 field_buffer.src.grid_name,
1263 field_buffer.field_names[i].src,
1264 field_buffer.tgt.comp_name,
1265 field_buffer.tgt.grid_name,
1266 field_buffer.field_names[i].tgt,
1267 field_buffer.coupling_period,
1268 field_buffer.time_reduction,
1269 field_buffer.interp_stack,
1270 field_buffer.src.lag,
1271 field_buffer.tgt.lag,
1272 field_buffer.weight_file_name,
1273 field_buffer.mapping_on_source,
1274 field_buffer.scale_factor,
1275 field_buffer.scale_summand,
1276 field_buffer.num_src_mask_names,
1277 field_buffer.src_mask_names,
1278 field_buffer.tgt_mask_name);
1279
1280 // cleanup
1281 free((void*)field_buffer.field_names);
1282 free((void*)field_buffer.coupling_period);
1284}
1285
1287 struct yac_couple_config * couple_config,
1288 fy_node_t coupling_node, char const * yaml_filename,
1289 enum yac_time_unit_type time_unit) {
1290 char const * routine_name = "yaml_parse_coupling";
1291
1292 // check if the coupling node is empty -> nothing to be read
1293 if (!coupling_node) return;
1294
1296 fy_node_is_sequence(coupling_node),
1297 "unsupported coupling node type "
1298 "(couplings are expected to be defined as a sequence)");
1299
1300 // parse couplings
1301 void * iter = NULL;
1302 fy_node_t couple_node;
1303 while ((couple_node = fy_node_sequence_iterate(coupling_node, &iter)))
1304 yaml_parse_couple(couple_config, couple_node, yaml_filename, time_unit);
1305}
1306
1308 struct yac_couple_config * couple_config, fy_node_pair_t base_pair,
1309 const char * yaml_filename, enum yac_time_unit_type * time_unit) {
1310 char const * routine_name = "yaml_parse_base_map_pair";
1311
1312 fy_node_t key_node = fy_node_pair_key(base_pair);
1313
1315 fy_node_is_scalar(key_node),
1316 "unsupported key node type "
1317 "(key nodes are expected to be scalar nodes)");
1318
1319 char const * base_key_name = fy_node_get_scalar0(key_node);
1320 int base_key_type =
1322 yaml_base_keys, num_yaml_base_keys, base_key_name);
1323
1325 (base_key_type == INT_MAX) || // for unknown keys, which are skipped
1326 (base_key_type == START_DATE) ||
1327 (base_key_type == END_DATE) ||
1328 (base_key_type == CALENDAR) ||
1329 (base_key_type == TIMESTEP_UNIT) ||
1330 (base_key_type == COUPLING),
1331 "unsupported base key name \"%s\"",
1332 base_key_name);
1333
1334 fy_node_t value_node = fy_node_pair_value(base_pair);
1335
1336 switch (base_key_type) {
1337 case (START_DATE):
1339 couple_config,
1341 value_node, base_key_name, yaml_filename), NULL);
1342 break;
1343 case (END_DATE):
1345 couple_config, NULL,
1347 value_node, base_key_name, yaml_filename));
1348 break;
1349 case (CALENDAR):
1352 value_node, base_key_name, yaml_filename));
1353 break;
1354 case (TIMESTEP_UNIT): {
1355 enum yac_time_unit_type time_unit_ =
1357 value_node, base_key_name, yaml_filename);
1359 (*time_unit == TIME_UNIT_UNDEFINED) || (*time_unit == time_unit_),
1360 "inconsistent redefinition of time unit")
1361 *time_unit = time_unit_;
1362 break;
1363 }
1364 case (COUPLING):
1366 (*time_unit != TIME_UNIT_UNDEFINED),
1367 "time unit has to be defined before the couplings")
1369 couple_config, value_node, yaml_filename, *time_unit);
1370 break;
1371 default:
1372 // nothing to be done
1373 break;
1374 }
1375}
1376
1378 struct yac_couple_config * couple_config, fy_document_t document,
1379 const char * yaml_filename) {
1380 char const * routine_name = "yaml_parse_document";
1381
1382 // get root node of document
1383 fy_node_t root_node = fy_document_root(document);
1384
1385 // if the configuration file is empty
1386 if (!root_node) return;
1387
1389 fy_node_is_mapping(root_node),
1390 "unsupported root node type (root node is expected to be a mapping node)");
1391
1392 // parse base root mappings
1393 enum yac_time_unit_type time_unit = TIME_UNIT_UNDEFINED;
1394 void * iter = NULL;
1395 fy_node_pair_t pair;
1396 while ((pair = fy_node_mapping_iterate(root_node, &iter)))
1397 yaml_parse_base_map_pair(couple_config, pair, yaml_filename, &time_unit);
1398}
1399
1401 struct yac_couple_config * couple_config, const char * yaml_filename,
1402 int parse_flags) {
1403 char const * routine_name = "yac_yaml_read_coupling";
1404
1405 // check whether the yaml configuration file exists
1407 yac_file_exists(yaml_filename),
1408 "ERROR(%s): YAML configuration file could not be found \"%s\"",
1409 routine_name, yaml_filename);
1410
1411 // open yaml configuration file
1412 FILE * config_file = xfopen(yaml_filename, "r");
1414 config_file,
1415 "ERROR(%s): could not open YAML configuration file \"%s\"",
1416 routine_name, yaml_filename);
1417
1418 // parse yaml configuration file into document
1419 struct fy_parse_cfg parse_config =
1420 {.search_path = ".",
1421 .userdata = NULL,
1422 .diag = NULL};
1423 parse_config.flags =
1424 (enum fy_parse_cfg_flags)parse_flags;
1425
1426 fy_document_t document =
1427 fy_document_build_from_fp(&parse_config, config_file);
1429 document,
1430 "ERROR(%s): could not parse YAML configuration file \"%s\"",
1431 routine_name, yaml_filename);
1432
1433 // resolve anchors and merge keys
1435 !fy_document_resolve(document),
1436 "could not resolve anchors and merge keys");
1437
1438 // parse document into couple configuration
1439 yaml_parse_document(couple_config, document, yaml_filename);
1440
1441 // cleanup
1442 fy_document_destroy(document);
1443 xfclose(config_file);
1444
1445 return;
1446}
1447
1449 fy_document_t document, char const * value) {
1450
1451 // return NULL if value is empty
1452 if (!value) return (fy_node_t)NULL;
1453
1454 fy_node_t scalar_node =
1455 fy_node_create_scalar_copy(document, value, strlen(value));
1456 YAC_ASSERT(
1457 scalar_node,
1458 "ERROR(yac_yaml_create_scalar): failed to create scalar node");
1459
1460 return scalar_node;
1461}
1462
1464 fy_document_t document, int value) {
1465
1466 char str_value[16];
1467 int value_size = snprintf(str_value, sizeof(str_value), "%d", value);
1469 value_size < sizeof(str_value),
1470 "ERROR(yac_yaml_create_scalar_int): "
1471 "value \"%d\" is too big for string buffer", value);
1472
1473 return yac_yaml_create_scalar(document, str_value);
1474}
1475
1477 fy_document_t document, double value) {
1478
1479 char str_value[32];
1480 int value_size = snprintf(str_value, sizeof(str_value), "%g", value);
1482 value_size < sizeof(str_value),
1483 "ERROR(yac_yaml_create_scalar_dble): "
1484 "value \"%g\" is too big for string buffer", value);
1485
1486 return yac_yaml_create_scalar(document, str_value);
1487}
1488
1490 fy_document_t document, char const * const * values, size_t num_values) {
1491
1492 // return NULL if sequence is empty
1493 if (num_values == 0) return (fy_node_t)NULL;
1494
1495 YAC_ASSERT(
1496 values, "ERROR(yac_yaml_create_sequence_scalar): no values provided");
1497
1498 // create sequence node
1499 fy_node_t sequence_node = fy_node_create_sequence(document);
1500 YAC_ASSERT(
1501 sequence_node, "ERROR(yac_yaml_create_sequence_scalar): "
1502 "failed to create sequence node");
1503
1504 for (size_t value_idx = 0; value_idx < num_values; ++value_idx) {
1505 char const * value = values[value_idx];
1507 value, "ERROR(yac_yaml_create_sequence_scalar): "
1508 "invalid value at idx %zu", value_idx);
1509 int appending_failed =
1510 fy_node_sequence_append(
1511 sequence_node, yac_yaml_create_scalar(document, value));
1512 YAC_ASSERT(
1513 !appending_failed, "ERROR(yac_yaml_create_sequence_scalar): "
1514 "failed to append interpolation node");
1515 }
1516
1517 return sequence_node;
1518}
1519
1521 fy_node_t map, char const * key, fy_node_t value) {
1522
1523 // if the value node is empty, return
1524 if (!value) return;
1525
1526 YAC_ASSERT(
1527 key, "ERROR(yac_yaml_map_append): NULL key is not supported");
1528
1529 fy_document_t document = fy_node_document(map);
1530 YAC_ASSERT(
1531 document,
1532 "ERROR(yac_yaml_map_append): failed to get document from node");
1533
1534 // set key and value for root node
1535 int appending_failed =
1536 fy_node_mapping_append(
1537 map, yac_yaml_create_scalar(document, key), value);
1538 YAC_ASSERT(
1539 !appending_failed,
1540 "ERROR(yac_yaml_map_append): failed to append mapping node pair");
1541}
1542
1544 fy_node_t map, char const * key, char const * value) {
1545
1546 fy_document_t document = fy_node_document(map);
1547 YAC_ASSERT(
1548 document, "ERROR(yac_yaml_map_append_scalar): "
1549 "failed to get document from node");
1550
1552}
1553
1555 fy_node_t map, char const * key, int value) {
1556
1557 fy_document_t document = fy_node_document(map);
1558 YAC_ASSERT(
1559 document, "ERROR(yac_yaml_map_append_scalar_int): "
1560 "failed to get document from node");
1561
1563 map, key, yac_yaml_create_scalar_int(document, value));
1564}
1565
1567 fy_node_t map, char const * key, double value) {
1568
1569 fy_document_t document = fy_node_document(map);
1570 YAC_ASSERT(
1571 document, "ERROR(yac_yaml_map_append_scalar_dble): "
1572 "failed to get document from node");
1573
1575 map, key, yac_yaml_create_scalar_dble(document, value));
1576}
1577
1579 fy_document_t document, struct yac_couple_config * couple_config,
1580 size_t couple_idx, size_t field_couple_idx) {
1581
1582 const char * src_field_name;
1583 const char * tgt_field_name;
1585 couple_config, couple_idx, field_couple_idx,
1586 &src_field_name, &tgt_field_name);
1587
1588 // if both names are identical
1589 if (!strcmp(src_field_name, tgt_field_name))
1590 return yac_yaml_create_scalar(document, src_field_name);
1591
1592 // create field name node
1593 fy_node_t field_name_node = fy_node_create_mapping(document);
1594 YAC_ASSERT(
1595 field_name_node, "ERROR(yac_yaml_create_field_name_node): "
1596 "failed to create mapping node");
1597
1598 // add source field name
1599 yac_yaml_map_append_scalar(field_name_node, "src", src_field_name);
1600
1601 // add target field name
1602 yac_yaml_map_append_scalar(field_name_node, "tgt", tgt_field_name);
1603
1604 return field_name_node;
1605}
1606
1608 fy_node_t map,
1609 struct interp_method_parameter const * parameter,
1611
1612 YAC_ASSERT(
1613 (parameter->type == ENUM_PARAM) ||
1614 (parameter->type == INT_PARAM) ||
1615 (parameter->type == DBLE_PARAM) ||
1616 (parameter->type == BOOL_PARAM) ||
1617 (parameter->type == STR_PARAM) ||
1618 (parameter->type == DEG_PARAM),
1619 "ERROR(yac_yaml_map_append_parameter): unsupported parameter type");
1620
1621 char const * key = parameter->name;
1622
1623 switch (parameter->type) {
1624 default:
1625 case (ENUM_PARAM): {
1627 map, key,
1629 parameter->data.enum_param.valid_values,
1630 parameter->data.enum_param.num_valid_values,
1631 value.enum_value));
1632 break;
1633 }
1634 case (INT_PARAM): {
1635 yac_yaml_map_append_scalar_int(map, key, value.int_value);
1636 break;
1637 }
1638 case (DEG_PARAM):
1639 case (DBLE_PARAM): {
1640 yac_yaml_map_append_scalar_dble(map, key, value.dble_value);
1641 break;
1642 }
1643 case (BOOL_PARAM): {
1645 map, key,
1647 bool_names, num_bool_names, value.bool_value));
1648 break;
1649 }
1650 case (STR_PARAM): {
1651 yac_yaml_map_append_scalar(map, key, value.str_value);
1652 break;
1653 }
1654 };
1655}
1656
1661
1662 YAC_ASSERT(
1663 (type == ENUM_PARAM) ||
1664 (type == INT_PARAM) ||
1665 (type == DBLE_PARAM) ||
1666 (type == BOOL_PARAM) ||
1667 (type == STR_PARAM) ||
1668 (type == DEG_PARAM),
1669 "ERROR(compare_parameter_values): "
1670 "invalid interpolation method parameter value type");
1671
1672 switch (type) {
1673 default:
1674 case (ENUM_PARAM):
1675 return
1676 (a->enum_value > b->enum_value) - (a->enum_value < b->enum_value);
1677 case (INT_PARAM):
1678 return
1679 (a->int_value > b->int_value) - (a->int_value < b->int_value);
1680 case (DEG_PARAM):
1681 case (DBLE_PARAM):
1682 return
1683 (a->dble_value > b->dble_value) - (a->dble_value < b->dble_value);
1684 case (BOOL_PARAM):
1685 return
1686 (a->bool_value > b->bool_value) - (a->bool_value < b->bool_value);
1687 case (STR_PARAM):
1688 if ((a->str_value != NULL) && (b->str_value != NULL))
1689 return strcmp(a->str_value, b->str_value);
1690 else
1691 return (a->str_value != NULL) - (b->str_value != NULL);
1692 }
1693}
1694
1696 fy_document_t document,
1697 union yac_interp_stack_config_entry const * interp_stack_entry) {
1698
1699 enum yac_interpolation_list interp_type =
1700 yac_interp_stack_config_entry_get_type(interp_stack_entry);
1701
1702 struct yac_interpolation_method const * interp_method = NULL;
1703 for (size_t i = 0;
1705 if (interpolation_methods[i].type == interp_type)
1707
1708 struct interp_method_parameter const * parameters =
1709 interp_method->parameters;
1710 size_t num_parameters = interp_method->num_parameters;
1711
1713 parameter_values[MAX(num_parameters,1)];
1714 for (size_t param_idx = 0; param_idx < num_parameters; ++param_idx)
1715 parameter_values[param_idx] = parameters[param_idx].default_value;
1716
1717 interp_method->get_interpolation(interp_stack_entry, parameter_values);
1718
1719 // create parameter node
1720 fy_node_t parameter_node = fy_node_create_mapping(document);
1721 YAC_ASSERT(
1722 parameter_node, "ERROR(yac_yaml_create_interpolation_node): "
1723 "failed to create mapping node");
1724
1725 size_t num_non_default_parameters = 0;
1726 for (size_t param_idx = 0; param_idx < num_parameters; ++param_idx) {
1728 &parameters[param_idx].default_value,
1729 parameter_values + param_idx, parameters[param_idx].type)) {
1730 ++num_non_default_parameters;
1732 parameter_node, parameters + param_idx,
1733 parameter_values[param_idx]);
1734 }
1735 }
1736
1737 fy_node_t interpolation_node;
1738 if (num_non_default_parameters) {
1739
1740 // create interpolation node
1741 interpolation_node = fy_node_create_mapping(document);
1742 YAC_ASSERT(
1743 interpolation_node, "ERROR(yac_yaml_create_interpolation_node): "
1744 "failed to create mapping node");
1745
1747 interpolation_node, interp_method->name, parameter_node);
1748 } else {
1749
1750 // free parameter node
1751 fy_node_free(parameter_node);
1752
1753 interpolation_node =
1754 yac_yaml_create_scalar(document, interp_method->name);
1755 }
1756
1757 return interpolation_node;
1758}
1759
1761 fy_document_t document, struct yac_couple_config * couple_config,
1762 size_t couple_idx, size_t field_couple_idx) {
1763
1764 struct yac_interp_stack_config * interp_stack =
1766 couple_config, couple_idx, field_couple_idx);
1767
1768 YAC_ASSERT(
1769 interp_stack, "ERROR(yac_yaml_create_interpolation_stack_node): "
1770 "invalid interpolation stack");
1771
1772 // create interpolation stack node
1773 fy_node_t interp_stack_node = fy_node_create_sequence(document);
1774 YAC_ASSERT(
1775 interp_stack_node, "ERROR(yac_yaml_create_interpolation_stack_node): "
1776 "failed to create sequence node");
1777
1778 size_t interp_stack_size =
1780 YAC_ASSERT(
1781 interp_stack_size, "ERROR(yac_yaml_create_interpolation_stack_node): "
1782 "invalid interpolation stack size");
1783
1784 for (size_t interp_stack_idx = 0; interp_stack_idx < interp_stack_size;
1785 ++interp_stack_idx) {
1786 int appending_failed =
1787 fy_node_sequence_append(
1788 interp_stack_node,
1790 document,
1792 interp_stack, interp_stack_idx)));
1793 YAC_ASSERT(
1794 !appending_failed,
1795 "ERROR(yac_yaml_create_interpolation_stack_node): "
1796 "failed to append interpolation node");
1797 }
1798
1799 return interp_stack_node;
1800}
1801
1803 fy_node_t coupling_node, struct yac_couple_config * couple_config,
1804 size_t couple_idx, size_t field_couple_idx) {
1805
1806 fy_document_t document = fy_node_document(coupling_node);
1807 YAC_ASSERT(
1808 document, "ERROR(yac_yaml_append_couple_field_nodes): "
1809 "failed to get document from node");
1810
1811 // create couple node
1812 fy_node_t field_couple_node = fy_node_create_mapping(document);
1813 YAC_ASSERT(
1814 coupling_node, "ERROR(yac_yaml_append_couple_field_nodes): "
1815 "failed to create mapping node");
1816
1817 // get component names
1818 char const * src_component_name;
1819 char const * tgt_component_name;
1821 couple_config, couple_idx, field_couple_idx,
1822 &src_component_name, &tgt_component_name);
1823
1824 // add source component name
1826 field_couple_node,
1828 yaml_couple_keys, num_yaml_couple_keys, SOURCE_COMPONENT),
1829 src_component_name);
1830
1831 // add target component name
1833 field_couple_node,
1835 yaml_couple_keys, num_yaml_couple_keys, TARGET_COMPONENT),
1836 tgt_component_name);
1837
1838 // get grid names
1839 char const * src_grid_name;
1840 char const * tgt_grid_name;
1842 couple_config, couple_idx, field_couple_idx,
1843 &src_grid_name, &tgt_grid_name);
1844
1845 // add source grid name
1847 field_couple_node,
1849 yaml_couple_keys, num_yaml_couple_keys, SOURCE_GRID),
1850 src_grid_name);
1851
1852 // add target grid name
1854 field_couple_node,
1856 yaml_couple_keys, num_yaml_couple_keys, TARGET_GRID),
1857 tgt_grid_name);
1858
1859 // add field names
1861 field_couple_node,
1863 yaml_couple_keys, num_yaml_couple_keys, FIELD),
1865 document, couple_config, couple_idx, field_couple_idx));
1866
1867 // add coupling period
1869 field_couple_node,
1871 yaml_couple_keys, num_yaml_couple_keys, COUPLING_PERIOD),
1873 couple_config, couple_idx, field_couple_idx));
1874
1875 // add time reduction
1877 field_couple_node,
1879 yaml_couple_keys, num_yaml_couple_keys, TIME_REDUCTION),
1881 time_operations, num_time_operations,
1883 couple_config, couple_idx, field_couple_idx)));
1884
1885 // add source lag
1887 field_couple_node,
1889 yaml_couple_keys, num_yaml_couple_keys, SOURCE_LAG),
1891 couple_config, couple_idx, field_couple_idx));
1892
1893 // add target lag
1895 field_couple_node,
1897 yaml_couple_keys, num_yaml_couple_keys, TARGET_LAG),
1899 couple_config, couple_idx, field_couple_idx));
1900
1901 // add weight file name
1903 couple_config, couple_idx, field_couple_idx))
1905 field_couple_node,
1907 yaml_couple_keys, num_yaml_couple_keys, WEIGHT_FILE_NAME),
1909 couple_config, couple_idx, field_couple_idx));
1910
1911 // add mapping side
1913 field_couple_node,
1915 yaml_couple_keys, num_yaml_couple_keys, MAPPING_SIDE),
1917 mapping_sides, num_mapping_sides,
1919 couple_config, couple_idx, field_couple_idx)));
1920
1921 // add scale factor
1923 field_couple_node,
1925 yaml_couple_keys, num_yaml_couple_keys, SCALE_FACTOR),
1927 couple_config, couple_idx, field_couple_idx));
1928
1929 // add scale summand
1931 field_couple_node,
1933 yaml_couple_keys, num_yaml_couple_keys, SCALE_SUMMAND),
1935 couple_config, couple_idx, field_couple_idx));
1936
1937 // add interpolation
1939 field_couple_node,
1941 yaml_couple_keys, num_yaml_couple_keys, INTERPOLATION),
1943 document, couple_config, couple_idx, field_couple_idx));
1944
1945 // add source mask names
1946 char const * const * src_mask_names;
1947 size_t num_src_mask_names;
1949 couple_config, couple_idx, field_couple_idx,
1950 &src_mask_names, &num_src_mask_names);
1951 if (num_src_mask_names == 1)
1953 field_couple_node,
1955 yaml_couple_keys, num_yaml_couple_keys, SOURCE_MASK_NAME),
1956 src_mask_names[0]);
1957 else if (num_src_mask_names > 1)
1959 field_couple_node,
1961 yaml_couple_keys, num_yaml_couple_keys, SOURCE_MASK_NAMES),
1963 document, src_mask_names, num_src_mask_names));
1964
1965 // add target mask name
1966 char const * tgt_mask_name =
1968 couple_config, couple_idx, field_couple_idx);
1969 if (tgt_mask_name)
1971 field_couple_node,
1973 yaml_couple_keys, num_yaml_couple_keys, TARGET_MASK_NAME),
1974 tgt_mask_name);
1975
1976 int appending_failed =
1977 fy_node_sequence_append(coupling_node, field_couple_node);
1978 YAC_ASSERT(
1979 !appending_failed,
1980 "ERROR(yac_yaml_append_couple_field_nodes): "
1981 "failed to append field couple node");
1982}
1983
1985 fy_node_t coupling_node, struct yac_couple_config * couple_config,
1986 size_t couple_idx) {
1987
1988 size_t num_couple_fields =
1989 yac_couple_config_get_num_couple_fields(couple_config, couple_idx);
1990
1991 for (size_t field_couple_idx = 0;
1992 field_couple_idx < num_couple_fields; ++field_couple_idx)
1994 coupling_node, couple_config, couple_idx, field_couple_idx);
1995}
1996
1998 fy_document_t document, struct yac_couple_config * couple_config) {
1999
2000 size_t num_couples =
2001 yac_couple_config_get_num_couples(couple_config);
2002
2003 if (!num_couples) return NULL;
2004
2005 // create coupling node
2006 fy_node_t coupling_node = fy_node_create_sequence(document);
2007 YAC_ASSERT(
2008 coupling_node, "ERROR(yac_yaml_create_coupling_node): "
2009 "failed to create sequence node");
2010
2011 // for all couples
2012 for (size_t couple_idx = 0; couple_idx < num_couples; ++couple_idx)
2014 coupling_node, couple_config, couple_idx);
2015
2016 return coupling_node;
2017}
2018
2020 struct yac_couple_config * couple_config,
2021 int emit_flags) {
2022
2023 // create an empty document
2024 fy_document_t document = fy_document_create(NULL);
2025 YAC_ASSERT(
2026 document,
2027 "ERROR(yac_yaml_write_coupling): failed to create document");
2028
2029 // create root node
2030 fy_node_t root_node = fy_node_create_mapping(document);
2031 YAC_ASSERT(
2032 root_node,
2033 "ERROR(yac_yaml_write_coupling): failed to create mapping node");
2034
2035 // add start datetime
2037 root_node,
2039 yaml_base_keys, num_yaml_base_keys, START_DATE),
2041
2042 // add end datetime
2044 root_node,
2046 yaml_base_keys, num_yaml_base_keys, END_DATE),
2047 yac_couple_config_get_end_datetime(couple_config));
2048
2049 // add calendar
2051 root_node,
2053 yaml_base_keys, num_yaml_base_keys, CALENDAR),
2055 calendar_types, num_calendar_types, getCalendarType()));
2056
2057 // add timestep unit
2059 root_node,
2061 yaml_base_keys, num_yaml_base_keys, TIMESTEP_UNIT),
2063 timestep_units, num_timestep_units, C_ISO_FORMAT));
2064
2065 // add couplings
2067 root_node,
2069 yaml_base_keys, num_yaml_base_keys, COUPLING),
2070 yac_yaml_create_coupling_node(document, couple_config));
2071
2072 // set root node of the document
2073 int setting_root_failed =
2074 fy_document_set_root(document, root_node);
2075 YAC_ASSERT(
2076 !setting_root_failed, "ERROR(yac_yaml_write_coupling): "
2077 "failed to add root node to document");
2078
2079
2080 // emit document to string
2081 char * str_couple_config =
2082 fy_emit_document_to_string(
2083 document, (enum fy_emitter_cfg_flags)emit_flags);
2084
2085 YAC_ASSERT(
2086 str_couple_config, "ERROR(yac_yaml_write_coupling): "
2087 "failed to emit document to string");
2088
2089 // destroy document
2090 fy_document_destroy(document);
2091
2092 return str_couple_config;
2093}
static double yaml_parse_double_value(fy_node_t value_node, char const *key_name, char const *yaml_filename)
#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)
#define DEF_STR_PARAM(NAME, DEFAULT, MAX_STR_LEN)
#define DEF_INTERP_STACK_ADD_NO_PARAM(NAME)
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)
int YAC_YAML_EMITTER_JSON
emit to JSON format
Definition config_yaml.c:47
static void yac_yaml_append_couple_nodes(fy_node_t coupling_node, struct yac_couple_config *couple_config, size_t couple_idx)
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:36
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 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 int compare_parameter_values(interp_method_parameter_value const *a, interp_method_parameter_value const *b, enum interp_method_parameter_value_type type)
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)
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)
void yac_yaml_read_coupling(struct yac_couple_config *couple_config, const char *yaml_filename, int parse_flags)
yaml_couple_key_types
Definition config_yaml.c:86
@ WEIGHT_FILE_NAME
Definition config_yaml.c:96
@ SCALE_SUMMAND
Definition config_yaml.c:99
@ TARGET_COMPONENT
Definition config_yaml.c:89
@ SOURCE_GRID
Definition config_yaml.c:88
@ SOURCE_MASK_NAME
@ INTERPOLATION
@ SOURCE_MASK_NAMES
@ MAPPING_SIDE
Definition config_yaml.c:97
@ TIME_REDUCTION
Definition config_yaml.c:93
@ SOURCE_LAG
Definition config_yaml.c:94
@ FIELD
Definition config_yaml.c:91
@ TARGET_GRID
Definition config_yaml.c:90
@ COUPLING_PERIOD
Definition config_yaml.c:92
@ SOURCE_COMPONENT
Definition config_yaml.c:87
@ SCALE_FACTOR
Definition config_yaml.c:98
@ TARGET_LAG
Definition config_yaml.c:95
@ TARGET_MASK_NAME
static int yaml_parse_integer_value(fy_node_t value_node, char const *key_name, char const *yaml_filename)
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:34
#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 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 void yaml_parse_interp_method(struct field_couple_buffer *field_buffer, fy_node_t interp_method_node, char const *yaml_filename)
#define DEF_NAME_TYPE_PAIR(NAME, TYPE)
int YAC_YAML_PARSER_JSON_AUTO
Definition config_yaml.c:49
#define YAML_ASSERT_F(CHECK, MSG,...)
static void yac_yaml_map_append_parameter(fy_node_t map, struct interp_method_parameter const *parameter, interp_method_parameter_value value)
int YAC_YAML_PARSER_DEFAULT
default parse flags (YAML format)
Definition config_yaml.c:48
static void yaml_parse_interp_stack_value(struct field_couple_buffer *field_buffer, fy_node_t interp_stack_node, char const *yaml_filename)
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)
int YAC_YAML_PARSER_JSON_FORCE
assume JSON format
Definition config_yaml.c:50
#define DEF_INT_PARAM(NAME, DEFAULT, VALID_MIN, VALID_MAX)
int YAC_YAML_EMITTER_DEFAULT
emit to YAML format
Definition config_yaml.c:46
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 *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)
#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
char * yac_yaml_emit_coupling(struct yac_couple_config *couple_config, int emit_flags)
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)
struct fy_node * fy_node_t
Definition config_yaml.c:35
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 yac_yaml_map_append_scalar_int(fy_node_t map, char const *key, int value)
#define YAML_ASSERT(CHECK, MSG)
size_t num_interpolation_methods
yaml_base_key_types
Definition config_yaml.c:78
@ TIMESTEP_UNIT
Definition config_yaml.c:82
@ START_DATE
Definition config_yaml.c:79
@ COUPLING
Definition config_yaml.c:83
@ CALENDAR
Definition config_yaml.c:81
@ END_DATE
Definition config_yaml.c:80
#define DEF_NAME_TYPE_PAIRS(NAME,...)
static fy_node_t yac_yaml_create_scalar(fy_document_t document, char const *value)
static fy_node_t yac_yaml_create_scalar_int(fy_document_t document, int value)
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)
#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:39
@ PARSER_JSON_AUTO
Definition config_yaml.c:42
@ EMITTER_JSON
Definition config_yaml.c:40
@ PARSER_JSON_FORCE
Definition config_yaml.c:43
@ PARSER_DEFAULT
Definition config_yaml.c:41
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)
void yac_couple_config_set_datetime(struct yac_couple_config *couple_config, char const *start, char const *end)
int yac_couple_config_mapping_on_source(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx)
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)
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)
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)
int yac_couple_config_get_source_lag(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx)
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_end_datetime(struct yac_couple_config *couple_config)
char const * yac_couple_config_get_tgt_mask_name(struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_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_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 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)
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)
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_start_datetime(struct yac_couple_config *couple_config)
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
#define YAC_RAD
Definition geometry.h:30
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 @8::@9 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_WEIGHT_FILE_NAME_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_N_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
#define YAC_INTERP_SPMAP_SCALE_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_TGT_SPHERE_RADIUS_DEFAULT
#define YAC_INTERP_SPMAP_WEIGHTED_DEFAULT
#define YAC_INTERP_SPMAP_SPREAD_DISTANCE_DEFAULT
yac_interp_spmap_weight_type
@ YAC_INTERP_SPMAP_AVG
@ YAC_INTERP_SPMAP_DIST
#define YAC_INTERP_SPMAP_SRC_SPHERE_RADIUS_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
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
char const ** src_mask_names
Definition config_yaml.c:73
char const * coupling_period
Definition config_yaml.c:61
char const * weight_file_name
Definition config_yaml.c:64
char const * tgt_mask_name
Definition config_yaml.c:75
char const * comp_name
Definition config_yaml.c:57
struct yac_interp_stack_config * interp_stack
Definition config_yaml.c:63
char const * grid_name
Definition config_yaml.c:58
struct field_couple_buffer::@51 tgt
struct field_couple_buffer::field_couple_field_names * field_names
struct field_couple_buffer::@51 src
enum yac_reduction_type time_reduction
Definition config_yaml.c:62
struct interp_method_parameter::@52::@56 str_param
struct yac_name_type_pair const * valid_values
struct interp_method_parameter::@52::@54 int_param
enum interp_method_parameter_value_type type
struct interp_method_parameter::@52::@53 enum_param
union interp_method_parameter::@52 data
struct interp_method_parameter::@52::@55 dble_param
struct interp_method_parameter::@52::@57 bool_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)
void yac_cdef_calendar(int calendar)
Definition yac.c:562
#define YAC_ASSERT_F(exp, format,...)
Definition yac_assert.h:18
#define YAC_ASSERT(exp, msg)
Definition yac_assert.h:15