28 size_t * tgt_points,
size_t count,
30 int * interpolation_complete);
33 size_t * tgt_points,
size_t count,
35 int * interpolation_complete);
38 size_t * tgt_points,
size_t count,
40 int * interpolation_complete);
80 size_t * tgt_points,
size_t count,
82 int * interpolation_complete) {
84 if (*interpolation_complete)
return 0;
95 interp_grid, tgt_points, count, tgt_coords);
97 size_t n = method_nnn->
n;
100 size_t * size_t_buffer =
xmalloc((2 *
n + 1) * count *
sizeof(*size_t_buffer));
101 size_t * src_points = size_t_buffer;
102 size_t * src_points_reorder = size_t_buffer +
n * count;
103 size_t * reorder_idx = size_t_buffer + 2 *
n * count;
104 int * fail_flag =
xmalloc(count *
sizeof(*fail_flag));
105 size_t * num_src_per_tgt =
xmalloc(count *
sizeof(*num_src_per_tgt));
109 interp_grid, tgt_coords, count,
n, src_points,
112 size_t result_count = 0;
113 size_t total_num_weights = 0;
121 for (
size_t i = 0, k = 0; i < count; ++i) {
122 size_t curr_num_src = 0;
123 for (
size_t j = 0; j <
n; ++j, ++k)
124 if (src_points[k] != SIZE_MAX) ++curr_num_src;
125 num_src_per_tgt[i] = curr_num_src;
130 total_num_weights += curr_num_src;
143 double * w =
xmalloc(total_num_weights *
sizeof(*w));
144 size_t * num_weights_per_tgt =
145 xmalloc(result_count *
sizeof(*num_weights_per_tgt));
151 for (
size_t i = 0, weight_offset = 0; i < result_count; ++i) {
152 size_t curr_reorder_idx = reorder_idx[i];
153 size_t curr_num_src = num_src_per_tgt[curr_reorder_idx];
154 for (
size_t j = 0; j < curr_num_src; ++j) {
155 size_t curr_src_point = src_points[curr_reorder_idx *
n + j];
156 memcpy(src_coord_buffer[j], src_field_coordinates[curr_src_point],
158 src_points_reorder[weight_offset + j] = curr_src_point;
162 tgt_coords[curr_reorder_idx],
164 w + weight_offset,
scale);
165 num_weights_per_tgt[i] = curr_num_src;
166 weight_offset += curr_num_src;
169 free(num_src_per_tgt);
172 for (
size_t i = 0; i < count; ++i) src_points[reorder_idx[i]] = i;
175 free(src_coord_buffer);
180 interp_grid, 0, src_points_reorder, total_num_weights);
185 interp_grid, tgt_points, result_count),
186 .count = result_count};
190 weights, &tgts, num_weights_per_tgt, srcs, w);
196 free(num_weights_per_tgt);
205 size_t * tgt_points,
size_t count,
207 int * interpolation_complete) {
209 if (*interpolation_complete)
return 0;
218 interp_grid, tgt_points,
count, tgt_coords);
220 size_t * src_points =
xmalloc(
count *
sizeof(*src_points));
224 interp_grid, tgt_coords,
count, 1, src_points,
233 size_t result_count = 0;
234 for (; (result_count <
count) && (src_points[result_count] != SIZE_MAX);
239 interp_grid, 0, src_points, result_count);
244 interp_grid, tgt_points, result_count),
245 .count = result_count};
249 weights, &tgts, srcs);
264 size_t * num_src_per_tgt =
xmalloc(tgts->
count *
sizeof(*num_src_per_tgt));
268 for (
size_t i = 0; i < tgts->
count; ++i) {
269 num_src_per_tgt[i] = 1;
278 free(num_src_per_tgt);
283 size_t * tgt_points,
size_t count,
285 int * interpolation_complete) {
287 if (*interpolation_complete)
return 0;
296 size_t * src_points, src_count;
298 yac_int * src_global_ids =
xmalloc(src_count *
sizeof(*src_global_ids));
301 interp_grid, src_points, src_count, 0, src_global_ids);
306 yac_int min_src_global_id = YAC_INT_MAX;
307 for (
size_t i = 0; i < src_count; ++i)
308 if (src_global_ids[i] < min_src_global_id)
309 min_src_global_id = src_global_ids[i];
310 free(src_global_ids);
317 MPI_IN_PLACE, &min_src_global_id, 1,
yac_int_dt, MPI_MIN, comm), comm);
319 min_src_global_id != YAC_INT_MAX,
"unable to find unmasked source points");
323 size_t min_src_local_id;
325 interp_grid, 0, &min_src_global_id, 1, &min_src_local_id);
329 interp_grid, 0, &min_src_local_id, 1);
334 interp_grid, tgt_points,
count),
360 (
config.max_search_distance >= 0.0) &&
361 (
config.max_search_distance <= M_PI),
362 "unsupported value for max_search_distance (%lf), has to be in [0.0,PI]",
363 config.max_search_distance)
366 config.n >= 1,
"unsupported value for n (%d), has to be >= 1",
config.n)
370 "unsupported value for n_min (%d), has to be in [0,n] (n: %d)",
376 config.n == 1,
"n != 1 does not make sense for zero")
378 config.max_search_distance == 0.0,
379 "max_search_distance != 0.0 does not make sense for zero")
386 double max_search_distance =
387 (
config.max_search_distance == 0.0)?M_PI:
config.max_search_distance;
410 config.n >= 1,
"n needs to be at least 1 for distance weighted average")
416 config.n >= 2,
"n needs to be at least 2 for distance weighted average")
422 config.n >= 2,
"n needs to be at least 2 for gauss")
428 config.n >= 2,
"n needs to be at least 2 for RBF")
473 copy->
config = config_nnn->config;
479 void const *a_,
void const *b_) {
487 if (a_n_min != b_n_min)
return (a_n_min > b_n_min) - (a_n_min < b_n_min);
494 switch (a->config.type) {
537 int const n_max = INT_MAX;
541 &config_nnn->
config.
n, n_default,
542 n_min, n_max, N_HAS_DEFAULT, N_IS_DEFINED);
549 N_MIN_HAS_DEFAULT = 1,
550 N_MIN_IS_DEFINED = 1,
554 int const n_min_min = 0;
555 int const n_min_max = INT_MAX;
560 n_min_min, n_min_max, N_MIN_HAS_DEFAULT, N_MIN_IS_DEFINED);
565 double max_search_distance_default) {
568 MAX_SEARCH_DISTANCE_HAS_DEFAULT = 1,
569 MAX_SEARCH_DISTANCE_IS_DEFINED = 1,
572 double const max_search_distance_min = 0.0;
573 double const max_search_distance_max = M_PI - 0.000001;
576 "max_search_distance",
578 max_search_distance_default,
579 max_search_distance_min, max_search_distance_max,
580 MAX_SEARCH_DISTANCE_HAS_DEFAULT, MAX_SEARCH_DISTANCE_IS_DEFINED);
584 char const *
name,
double *scale_value,
double scale_default) {
587 SCALE_HAS_DEFAULT = 1,
588 SCALE_IS_DEFINED = 1,
591 double const scale_min = -DBL_MAX;
592 double const scale_max = DBL_MAX;
599 name, scale_value, scale_default, scale_min, scale_max,
600 SCALE_ALLOW_NAN, SCALE_ALLOW_INF, SCALE_HAS_DEFAULT, SCALE_IS_DEFINED);
609 WEIGHTED_HAS_DEFAULT = 1,
610 WEIGHTED_IS_DEFINED = 1,
625 weighted_enum_table, weighted_enum_table_size,
626 WEIGHTED_HAS_DEFAULT, WEIGHTED_IS_DEFINED);
634 struct yac_param *max_search_distance_param =
647 max_search_distance_param,
651 ROOT_PARAM_ARRAY_SIZE =
652 sizeof(root_param_array) /
sizeof(root_param_array[0])
656 "nnn", root_param_array, ROOT_PARAM_ARRAY_SIZE);
674 RBF_KERNEL_HAS_DEFAULT = 1,
675 RBF_KERNEL_IS_DEFINED = 1
679 rbf_kernel_enum_table,
689 struct yac_param *max_search_distance_param =
703 rbf_kernel_enum_table, rbf_kernel_enum_table_size,
704 RBF_KERNEL_HAS_DEFAULT, RBF_KERNEL_IS_DEFINED);
709 max_search_distance_param,
714 ROOT_PARAM_ARRAY_SIZE =
715 sizeof(root_param_array) /
sizeof(root_param_array[0])
719 "rbf", root_param_array, ROOT_PARAM_ARRAY_SIZE);
#define YAC_ASSERT(exp, msg)
#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).
MPI_Comm yac_interp_grid_get_MPI_Comm(struct yac_interp_grid *interp_grid)
struct remote_point * yac_interp_grid_get_tgt_remote_points(struct yac_interp_grid *interp_grid, size_t *tgt_points, size_t count)
void yac_interp_grid_get_src_points(struct yac_interp_grid *interp_grid, size_t src_field_idx, size_t **src_indices, 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)
void yac_interp_grid_do_nnn_search_src(struct yac_interp_grid *interp_grid, yac_coordinate_pointer search_coords, size_t count, size_t n, size_t *src_points, double max_search_distance)
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)
void yac_interp_grid_get_src_global_ids(struct yac_interp_grid *interp_grid, size_t *src_points, size_t count, size_t src_field_idx, yac_int *src_global_ids)
void yac_interp_grid_src_global_to_local(struct yac_interp_grid *interp_grid, size_t src_field_idx, yac_int *src_global_ids, size_t count, size_t *src_local_ids)
@ YAC_N_NEAREST_NEIGHBOR
N-nearest-neighbor interpolation.
@ YAC_RADIAL_BASIS_FUNCTION
Radial basis function interpolation.
#define DEF_INTERP_METHOD_CONFIG_COMPARE_TYPE(TYPE)
#define DEF_INTERP_METHOD_CONFIG_TYPE(TYPE)
#define CHECK_ANGLE(FIELD)
static void compute_weights(struct tgt_point_search_data *tgt_point_data, size_t num_tgt_points, struct edge_interp_data *edge_data, size_t num_edges, struct triangle_interp_data *triangle_data, size_t num_triangles, struct weight_vector_data **weights, size_t **num_weights_per_tgt, size_t *total_num_weights)
static void config_nnn_delete(struct yac_interp_method_config *config)
static struct yac_param * config_nnn_get_param(struct yac_interp_method_config const *config)
struct yac_interp_method_config * yac_interp_method_config_default_nnn_new(void)
Creates a nearest-neighbour interpolation method configuration with default parameters.
static struct yac_interp_method_config_vtable yac_interp_method_config_vtable_rbf
static struct yac_interp_method_config * config_nnn_copy(const struct yac_interp_method_config *config)
static enum yac_interpolation_list config_nnn_get_type()
static struct yac_param * config_nnn_get_scale_param(char const *name, double *scale_value, double scale_default)
static size_t do_search_nnn(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 enum yac_interpolation_list config_rbf_get_type()
static struct yac_interp_method_config_vtable yac_interp_method_config_vtable_nnn
static void delete_nnn(struct interp_method *method)
static struct yac_param * config_nnn_get_max_search_distance_param(struct yac_interp_method_config_nnn *config_nnn, double max_search_distance_default)
static size_t do_search_1nn(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 interp_method * config_nnn_generate(struct yac_interp_method_config const *config)
struct interp_method * yac_interp_method_nnn_new(struct yac_interp_method_nnn_config config)
static struct interp_method_vtable interp_method_1nn_vtable
static int config_nnn_compare(void const *a_, void const *b_)
struct yac_interp_method_config * yac_interp_method_config_default_rbf_new(void)
Creates a radial-basis-function interpolation method configuration with default parameters.
static int get_nnn_n_min(struct yac_interp_method_nnn_config config)
static void interp_weights_add_zero(struct yac_interp_weights *weights, struct remote_points *tgts, struct remote_point src)
static struct interp_method_vtable interp_method_zero_vtable
static struct yac_param * config_nnn_get_n_min_param(struct yac_interp_method_config_nnn *config_nnn, int n_min_default)
static size_t do_search_zero(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_param * config_rbf_get_param(struct yac_interp_method_config const *config)
static struct interp_method_vtable interp_method_nnn_vtable
static struct yac_param * config_nnn_get_n_param(struct yac_interp_method_config_nnn *config_nnn, int n_default)
#define YAC_INTERP_NNN_WEIGHTED_DEFAULT
@ 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_MAX_SEARCH_DISTANCE_DEFAULT
#define YAC_INTERP_RBF_N_DEFAULT
#define YAC_INTERP_NNN_MAX_SEARCH_DISTANCE_DEFAULT
#define YAC_INTERP_RBF_N_MIN_DEFAULT
a value of 0 is interpreted as "use the value of n"
#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_NNN_N_MIN_DEFAULT
a value of 0 is interpreted as "use the value of n"
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)
void yac_interp_weights_add_direct(struct yac_interp_weights *weights, struct remote_points *tgts, struct remote_point *srcs)
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.
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.
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.
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.
void(* interp_weights_add)(struct yac_interp_weights *weights, struct remote_points *tgts, struct remote_point *srcs)
double max_search_distance
struct interp_method_vtable * vtable
struct interp_method_vtable * vtable
double max_search_distance
yac_interp_compute_weights_func compute_weights
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)
struct interp_method_vtable * vtable
information (global id and location) about a point that
structure containing the information (global id and location)
struct remote_point * data
Concrete implementation of yac_interp_method_config for the NNN method.
struct yac_interp_method_config base
base config object, must be first entry
struct yac_interp_method_nnn_config config
method-specific configuration
void(* delete)(struct yac_interp_method_config *config)
struct yac_param * root_param_cache
struct yac_interp_method_config_vtable const * vtable
double max_search_distance
union yac_interp_method_nnn_config::@39 data
enum yac_interp_nnn_weight_type type
static struct yac_interp_method_config * config
void yac_quicksort_index_int_size_t(int *a, size_t n, size_t *idx)
void yac_quicksort_index_size_t_size_t(size_t *a, size_t n, size_t *idx)
#define YAC_ASSERT_F(exp, format,...)
#define YAC_UNREACHABLE_DEFAULT(msg)
#define yac_mpi_call(call, comm)
double const (* yac_const_coordinate_pointer)[3]
double(* yac_coordinate_pointer)[3]