18#include "mtime_calendar.h"
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__);
184#if defined __NVCOMPILER && __NVCOMPILER_MAJOR__ <= 24
216#if defined __NVCOMPILER && __NVCOMPILER_MAJOR__ <= 24
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; \
256 (void)yaml_filename; \
257 (void)routine_name; \
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; \
269#define DEF_ENUM_PARAM(NAME, DEFAULT, ...) \
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) \
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) \
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) \
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) \
295 .type = BOOL_PARAM, \
296 .default_value.bool_value = (int)(DEFAULT)}
297#define DEF_STR_PARAM(NAME, DEFAULT, MAX_STR_LEN) \
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__};
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)
315#define DEF_INTERP_STACK_ADD(NAME, ...) \
316 yac_interp_stack_config_add_ ## NAME ( \
317 field_buffer->interp_stack, __VA_ARGS__);
319#define DEF_INTERP_STACK_ADD_NO_PARAM(NAME) \
320 yac_interp_stack_config_add_ ## NAME ( \
321 field_buffer->interp_stack);
323#define DEF_INTERP_STACK_GET(NAME, ...) \
324 yac_interp_stack_config_entry_get_ ## NAME ( \
325 interp_stack_entry, __VA_ARGS__);
327#define DEF_INTERP_STACK_GET_NO_PARAM(NAME) \
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__)
339 parameters[1].bool_value),
342 &reduction_type, ¶meter_values[1].bool_value)
343 parameter_values[0].enum_value = (int)reduction_type;,
356 parameters[1].bool_value),
359 &weight_type, ¶meter_values[1].bool_value)
360 parameter_values[0].enum_value = (int)weight_type;,
372 (
size_t)parameters[1].int_value,
373 parameters[2].dble_value),
377 &
type, &n, ¶meter_values[2].dble_value)
378 parameter_values[0].enum_value = (int)
type;
379 parameter_values[1].int_value = (int)n;,
393 parameters[0].int_value,
394 parameters[1].bool_value,
395 parameters[2].bool_value,
399 ¶meter_values[0].int_value,
400 ¶meter_values[1].bool_value,
401 ¶meter_values[2].bool_value, &normalisation)
402 parameter_values[3].enum_value = (int)normalisation;,
416 parameters[0].dble_value,
417 parameters[1].dble_value,
420 parameters[4].dble_value,
421 parameters[5].dble_value),
425 ¶meter_values[0].dble_value,
426 ¶meter_values[1].dble_value,
427 &weight_type, &scale_type,
428 ¶meter_values[4].dble_value,
429 ¶meter_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;,
459 parameters[0].dble_value != DBL_MAX,
460 "parameter 'user_value' of interpolation method 'fixed' is unset");
463 ¶meter_values[0].dble_value),
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\"")
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;
487 ¶meter_values[0].str_value,
488 &src_grid_name, &tgt_grid_name),
496 (
char*)(parameters[0].str_value),
497 (
char*)(parameters[1].str_value)),
499 ¶meter_values[0].str_value,
500 ¶meter_values[1].str_value),
517 (
size_t)parameters[0].int_value,
518 parameters[1].dble_value),
522 &
type, &n, ¶meter_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;,
538 ¶meter_values[0].int_value),
545 parameters[0].str_value,
546 "parameter \"func_compute_weights\" "
547 "of interpolation method \"user callback\" is unset")
550 ¶meter_values[0].str_value),
556#define ADD_INTERPOLATION(NAME, TYPE) \
559 .add_interpolation = add_interp_method_ ## NAME , \
560 .get_interpolation = get_interp_method_ ## NAME , \
561 .parameters = interp_method_parameters_ ## NAME , \
563 sizeof(interp_method_parameters_ ## NAME ) / \
564 sizeof(interp_method_parameters_ ## NAME [0])}
566struct yac_interpolation_method {
569 void(*add_interpolation)(
572 char const * yaml_filename);
573 void(*get_interpolation)(
577 size_t num_parameters;
595 fy_node_t value_node,
char const *
name,
char const * yaml_filename) {
596 char const * routine_name =
"yaml_parse_string_value";
599 value_node && fy_node_is_scalar(value_node),
600 "unsupported node type for \"%s\" (the node is expected to be scalar)",
603 return fy_node_get_scalar0(value_node);
607 fy_node_t value_node,
char const * key_name,
char const * yaml_filename) {
608 char const * routine_name =
"yaml_parse_calendar_value";
610 char const * calendar_name =
615 calendar_types, num_calendar_types, calendar_name);
618 calendar_type != INT_MAX,
619 "\"%s\" is not a valid calendar name", calendar_name);
621 return (calendarType)calendar_type;
625 fy_node_t value_node,
char const * key_name,
char const * yaml_filename,
627 char const * routine_name =
"yaml_parse_timestep_value";
632 value_node && fy_node_is_scalar(value_node),
633 "unsupported node type for \"%s\" (the node is expected to be scalar)",
635 char const * timestep =
637 char const * timestep_iso =
641 timestep_iso,
"valid to convert timestep \"%s\" to ISO 8601 format",
644 return strdup(timestep_iso);
648 fy_node_t value_node,
char const * key_name,
char const * yaml_filename) {
649 char const * routine_name =
"yaml_parse_timestep_unit_value";
651 char const * timestep_unit_str =
656 timestep_units, num_timestep_units, timestep_unit_str);
659 timestep_unit != INT_MAX,
660 "\"%s\" is not a valid time step unit", timestep_unit_str);
666 fy_node_t value_node,
char const * key_name,
char const * yaml_filename) {
667 char const * routine_name =
"yaml_parse_time_reduction_value";
669 char const * time_reduction_str =
674 time_operations, num_time_operations, time_reduction_str);
677 time_reduction != INT_MAX,
678 "\"%s\" is not a valid time reduction type in", time_reduction_str);
684 fy_node_t value_node,
char const * key_name,
char const * yaml_filename) {
685 char const * routine_name =
"yaml_parse_integer_value";
687 char const * integer_str =
691 long int long_value = strtol(integer_str, &endptr, 10);
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);
698 return (
int)long_value;
702 fy_node_t value_node,
char const * key_name,
char const * yaml_filename) {
703 char const * routine_name =
"yaml_parse_double_value";
705 char const * double_str =
709 double dble_value = strtod(double_str, &endptr);
712 (endptr != double_str) && (*endptr ==
'\0'),
713 "\"%s\" is not a valid double value", double_str);
720 fy_node_t value_node,
char const * key_name,
char const * yaml_filename) {
721 char const * routine_name =
"yaml_parse_enum_value";
723 char const * value_str =
732 "\"%s\" is not a valid enum value for \"%s\" ", value_str, key_name);
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";
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 "
749 switch(fy_node_get_type(interp_method_node)) {
752 *interpolation_type_str =
754 interp_method_node,
"interpolation method name", yaml_filename);
755 *parameter_node = NULL;
761 fy_node_mapping_item_count(interp_method_node) == 1,
762 "base interpolation method node is only allowed to have one pair ");
765 fy_node_mapping_get_by_index(interp_method_node, 0);
768 fy_node_pair_key(base_interp_method_pair);
770 *interpolation_type_str =
772 base_interp_method_key_node,
"interpolation method name",
775 fy_node_t base_interp_method_value_node =
776 fy_node_pair_value(base_interp_method_pair);
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);
785 *parameter_node = base_interp_method_value_node;
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";
804 "unsupported parameter type for interpolation method \"%s\"",
809 switch(parameter->
type) {
816 value_node,
"interpolation method enum parameter value",
822 value_node,
"interpolation method integer parameter value",
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,
837 value_node,
"interpolation method double parameter value",
842 "\"%lf\" is not a valid double parameter value for parameter \"%s\" "
843 "of interpolation method \"%s\" "
844 "(valid range: %e <= value <= %e)",
852 value_node,
"interpolation method double parameter value",
857 "\"%lf\" is not a valid double parameter value for parameter \"%s\" "
858 "of interpolation method \"%s\" "
859 "(valid range: %e <= value <= %e)",
868 bool_names, num_bool_names, value_node,
869 "interpolation method bool parameter value", yaml_filename);
874 value_node,
"interpolation method string parameter value",
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,
887 return parameter_value;
894 char const * yaml_filename) {
895 char const * routine_name =
"yaml_parse_interp_method_parameter";
897 char const * parameter_name =
899 fy_node_pair_key(parameter_pair),
900 "interpolation method parameter name", yaml_filename);
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 ¶meters[i], fy_node_pair_value(parameter_pair),
908 interpolation_name, yaml_filename);
912 "\"%s\" is not a valid parameter for interpolation method \"%s\"",
913 parameter_name, interpolation_name);
919 fy_node_t parameter_node,
char const * yaml_filename) {
920 char const * routine_name =
"yaml_parse_interp_method_parameters";
924 parameter_values[i] =
interp_method->parameters[i].default_value;
927 if (!parameter_node)
return;
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)",
939 while ((pair = fy_node_mapping_iterate(parameter_node, &iter)))
948 fy_node_t interp_method_node,
char const * yaml_filename) {
949 char const * routine_name =
"yaml_parse_interp_method";
951 char const * interpolation_type_str;
955 &interpolation_type_str, ¶meter_node,
956 interp_method_node, yaml_filename);
958 struct yac_interpolation_method const *
interp_method = NULL;
966 "\"%s\" is not a valid interpolation method",
967 interpolation_type_str);
970 interp_method_paramter_values[
interp_method->num_parameters];
973 parameter_node, yaml_filename);
975 field_buffer, interp_method_paramter_values, yaml_filename);
980 fy_node_t interp_stack_node,
char const * yaml_filename) {
981 char const * routine_name =
"yaml_parse_interp_stack_value";
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)");
991 while ((interp_stack_item =
992 fy_node_sequence_iterate(interp_stack_node, &iter)))
994 field_buffer, interp_stack_item, yaml_filename);
998 fy_node_t field_node, const char * yaml_filename) {
999 char const * routine_name =
"yaml_parse_field_name";
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)");
1007 struct field_couple_field_names field_name;
1010 if (fy_node_is_scalar(field_node)) {
1019 fy_node_mapping_lookup_scalar0_by_simple_key(
1020 field_node,
"src", (
size_t)-1);
1022 fy_node_mapping_lookup_scalar0_by_simple_key(
1023 field_node,
"tgt", (
size_t)-1);
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\")")
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";
1043 (*values == NULL) && (*num_values == 0),
1044 "values have already been set for sequence \"%s\"",
1048 if (fy_node_is_sequence(values_node)) {
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);
1059 *values =
xmalloc(
sizeof(**values));
1062 values_node, sequence_name, yaml_filename);
1067 struct field_couple_field_names ** field_names,
1068 size_t * num_field_names,
fy_node_t fields_node,
1069 const char * yaml_filename) {
1072 if (fy_node_is_sequence(fields_node)) {
1074 size_t start_idx = *num_field_names;
1075 *num_field_names += (size_t)fy_node_sequence_item_count(fields_node);
1077 xrealloc(*field_names, *num_field_names *
sizeof(**field_names));
1078 for (
size_t i = start_idx; i < *num_field_names; ++i)
1081 fy_node_sequence_get_by_index(fields_node, i), yaml_filename);
1085 xrealloc(*field_names, *num_field_names *
sizeof(**field_names));
1086 (*field_names)[*num_field_names-1] =
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);
1106 fy_node_t value_node = fy_node_pair_value(couple_pair);
1108 switch (couple_key_type) {
1130 value_node, yaml_filename);
1135 value_node, couple_key_name, yaml_filename, time_unit);
1140 value_node, couple_key_name, yaml_filename);
1145 value_node, couple_key_name, yaml_filename);
1150 value_node, couple_key_name, yaml_filename);
1155 value_node, couple_key_name, yaml_filename);
1160 mapping_sides, num_mapping_sides,
1161 value_node, couple_key_name, yaml_filename);
1166 value_node, couple_key_name, yaml_filename);
1171 value_node, couple_key_name, yaml_filename);
1175 field_buffer, value_node, yaml_filename);
1182 value_node, couple_key_name, yaml_filename);
1187 value_node, couple_key_name, yaml_filename);
1195 char const * routine_name =
"yaml_parse_couple";
1198 fy_node_is_mapping(couple_node),
1199 "unsupported couple node type "
1200 "(couples are expected to be defined as a mapping)");
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,
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};
1226 while ((pair = fy_node_mapping_iterate(couple_node, &iter)))
1228 &field_buffer, pair, yaml_filename, time_unit);
1231 field_buffer.
src.
comp_name,
"missing source component name");
1234 "missing source grid name (component \"%s\")",
1238 "missing target component name");
1241 "missing target grid name (component \"%s\")",
1245 "missing field names "
1246 "(source component \"%s\" source grid \"%s\" "
1247 "target component \"%s\" target grid \"%s\")",
1252 "missing coupling period "
1253 "(source component \"%s\" source grid \"%s\" "
1254 "target component \"%s\" target grid \"%s\")",
1288 fy_node_t coupling_node,
char const * yaml_filename,
1290 char const * routine_name =
"yaml_parse_coupling";
1293 if (!coupling_node)
return;
1296 fy_node_is_sequence(coupling_node),
1297 "unsupported coupling node type "
1298 "(couplings are expected to be defined as a sequence)");
1303 while ((couple_node = fy_node_sequence_iterate(coupling_node, &iter)))
1310 char const * routine_name =
"yaml_parse_base_map_pair";
1312 fy_node_t key_node = fy_node_pair_key(base_pair);
1315 fy_node_is_scalar(key_node),
1316 "unsupported key node type "
1317 "(key nodes are expected to be scalar nodes)");
1319 char const * base_key_name = fy_node_get_scalar0(key_node);
1322 yaml_base_keys, num_yaml_base_keys, base_key_name);
1325 (base_key_type == INT_MAX) ||
1331 "unsupported base key name \"%s\"",
1334 fy_node_t value_node = fy_node_pair_value(base_pair);
1336 switch (base_key_type) {
1341 value_node, base_key_name, yaml_filename), NULL);
1345 couple_config, NULL,
1347 value_node, base_key_name, yaml_filename));
1352 value_node, base_key_name, yaml_filename));
1357 value_node, base_key_name, yaml_filename);
1360 "inconsistent redefinition of time unit")
1361 *time_unit = time_unit_;
1367 "time unit has to be defined before the couplings")
1369 couple_config, value_node, yaml_filename, *time_unit);
1379 const char * yaml_filename) {
1380 char const * routine_name =
"yaml_parse_document";
1383 fy_node_t root_node = fy_document_root(document);
1386 if (!root_node)
return;
1389 fy_node_is_mapping(root_node),
1390 "unsupported root node type (root node is expected to be a mapping node)");
1396 while ((pair = fy_node_mapping_iterate(root_node, &iter)))
1403 char const * routine_name =
"yac_yaml_read_coupling";
1408 "ERROR(%s): YAML configuration file could not be found \"%s\"",
1409 routine_name, yaml_filename);
1412 FILE * config_file =
xfopen(yaml_filename,
"r");
1415 "ERROR(%s): could not open YAML configuration file \"%s\"",
1416 routine_name, yaml_filename);
1419 struct fy_parse_cfg parse_config =
1420 {.search_path =
".",
1423 parse_config.flags =
1424 (
enum fy_parse_cfg_flags)parse_flags;
1427 fy_document_build_from_fp(&parse_config, config_file);
1430 "ERROR(%s): could not parse YAML configuration file \"%s\"",
1431 routine_name, yaml_filename);
1435 !fy_document_resolve(document),
1436 "could not resolve anchors and merge keys");
1442 fy_document_destroy(document);
1455 fy_node_create_scalar_copy(document,
value, strlen(
value));
1458 "ERROR(yac_yaml_create_scalar): failed to create scalar node");
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);
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);
1490 fy_document_t document,
char const *
const * values,
size_t num_values) {
1493 if (num_values == 0)
return (
fy_node_t)NULL;
1496 values,
"ERROR(yac_yaml_create_sequence_scalar): no values provided");
1499 fy_node_t sequence_node = fy_node_create_sequence(document);
1501 sequence_node,
"ERROR(yac_yaml_create_sequence_scalar): "
1502 "failed to create sequence node");
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(
1513 !appending_failed,
"ERROR(yac_yaml_create_sequence_scalar): "
1514 "failed to append interpolation node");
1517 return sequence_node;
1527 key,
"ERROR(yac_yaml_map_append): NULL key is not supported");
1532 "ERROR(yac_yaml_map_append): failed to get document from node");
1535 int appending_failed =
1536 fy_node_mapping_append(
1540 "ERROR(yac_yaml_map_append): failed to append mapping node pair");
1548 document,
"ERROR(yac_yaml_map_append_scalar): "
1549 "failed to get document from node");
1559 document,
"ERROR(yac_yaml_map_append_scalar_int): "
1560 "failed to get document from node");
1571 document,
"ERROR(yac_yaml_map_append_scalar_dble): "
1572 "failed to get document from node");
1580 size_t couple_idx,
size_t field_couple_idx) {
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);
1589 if (!strcmp(src_field_name, tgt_field_name))
1593 fy_node_t field_name_node = fy_node_create_mapping(document);
1595 field_name_node,
"ERROR(yac_yaml_create_field_name_node): "
1596 "failed to create mapping node");
1604 return field_name_node;
1619 "ERROR(yac_yaml_map_append_parameter): unsupported parameter type");
1621 char const *
key = parameter->
name;
1623 switch (parameter->
type) {
1647 bool_names, num_bool_names,
value.bool_value));
1669 "ERROR(compare_parameter_values): "
1670 "invalid interpolation method parameter value type");
1702 struct yac_interpolation_method const *
interp_method = NULL;
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;
1717 interp_method->get_interpolation(interp_stack_entry, parameter_values);
1720 fy_node_t parameter_node = fy_node_create_mapping(document);
1722 parameter_node,
"ERROR(yac_yaml_create_interpolation_node): "
1723 "failed to create mapping node");
1725 size_t num_non_default_parameters = 0;
1726 for (
size_t param_idx = 0; param_idx < num_parameters; ++param_idx) {
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]);
1738 if (num_non_default_parameters) {
1741 interpolation_node = fy_node_create_mapping(document);
1743 interpolation_node,
"ERROR(yac_yaml_create_interpolation_node): "
1744 "failed to create mapping node");
1751 fy_node_free(parameter_node);
1753 interpolation_node =
1757 return interpolation_node;
1762 size_t couple_idx,
size_t field_couple_idx) {
1766 couple_config, couple_idx, field_couple_idx);
1769 interp_stack,
"ERROR(yac_yaml_create_interpolation_stack_node): "
1770 "invalid interpolation stack");
1773 fy_node_t interp_stack_node = fy_node_create_sequence(document);
1775 interp_stack_node,
"ERROR(yac_yaml_create_interpolation_stack_node): "
1776 "failed to create sequence node");
1778 size_t interp_stack_size =
1781 interp_stack_size,
"ERROR(yac_yaml_create_interpolation_stack_node): "
1782 "invalid interpolation stack size");
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(
1792 interp_stack, interp_stack_idx)));
1795 "ERROR(yac_yaml_create_interpolation_stack_node): "
1796 "failed to append interpolation node");
1799 return interp_stack_node;
1804 size_t couple_idx,
size_t field_couple_idx) {
1808 document,
"ERROR(yac_yaml_append_couple_field_nodes): "
1809 "failed to get document from node");
1812 fy_node_t field_couple_node = fy_node_create_mapping(document);
1814 coupling_node,
"ERROR(yac_yaml_append_couple_field_nodes): "
1815 "failed to create mapping node");
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);
1829 src_component_name);
1836 tgt_component_name);
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);
1849 yaml_couple_keys, num_yaml_couple_keys,
SOURCE_GRID),
1856 yaml_couple_keys, num_yaml_couple_keys,
TARGET_GRID),
1863 yaml_couple_keys, num_yaml_couple_keys,
FIELD),
1865 document, couple_config, couple_idx, field_couple_idx));
1873 couple_config, couple_idx, field_couple_idx));
1881 time_operations, num_time_operations,
1883 couple_config, couple_idx, field_couple_idx)));
1889 yaml_couple_keys, num_yaml_couple_keys,
SOURCE_LAG),
1891 couple_config, couple_idx, field_couple_idx));
1897 yaml_couple_keys, num_yaml_couple_keys,
TARGET_LAG),
1899 couple_config, couple_idx, field_couple_idx));
1903 couple_config, couple_idx, field_couple_idx))
1909 couple_config, couple_idx, field_couple_idx));
1917 mapping_sides, num_mapping_sides,
1919 couple_config, couple_idx, field_couple_idx)));
1927 couple_config, couple_idx, field_couple_idx));
1935 couple_config, couple_idx, field_couple_idx));
1943 document, couple_config, couple_idx, field_couple_idx));
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)
1957 else if (num_src_mask_names > 1)
1963 document, src_mask_names, num_src_mask_names));
1966 char const * tgt_mask_name =
1968 couple_config, couple_idx, field_couple_idx);
1976 int appending_failed =
1977 fy_node_sequence_append(coupling_node, field_couple_node);
1980 "ERROR(yac_yaml_append_couple_field_nodes): "
1981 "failed to append field couple node");
1986 size_t couple_idx) {
1988 size_t num_couple_fields =
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);
2000 size_t num_couples =
2003 if (!num_couples)
return NULL;
2006 fy_node_t coupling_node = fy_node_create_sequence(document);
2008 coupling_node,
"ERROR(yac_yaml_create_coupling_node): "
2009 "failed to create sequence node");
2012 for (
size_t couple_idx = 0; couple_idx < num_couples; ++couple_idx)
2014 coupling_node, couple_config, couple_idx);
2016 return coupling_node;
2027 "ERROR(yac_yaml_write_coupling): failed to create document");
2030 fy_node_t root_node = fy_node_create_mapping(document);
2033 "ERROR(yac_yaml_write_coupling): failed to create mapping node");
2039 yaml_base_keys, num_yaml_base_keys,
START_DATE),
2046 yaml_base_keys, num_yaml_base_keys,
END_DATE),
2053 yaml_base_keys, num_yaml_base_keys,
CALENDAR),
2055 calendar_types, num_calendar_types, getCalendarType()));
2069 yaml_base_keys, num_yaml_base_keys,
COUPLING),
2073 int setting_root_failed =
2074 fy_document_set_root(document, root_node);
2076 !setting_root_failed,
"ERROR(yac_yaml_write_coupling): "
2077 "failed to add root node to document");
2081 char * str_couple_config =
2082 fy_emit_document_to_string(
2083 document, (
enum fy_emitter_cfg_flags)emit_flags);
2086 str_couple_config,
"ERROR(yac_yaml_write_coupling): "
2087 "failed to emit document to string");
2090 fy_document_destroy(document);
2092 return str_couple_config;
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
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
interp_method_parameter_value_type
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)
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
#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
#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)
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
#define DEF_INT_PARAM(NAME, DEFAULT, VALID_MIN, VALID_MAX)
int YAC_YAML_EMITTER_DEFAULT
emit to YAML format
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)
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
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
#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)
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)
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_ARITHMETIC
#define YAC_INTERP_AVG_WEIGHT_TYPE_DEFAULT
#define YAC_INTERP_CALLBACK_COMPUTE_WEIGHTS_KEY_DEFAULT
#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
#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_SOURCE_TO_TARGET_MAP
@ YAC_NEAREST_CORNER_CELLS
@ YAC_RADIAL_BASIS_FUNCTION
#define YAC_MAX_ROUTINE_NAME_LENGTH
#define YAC_MAX_FILE_NAME_LENGTH
int yac_file_exists(const char *filename)
#define xrealloc(ptr, size)
#define xfopen(path, mode)
char const ** src_mask_names
char const * coupling_period
char const * weight_file_name
char const * tgt_mask_name
struct yac_interp_stack_config * interp_stack
struct field_couple_buffer::@51 tgt
struct field_couple_buffer::field_couple_field_names * field_names
struct field_couple_buffer::@51 src
size_t num_src_mask_names
enum yac_reduction_type time_reduction
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)
char const * yac_name_type_pair_get_name(struct yac_name_type_pair const *pairs, size_t count, int type)
void yac_cdef_calendar(int calendar)
#define YAC_ASSERT_F(exp, format,...)
#define YAC_ASSERT(exp, msg)