11#if defined(__NVCOMPILER)
12# pragma diag_suppress unsigned_compare_with_zero
13#elif defined(__GNUC__)
14# pragma GCC diagnostic push
15# pragma GCC diagnostic ignored "-Wpedantic"
16# pragma GCC diagnostic ignored "-Wall"
17# pragma GCC diagnostic ignored "-Wextra"
20#if defined(__NVCOMPILER)
21# pragma diag_default unsigned_compare_with_zero
22#elif defined(__GNUC__)
23# pragma GCC diagnostic pop
36#include "mtime_calendar.h"
184#define OUTPUT_GRIDS_FILE_NAME_STR "file_name"
226 yaml_debug_sync_loc_keys,
237 yaml_debug_output_grid_keys,
304 yaml_comp_grid_names_keys,
309 yaml_weight_file_data_keys,
314 weight_file_on_existing_types,
320#define YAML_ASSERT(CHECK, MSG) \
322 CHECK, MSG "in YAML configuration file \"%s\"", yaml_filename)
323#define YAML_ASSERT_F(CHECK, MSG, ...) \
325 CHECK, MSG "in YAML configuration file \"%s\"", __VA_ARGS__, yaml_filename)
326#define YAML_UNREACHABLE_DEFAULT(MSG) \
327 YAC_UNREACHABLE_DEFAULT_F( \
328 MSG "in YAML configuration file \"%s\"", yaml_filename)
329#define YAML_UNREACHABLE_DEFAULT_F(MSG, ...) \
330 YAC_UNREACHABLE_DEFAULT_F( \
331 MSG "in YAML configuration file \"%s\"", __VA_ARGS__, yaml_filename)
333static char const * yaml_parse_string_value(
337 value_node && fy_node_is_scalar(value_node),
338 "unsupported node type for \"%s\" (the node is expected to be scalar)",
341 return fy_node_get_scalar0(value_node);
347 char const * calendar_name =
348 yaml_parse_string_value(value_node, key_name,
yaml_filename);
352 calendar_types, calendar_types_size, calendar_name);
355 calendar_type != INT_MAX,
356 "\"%s\" is not a valid calendar name", calendar_name);
358 return (calendarType)calendar_type;
368 value_node && fy_node_is_scalar(value_node),
369 "unsupported node type for \"%s\" (the node is expected to be scalar)",
371 char const * timestep =
372 yaml_parse_string_value(value_node, key_name,
yaml_filename);
373 char const * timestep_iso =
377 timestep_iso,
"valid to convert timestep \"%s\" to ISO 8601 format",
386 char const * timestep_unit_str =
387 yaml_parse_string_value(value_node, key_name,
yaml_filename);
391 timestep_units, timestep_units_size, timestep_unit_str);
394 timestep_unit != INT_MAX,
395 "\"%s\" is not a valid time step unit", timestep_unit_str);
403 char const * time_reduction_str =
404 yaml_parse_string_value(value_node, key_name,
yaml_filename);
408 time_operations, time_operations_size, time_reduction_str);
411 time_reduction != INT_MAX,
412 "\"%s\" is not a valid time reduction type in", time_reduction_str);
420 char const * integer_str =
421 yaml_parse_string_value(value_node, key_name,
yaml_filename);
424 long int long_value = strtol(integer_str, &endptr, 10);
427 (endptr != integer_str) && (*endptr ==
'\0') &&
428 (long_value >= INT_MIN) && (long_value <= INT_MAX),
429 "\"%s\" is not a valid integer value", integer_str);
431 return (
int)long_value;
437 char const * size_t_str =
438 yaml_parse_string_value(value_node, key_name,
yaml_filename);
442 uintmax_t temp = strtoumax(size_t_str, &endptr, 10);
445 (errno == 0) && (endptr != size_t_str) && (*endptr ==
'\0') &&
447 "\"%s\" is not a valid size_t value", size_t_str);
455 char const * double_str =
456 yaml_parse_string_value(value_node, key_name,
yaml_filename);
459 double dble_value = strtod(double_str, &endptr);
462 (endptr != double_str) && (*endptr ==
'\0'),
463 "\"%s\" is not a valid double value for \"%s\"", double_str, key_name);
472 char const * value_str =
473 yaml_parse_string_value(value_node, key_name,
yaml_filename);
477 valid_values, num_valid_values, value_str);
481 "\"%s\" is not a valid enum value for \"%s\" ", value_str, key_name);
496 char const ** interpolation_type_str,
fy_node_t * parameter_node,
502 switch(fy_node_get_type(interp_method_node)) {
504 "unsupported interpolation method node type "
505 "(interpolation methods are expected to be defined as either scalar "
510 interpolation_name_node = interp_method_node;
511 *parameter_node = NULL;
518 fy_node_mapping_item_count(interp_method_node) == 1,
519 "base interpolation method node is only allowed to have one pair ");
522 fy_node_mapping_get_by_index(interp_method_node, 0);
524 interpolation_name_node = fy_node_pair_key(base_interp_method_pair);
526 fy_node_t base_interp_method_value_node =
527 fy_node_pair_value(base_interp_method_pair);
530 fy_node_is_mapping(base_interp_method_value_node),
531 "unsupported base interpolation method value node type "
532 "for interpolation method \"%s\" "
533 "(interpolation method parameters are expected to be "
535 yaml_parse_string_value(
536 interpolation_name_node,
"interpolation method name",
yaml_filename));
538 *parameter_node = base_interp_method_value_node;
542 *interpolation_type_str =
543 yaml_parse_string_value(
544 interpolation_name_node,
"interpolation method name",
yaml_filename);
550 char const * interpolation_name,
558 if (fy_node_is_null(value_node))
return;
562 "unsupported parameter type for parameter \"%s\" of interpolation "
564 param_name, interpolation_name);
574 fy_node_is_scalar(value_node),
575 "invalid scalar parameter value for parameter \"%s\" of interpolation "
577 param_name, interpolation_name);
583 "failed to set parameter \"%s\" of interpolation method \"%s\": %s",
584 param_name, interpolation_name,
590 fy_node_is_scalar(value_node) || fy_node_is_mapping(value_node),
591 "invalid parameter value for parameter \"%s\" of interpolation "
592 "method \"%s\" (expected scalar sub-parameter name or map)",
593 param_name, interpolation_name);
595 if (fy_node_is_scalar(value_node)) {
598 char const * sub_parameter_name =
599 yaml_parse_string_value(
600 value_node,
"interpolation method parameter name",
yaml_filename);
605 param, sub_parameter_name, &sub_param);
608 "\"%s\" is not a valid sub-parameter of \"%s\" for interpolation "
610 sub_parameter_name, param_name, interpolation_name,
617 while ((parameter_pair = fy_node_mapping_iterate(value_node, &iter))) {
619 char const * sub_parameter_name =
620 yaml_parse_string_value(
621 fy_node_pair_key(parameter_pair),
627 param, sub_parameter_name, &sub_param);
630 "\"%s\" is not a valid sub-parameter of \"%s\" for interpolation "
632 sub_parameter_name, param_name, interpolation_name,
636 sub_param, fy_node_pair_value(parameter_pair),
644 fy_node_is_scalar(value_node) || fy_node_is_sequence(value_node),
645 "invalid parameter value for parameter \"%s\" of "
646 "interpolation method \"%s\" (expected scalar or sequence)",
647 param_name, interpolation_name);
649 size_t count = fy_node_is_scalar(value_node)?1:
650 (size_t)fy_node_sequence_item_count(value_node);
651 for (
size_t i = 0; i < count; ++i) {
656 "failed to append to parameter \"%s\" of interpolation method "
658 param_name, interpolation_name,
663 fy_node_is_scalar(value_node)?value_node:
664 fy_node_sequence_get_by_index(value_node, (
int)i),
676 char const * interpolation_type_str;
681 &interpolation_type_str, ¶meter_node,
694 root_param, parameter_node, interpolation_type_str,
yaml_filename);
706 fy_node_is_sequence(interp_stack_node),
707 "unsupported interpolation stack node type"
708 "(interpolation stacks are expected to be defined as a sequence)");
713 while ((interp_stack_item =
714 fy_node_sequence_iterate(interp_stack_node, &iter)))
722 struct field_couple_field_names field_name;
724 switch(fy_node_get_type(field_node)) {
727 "unsupported field name node type "
728 "(field name is either scalars or a map)");
731 case (FYNT_SCALAR): {
735 yaml_parse_string_value(field_node,
"field name",
yaml_filename)));
741 case (FYNT_MAPPING): {
744 fy_node_mapping_lookup_scalar0_by_simple_key(
745 field_node,
"src", (
size_t)-1);
747 fy_node_mapping_lookup_scalar0_by_simple_key(
748 field_node,
"tgt", (
size_t)-1);
751 field_name.src && field_name.tgt &&
752 (fy_node_mapping_item_count(field_node) == 2),
753 "invalid field name mapping node "
754 "(field name mapping node has to contain two maps "
755 "with the keys \"src\" and \"tgt\")")
765 size_t ** values,
size_t * num_values,
766 fy_node_t values_node,
char const * sequence_name,
770 (*values == NULL) && (*num_values == 0),
771 "values have already been set for sequence \"%s\"",
775 if (fy_node_is_sequence(values_node)) {
777 *num_values = (size_t)fy_node_sequence_item_count(values_node);
778 *values =
xmalloc(*num_values *
sizeof(**values));
780 for (
size_t value_idx = 0; value_idx < *num_values; ++value_idx)
781 (*values)[value_idx] =
783 fy_node_sequence_get_by_index(values_node, value_idx),
788 *values =
xmalloc(
sizeof(**values));
796 fy_node_t values_node,
char const * sequence_name,
800 *collection_selection == NULL,
801 "values have already been set for sequence \"%s\"",
805 size_t * indices = NULL;
810 *collection_selection =
817 char const *** values,
size_t * num_values,
818 fy_node_t values_node,
char const * sequence_name,
822 (*values == NULL) && (*num_values == 0),
823 "values have already been set for sequence \"%s\"",
827 if (fy_node_is_sequence(values_node)) {
829 *num_values = (size_t)fy_node_sequence_item_count(values_node);
830 *values =
xmalloc(*num_values *
sizeof(**values));
831 for (
size_t value_idx = 0; value_idx < *num_values; ++value_idx)
832 (*values)[value_idx] =
833 yaml_parse_string_value(
834 fy_node_sequence_get_by_index(values_node, value_idx),
838 *values =
xmalloc(
sizeof(**values));
840 yaml_parse_string_value(
847 size_t * num_field_names,
fy_node_t fields_node,
851 if (fy_node_is_sequence(fields_node)) {
853 size_t start_idx = *num_field_names;
854 *num_field_names += (size_t)fy_node_sequence_item_count(fields_node);
857 for (
size_t i = start_idx; i < *num_field_names; ++i)
860 fy_node_sequence_get_by_index(fields_node, i),
yaml_filename);
865 (*field_names)[*num_field_names-1] =
871 char const ** comp_name,
char const ***
grid_names,
size_t * num_grid_names,
873 int allow_multiple_grids) {
876 *comp_name == NULL,
"%s component name already set", type_name);
878 (*
grid_names == NULL) && (*num_grid_names == 0),
879 "%s grid names already set", type_name);
882 fy_node_is_mapping(values_node),
883 "unsupported component/grid names node type (has to be a map)");
888 while((pair = fy_node_mapping_iterate(values_node, &iter))) {
893 yaml_comp_grid_names_keys, yaml_comp_grid_names_keys_size,
894 fy_node_pair_key(pair),
896 char const * comp_grid_names_key_name =
898 yaml_comp_grid_names_keys, yaml_comp_grid_names_keys_size,
899 comp_grid_names_key_type);
901 fy_node_t name_node = fy_node_pair_value(pair);
903 switch(comp_grid_names_key_type) {
907 yaml_parse_string_value(
911 if (allow_multiple_grids) {
919 yaml_parse_string_value(
936 "%s \"on existing\" already set ", type_name);
939 fy_node_is_mapping(values_node),
940 "unsupported weight file data node type (has to be a map)");
945 while((pair = fy_node_mapping_iterate(values_node, &iter))) {
950 yaml_weight_file_data_keys, yaml_weight_file_data_keys_size,
951 fy_node_pair_key(pair),
953 char const * weight_file_data_key_name =
955 yaml_weight_file_data_keys, yaml_weight_file_data_keys_size,
956 weight_file_data_key_type);
958 fy_node_t weight_file_data_node = fy_node_pair_value(pair);
960 switch(weight_file_data_key_type) {
964 yaml_parse_string_value(
965 weight_file_data_node, weight_file_data_key_name,
yaml_filename);
971 weight_file_on_existing_types,
972 weight_file_on_existing_types_size,
973 weight_file_data_node, weight_file_data_key_name,
988 yaml_couple_keys, yaml_couple_keys_size,
989 fy_node_pair_key(couple_pair),
991 char const * couple_key_name =
993 yaml_couple_keys, yaml_couple_keys_size, couple_key_type);
995 fy_node_t value_node = fy_node_pair_value(couple_pair);
997 switch (couple_key_type) {
1000 char const ** src_grid_names = NULL;
1001 size_t num_src_grid_names = 0;
1002 int const allow_multiple_grids = 0;
1006 &num_src_grid_names,
1007 value_node, couple_key_name,
yaml_filename, allow_multiple_grids);
1009 free((
void*)src_grid_names);
1014 yaml_parse_string_value(value_node, couple_key_name,
yaml_filename);
1019 "%s has already been set", couple_key_name);
1021 yaml_parse_string_value(value_node, couple_key_name,
yaml_filename);
1024 int const allow_multiple_grids = 1;
1029 value_node, couple_key_name,
yaml_filename, allow_multiple_grids);
1034 yaml_parse_string_value(value_node, couple_key_name,
yaml_filename);
1069 yaml_parse_string_value(
1076 weight_file_on_existing_types,
1077 weight_file_on_existing_types_size,
1089 mapping_sides, mapping_sides_size,
1115 yaml_parse_string_value(
1120 yaml_parse_string_value(
1131 bool_names, bool_names_size,
1142 fy_node_is_mapping(couple_node),
1143 "unsupported couple node type "
1144 "(couples are expected to be defined as a mapping)");
1149 .src.grid_name = NULL,
1150 .tgt.comp_name = NULL,
1151 .tgt.grid.name = NULL,
1152 .tgt.grid.count = 0,
1153 .field_names = NULL,
1154 .num_field_names = 0,
1155 .coupling_period = NULL,
1160 .weight_file.name = NULL,
1162 .mapping_on_source = 1,
1163 .scale_factor = 1.0,
1164 .scale_summand = 0.0,
1165 .src_mask_names = NULL,
1166 .num_src_mask_names = 0,
1167 .tgt_mask_name = NULL,
1168 .yaxt_exchanger_name = NULL,
1169 .collection_selection = NULL,
1170 .use_raw_exchange = 0};
1175 while ((pair = fy_node_mapping_iterate(couple_node, &iter)))
1180 field_buffer.
src.
comp_name,
"missing source component name");
1183 "missing source grid name (component \"%s\")",
1187 "invalid source grid name (component \"%s\")",
1191 "missing target component name");
1194 "missing target grid name (component \"%s\")",
1196 for (
size_t i = 0; i < field_buffer.
tgt.
grid.
count; ++i)
1200 "invalid target grid name (component \"%s\" grid idx %zu)",
1204 "missing field names "
1205 "(source component \"%s\" source grid \"%s\" "
1206 "target component \"%s\" target grid \"%s\")",
1211 "missing coupling period "
1212 "(source component \"%s\" source grid \"%s\" "
1213 "target component \"%s\" target grid \"%s\")",
1218 for (
size_t k = 0; k < field_buffer.
tgt.
grid.
count; ++k)
1261 if (!coupling_node)
return;
1264 fy_node_is_sequence(coupling_node),
1265 "unsupported coupling node type "
1266 "(couplings are expected to be defined as a sequence)");
1271 while ((couple_node = fy_node_sequence_iterate(coupling_node, &iter)))
1276 fy_node_t config_file_node, char const * file_type_name,
1279 struct debug_config_file config_file =
1282 char * str_buffer =
xmalloc(strlen(file_type_name) + 32);
1284 switch(fy_node_get_type(config_file_node)) {
1287 "unsupported config file node type "
1288 "(%s is either scalar or a map)", file_type_name);
1291 case (FYNT_SCALAR): {
1294 yaml_parse_string_value(
1296 strcat(strcpy(str_buffer, file_type_name),
" name"),
1303 case (FYNT_MAPPING): {
1306 fy_node_mapping_lookup_by_string(
1307 config_file_node,
"filename", (
size_t)-1);
1309 fy_node_mapping_lookup_by_string(
1310 config_file_node,
"filetype", (
size_t)-1);
1312 fy_node_mapping_lookup_by_string(
1313 config_file_node,
"include_definitions", (
size_t)-1);
1317 "invalid %s mapping node "
1318 "(global config file mapping node has to include a map "
1319 "with the keys \"filename\")", file_type_name)
1322 yaml_parse_string_value(
1323 filename_node, strcat(strcpy(str_buffer, file_type_name),
" name"),
1329 config_filetypes, config_filetypes_size,
1330 filetype_node, strcat(strcpy(str_buffer, file_type_name),
" type"),
1332 config_file.include_definitions =
1333 (include_definitions_node)?
1335 bool_names, bool_names_size,
1336 include_definitions_node,
1337 strcat(strcpy(str_buffer, file_type_name),
" include definitions"),
1344 config_file.name,
"missing filename for %s", file_type_name);
1353 fy_node_pair_t config_file_pair,
char const * config_file_type_name,
1357 debug_sync_loc_key_type =
1360 yaml_debug_sync_loc_keys,
1361 yaml_debug_sync_loc_keys_size,
1362 fy_node_pair_key(config_file_pair),
1363 "config synchronisation location parameter name",
1365 char const * debug_sync_loc_key_name =
1367 yaml_debug_sync_loc_keys, yaml_debug_sync_loc_keys_size,
1368 debug_sync_loc_key_type);
1370 fy_node_t value_node = fy_node_pair_value(config_file_pair);
1372 char config_file_type_name_sync[
1373 strlen(config_file_type_name) + strlen(debug_sync_loc_key_name) + 8];
1375 config_file_type_name_sync,
"%s (%s)",
1376 config_file_type_name, debug_sync_loc_key_name);
1378 config_file_buffer->
config_file[debug_sync_loc_key_type] =
1384 fy_node_t config_file_node, char const * config_file_type_name,
1388 fy_node_is_mapping(config_file_node),
1389 "unsupported %s node type "
1390 "(%s is expected to be defined as a mapping)",
1391 config_file_type_name, config_file_type_name);
1406 "invalid unsupported synchronisation location (%d) for %s",
1407 i, config_file_type_name);
1413 while ((pair = fy_node_mapping_iterate(config_file_node, &iter)))
1415 &config_file_buffer, pair, config_file_type_name,
yaml_filename);
1417 return config_file_buffer;
1424 char const * config_file_type_name =
"debug global config file";
1427 fy_node_is_mapping(global_config_node),
1428 "unsupported %s node type "
1429 "(%s is expected to be defined as a mapping)",
1430 config_file_type_name, config_file_type_name);
1446 char const ** grid_name,
char const **
file_name,
1452 yaml_debug_output_grid_keys, yaml_debug_output_grid_keys_size,
1453 fy_node_pair_key(output_grid_pair),
1455 char const * debug_output_key_name =
1457 yaml_debug_output_grid_keys, yaml_debug_output_grid_keys_size,
1458 output_grid_key_type);
1460 fy_node_t value_node = fy_node_pair_value(output_grid_pair);
1462 switch(output_grid_key_type) {
1466 yaml_parse_string_value(value_node, debug_output_key_name,
yaml_filename);
1471 yaml_parse_string_value(value_node, debug_output_key_name,
yaml_filename);
1482 fy_node_is_mapping(output_grid_node),
1483 "unsupported output grid node type "
1484 "(output grids are expected to be defined as a mapping)");
1486 char const * grid_name = NULL;
1492 while ((pair = fy_node_mapping_iterate(output_grid_node, &iter)))
1497 "output grid mapping has to contain both \"grid_name\" and \"file_name\" "
1498 "parameters (grid name: \"%s\", file name: \"%s\")",
1515 fy_node_mapping_item_count(output_grids_node) == 1,
1516 "debug output grids mapping is only allowed to have one pair ");
1519 fy_node_mapping_get_by_index(output_grids_node, 0);
1524 yaml_parse_string_value(
1525 fy_node_pair_key(output_grids_pair),
1527 "unsupported output grid parameter name \"%s\" "
1528 "(only \"%s\" is supported if debug output grids is defined as a "
1529 "mapping, because it applies to all grids) ",
1530 yaml_parse_string_value(
1531 fy_node_pair_key(output_grids_pair),
1537 yaml_parse_string_value(
1538 fy_node_pair_value(output_grids_pair),
1547 fy_node_is_sequence(output_grids_node) ||
1548 fy_node_is_mapping(output_grids_node),
1549 "unsupported debug output grids node type "
1550 "(debug output grids is expected to be defined as a mapping or as a "
1551 "sequence of mappings)");
1554 if (fy_node_is_mapping(output_grids_node)) {
1563 while ((output_grid_node =
1564 fy_node_sequence_iterate(output_grids_node, &iter)))
1576 yaml_debug_keys, yaml_debug_keys_size,
1577 fy_node_pair_key(debug_pair),
1580 fy_node_t value_node = fy_node_pair_value(debug_pair);
1582 switch (debug_key_type) {
1596 bool_names, bool_names_size, value_node,
1597 "\"missing definition is fatal\" bool value",
yaml_filename));
1603 bool_names, bool_names_size, value_node,
1610 bool_names, bool_names_size, value_node,
1611 "\"coordinates mismatch is fatal\" bool value",
1622 if (!debug_node)
return;
1625 fy_node_is_mapping(debug_node),
1626 "unsupported debug node type "
1627 "(debug is expected to be defined as a mapping)");
1632 while ((pair = fy_node_mapping_iterate(debug_node, &iter)))
1641 size_t len_a = strlen(a);
1642 size_t len_b = strlen(b);
1644 size_t * prev_row =
xmalloc((len_b + 1) *
sizeof(*prev_row));
1645 size_t * curr_row =
xmalloc((len_b + 1) *
sizeof(*curr_row));
1647 for (
size_t j = 0; j <= len_b; ++j) prev_row[j] = j;
1649 for (
size_t i = 1; i <= len_a; ++i) {
1651 for (
size_t j = 1; j <= len_b; ++j) {
1652 size_t substitution_cost = prev_row[j-1] + (a[i-1] != b[j-1]);
1653 size_t deletion_cost = prev_row[j] + 1;
1654 size_t insertion_cost = curr_row[j-1] + 1;
1655 size_t cost =
MIN(substitution_cost,
MIN(deletion_cost, insertion_cost));
1658 size_t * tmp = prev_row;
1659 prev_row = curr_row;
1663 size_t distance = prev_row[len_b];
1678 char const * closest_key_name = NULL;
1679 size_t closest_distance = SIZE_MAX;
1681 for (
size_t i = 0; i < yaml_base_keys_size; ++i) {
1684 if (distance < closest_distance) {
1685 closest_distance = distance;
1686 closest_key_name = yaml_base_keys[i].name;
1692 size_t key_len = strlen(unknown_key);
1693 size_t max_typo_distance =
MIN(key_len / 4 + 1, (
size_t)2);
1696 (closest_key_name == NULL) || (closest_distance > max_typo_distance),
1697 "unknown root key \"%s\" (did you mean \"%s\"?) ",
1698 unknown_key, closest_key_name);
1704 char const ** start_datetime,
char const ** end_datetime) {
1706 fy_node_t key_node = fy_node_pair_key(base_pair);
1709 fy_node_is_scalar(key_node),
1710 "unsupported key node type "
1711 "(key nodes are expected to be scalar nodes)");
1713 char const * base_key_name = fy_node_get_scalar0(key_node);
1716 yaml_base_keys, yaml_base_keys_size, base_key_name);
1718 fy_node_t value_node = fy_node_pair_value(base_pair);
1720 switch (base_key_type) {
1723 yaml_parse_string_value(
1728 yaml_parse_string_value(
1735 "YAML coupling configuration file");
1743 "inconsistent redefinition of time unit")
1744 *time_unit = time_unit_;
1750 "time unit has to be defined before the couplings")
1774 fy_node_t root_node = fy_document_root(document);
1777 if (!root_node)
return;
1780 fy_node_is_mapping(root_node),
1781 "unsupported root node type (root node is expected to be a mapping node)");
1783 char const * start_datetime = NULL;
1784 char const * end_datetime = NULL;
1790 while ((pair = fy_node_mapping_iterate(root_node, &iter)))
1793 &start_datetime, &end_datetime);
1795 if ((start_datetime != NULL) || (end_datetime != NULL)) {
1799 "cannot set start/end datetime because calendar has not yet been set");
1802 couple_config, start_datetime, end_datetime);
1813 "YAML configuration file could not be found \"%s\"",
yaml_filename);
1821 struct fy_parse_cfg parse_config =
1822 {.search_path =
".",
1825 parse_config.flags =
1826 (
enum fy_parse_cfg_flags)parse_flags;
1829 fy_document_build_from_fp(&parse_config, config_file);
1831 document,
"could not parse YAML configuration file \"%s\"",
yaml_filename);
1835 !fy_document_resolve(document),
1836 "could not resolve anchors and merge keys");
1842 fy_document_destroy(document);
1850 char const * str_interp_stack_config,
int parse_flags) {
1852 "user-provided interp stack config string";
1855 str_interp_stack_config != NULL,
"interpolation stack string is NULL");
1858 struct fy_parse_cfg parse_config =
1859 {.search_path =
".",
1862 parse_config.flags =
1863 (
enum fy_parse_cfg_flags)parse_flags;
1866 fy_document_build_from_string(
1867 &parse_config, str_interp_stack_config, (
size_t)-1);
1872 !fy_document_resolve(document),
1873 "could not resolve anchors and merge keys");
1875 fy_node_t interp_stack_config_node = fy_document_root(document);
1876 YAML_ASSERT(interp_stack_config_node,
"invalid root node");
1882 interp_stack_config, interp_stack_config_node,
1886 fy_document_destroy(document);
1888 return interp_stack_config;
1898 fy_node_create_scalar_copy(document,
value, strlen(
value));
1899 YAC_ASSERT(scalar_node,
"failed to create scalar node");
1908 int value_size = snprintf(str_value,
sizeof(str_value),
"%d",
value);
1910 (value_size >= 0) && ((
size_t)value_size <
sizeof(str_value)),
1911 "could not write \"%d\" to string buffer of size %zu",
1912 value,
sizeof(str_value));
1921 int value_size = snprintf(str_value,
sizeof(str_value),
"%zu",
value);
1923 (value_size >= 0) && ((
size_t)value_size <
sizeof(str_value)),
1924 "could not write \"%zu\" to string buffer of size %zu",
1925 value,
sizeof(str_value));
1934 int value_size = snprintf(str_value,
sizeof(str_value),
"%g",
value);
1936 (value_size >= 0) && ((
size_t)value_size <
sizeof(str_value)),
1937 "could not write \"%g\" to string buffer of size %zu",
1938 value,
sizeof(str_value));
1944 fy_document_t document,
char const *
const * values,
size_t num_values) {
1947 if (num_values == 0)
return (
fy_node_t)NULL;
1952 fy_node_t sequence_node = fy_node_create_sequence(document);
1953 YAC_ASSERT(sequence_node,
"failed to create sequence node");
1955 for (
size_t value_idx = 0; value_idx < num_values; ++value_idx) {
1956 char const *
value = values[value_idx];
1958 int appending_failed =
1959 fy_node_sequence_append(
1961 YAC_ASSERT(!appending_failed,
"failed to append interpolation node");
1964 return sequence_node;
1968 fy_document_t document,
size_t const * values,
size_t num_values) {
1971 if (num_values == 0)
return (
fy_node_t)NULL;
1976 fy_node_t sequence_node = fy_node_create_sequence(document);
1977 YAC_ASSERT(sequence_node,
"failed to create sequence node");
1980 for (
size_t value_idx = 0; value_idx < num_values; ++value_idx) {
1982 snprintf(str_value,
sizeof(str_value),
"%zu", values[value_idx]);
1984 (value_size >= 0) && ((
size_t)value_size <
sizeof(str_value)),
1985 "could not write \"%zu\" to string buffer of size %zu",
1986 values[value_idx],
sizeof(str_value));
1988 YAC_ASSERT_F(scalar_node,
"failed to create scalar at idx %zu", value_idx);
1989 int appending_failed = fy_node_sequence_append(sequence_node, scalar_node);
1990 YAC_ASSERT(!appending_failed,
"failed to append sequence element");
1993 return sequence_node;
2006 YAC_ASSERT(document,
"failed to get document from node");
2009 int appending_failed =
2010 fy_node_mapping_append(
2012 YAC_ASSERT(!appending_failed,
"failed to append mapping node pair");
2019 YAC_ASSERT(document,
"failed to get document from node");
2028 YAC_ASSERT(document,
"failed to get document from node");
2038 YAC_ASSERT(document,
"failed to get document from node");
2048 YAC_ASSERT(document,
"failed to get document from node");
2056 size_t couple_idx,
size_t field_couple_idx) {
2058 const char * src_field_name;
2059 const char * tgt_field_name;
2061 couple_config, couple_idx, field_couple_idx,
2062 &src_field_name, &tgt_field_name);
2065 if (!strcmp(src_field_name, tgt_field_name))
2069 fy_node_t field_name_node = fy_node_create_mapping(document);
2070 YAC_ASSERT(field_name_node,
"failed to create mapping node");
2078 return field_name_node;
2091 char * value_str =
xmalloc(buflen);
2095 if (ierr == 0)
break;
2098 value_str =
xrealloc(value_str, buflen);
2116 fy_node_t map_node = fy_node_create_mapping(document);
2117 YAC_ASSERT(map_node,
"failed to create mapping node");
2119 int contains_non_default_values = 0;
2120 for (
size_t i = 0; i < sub_count; ++i) {
2127 if (!sub_node)
continue;
2130 YAC_ASSERT(sub_name,
"encountered unnamed sub-parameter");
2133 contains_non_default_values = 1;
2136 if (contains_non_default_values)
return map_node;
2141 if (sub_count == 1) {
2142 struct yac_param * active_sub_param = NULL;
2148 YAC_ASSERT(sub_name,
"active sub-parameter has no name");
2153 fy_node_free(map_node);
2167 fy_node_t sequence_node = fy_node_create_sequence(document);
2168 YAC_ASSERT(sequence_node,
"failed to create sequence node");
2170 for (
size_t i = 0; i < sub_count; ++i) {
2177 int appending_failed = fy_node_sequence_append(sequence_node, sub_node);
2178 YAC_ASSERT(!appending_failed,
"failed to append sequence element");
2181 return sequence_node;
2213 char const * interpolation_name =
2215 YAC_ASSERT(interpolation_name,
"failed to get interpolation method name");
2223 if (parameter_node) {
2226 interpolation_node = fy_node_create_mapping(document);
2227 YAC_ASSERT(interpolation_node,
"failed to create mapping node");
2229 interpolation_node, interpolation_name, parameter_node);
2232 interpolation_node =
2237 return interpolation_node;
2242 size_t couple_idx,
size_t field_couple_idx) {
2246 couple_config, couple_idx, field_couple_idx);
2248 YAC_ASSERT(interp_stack,
"invalid interpolation stack");
2251 fy_node_t interp_stack_node = fy_node_create_sequence(document);
2252 YAC_ASSERT(interp_stack_node,
"failed to create sequence node");
2254 size_t interp_stack_size =
2256 YAC_ASSERT(interp_stack_size,
"invalid interpolation stack size");
2258 for (
size_t interp_stack_idx = 0; interp_stack_idx < interp_stack_size;
2259 ++interp_stack_idx) {
2260 int appending_failed =
2261 fy_node_sequence_append(
2266 YAC_ASSERT(!appending_failed,
"failed to append interpolation node");
2269 return interp_stack_node;
2274 size_t couple_idx,
size_t field_couple_idx) {
2277 YAC_ASSERT(document,
"failed to get document from node");
2280 fy_node_t field_couple_node = fy_node_create_mapping(document);
2281 YAC_ASSERT(coupling_node,
"failed to create mapping node");
2284 char const * src_component_name;
2285 char const * tgt_component_name;
2287 couple_config, couple_idx, field_couple_idx,
2288 &src_component_name, &tgt_component_name);
2295 src_component_name);
2302 tgt_component_name);
2308 couple_config, couple_idx, field_couple_idx,
2315 yaml_couple_keys, yaml_couple_keys_size,
SOURCE_GRID),
2322 yaml_couple_keys, yaml_couple_keys_size,
TARGET_GRID),
2329 yaml_couple_keys, yaml_couple_keys_size,
FIELD),
2331 document, couple_config, couple_idx, field_couple_idx));
2339 couple_config, couple_idx, field_couple_idx));
2347 time_operations, time_operations_size,
2349 couple_config, couple_idx, field_couple_idx)));
2355 yaml_couple_keys, yaml_couple_keys_size,
SOURCE_LAG),
2357 couple_config, couple_idx, field_couple_idx));
2363 yaml_couple_keys, yaml_couple_keys_size,
TARGET_LAG),
2365 couple_config, couple_idx, field_couple_idx));
2369 couple_config, couple_idx, field_couple_idx)) {
2375 couple_config, couple_idx, field_couple_idx));
2381 weight_file_on_existing_types, weight_file_on_existing_types_size,
2383 couple_config, couple_idx, field_couple_idx)));
2390 yaml_couple_keys, yaml_couple_keys_size,
MAPPING_SIDE),
2392 mapping_sides, mapping_sides_size,
2394 couple_config, couple_idx, field_couple_idx)));
2400 yaml_couple_keys, yaml_couple_keys_size,
SCALE_FACTOR),
2402 couple_config, couple_idx, field_couple_idx));
2410 couple_config, couple_idx, field_couple_idx));
2418 document, couple_config, couple_idx, field_couple_idx));
2421 char const *
const * src_mask_names;
2422 size_t num_src_mask_names;
2424 couple_config, couple_idx, field_couple_idx,
2425 &src_mask_names, &num_src_mask_names);
2426 if (num_src_mask_names == 1)
2432 else if (num_src_mask_names > 1)
2438 document, src_mask_names, num_src_mask_names));
2441 char const * tgt_mask_name =
2443 couple_config, couple_idx, field_couple_idx);
2452 char const * yaxt_exchanger_name =
2454 couple_config, couple_idx, field_couple_idx);
2455 if (yaxt_exchanger_name)
2460 yaxt_exchanger_name);
2465 couple_config, couple_idx, field_couple_idx);
2466 if (collection_selection) {
2469 size_t const * indices =
2471 size_t * continous_indices = NULL;
2472 if (indices == NULL) {
2475 for (
size_t i = 0; i <
collection_size; ++i) continous_indices[i] = i;
2476 indices = continous_indices;
2492 free(continous_indices);
2501 bool_names, bool_names_size,
2503 couple_config, couple_idx, field_couple_idx)));
2505 int appending_failed =
2506 fy_node_sequence_append(coupling_node, field_couple_node);
2507 YAC_ASSERT(!appending_failed,
"failed to append field couple node");
2512 size_t couple_idx) {
2514 size_t num_couple_fields =
2517 for (
size_t field_couple_idx = 0;
2518 field_couple_idx < num_couple_fields; ++field_couple_idx)
2520 coupling_node, couple_config, couple_idx, field_couple_idx);
2526 fy_node_t output_grid_node = fy_node_create_mapping(document);
2527 YAC_ASSERT(output_grid_node,
"failed to create mapping node");
2532 yaml_debug_output_grid_keys, yaml_debug_output_grid_keys_size,
2538 yaml_debug_output_grid_keys, yaml_debug_output_grid_keys_size,
2542 return output_grid_node;
2551 size_t num_output_grids = 0;
2562 if (num_output_grids > 0) {
2565 output_grids_node = fy_node_create_sequence(document);
2566 YAC_ASSERT(output_grids_node,
"failed to create sequence node");
2571 char const * grid_name =
2577 int appending_failed =
2578 fy_node_sequence_append(
2581 YAC_ASSERT(!appending_failed,
"failed to append output grid node");
2586 return output_grids_node;
2593 fy_node_t debug_node = fy_node_create_mapping(document);
2594 YAC_ASSERT(debug_node,
"failed to create mapping node");
2607 yaml_debug_keys, yaml_debug_keys_size,
MISSING_DEF),
2609 bool_names, bool_names_size,
2618 bool_names, bool_names_size,
2627 bool_names, bool_names_size,
2636 size_t num_couples =
2639 if (!num_couples)
return NULL;
2642 fy_node_t coupling_node = fy_node_create_sequence(document);
2643 YAC_ASSERT(coupling_node,
"failed to create sequence node");
2646 for (
size_t couple_idx = 0; couple_idx < num_couples; ++couple_idx)
2648 coupling_node, couple_config, couple_idx);
2650 return coupling_node;
2657 fy_node_t field_node = fy_node_create_mapping(document);
2658 YAC_ASSERT(field_node,
"failed to create mapping node");
2661 char const * component_name =
2664 char const * field_name =
2667 char const * grid_name =
2670 char const * metadata =
2672 couple_config, component_name, grid_name, field_name);
2675 couple_config, component_name, grid_name, field_name);
2676 char const * timestep =
2678 couple_config, component_name, grid_name, field_name);
2681 couple_config, component_name, grid_name, field_name);
2682 double frac_mask_fallback_value =
2684 couple_config, component_name, grid_name, field_name);
2714 field_node,
"frac_mask_fallback_value", frac_mask_fallback_value);
2728 fy_node_t fields_node = fy_node_create_sequence(document);
2729 YAC_ASSERT(fields_node,
"failed to create sequence node");
2731 for (
size_t field_idx = 0; field_idx <
num_fields; ++field_idx) {
2733 int appending_failed =
2734 fy_node_sequence_append(
2738 YAC_ASSERT(!appending_failed,
"failed to append field node");
2748 fy_node_t component_node = fy_node_create_mapping(document);
2749 YAC_ASSERT(component_node,
"failed to create mapping node");
2752 char const * component_name =
2754 char const * metadata =
2770 return component_node;
2782 fy_node_t components_node = fy_node_create_sequence(document);
2783 YAC_ASSERT(components_node,
"failed to create sequence node");
2788 int appending_failed =
2789 fy_node_sequence_append(
2792 YAC_ASSERT(!appending_failed,
"failed to append component node");
2795 return components_node;
2802 fy_node_t grid_node = fy_node_create_mapping(document);
2803 YAC_ASSERT(grid_node,
"failed to create mapping node");
2806 char const * grid_name =
2808 char const * metadata =
2827 if (num_grids == 0)
return (
fy_node_t)NULL;
2830 fy_node_t grids_node = fy_node_create_sequence(document);
2831 YAC_ASSERT(grids_node,
"failed to create sequence node");
2833 for (
size_t grids_idx = 0; grids_idx < num_grids; ++grids_idx) {
2835 int appending_failed =
2836 fy_node_sequence_append(
2839 YAC_ASSERT(!appending_failed,
"failed to append grid node");
2849 fy_node_t definition_node = fy_node_create_mapping(document);
2850 YAC_ASSERT(definition_node,
"failed to create mapping node");
2861 return definition_node;
2866 int include_definitions) {
2869 fy_node_t root_node = fy_node_create_mapping(document);
2870 YAC_ASSERT(root_node,
"failed to create mapping node");
2876 yaml_base_keys, yaml_base_keys_size,
DEBUG),
2880 if (include_definitions)
2882 root_node,
"debug_definitions",
2890 yaml_base_keys, yaml_base_keys_size,
START_DATE), start_datetime);
2891 free(start_datetime);
2898 yaml_base_keys, yaml_base_keys_size,
END_DATE), end_datetime);
2905 yaml_base_keys, yaml_base_keys_size,
CALENDAR),
2907 calendar_types, calendar_types_size, getCalendarType()));
2921 yaml_base_keys, yaml_base_keys_size,
COUPLING),
2929 int include_definitions) {
2933 YAC_ASSERT(document,
"failed to create document");
2938 document, couple_config, include_definitions);
2941 int setting_root_failed =
2942 fy_document_set_root(document, root_node);
2943 YAC_ASSERT(!setting_root_failed,
"failed to add root node to document");
2946 char * str_document =
2947 fy_emit_document_to_string(
2948 document, (
enum fy_emitter_cfg_flags)emit_flags);
2950 YAC_ASSERT(str_document,
"failed to emit document to string");
2953 fy_document_destroy(document);
2955 return str_document;
char const * grid_names[]
unsigned component_idx[3]
char const * field_names[8]
#define YAC_ASSERT(exp, msg)
static double yaml_parse_double_value(fy_node_t value_node, char const *key_name, char const *yaml_filename)
yaml_debug_sync_loc_key_types
static fy_node_t yac_yaml_create_interpolation_node(fy_document_t document, struct yac_interp_method_config const *method_config)
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)
struct yac_interp_stack_config * yac_yaml_parse_interp_stack_config_string(char const *str_interp_stack_config, int parse_flags)
static void yaml_parse_field_names(struct field_couple_field_names **field_names, size_t *num_field_names, fy_node_t fields_node, const char *yaml_filename)
static void yac_yaml_append_couple_nodes(fy_node_t coupling_node, struct yac_couple_config *couple_config, size_t couple_idx)
static void yaml_check_base_key_typo(char const *unknown_key, char const *yaml_filename)
static fy_node_t yac_yaml_create_scalar_dble(fy_document_t document, double value)
#define YAML_UNREACHABLE_DEFAULT_F(MSG,...)
static void yaml_set_interp_method_config_param_from_node(struct yac_param *param, fy_node_t value_node, char const *interpolation_name, char const *yaml_filename)
struct fy_node_pair * fy_node_pair_t
static fy_node_t yac_yaml_create_non_default_param_node(fy_document_t document, struct yac_param *param)
static fy_node_t yac_yaml_create_field_node(fy_document_t document, struct yac_couple_config *couple_config, size_t component_idx, size_t field_idx)
static calendarType yaml_parse_calendar_value(fy_node_t value_node, char const *key_name, char const *yaml_filename)
static fy_node_t yac_yaml_create_grids_node(fy_document_t document, struct yac_couple_config *couple_config)
static void yaml_parse_base_map_pair(struct yac_couple_config *couple_config, fy_node_pair_t base_pair, const char *yaml_filename, enum yac_time_unit_type *time_unit, char const **start_datetime, char const **end_datetime)
static void yaml_parse_string_sequence(char const ***values, size_t *num_values, fy_node_t values_node, char const *sequence_name, const char *yaml_filename)
static fy_node_t yac_yaml_create_output_grids_node(fy_document_t document, struct yac_couple_config *couple_config)
static fy_node_t yac_yaml_create_sequence_scalar_size_t(fy_document_t document, size_t const *values, size_t num_values)
int const YAC_YAML_PARSER_JSON_AUTO
static void yaml_parse_size_t_sequence(size_t **values, size_t *num_values, fy_node_t values_node, char const *sequence_name, const char *yaml_filename)
#define YAML_UNREACHABLE_DEFAULT(MSG)
char * yac_yaml_emit_coupling(struct yac_couple_config *couple_config, int emit_flags, int include_definitions)
static size_t yaml_parse_size_t_value(fy_node_t value_node, char const *key_name, char const *yaml_filename)
static fy_node_t yac_yaml_create_components_node(fy_document_t document, struct yac_couple_config *couple_config)
static fy_node_t yac_yaml_create_couple_config_nodes(fy_document_t document, struct yac_couple_config *couple_config, int include_definitions)
static fy_node_t yac_yaml_create_grid_node(fy_document_t document, struct yac_couple_config *couple_config, size_t grid_idx)
static void yac_yaml_map_append_scalar_dble(fy_node_t map, char const *key, double value)
static void yaml_parse_document(struct yac_couple_config *couple_config, fy_document_t document, const char *yaml_filename)
static int yaml_parse_enum_value(struct yac_name_type_pair const *valid_values, size_t num_valid_values, fy_node_t value_node, char const *key_name, char const *yaml_filename)
int const YAC_YAML_EMITTER_DEFAULT
emit to YAML format
void yac_yaml_read_coupling(struct yac_couple_config *couple_config, const char *yaml_filename, int parse_flags)
static fy_node_t yac_yaml_create_non_default_scalar_param_node(fy_document_t document, struct yac_param const *param)
@ WEIGHT_FILE_ON_EXISTING
static int yaml_parse_integer_value(fy_node_t value_node, char const *key_name, char const *yaml_filename)
static void yaml_parse_debug_output_grids(struct yac_couple_config *couple_config, fy_node_t output_grids_node, char const *yaml_filename)
static void yaml_parse_comp_grid_names(char const **comp_name, char const ***grid_names, size_t *num_grid_names, fy_node_t values_node, char const *type_name, const char *yaml_filename, int allow_multiple_grids)
#define OUTPUT_GRIDS_FILE_NAME_STR
int const YAC_YAML_EMITTER_JSON
emit to JSON format
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
int const YAC_YAML_PARSER_DEFAULT
default parse flags (YAML format)
static fy_node_t yac_yaml_create_output_grid_node(fy_document_t document, char const *grid_name, char const *file_name)
static fy_node_t yac_yaml_create_non_default_struct_param_node(fy_document_t document, struct yac_param *param)
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)
reads interpolation name and user-provided parameters from YAML node
static void yaml_parse_weight_file_data(char const **weight_file_name, enum yac_weight_file_on_existing *on_existing, fy_node_t values_node, char const *type_name, const char *yaml_filename)
yaml_weight_file_data_key_types
@ WEIGHT_FILE_DATA_ON_EXISTING
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)
static struct debug_config_file_buffer yaml_parse_debug_config_file_buffer(fy_node_t config_file_node, char const *config_file_type_name, char const *yaml_filename)
#define YAML_ASSERT_F(CHECK, MSG,...)
static fy_node_t yac_yaml_create_component_node(fy_document_t document, struct yac_couple_config *couple_config, size_t component_idx)
static size_t yaml_edit_distance(char const *a, char const *b)
yaml_debug_output_grid_key_types
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_output_grid_pair(char const **grid_name, char const **file_name, fy_node_pair_t output_grid_pair, char const *yaml_filename)
static fy_node_t yac_yaml_create_interpolation_stack_node(fy_document_t document, struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx)
static enum yac_reduction_type yaml_parse_time_reduction_value(fy_node_t value_node, char const *key_name, char const *yaml_filename)
static void yaml_parse_debug_global_config(struct yac_couple_config *couple_config, fy_node_t global_config_node, char const *yaml_filename)
static void yac_yaml_map_append_scalar_size_t(fy_node_t map, char const *key, size_t value)
static fy_node_t yac_yaml_create_scalar_size_t(fy_document_t document, size_t value)
char const * yac_time_to_ISO(char const *time, enum yac_time_unit_type time_unit)
int const YAC_YAML_PARSER_JSON_FORCE
assume JSON format
static void yac_yaml_append_couple_field_nodes(fy_node_t coupling_node, struct yac_couple_config *couple_config, size_t couple_idx, size_t field_couple_idx)
static void yaml_parse_interp_stack_value(struct yac_interp_stack_config *interp_stack, fy_node_t interp_stack_node, char const *yaml_filename)
static fy_node_t yac_yaml_create_debug_node(fy_document_t document, struct yac_couple_config *couple_config)
struct fy_node * fy_node_t
static void yaml_parse_debug(struct yac_couple_config *couple_config, fy_node_t debug_node, char const *yaml_filename)
static void yac_yaml_map_append(fy_node_t map, char const *key, fy_node_t value)
static fy_node_t yac_yaml_create_sequence_scalar(fy_document_t document, char const *const *values, size_t num_values)
static void yaml_parse_debug_map_pair(struct yac_couple_config *couple_config, fy_node_pair_t debug_pair, const char *yaml_filename)
static void yac_yaml_map_append_scalar_int(fy_node_t map, char const *key, int value)
#define YAML_ASSERT(CHECK, MSG)
static fy_node_t yac_yaml_create_fields_node(fy_document_t document, struct yac_couple_config *couple_config, size_t component_idx)
static void yaml_parse_debug_config_file_map_pair(struct debug_config_file_buffer *config_file_buffer, fy_node_pair_t config_file_pair, char const *config_file_type_name, const char *yaml_filename)
static void yaml_parse_interp_method(struct yac_interp_stack_config *interp_stack, fy_node_t interp_method_node, char const *yaml_filename)
yaml_comp_grid_names_key_types
static fy_node_t yac_yaml_create_scalar(fy_document_t document, char const *value)
static void yaml_parse_output_grid(struct yac_couple_config *couple_config, fy_node_t output_grid_node, char const *yaml_filename)
static fy_node_t yac_yaml_create_scalar_int(fy_document_t document, int value)
static void yaml_parse_collection_selection_sequence(struct yac_collection_selection **collection_selection, fy_node_t values_node, char const *sequence_name, const char *yaml_filename)
static struct debug_config_file yaml_parse_config_file_value(fy_node_t config_file_node, char const *file_type_name, const char *yaml_filename)
static fy_node_t yac_yaml_create_non_default_list_param_node(fy_document_t document, struct yac_param *param)
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)
static void yaml_parse_all_output_grids(struct yac_couple_config *couple_config, fy_node_t output_grids_node, char const *yaml_filename)
static fy_node_t yac_yaml_create_definitions_node(fy_document_t document, struct yac_couple_config *couple_config)
int yac_couple_config_get_enforce_write_weight_file(struct yac_couple_config const *couple_config, size_t couple_idx, size_t field_couple_idx)
double yac_couple_config_get_scale_summand(struct yac_couple_config const *couple_config, size_t couple_idx, size_t field_couple_idx)
void yac_couple_config_get_field_couple_component_names(struct yac_couple_config const *couple_config, size_t couple_idx, size_t field_couple_idx, char const **src_component_name, char const **tgt_component_name)
struct yac_interp_stack_config * yac_couple_config_get_interp_stack(struct yac_couple_config const *couple_config, size_t couple_idx, size_t field_couple_idx)
int yac_couple_config_get_missing_definition_is_fatal(struct yac_couple_config const *couple_config)
int yac_couple_config_get_use_raw_exchange(struct yac_couple_config const *couple_config, size_t couple_idx, size_t field_couple_idx)
void yac_couple_config_get_field_names(struct yac_couple_config const *couple_config, size_t couple_idx, size_t field_couple_idx, char const **src_field_name, const char **tgt_field_name)
char * yac_couple_config_get_end_datetime(struct yac_couple_config const *couple_config)
void yac_couple_config_set_grid_output_filename(struct yac_couple_config *couple_config, char const *grid_name, const char *output_filename)
const char * yac_couple_config_get_grid_output_filename(struct yac_couple_config const *couple_config, const char *grid_name)
const char * yac_couple_config_get_component_metadata(struct yac_couple_config const *couple_config, const char *comp_name)
char const * yac_couple_config_get_yaxt_exchanger_name(struct yac_couple_config const *couple_config, size_t couple_idx, size_t field_couple_idx)
char const * yac_couple_config_get_field_grid_name(struct yac_couple_config const *couple_config, size_t component_idx, size_t field_idx)
char const * yac_couple_config_get_field_timestep(struct yac_couple_config const *couple_config, char const *component_name, char const *grid_name, char const *field_name)
double yac_couple_config_get_scale_factor(struct yac_couple_config const *couple_config, size_t couple_idx, size_t field_couple_idx)
void yac_couple_config_set_datetime(struct yac_couple_config *couple_config, char const *start, char const *end)
size_t yac_couple_config_get_num_grids(struct yac_couple_config const *couple_config)
void yac_couple_config_set_apply_coordinate_check(struct yac_couple_config *couple_config, int apply_coordinate_check)
char const * yac_couple_config_get_weight_file_name(struct yac_couple_config const *couple_config, size_t couple_idx, size_t field_couple_idx)
void yac_couple_config_get_src_mask_names(struct yac_couple_config const *couple_config, size_t couple_idx, size_t field_couple_idx, char const *const **mask_names, size_t *num_mask_names)
char const * yac_couple_config_get_grid_name(struct yac_couple_config const *couple_config, size_t grid_idx)
double yac_couple_config_get_frac_mask_fallback_value(struct yac_couple_config const *couple_config, char const *component_name, char const *grid_name, char const *field_name)
size_t yac_couple_config_get_num_couples(struct yac_couple_config const *couple_config)
struct yac_collection_selection const * yac_couple_config_get_collection_selection(struct yac_couple_config const *couple_config, size_t couple_idx, size_t field_couple_idx)
char const * yac_couple_config_get_tgt_mask_name(struct yac_couple_config const *couple_config, size_t couple_idx, size_t field_couple_idx)
int yac_couple_config_get_source_lag(struct yac_couple_config const *couple_config, size_t couple_idx, size_t field_couple_idx)
size_t yac_couple_config_get_field_collection_size(struct yac_couple_config const *couple_config, char const *component_name, char const *grid_name, char const *field_name)
char * yac_couple_config_get_start_datetime(struct yac_couple_config const *couple_config)
int yac_couple_config_get_field_role(struct yac_couple_config const *couple_config, char const *component_name, char const *grid_name, char const *field_name)
size_t yac_couple_config_get_num_components(struct yac_couple_config const *couple_config)
void yac_couple_config_set_coordinates_mismatch_is_fatal(struct yac_couple_config *couple_config, int coordinates_mismatch_is_fatal)
char const * yac_couple_config_get_field_name(struct yac_couple_config const *couple_config, size_t component_idx, size_t field_idx)
size_t yac_couple_config_get_num_couple_fields(struct yac_couple_config const *couple_config, size_t couple_idx)
size_t yac_couple_config_get_num_fields(struct yac_couple_config const *couple_config, size_t component_idx)
void yac_couple_config_add_grid(struct yac_couple_config *couple_config, char const *name)
int yac_couple_config_get_target_lag(struct yac_couple_config const *couple_config, size_t couple_idx, size_t field_couple_idx)
const char * yac_couple_config_get_grid_metadata(struct yac_couple_config const *couple_config, const char *grid_name)
enum yac_weight_file_on_existing yac_couple_config_get_weight_file_on_existing(struct yac_couple_config const *couple_config, size_t couple_idx, size_t field_couple_idx)
int yac_couple_config_get_coordinates_mismatch_is_fatal(struct yac_couple_config const *couple_config)
int yac_couple_config_get_mapping_on_source(struct yac_couple_config const *couple_config, size_t couple_idx, size_t field_couple_idx)
void yac_couple_config_get_field_grid_names(struct yac_couple_config const *couple_config, size_t couple_idx, size_t field_couple_idx, char const **src_grid_name, char const **tgt_grid_name)
char const * yac_couple_config_get_component_name(struct yac_couple_config const *couple_config, size_t component_idx)
int yac_couple_config_get_apply_coordinate_check(struct yac_couple_config const *couple_config)
void yac_couple_config_set_all_grids_output_filename(struct yac_couple_config *couple_config, char const *output_filename)
void yac_couple_config_set_missing_definition_is_fatal(struct yac_couple_config *couple_config, int missing_definition_is_fatal)
char const * yac_couple_config_get_coupling_period(struct yac_couple_config const *couple_config, size_t couple_idx, size_t field_couple_idx)
void yac_couple_config_set_config_output_filename(struct yac_couple_config *couple_config, char const *filename, enum yac_text_filetype filetype, char const *ref, int include_definitions)
void yac_couple_config_def_couple(struct yac_couple_config *couple_config, char const *src_comp_name, char const *src_grid_name, char const *src_field_name, char const *tgt_comp_name, char const *tgt_grid_name, char const *tgt_field_name, char const *coupling_period, int time_reduction, struct yac_interp_stack_config *interp_stack, int src_lag, int tgt_lag, const char *weight_file_name, int weight_file_on_existing, int mapping_on_source, double scale_factor, double scale_summand, size_t num_src_mask_names, char const *const *src_mask_names, char const *tgt_mask_name, char const *yaxt_exchanger_name, struct yac_collection_selection const *collection_selection, int use_raw_exchange)
enum yac_reduction_type yac_couple_config_get_coupling_period_operation(struct yac_couple_config const *couple_config, size_t couple_idx, size_t field_couple_idx)
const char * yac_couple_config_get_field_metadata(struct yac_couple_config const *couple_config, const char *comp_name, const char *grid_name, const char *field_name)
@ YAC_TEXT_FILETYPE_YAML
YAML format.
@ YAC_TEXT_FILETYPE_JSON
JSON format.
size_t yac_collection_selection_get_collection_size(struct yac_collection_selection const *collection_selection)
Get the size of the collection selection.
size_t const * yac_collection_selection_get_indices(struct yac_collection_selection const *collection_selection)
Get explicit selection indices if non-contiguous.
void yac_collection_selection_delete(struct yac_collection_selection *collection_selection)
Delete a collection selection object.
struct yac_collection_selection * yac_collection_selection_new(size_t collection_size, size_t const *selection_indices)
Create a new collection selection.
int yac_name_type_pair_get_type(struct yac_name_type_pair const *pairs, size_t count, char const *name)
#define DEF_NAME_TYPE_PAIR(NAME, TYPE)
char const * yac_name_type_pair_get_name(struct yac_name_type_pair const *pairs, size_t count, int type)
#define DEF_NAME_TYPE_PAIRS(NAME,...)
void yac_instance_def_calendar(int calendar_type, char const *source)
#define YAC_INSTANCE_CONFIG_OUTPUT_REF_ENDDEF
#define YAC_INSTANCE_CONFIG_OUTPUT_REF_COMP
#define YAC_INSTANCE_CONFIG_OUTPUT_REF_SYNC
struct yac_param * yac_interp_method_config_get_param(struct yac_interp_method_config const *config)
struct yac_interp_method_config * yac_interp_method_config_default_from_name_new(char const *method_name)
Defines the interface for interpolation method configuration "base class" in YAC.
size_t yac_interp_stack_config_get_size(struct yac_interp_stack_config *interp_stack)
Get the number of interpolation methods in the stack.
struct yac_interp_method_config const * yac_interp_stack_config_get(struct yac_interp_stack_config *interp_stack, size_t interp_stack_idx)
Get a method configuration from the stack by index.
void yac_interp_stack_config_delete(struct yac_interp_stack_config *interp_stack_config)
Free an interpolation stack configuration object.
void yac_interp_stack_config_add(struct yac_interp_stack_config *interp_stack_config, struct yac_interp_method_config *method_config)
Add an interpolation method configuration to the end of the stack.
struct yac_interp_stack_config * yac_interp_stack_config_new()
Allocate a new empty interpolation stack configuration object.
#define YAC_WEIGHT_FILE_ON_EXISTING_DEFAULT_VALUE
yac_weight_file_on_existing
@ YAC_WEIGHT_FILE_KEEP
keep existing weight file
@ YAC_WEIGHT_FILE_UNDEFINED
@ YAC_WEIGHT_FILE_OVERWRITE
overwrite existing weight file
@ YAC_WEIGHT_FILE_ERROR
error when weight file existis already
Defines internal basic interpolation definitions.
#define YAC_FRAC_MASK_VALUE_IS_VALID(value)
Test whether a fractional mask value is valid.
int yac_file_exists(const char *filename)
Check whether a file exists.
int yac_param_get_sub_by_index(struct yac_param *param, size_t idx, struct yac_param **sub_param)
Get a handle to a subparameter by index.
int yac_param_is_default(const struct yac_param *param)
Check whether a parameter is at its default value.
int yac_param_get_scalar(const struct yac_param *param, char *buf, size_t buflen)
Get the value of a scalar parameter as a string.
int yac_param_set_scalar(struct yac_param *param, const char *value_str)
Set the value of a scalar parameter from a string.
enum yac_param_type yac_param_get_type(const struct yac_param *param)
Get the type of a parameter.
int yac_param_append(struct yac_param *param, struct yac_param **sub_param)
Append a new default subparameter to a list parameter and return a handle to it.
int yac_param_get_sub_count(const struct yac_param *param, size_t *count)
Get the number of subparameters.
const char * yac_param_get_last_error(void)
Retrieve the last error message for the calling thread.
const char * yac_param_get_name(const struct yac_param *param)
Get the name of the current parameter.
int yac_param_get_sub_by_name(struct yac_param *param, const char *name, struct yac_param **sub_param)
Get a handle to a subparameter by name.
Public interface for YAC parameters.
yac_param_type
Parameter type for generic configuration interface.
@ YAC_PARAM_TYPE_SCALAR
Single typed value (e.g., int, double, string, enum)
@ YAC_PARAM_TYPE_LIST
Ordered, growable list of subparameters.
@ YAC_PARAM_TYPE_STRUCT
Named, fixed set of subparameters.
#define xrealloc(ptr, size)
#define xfopen(path, mode)
enum yac_text_filetype type
struct debug_config_file_buffer::debug_config_file config_file[SYNC_LOC_COUNT]
char const * sync_loc_ref[SYNC_LOC_COUNT]
char const ** src_mask_names
char const * yaxt_exchanger_name
char const * coupling_period
enum yac_weight_file_on_existing on_existing
struct field_couple_buffer::@58 src
char const * tgt_mask_name
struct field_couple_buffer::@60 weight_file
struct field_couple_buffer::@59 tgt
struct yac_interp_stack_config * interp_stack
struct yac_collection_selection * collection_selection
struct field_couple_buffer::field_couple_field_names * field_names
struct field_couple_buffer::@59::@61 grid
size_t num_src_mask_names
enum yac_reduction_type time_reduction
char const * weight_file_name
char const src_grid_name[]
char const tgt_grid_name[]
int const YAC_CALENDAR_NOT_SET
#define YAC_ASSERT_F(exp, format,...)
#define YAC_UNREACHABLE_DEFAULT(msg)