YAC 3.21.0
Yet Another Coupler
Loading...
Searching...
No Matches
test_interp_method_config.py
Go to the documentation of this file.
1#!/usr/bin/env python3
2
3# Copyright (c) 2026 The YAC Authors
4#
5# SPDX-License-Identifier: BSD-3-Clause
6
7
11
12try:
13 from mpi4py import MPI
14 comm = MPI.COMM_WORLD
15except ImportError:
16 comm = None
17
18import math
19from numpy import deg2rad
20
21from yac.core import InterpMethodConfig, InterpolationStack
22
23# Test set/get int (nnn.n)
24cfg = InterpMethodConfig("nnn")
25cfg.set_param_int("n", 8)
26n = cfg.get_param_int("n")
27assert n == 8, f"set/get int: expected n==8, got {n}"
28
29# Test set/get double (nnn.max_search_distance)
30cfg2 = InterpMethodConfig("nnn")
31cfg2.set_param_dble("max_search_distance", 0.5)
32d = cfg2.get_param_dble("max_search_distance")
33assert d == 0.5, f"set/get dble: expected 0.5, got {d}"
34
35# Test set/get int (nnn.n_min; defaults to 0, which is interpreted as n)
36cfg_n_min = InterpMethodConfig("nnn")
37n_min = cfg_n_min.get_param_int("n_min")
38assert n_min == 0, f"default n_min: expected 0, got {n_min}"
39cfg_n_min.set_param_int("n", 8)
40cfg_n_min.set_param_int("n_min", 4)
41n_min = cfg_n_min.get_param_int("n_min")
42assert n_min == 4, f"set/get int: expected n_min==4, got {n_min}"
43
44# Test set/get int (dnn.n_min)
45cfg_dnn_n_min = InterpMethodConfig("dnn")
46n_min = cfg_dnn_n_min.get_param_int("n_min")
47assert n_min == 1, f"default dnn n_min: expected 1, got {n_min}"
48cfg_dnn_n_min.set_param_int("n_min", 3)
49n_min = cfg_dnn_n_min.get_param_int("n_min")
50assert n_min == 3, f"set/get int: expected n_min==3, got {n_min}"
51
52# Test set/get string (nnn.weighted)
53cfg3 = InterpMethodConfig("nnn")
54cfg3.set_param_str("weighted", "gauss_weighted")
55s = cfg3.get_param_str("weighted")
56assert s == "gauss_weighted", f"set/get str: expected 'gauss_weighted', got '{s}'"
57
58# Test dot-separated path (dnn.search_distance.fixed)
59cfg4 = InterpMethodConfig("dnn")
60cfg4.set_param_dble("search_distance.fixed", deg2rad(1))
61d4 = cfg4.get_param_dble("search_distance.fixed")
62assert d4 == deg2rad(1), f"dot-path dble: wrong value {d4}"
63
64# Test add_from_config integrates with InterpolationStack
65stack = InterpolationStack()
66cfg5 = InterpMethodConfig("nnn")
67cfg5.set_param_int("n", 3)
68stack.add_from_config(cfg5)
69
70# Check generic set_param method
71cfg6 = InterpMethodConfig("nnn")
72cfg6.set_param("n", 5)
73assert cfg6.get_param_int("n") == 5, "set_param int dispatch failed"
74
75cfg6.set_param("max_search_distance", 1.5)
76assert cfg6.get_param_dble("max_search_distance") == 1.5, "set_param float dispatch failed"
77
78cfg6.set_param("weighted", "gauss_weighted")
79assert cfg6.get_param_str("weighted") == "gauss_weighted", "set_param str dispatch failed"
80
81cfg7 = InterpMethodConfig("spmap")
82cfg7.set_param("overwrite", [
83 {
84 "condition": {
85 "bounding_circle": { # amazonas delta
86 "center": {
87 "lon": deg2rad(-50.0),
88 "lat": deg2rad(0.0),
89 },
90 "radius": deg2rad(4.0),
91 }
92 },
93 "spread_distance": deg2rad(0.3),
94 },
95 {
96 "condition": {
97 "bounding_circle": { # north pole
98 "center": {
99 "lon": deg2rad(0.0),
100 "lat": deg2rad(90.0),
101 },
102 "radius": deg2rad(2.0),
103 }
104 },
105 "spread_distance": deg2rad(0.4),
106 }
107])
108
109assert cfg7.get_param_dble("overwrite.0.spread_distance") == deg2rad(0.3)
110assert cfg7.get_param_dble("overwrite.0.condition.bounding_circle.radius") == deg2rad(4.0)
111assert cfg7.get_param_dble("overwrite.1.spread_distance") == deg2rad(0.4)
112
113
114# Check constructor with kwargs
115cfg8 = InterpMethodConfig("nnn",
116 n=3,
117 weighted="gauss_weighted",
118 max_search_distance=1.4,
119 )
120assert cfg8.get_param_int("n") == 3, "set_param int dispatch failed"
121assert cfg8.get_param_str("weighted") == "gauss_weighted", "set_param str dispatch failed"
122assert abs(cfg8.get_param_dble("max_search_distance") - 1.4) < 1e-15, "set_param float dispatch failed"
123
124
125
126# Test constructing multiple method types with default parameters
127for method_name in ("average", "ncc", "dnn", "nnn", "conservative",
128 "fixed", "check", "bernstein_bezier", "creep",
129 "source_to_target_map"):
130 c = InterpMethodConfig(method_name)
131 assert c is not None, f"failed to create default config for '{method_name}'"
132
133# Test list parameter: spmap overwrite (get_list_size, append_list_element, index path)
134spmap = InterpMethodConfig("spmap")
135
136# The overwrite list must be empty by default.
137assert spmap.get_list_size("overwrite") == 0, \
138 "spmap overwrite list should start empty"
139
140# Append first element and verify returned index.
141idx0 = spmap.append_list_element("overwrite")
142assert idx0 == 0, f"expected index 0 for first append, got {idx0}"
143assert spmap.get_list_size("overwrite") == 1, \
144 "expected list size 1 after one append"
145
146# Set and get a sub-parameter of the new element via index path.
147spmap.set_param_dble("overwrite.0.spread_distance", 0.05)
148sd0 = spmap.get_param_dble("overwrite.0.spread_distance")
149assert sd0 == 0.05, f"overwrite.0.spread_distance round-trip failed: {sd0}"
150
151# Append a second element; both elements must be independent.
152idx1 = spmap.append_list_element("overwrite")
153assert idx1 == 1, f"expected index 1 for second append, got {idx1}"
154
155spmap.set_param_dble("overwrite.1.spread_distance", 0.10)
156sd1 = spmap.get_param_dble("overwrite.1.spread_distance")
157assert sd1 == 0.10, f"overwrite.1.spread_distance round-trip failed: {sd1}"
158
159# First element must be unchanged.
160sd0_check = spmap.get_param_dble("overwrite.0.spread_distance")
161assert sd0_check == 0.05, \
162 f"overwrite.0 was modified when setting overwrite.1: {sd0_check}"
163
164# Check InterpolationStack add_from_dict
165stack2 = InterpolationStack()
166stack2.add_method("nnn",
167 n=5,
168 weighted="distance_weighted",
169 max_search_distance=2.2
170 )
171stack2.add_method("spmap",
172 overwrite=[{
173 "condition": {
174 "bounding_circle": { # amazonas delta
175 "center": {
176 "lon": deg2rad(-50.0),
177 "lat": deg2rad(0.0),
178 },
179 "radius": deg2rad(4.0),
180 }
181 },
182 "spread_distance": 0.0002}],
183 )