YAC 3.21.0
Yet Another Coupler
Loading...
Searching...
No Matches
interp_method_dnn.c
Go to the documentation of this file.
1// Copyright (c) 2026 The YAC Authors
2//
3// SPDX-License-Identifier: BSD-3-Clause
4
5#ifdef HAVE_CONFIG_H
6// Get the definition of the 'restrict' keyword.
7#include "config.h"
8#endif
9
10#include <limits.h>
11#include <string.h>
12#include <float.h>
13
21#include "parameter/param_int.h"
25#include "area.h"
26#include "instrument_internal.h"
27#include "yac_mpi_common.h"
28
29static size_t do_search_dnn(struct interp_method * method,
30 struct yac_interp_grid * interp_grid,
31 size_t * tgt_points, size_t count,
32 struct yac_interp_weights * weights,
33 int * interpolation_complete);
34static void delete_dnn(struct interp_method * method);
35
36static struct interp_method_vtable
40
53
57
59 if (search_distance != NULL) {
60 copy = xmalloc(sizeof(*copy));
61 *copy = *search_distance;
62 }
63 return copy;
64}
65
68
72 "internal error (default search distance type is assumed to be cell area)");
73
74 return
77 .search_distance.scale =
79}
80
82 struct interp_method_dnn * method_dnn, struct yac_interp_grid * interp_grid,
83 size_t * tgt_points, yac_coordinate_pointer tgt_coords,
84 struct bounding_circle * bnd_circles, size_t count) {
85
86 switch(method_dnn->search_distance_type) {
87
88 YAC_UNREACHABLE_DEFAULT("invalid search distance type");
89
91
92 // use a fixed search distance for all target points
93 double search_distance = method_dnn->search_distance.fixed;
94 struct sin_cos_angle search_distance_angle =
95 sin_cos_angle_new(sin(search_distance), cos(search_distance));
96 for (size_t i = 0; i < count; ++i) {
97 memcpy(bnd_circles[i].base_vector, tgt_coords[i], 3 * sizeof(double));
98 bnd_circles[i].inc_angle = search_distance_angle;
99 bnd_circles[i].sq_crd = DBL_MAX;
100 }
101 break;
102
103 }
105
106 // compute search distance from target cell area
107 // area of spherical cap: A = 2*PI*(1 - cos(theta))
108 // using half-angle identity: 1 - cos(theta) = 2*sin²(theta/2)
109 // => sin(theta/2) = sqrt(A/(4*PI))
110 // => theta = 2 * arcsin(sqrt(A/(4*PI)))
111 double search_distance_scale = method_dnn->search_distance.scale;
112 struct yac_const_basic_grid_data * tgt_basic_grid_data =
114
115 // allocate buffer for grid cell
116 struct yac_grid_cell grid_cell;
117 yac_init_grid_cell(&grid_cell);
118
119 for (size_t i = 0; i < count; ++i) {
120
121 // get target cell
123 tgt_basic_grid_data, tgt_points[i], &grid_cell);
124
125 // compute cell area
126 double cell_area = yac_grid_cell_area(grid_cell);
127
128 // convert area to polar angle of equivalent spherical cap
129 // theta = 2 * arcsin(sqrt(A/(4*PI)))
130 double sin_arg = sqrt(cell_area / (4.0 * M_PI));
131 // clamp to valid range [0, 1] for numerical safety
132 if (sin_arg > 1.0) sin_arg = 1.0;
133 double theta = 2.0 * asin(sin_arg);
134
135 // apply scale factor and clamp to [0, PI]
136 double search_distance = theta * search_distance_scale;
137 if (search_distance > M_PI) search_distance = M_PI;
138 if (search_distance < yac_angle_tol) search_distance = yac_angle_tol;
139
140 memcpy(bnd_circles[i].base_vector, tgt_coords[i], 3 * sizeof(double));
141 bnd_circles[i].inc_angle =
142 sin_cos_angle_new(sin(search_distance), cos(search_distance));
143 bnd_circles[i].sq_crd = DBL_MAX;
144 }
145
146 yac_free_grid_cell(&grid_cell);
147 break;
148 }
149 }
150}
151
152static size_t do_search_dnn(struct interp_method * method,
153 struct yac_interp_grid * interp_grid,
154 size_t * tgt_points, size_t count,
155 struct yac_interp_weights * weights,
156 int * interpolation_complete) {
157
158 if (*interpolation_complete) return 0;
159
160 YAC_INSTRUMENT_START(YAC_INSTR_INTERP_SEARCH_DNN);
161
162 struct interp_method_dnn * method_dnn = (struct interp_method_dnn *)method;
163
165
167 interp_grid,
170 "search_distance_type == cell_area requires target_field_location == CELL")
171
172 // get coordinates of target points
173 yac_coordinate_pointer tgt_coords = xmalloc(count * sizeof(*tgt_coords));
175 interp_grid, tgt_points, count, tgt_coords);
176
177 // create bounding circles for each target point
178 struct bounding_circle * bnd_circles =
179 xmalloc(count * sizeof(*bnd_circles));
180
181 // determine the bounding cicles for each target
183 method_dnn, interp_grid, tgt_points, tgt_coords, bnd_circles, count);
184
185 // search for source points within the bounding circles
186 size_t * src_points = NULL;
187 size_t * num_src_per_tgt = xmalloc(count * sizeof(*num_src_per_tgt));
188 int const src_field_idx = 0;
190 interp_grid, bnd_circles, count, src_field_idx, &src_points,
191 num_src_per_tgt);
192
193 free(bnd_circles);
194
195 // process results of yac_interp_grid_do_dnn_search_src
196 // * determine which target points have enough (>= n_min) source points
197 // * compute maximum number of source points per target
198 // * compute prefix sums for src_points offsets
199 // * compute total number of weights needed
200 size_t result_count = 0;
201 size_t * reorder_idx = xmalloc(count * sizeof(*reorder_idx));
202 int * fail_flag = xmalloc(count * sizeof(*fail_flag));
203 size_t max_src_per_tgt = 0;
204 size_t * src_offsets = xmalloc(count * sizeof(*src_offsets));
205 size_t src_offset = 0;
206 size_t total_weights = 0;
207 size_t n_min = method_dnn->n_min;
208 for (size_t i = 0; i < count; ++i) {
209 src_offsets[i] = src_offset;
210 size_t curr_num_src_per_tgt = num_src_per_tgt[i];
211 src_offset += curr_num_src_per_tgt;
212 if (curr_num_src_per_tgt < n_min) {
213 fail_flag[i] = 1;
214 } else {
215 fail_flag[i] = 0;
216 result_count++;
217 if (curr_num_src_per_tgt > max_src_per_tgt) {
218 max_src_per_tgt = curr_num_src_per_tgt;
219 }
220 total_weights += curr_num_src_per_tgt;
221 }
222 reorder_idx[i] = i;
223 }
224
225 // sort target points, for which the search was successful to the beginning
226 // of tgt_points
228 fail_flag, count, reorder_idx, tgt_points);
229 free(fail_flag);
230
231 // compute weights for successful target points
232 yac_interp_compute_weights_func compute_weights_func =
233 method_dnn->compute_weights;
234 double scale = method_dnn->scale;
235
236 double * w = xmalloc(total_weights * sizeof(*w));
237 size_t * num_weights_per_tgt =
238 xmalloc(result_count * sizeof(*num_weights_per_tgt));
239 size_t * reordered_src_points =
240 xmalloc(total_weights * sizeof(*reordered_src_points));
241
242 // temporary buffer for source coordinates
243 yac_coordinate_pointer src_coord_buffer =
244 xmalloc(max_src_per_tgt * sizeof(*src_coord_buffer));
245
246 // get source field coordinates for weight computation
247 yac_const_coordinate_pointer src_field_coordinates =
248 yac_interp_grid_get_src_field_coords(interp_grid, src_field_idx);
249
250 for (size_t i = 0, weight_offset = 0; i < result_count; ++i) {
251 size_t curr_reorder_idx = reorder_idx[i];
252 size_t curr_num_src_per_tgt = num_src_per_tgt[curr_reorder_idx];
253 size_t curr_src_offset = src_offsets[curr_reorder_idx];
254
255 // copy source coordinates
256 for (size_t j = 0; j < curr_num_src_per_tgt; ++j) {
257 memcpy(
258 src_coord_buffer[j],
259 src_field_coordinates[src_points[curr_src_offset + j]],
260 3 * sizeof(double));
261 }
262 memcpy(
263 reordered_src_points + weight_offset, src_points + curr_src_offset,
264 curr_num_src_per_tgt * sizeof(*reordered_src_points));
265 num_weights_per_tgt[i] = curr_num_src_per_tgt;
266
267 // compute weights
268 compute_weights_func(
269 tgt_coords[curr_reorder_idx],
270 (yac_const_coordinate_pointer)src_coord_buffer, curr_num_src_per_tgt,
271 w + weight_offset, scale);
272
273 weight_offset += curr_num_src_per_tgt;
274 }
275
276 free(src_offsets);
277 free(src_coord_buffer);
278 free(src_points);
279 free(num_src_per_tgt);
280 free(tgt_coords);
281
282 // get remote point information
283 struct remote_point * srcs =
285 interp_grid, src_field_idx, reordered_src_points, total_weights);
286
287 struct remote_points tgts = {
288 .data =
290 interp_grid, tgt_points, result_count),
291 .count = result_count};
292
293 // store weights
295 weights, &tgts, num_weights_per_tgt, srcs, w);
296
297 free(reorder_idx);
298 free(reordered_src_points);
299 free(tgts.data);
300 free(srcs);
301 free(w);
302 free(num_weights_per_tgt);
303
304 YAC_INSTRUMENT_STOP(YAC_INSTR_INTERP_SEARCH_DNN);
305
306 return result_count;
307}
308
311
312 struct interp_method_dnn * method = xmalloc(1 * sizeof(*method));
313
315 config.search_distance != NULL, "search_distance config is NULL")
316
318 config.n_min >= 1,
319 "unsupported value for n_min (%d), has to be >= 1", config.n_min)
320
322 method->search_distance_type = config.search_distance->type;
323 method->n_min = (size_t)config.n_min;
324
325 switch (config.search_distance->type) {
326 YAC_UNREACHABLE_DEFAULT("unsupported search distance type");
328
330 (config.search_distance->search_distance.fixed > 0.0) &&
331 (config.search_distance->search_distance.fixed <= M_PI),
332 "unsupported value for search_distance (%lf), has to be in (0.0,PI]",
333 config.search_distance->search_distance.fixed)
334 method->search_distance.fixed =
335 config.search_distance->search_distance.fixed;
336 break;
337 }
339
341 config.search_distance->search_distance.scale > 0.0,
342 "search_distance_scale must be positive (%lf)",
343 config.search_distance->search_distance.scale)
344 method->search_distance.scale =
345 config.search_distance->search_distance.scale;
346 }
347 }
348
349 switch (config.type) {
350 YAC_UNREACHABLE_DEFAULT("unsupported weighting type");
354 break;
355 }
359 break;
360 }
363 config.gauss_scale > 0.0,
364 "gauss_scale must be positive (%lf)", config.gauss_scale)
365 method->scale = config.gauss_scale;
367 break;
368 }
371 config.rbf_scale > 0.0,
372 "rbf_scale must be positive (%lf)", config.rbf_scale)
373 method->scale = config.rbf_scale;
375 break;
376 }
377 };
378
379 return (struct interp_method*)method;
380}
381
382static void delete_dnn(struct interp_method * method) {
383 free(method);
384}
385
386// --- Modular config struct and vtable for DNN method ---
387
402
405 struct yac_interp_method_config_dnn *config_dnn =
407 free(config_dnn->config.search_distance);
408 free(config_dnn);
409}
410
412 const struct yac_interp_method_config *config) {
414 struct yac_interp_method_config_dnn *copy =
415 xmalloc(sizeof(*copy));
416 copy->base.vtable = config_dnn->base.vtable;
417 copy->base.root_param_cache = NULL;
418 copy->config = config_dnn->config;
419 copy->config.search_distance =
420 copy_search_distance_config(config_dnn->config.search_distance);
421 return (struct yac_interp_method_config *)copy;
422}
423
425 void const *a_, void const *b_) {
427
428 struct yac_interp_method_config_dnn a_cmp = *a;
429 struct yac_interp_method_config_dnn b_cmp = *b;
430 struct yac_interp_method_dnn_config_search_distance default_search_distance =
432
433 if (a_cmp.config.search_distance == NULL)
434 a_cmp.config.search_distance = &default_search_distance;
435 if (b_cmp.config.search_distance == NULL)
436 b_cmp.config.search_distance = &default_search_distance;
437
438 a = &a_cmp;
439 b = &b_cmp;
440
441 // Compare distance-based nearest neighbor interpolation options:
442 // 1. Weighting type (AVG, DIST, GAUSS, RBF, ...)
443 CHECK_ENUM(config.type);
444 // 2. Search distance type (fixed or cell-area scaled)
445 CHECK_ENUM(config.search_distance->type);
446 // 3. Minimum number of source points required per target point
447 CHECK_INT(config.n_min);
448 // 4. Compare search distance value (fixed or scale, with tolerance)
449 switch (a->config.search_distance->type) {
451 "invalid distance-nearest-neighbour search distance type");
453 CHECK_ANGLE(config.search_distance->search_distance.fixed);
454 break;
456 CHECK_ANGLE(config.search_distance->search_distance.scale);
457 break;
458 }
459 // 5. Compare scale parameter for GAUSS/RBF types
460 switch (a->config.type) {
462 "invalid distance-nearest-neighbour search distance type");
464 CHECK_DOUBLE(config.gauss_scale);
465 break;
467 CHECK_DOUBLE(config.rbf_scale);
468 break;
469 case YAC_INTERP_DNN_WEIGHT_AVG: {__attribute__((fallthrough));}
471 // nothing to compare
472 break;
473 }
474 return 0;
475}
476
477// Gets interpolation method typed_config_hcsbb_get_type
481
483 struct yac_interp_method_config const *config) {
484 const struct yac_interp_method_config_dnn *config_dnn =
485 (const struct yac_interp_method_config_dnn *)config;
486 struct yac_interp_method_dnn_config method_config = config_dnn->config;
487 struct yac_interp_method_dnn_config_search_distance default_search_distance =
489
490 if (method_config.search_distance == NULL) {
491 method_config.search_distance = &default_search_distance;
492 }
493
494 return yac_interp_method_dnn_new(method_config);
495}
496
497static struct yac_param *
499 struct yac_interp_method_dnn_config_search_distance *search_distance) {
500
501 if (search_distance == NULL) {
502 return NULL;
503 }
504
505 enum {
506 FIXED_HAS_DEFAULT = 1,
507 FIXED_IS_DEFINED = 1,
508 CELL_AREA_HAS_DEFAULT = 1,
509 CELL_AREA_IS_DEFINED = 1,
510 SCALE_ALLOW_NAN = 0,
511 SCALE_ALLOW_INF = 0,
512 };
513
514 YAC_ASSERT(search_distance != NULL, "search_distance is NULL")
515
516 struct yac_param * param = NULL;
517
518 switch (search_distance->type) {
519 YAC_UNREACHABLE_DEFAULT("invalid search distance type");
521 param =
523 "fixed",
524 &search_distance->search_distance.fixed,
526 0.0, M_PI - 0.000001,
527 FIXED_HAS_DEFAULT, FIXED_IS_DEFINED);
528 break;
530 param =
532 "cell_area",
533 &search_distance->search_distance.scale,
535 0.0, DBL_MAX,
536 SCALE_ALLOW_NAN, SCALE_ALLOW_INF,
537 CELL_AREA_HAS_DEFAULT, CELL_AREA_IS_DEFINED);
538 break;
539 }
540
541 return param;
542}
543
545 char const * name, void ** obj,
546 struct yac_param ** param, int * is_default) {
547
548 YAC_ASSERT(obj, "missing object");
549 YAC_ASSERT(param, "param is NULL");
550 YAC_ASSERT(is_default, "is_default is NULL");
551
552 *param = NULL;
553 *is_default = 0;
554
555 struct yac_interp_method_dnn_config_search_distance ** search_distance_ptr =
557
559 *search_distance_ptr == NULL, "search_distance pointer is not NULL");
560
562 search_distance_type_table,
565
566 int type =
567 (name == NULL)?
570 search_distance_type_table, search_distance_type_table_size, name);
571
573
574 switch (type) {
576
578
579 // set type
581
582 // set default
583 search_distance->search_distance.fixed =
585
586 break;
588
590
591 // set type
593
594 // set default
595 search_distance->search_distance.scale =
597
598 break;
599 default:
600 YAC_PARAM_ASSERT(0, "%s is not a invalid search distance type", name);
601 break;
602 }
603
605 *search_distance_ptr = search_distance;
606 *param =
608
609 return 0;
610}
611
613 struct yac_interp_method_config const *config) {
614 struct yac_interp_method_config_dnn *config_dnn =
616
617 enum {
618 WEIGHTED_HAS_DEFAULT = 1,
619 WEIGHTED_IS_DEFINED = 1,
620 N_MIN_HAS_DEFAULT = 1,
621 N_MIN_IS_DEFINED = 1,
622 GAUSS_SCALE_HAS_DEFAULT = 1,
623 GAUSS_SCALE_IS_DEFINED = 1,
624 RBF_SCALE_HAS_DEFAULT = 1,
625 RBF_SCALE_IS_DEFINED = 1,
626 SCALE_ALLOW_NAN = 0,
627 SCALE_ALLOW_INF = 0,
628 };
629
631 dnn_weighted_enum_table,
636
637 struct yac_param *weighted_param =
639 "weighted",
640 (int *)&config_dnn->config.type,
642 dnn_weighted_enum_table, dnn_weighted_enum_table_size,
643 WEIGHTED_HAS_DEFAULT, WEIGHTED_IS_DEFINED);
644
645 int const n_min_min = 1;
646 int const n_min_max = INT_MAX;
647
648 struct yac_param *n_min_param =
650 "n_min",
651 &config_dnn->config.n_min,
653 n_min_min, n_min_max,
654 N_MIN_HAS_DEFAULT, N_MIN_IS_DEFINED);
655
656 double const gauss_scale_min = -DBL_MAX;
657 double const gauss_scale_max = DBL_MAX;
658
659 struct yac_param *gauss_scale_param =
661 "gauss_scale",
662 &config_dnn->config.gauss_scale,
664 gauss_scale_min, gauss_scale_max,
665 SCALE_ALLOW_NAN, SCALE_ALLOW_INF,
666 GAUSS_SCALE_HAS_DEFAULT, GAUSS_SCALE_IS_DEFINED);
667
668 double const rbf_scale_min = -DBL_MAX;
669 double const rbf_scale_max = DBL_MAX;
670
671 struct yac_param *rbf_scale_param =
673 "rbf_scale",
674 &config_dnn->config.rbf_scale,
676 rbf_scale_min, rbf_scale_max,
677 SCALE_ALLOW_NAN, SCALE_ALLOW_INF,
678 RBF_SCALE_HAS_DEFAULT, RBF_SCALE_IS_DEFINED);
679
680 struct yac_param * search_distance_subparam =
682 config_dnn->config.search_distance);
683
684 struct yac_param *search_distance_param =
686 "search_distance",
688 (void **)&config_dnn->config.search_distance,
689 search_distance_subparam,
690 (config_dnn->config.search_distance == NULL) ||
691 (config_dnn->config.search_distance->type ==
693
694 struct yac_param *root_param_array[] = {
695 weighted_param,
696 n_min_param,
697 gauss_scale_param,
698 rbf_scale_param,
699 search_distance_param,
700 };
702 "dnn", root_param_array,
703 sizeof(root_param_array) / sizeof(root_param_array[0]));
704}
705
714
716 struct yac_interp_method_config_dnn *config_dnn = xmalloc(sizeof(*config_dnn));
718 config_dnn->base.root_param_cache = NULL;
719 config_dnn->config = (struct yac_interp_method_dnn_config){
721 .search_distance = NULL,
725 };
726 return (struct yac_interp_method_config *)config_dnn;
727}
#define YAC_ASSERT(exp, msg)
double yac_grid_cell_area(struct yac_grid_cell cell)
Area calculation of a spherical cell.
Definition area.c:276
Structs and interfaces for area calculations.
#define __attribute__(x)
Definition core.h:69
void yac_const_basic_grid_data_get_grid_cell(struct yac_const_basic_grid_data *grid_data, size_t cell_idx, struct yac_grid_cell *buffer_cell)
Definition dist_grid.c:2418
#define yac_angle_tol
Definition geometry.h:26
static struct sin_cos_angle sin_cos_angle_new(double sin, double cos)
Definition geometry.h:483
void yac_init_grid_cell(struct yac_grid_cell *cell)
Definition grid_cell.c:14
void yac_free_grid_cell(struct yac_grid_cell *cell)
Definition grid_cell.c:44
int yac_name_type_pair_get_type(struct yac_name_type_pair const *pairs, size_t count, char const *name)
Definition utils_core.c:23
#define DEF_NAME_TYPE_PAIR(NAME, TYPE)
#define DEF_NAME_TYPE_PAIRS(NAME,...)
#define YAC_INSTRUMENT_START(ID)
Enter an instrumented region.
#define YAC_INSTRUMENT_STOP(ID)
Exit an instrumented region entered with YAC_INSTRUMENT_START(ID).
enum yac_location yac_interp_grid_get_tgt_field_location(struct yac_interp_grid *interp_grid)
void yac_interp_grid_do_dnn_search_src(struct yac_interp_grid *interp_grid, const_bounding_circle_pointer bnd_circles, size_t count, size_t src_field_idx, size_t **src_points, size_t *num_src_per_bnd_circle)
struct remote_point * yac_interp_grid_get_tgt_remote_points(struct yac_interp_grid *interp_grid, size_t *tgt_points, size_t count)
struct remote_point * yac_interp_grid_get_src_remote_points(struct yac_interp_grid *interp_grid, size_t src_field_idx, size_t *src_points, size_t count)
yac_const_coordinate_pointer yac_interp_grid_get_src_field_coords(struct yac_interp_grid *interp_grid, size_t src_field_idx)
void yac_interp_grid_get_tgt_coordinates(struct yac_interp_grid *interp_grid, size_t *tgt_points, size_t count, yac_coordinate_pointer tgt_coordinates)
struct yac_const_basic_grid_data * yac_interp_grid_get_basic_grid_data_tgt(struct yac_interp_grid *interp_grid)
yac_interpolation_list
@ YAC_DISTANCE_NEAREST_NEIGHBOR
Distance-nearest-neighbor interpolation.
enum callback_type type
#define DEF_INTERP_METHOD_CONFIG_COMPARE_TYPE(TYPE)
#define CHECK_DOUBLE
#define DEF_INTERP_METHOD_CONFIG_TYPE(TYPE)
#define CHECK_ANGLE(FIELD)
struct interp_method * yac_interp_method_dnn_new(struct yac_interp_method_dnn_config config)
static struct yac_param * config_dnn_get_param(struct yac_interp_method_config const *config)
static void config_dnn_delete(struct yac_interp_method_config *config)
static void delete_dnn(struct interp_method *method)
static struct yac_param * yac_interp_method_dnn_config_search_distance_build_param(struct yac_interp_method_dnn_config_search_distance *search_distance)
static int config_dnn_search_distance_factory(char const *name, void **obj, struct yac_param **param, int *is_default)
static int config_dnn_compare(void const *a_, void const *b_)
struct yac_interp_method_config * yac_interp_method_config_default_dnn_new(void)
Creates a distance-nearest-neighbour (DNN) interpolation method configuration with default parameters...
static struct yac_interp_method_dnn_config_search_distance get_default_search_distance(void)
static struct interp_method_vtable interp_method_dnn_vtable
static struct yac_interp_method_dnn_config_search_distance * copy_search_distance_config(struct yac_interp_method_dnn_config_search_distance const *search_distance)
static struct yac_interp_method_config_vtable yac_interp_method_config_vtable_dnn
static void set_dnn_bounding_circles(struct interp_method_dnn *method_dnn, struct yac_interp_grid *interp_grid, size_t *tgt_points, yac_coordinate_pointer tgt_coords, struct bounding_circle *bnd_circles, size_t count)
static size_t do_search_dnn(struct interp_method *method, struct yac_interp_grid *interp_grid, size_t *tgt_points, size_t count, struct yac_interp_weights *weights, int *interpolation_complete)
static struct yac_interp_method_config * config_dnn_copy(const struct yac_interp_method_config *config)
static struct interp_method * config_dnn_generate(struct yac_interp_method_config const *config)
static enum yac_interpolation_list config_dnn_get_type()
@ YAC_INTERP_DNN_WEIGHT_AVG
average of source points within search distance
@ YAC_INTERP_DNN_WEIGHT_DIST
distance weighted average of source points
@ YAC_INTERP_DNN_WEIGHT_GAUSS
Gauss weighted average of source points.
@ YAC_INTERP_DNN_WEIGHT_RBF
radial basis function weighted average
#define YAC_INTERP_DNN_SEARCH_DISTANCE_FIXED_DEFAULT
#define YAC_INTERP_DNN_RBF_SCALE_DEFAULT
#define YAC_INTERP_DNN_SEARCH_DISTANCE_TYPE_DEFAULT
#define YAC_INTERP_DNN_GAUSS_SCALE_DEFAULT
#define YAC_INTERP_DNN_DUMMY_SCALE
#define YAC_INTERP_DNN_N_MIN_DEFAULT
#define YAC_INTERP_DNN_WEIGHT_DEFAULT
#define YAC_INTERP_DNN_SEARCH_DISTANCE_CELL_AREA_DEFAULT
yac_interp_dnn_search_distance_type
@ YAC_INTERP_DNN_SEARCH_DISTANCE_FIXED
use a fixed search distance (in radians)
@ YAC_INTERP_DNN_SEARCH_DISTANCE_CELL_AREA
void yac_interp_compute_weights_gauss(double tgt_coord[3], yac_const_coordinate_pointer src_coords, size_t const n, double *weights, double const gauss_scale)
void yac_interp_compute_weights_avg(double tgt_coord[3], yac_const_coordinate_pointer src_coords, size_t const n, double *weights, double const dummy)
void yac_interp_compute_weights_dist(double tgt_coord[3], yac_const_coordinate_pointer src_coords, size_t const n, double *weights, double const dummy)
void yac_interp_compute_weights_rbf(double tgt_coord[3], yac_const_coordinate_pointer src_coords, size_t const n, double *weights, double const rbf_scale)
#define CHECK_SRC_FIELD_COUNT_SINGLE(INTERP_GRID)
void(* yac_interp_compute_weights_func)(double tgt_coord[3], yac_const_coordinate_pointer src_coords, size_t const n, double *weights, double const scale)
void yac_interp_weights_add_wsum(struct yac_interp_weights *weights, struct remote_points *tgts, size_t *num_src_per_tgt, struct remote_point *srcs, double *w)
#define YAC_INTERP_GRID_FIELD_ASSERT(INTERP_GRID, EXP, MSG)
@ YAC_LOC_CELL
Definition location.h:14
struct yac_param * yac_param_dble_new(const char *name, double *value_ptr, double default_value, double value_min, double value_max, int allow_nan, int allow_inf, int has_default, int is_defined)
Create a double parameter.
Definition param_dble.c:166
struct yac_param * yac_param_distance_new(const char *name, double *value_ptr, double default_value, double value_min, double value_max, int has_default, int is_defined)
Create a distance parameter (stored in radians)
struct yac_param * yac_param_enum_new(const char *name, int *value_ptr, int default_value, struct yac_name_type_pair const *enum_table, size_t enum_table_size, int has_default, int is_defined)
Create a new enum parameter for configuration.
Definition param_enum.c:148
struct yac_param * yac_param_int_new(const char *name, int *value_ptr, int default_value, int value_min, int value_max, int has_default, int is_defined)
Create an int parameter.
Definition param_int.c:163
#define YAC_PARAM_ASSERT(COND,...)
struct yac_param * yac_param_oneof_new(const char *name, yac_param_oneof_factory_ptr default_factory, void **value_ptr, struct yac_param *subparam, int subparam_is_default)
Create a new one-of struct parameter with a given name and a default_factory.
struct yac_param * yac_param_struct_new(const char *name, struct yac_param **subparams, size_t subparam_count)
Create a new struct parameter with a given name and subparameters.
#define xmalloc(size)
Definition ppm_xfuncs.h:66
struct sin_cos_angle inc_angle
angle between the middle point and the boundary of the spherical cap
Definition geometry.h:53
double sq_crd
Definition geometry.h:56
yac_interp_compute_weights_func compute_weights
union interp_method_dnn::@27 search_distance
struct interp_method_vtable * vtable
enum yac_interp_dnn_search_distance_type search_distance_type
size_t(* do_search)(struct interp_method *method, struct yac_interp_grid *grid, size_t *tgt_points, size_t count, struct yac_interp_weights *weights, int *interpolation_complete)
information (global id and location) about a point that
structure containing the information (global id and location)
struct remote_point * data
double sin
Definition geometry.h:33
double cos
Definition geometry.h:33
Concrete implementation of yac_interp_method_config for the DNN method.
struct yac_interp_method_config base
‍base config object, must be first entry
struct yac_interp_method_dnn_config config
‍method-specific configuration
void(* delete)(struct yac_interp_method_config *config)
struct yac_interp_method_config_vtable const * vtable
union yac_interp_method_dnn_config_search_distance::@28 search_distance
enum yac_interp_dnn_search_distance_type type
method for determining the search distance
enum yac_interp_dnn_weight_type type
weighting type
struct yac_interp_method_dnn_config_search_distance * search_distance
double gauss_scale
scale factor for Gauss weighting
double rbf_scale
scale factor for RBF weighting
static struct yac_interp_method_config * config
char const * name
Definition toy_scrip.c:114
void yac_quicksort_index_int_size_t_size_t(int *a, size_t n, size_t *b, size_t *c)
#define YAC_ASSERT_F(exp, format,...)
Definition yac_assert.h:39
#define YAC_UNREACHABLE_DEFAULT(msg)
Definition yac_assert.h:56
double const (* yac_const_coordinate_pointer)[3]
Definition yac_types.h:22
double(* yac_coordinate_pointer)[3]
Definition yac_types.h:21