YAC 3.18.0
Yet Another Coupler
Loading...
Searching...
No Matches
interpolation.c
Go to the documentation of this file.
1// Copyright (c) 2024 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 <string.h>
11#include <math.h>
12
13#include <yaxt.h>
14
15#include "ppm/core.h"
16#include "utils_core.h"
24#include "yac_mpi_internal.h"
26
27double const YAC_FRAC_MASK_NO_VALUE = 133713371337.0;
28double const YAC_FRAC_MASK_UNDEF = -133713371337.0;
29
53
57
60 "ERROR(yac_interpolation_new): "
61 "invalid collection_selection its size has to be > 0");
63 isnormal(scale_factor) || (fabs(scale_factor) == 0.0),
64 "ERROR(yac_interpolation_new): scale_factor argument is not normale (%f)",
67 isnormal(scale_summand) || (fabs(scale_summand) == 0.0),
68 "ERROR(yac_interpolation_new): scale_summand argument is not normale (%f)",
70
71 struct yac_interpolation * interp = xmalloc(1 * sizeof(*interp));
72
73 interp->interps = NULL;
74 interp->interp_count = 0;
75
76 interp->is_source = 0;
77 interp->is_target = 0;
78 interp->collection_selection =
80
81 interp->ref_count = 1;
82
83 interp->frac_mask_fallback_value = frac_mask_fallback_value;
84
86 isnormal(scale_factor),
87 "ERROR(yac_interpolation_new): \"%lf\" is not a valid scaling factor",
90 (scale_summand == 0.0) || isnormal(scale_summand),
91 "ERROR(yac_interpolation_new): \"%lf\" is not a valid scaling summand",
93
94 interp->scale_factor = scale_factor;
95 interp->scale_summand = scale_summand;
96
97 return interp;
98}
99
101 struct yac_interpolation * interp,
102 struct yac_interp_operator * interp_type) {
103
104 if (interp_type == NULL) return;
105
106 interp->interps =
107 xrealloc(
108 interp->interps,
109 (interp->interp_count + 1) * sizeof(*(interp->interps)));
110 interp->interps[interp->interp_count] = interp_type;
111 interp->interp_count++;
112
113 interp->is_source |= yac_interp_operator_is_source(interp_type);
114 interp->is_target |= yac_interp_operator_is_target(interp_type);
115}
116
118 struct yac_interpolation * interp, double value, size_t count,
119 size_t * pos) {
120
122 interp,
124 interp->collection_selection, value, count, pos));
125}
126
128 struct yac_interpolation * interp, Xt_redist redist) {
129
131 interp, yac_interp_operator_direct_new(interp->collection_selection, redist));
132}
133
135 struct yac_interpolation * interp, Xt_redist * redists,
136 size_t num_src_fields) {
137
139 interp,
141 interp->collection_selection, redists, num_src_fields));
142}
143
145 struct yac_interpolation * interp, Xt_redist * halo_redists,
146 size_t tgt_count, size_t * num_src_per_tgt,
147 size_t * src_field_idx, size_t * src_idx,
148 size_t num_src_fields, Xt_redist result_redist) {
149
151 interp,
153 interp->collection_selection, halo_redists, tgt_count, num_src_per_tgt,
154 NULL, src_field_idx, src_idx, num_src_fields, result_redist,
155 YAC_FRAC_MASK_VALUE_IS_VALID(interp->frac_mask_fallback_value)));
156}
157
159 struct yac_interpolation * interp, Xt_redist * src_redists,
160 size_t * tgt_pos, size_t tgt_count, size_t * num_src_per_tgt,
161 size_t * src_field_idx, size_t * src_idx,
162 size_t num_src_fields) {
163
165 interp,
167 interp->collection_selection, src_redists, tgt_pos, tgt_count,
168 num_src_per_tgt, NULL, src_field_idx, src_idx, num_src_fields,
169 YAC_FRAC_MASK_VALUE_IS_VALID(interp->frac_mask_fallback_value)));
170}
171
173 struct yac_interpolation * interp, Xt_redist * halo_redists,
174 size_t tgt_count, size_t * num_src_per_tgt, double * weights,
175 size_t * src_field_idx, size_t * src_idx,
176 size_t num_src_fields, Xt_redist result_redist) {
177
179 interp,
181 interp->collection_selection, halo_redists, tgt_count, num_src_per_tgt,
182 weights, src_field_idx, src_idx, num_src_fields, result_redist,
183 YAC_FRAC_MASK_VALUE_IS_VALID(interp->frac_mask_fallback_value)));
184}
185
187 struct yac_interpolation * interp, Xt_redist * src_redists, size_t * tgt_pos,
188 size_t tgt_count, size_t * num_src_per_tgt, double * weights,
189 size_t * src_field_idx, size_t * src_idx,
190 size_t num_src_fields) {
191
193 interp,
195 interp->collection_selection, src_redists, tgt_pos, tgt_count,
196 num_src_per_tgt, weights, src_field_idx, src_idx, num_src_fields,
197 YAC_FRAC_MASK_VALUE_IS_VALID(interp->frac_mask_fallback_value)));
198}
199
201 struct yac_interpolation * interp) {
202
203 struct yac_interpolation * interp_copy =
205 interp->collection_selection, interp->frac_mask_fallback_value,
206 interp->scale_factor, interp->scale_summand);
207
208 interp_copy->interps =
209 xmalloc(interp->interp_count * sizeof(*interp_copy->interps));
210 interp_copy->interp_count = interp->interp_count;
211
212 for (size_t i = 0; i < interp->interp_count; ++i)
213 interp_copy->interps[i] =
214 yac_interp_operator_copy(interp->interps[i]);
215
216 interp_copy->is_source = interp->is_source;
217 interp_copy->is_target = interp->is_target;
218
219 return interp_copy;
220}
221
222// src_fields dimensions [collection_idx]
223// [field index]
224// [local_idx]
225// src_frac_masks dimensions [collection_idx]
226// [field index]
227// [local_idx]
228// tgt_field dimensions [collection_idx]
229// [local_idx]
231 struct yac_interpolation * interp, double *** src_fields,
232 double *** src_frac_masks, double ** tgt_field) {
233
235 YAC_FRAC_MASK_VALUE_IS_VALID(interp->frac_mask_fallback_value) ||
236 (src_frac_masks == NULL),
237 "ERROR(yac_interpolation_execute_frac): "
238 "interpolation was not built for dynamic fractional masking, "
239 "use yac_interpolation_execute instead");
240
241 for (size_t i = 0; i < interp->interp_count; ++i)
243 interp->interps[i], src_fields, src_frac_masks, tgt_field,
244 interp->frac_mask_fallback_value, interp->scale_factor,
245 interp->scale_summand);
246}
247
248// src_fields dimensions [collection_idx]
249// [field index]
250// [local_idx]
251// tgt_field dimensions [collection_idx]
252// [local_idx]
254 struct yac_interpolation * interp, double *** src_fields,
255 double ** tgt_field) {
256
258 !YAC_FRAC_MASK_VALUE_IS_VALID(interp->frac_mask_fallback_value),
259 "ERROR(yac_interpolation_execute): "
260 "interpolation was built for dynamic fractional masking, "
261 "use yac_interpolation_execute_frac instead");
262
263 yac_interpolation_execute_frac(interp, src_fields, NULL, tgt_field);
264}
265
266// src_fields dimensions [collection_idx]
267// [field index]
268// [local_idx]
269// src_frac_masks dimensions [collection_idx]
270// [field index]
271// [local_idx]
273 struct yac_interpolation * interp, double *** src_fields,
274 double *** src_frac_masks) {
275
277 YAC_FRAC_MASK_VALUE_IS_VALID(interp->frac_mask_fallback_value) ||
278 (src_frac_masks == NULL),
279 "ERROR(yac_interpolation_execute_put_frac): "
280 "interpolation was built for dynamic fractional masking, "
281 "use yac_interpolation_execute_put instead");
282
283 if (!interp->is_source) return;
284
285 for (size_t i = 0; i < interp->interp_count; ++i)
287 interp->interps[i], src_fields, src_frac_masks,
288 interp->is_target, interp->frac_mask_fallback_value,
289 interp->scale_factor, interp->scale_summand);
290}
291
292// src_fields dimensions [collection_idx]
293// [field index]
294// [local_idx]
296 struct yac_interpolation * interp, double *** src_fields) {
297
299 !YAC_FRAC_MASK_VALUE_IS_VALID(interp->frac_mask_fallback_value),
300 "ERROR(yac_interpolation_execute_put): "
301 "interpolation was built for dynamic fractional masking, "
302 "use yac_interpolation_execute_put_frac instead");
303
304 yac_interpolation_execute_put_frac(interp, src_fields, NULL);
305}
306
307// tgt_field dimensions [collection_idx]
308// [local_idx]
310 struct yac_interpolation * interp, double ** tgt_field) {
311
312 if (!interp->is_target) return;
313
314 for (size_t i = 0; i < interp->interp_count; ++i)
316 interp->interps[i], tgt_field, interp->frac_mask_fallback_value,
317 interp->scale_factor, interp->scale_summand);
318}
319
321 struct yac_interpolation * interp, double ** tgt_field) {
322
323 if (!interp->is_target) return;
324
325 for (size_t i = 0; i < interp->interp_count; ++i)
327 interp->interps[i], tgt_field, interp->frac_mask_fallback_value,
328 interp->scale_factor, interp->scale_summand);
329}
330
332
333 int put_complete = 1;
334
335 for (size_t i = 0; (i < interp->interp_count) && put_complete; ++i)
336 put_complete &=
338 interp->interps[i]) == YAC_INTERP_COMPLETE);
339
340 return put_complete;
341}
342
344
345 int get_complete = 1;
346
347 for (size_t i = 0; (i < interp->interp_count) && get_complete; ++i)
348 get_complete &=
350 interp->interps[i]) == YAC_INTERP_COMPLETE);
351
352 return get_complete;
353}
354
356
357 for (size_t i = 0; i < interp->interp_count; ++i) {
358 yac_interp_operator_execute_wait(interp->interps[i]);
359 }
360}
361
363
364 interpolation->ref_count++;
365}
366
368
369 return
371}
372
374
375 if (interp == NULL) return;
376
377 if(--(interp->ref_count)) return;
378
379 for (size_t i = 0; i < interp->interp_count; ++i) {
380 yac_interp_operator_delete(interp->interps[i]);
381 }
382 yac_collection_selection_delete(interp->collection_selection);
383 free(interp->interps);
384 free(interp);
385}
386
387struct yac_collection_selection const *
389 struct yac_interpolation const * interp) {
390
391 return (interp == NULL)?NULL:interp->collection_selection;
392}
393
397
#define YAC_ASSERT(exp, msg)
size_t yac_collection_selection_get_collection_size(struct yac_collection_selection const *collection_selection)
Get the size of the collection selection.
void yac_collection_selection_delete(struct yac_collection_selection *collection_selection)
Delete a collection selection object.
struct yac_collection_selection * yac_collection_selection_copy(const struct yac_collection_selection *collection_selection)
Selection of indices from a collection.
struct yac_interp_operator * yac_interp_operator_direct_mf_new(struct yac_collection_selection const *collection_selection, Xt_redist *redists, size_t num_src_fields)
Create a direct redistribution operator for multiple source fields.
struct yac_interp_operator * yac_interp_operator_sum_mvp_at_tgt_new(struct yac_collection_selection const *collection_selection, Xt_redist *src_redists, size_t *tgt_pos, size_t tgt_count, size_t *num_src_per_tgt, double *weights, size_t *src_field_idx, size_t *src_idx, size_t num_src_fields, int with_frac_mask)
Create a sum (weighted or unweighted) interpolation operator computed on the target processes.
struct yac_interp_operator * yac_interp_operator_fixed_new(struct yac_collection_selection const *collection_selection, double value, size_t count, size_t const *pos)
Create a fixed-value interpolation operator.
struct yac_interp_operator * yac_interp_operator_direct_new(struct yac_collection_selection const *collection_selection, Xt_redist redist_)
Create a direct redistribution interpolation operator.
struct yac_interp_operator * yac_interp_operator_sum_mvp_at_src_new(struct yac_collection_selection const *collection_selection, Xt_redist *halo_redists, size_t tgt_count, size_t *num_src_per_tgt, double *weights, size_t *src_field_idx, size_t *src_idx, size_t num_src_fields, Xt_redist result_redist_, int with_frac_mask)
Create a sum (weighted or unweighted) interpolation operator computed on the source processes.
struct @23::@24 value
void yac_interp_operator_execute_wait(struct yac_interp_operator *interp)
Wait for all pending put/get operations to finish.
int yac_interp_operator_is_target(struct yac_interp_operator *interp)
Checks if the current process holds target data for the interpolation operator.
struct yac_interp_operator * yac_interp_operator_copy(struct yac_interp_operator *interp)
Create a deep copy of the interpolation operator.
enum YAC_INTERP_TEST_STATUS yac_interp_operator_execute_put_test(struct yac_interp_operator *interp)
Test whether the put phase has completed.
int yac_interp_operator_is_source(struct yac_interp_operator *interp)
Checks if the current process holds source data for the interpolation operator.
enum YAC_INTERP_TEST_STATUS yac_interp_operator_execute_get_test(struct yac_interp_operator *interp)
Test whether the get phase has completed.
void yac_interp_operator_execute_get(struct yac_interp_operator *interp, double **tgt_field, double frac_mask_fallback_value, double scale_factor, double scale_summand)
void yac_interp_operator_execute_put(struct yac_interp_operator *interp, double ***src_fields, double ***src_frac_masks, int is_target, double frac_mask_fallback_value, double scale_factor, double scale_summand)
void yac_interp_operator_execute_get_async(struct yac_interp_operator *interp, double **tgt_field, double frac_mask_fallback_value, double scale_factor, double scale_summand)
void yac_interp_operator_execute(struct yac_interp_operator *interp, double ***src_fields, double ***src_frac_masks, double **tgt_field, double frac_mask_fallback_value, double scale_factor, double scale_summand)
void yac_interp_operator_delete(struct yac_interp_operator *interp)
Delete the interpolation operator and free resources.
@ YAC_INTERP_COMPLETE
Direct redistribution operator in YAC.
Multi-field direct redistribution operator in YAC.
Fixed-value interpolation operator in YAC.
Weighted/unweighted sum operator at source in YAC.
Weighted/unweighted sum operator at target in YAC.
void yac_interpolation_add_sum_at_src(struct yac_interpolation *interp, Xt_redist *halo_redists, size_t tgt_count, size_t *num_src_per_tgt, size_t *src_field_idx, size_t *src_idx, size_t num_src_fields, Xt_redist result_redist)
Add a sum operator where accumulation occurs on source processes.
struct yac_interpolation * yac_interpolation_copy(struct yac_interpolation *interp)
Create a deep copy of an interpolation object.
void yac_interpolation_inc_ref_count(struct yac_interpolation *interpolation)
Increase the reference count of an interpolation.
void yac_interpolation_add_weight_sum_mvp_at_tgt(struct yac_interpolation *interp, Xt_redist *src_redists, size_t *tgt_pos, size_t tgt_count, size_t *num_src_per_tgt, double *weights, size_t *src_field_idx, size_t *src_idx, size_t num_src_fields)
Add a weighted sum operator (distributed matrix-vector product), which computes the product at the ta...
void yac_interpolation_execute(struct yac_interpolation *interp, double ***src_fields, double **tgt_field)
Execute interpolation synchronously and write results to the target field.
int yac_interpolation_with_frac_mask(struct yac_interpolation *interpolation)
Query whether interpolation uses fractional masks.
void yac_interpolation_add_direct_mf(struct yac_interpolation *interp, Xt_redist *redists, size_t num_src_fields)
Add a direct redistribution operator for multiple source fields.
void yac_interpolation_delete(struct yac_interpolation *interp)
Free an interpolation object and release all resources.
void yac_interpolation_add_sum_at_tgt(struct yac_interpolation *interp, Xt_redist *src_redists, size_t *tgt_pos, size_t tgt_count, size_t *num_src_per_tgt, size_t *src_field_idx, size_t *src_idx, size_t num_src_fields)
Add a sum operator where accumulation occurs on target processes.
int yac_interpolation_execute_put_test(struct yac_interpolation *interp)
Test whether the asynchronous put phase has completed.
void yac_interpolation_add_fixed(struct yac_interpolation *interp, double value, size_t count, size_t *pos)
Add a fixed-value operator to an interpolation.
void yac_interpolation_execute_wait(struct yac_interpolation *interp)
Wait for completion of pending asynchronous interpolation operations.
void yac_interpolation_execute_frac(struct yac_interpolation *interp, double ***src_fields, double ***src_frac_masks, double **tgt_field)
Execute interpolation with fractional masks and write results to the target field.
void yac_interpolation_execute_get(struct yac_interpolation *interp, double **tgt_field)
Complete interpolation and write results to the target field (get phase).
void yac_interpolation_execute_get_async(struct yac_interpolation *interp, double **tgt_field)
Complete interpolation asynchronously and write results to the target field (get phase).
double const YAC_FRAC_MASK_UNDEF
void yac_interpolation_add_direct(struct yac_interpolation *interp, Xt_redist redist)
Add a direct redistribution operator.
double yac_interpolation_get_const_frac_mask_no_value_c2f()
struct yac_interpolation * yac_interpolation_new(struct yac_collection_selection const *collection_selection, double frac_mask_fallback_value, double scale_factor, double scale_summand)
Create a new interpolation object.
void yac_interpolation_execute_put_frac(struct yac_interpolation *interp, double ***src_fields, double ***src_frac_masks)
Provide source field data with fractional masks and start asynchronous execution of interpolation (pu...
void yac_interpolation_execute_put(struct yac_interpolation *interp, double ***src_fields)
Provide source field data and start asynchronous execution of interpolation (put phase).
void yac_interpolation_add_weight_sum_mvp_at_src(struct yac_interpolation *interp, Xt_redist *halo_redists, size_t tgt_count, size_t *num_src_per_tgt, double *weights, size_t *src_field_idx, size_t *src_idx, size_t num_src_fields, Xt_redist result_redist)
Add a weighted sum operator (distributed matrix-vector product), which computes the productes at the ...
int yac_interpolation_execute_get_test(struct yac_interpolation *interp)
Test whether the asynchronous get phase has completed.
double yac_interpolation_get_const_frac_mask_undef_c2f()
static void yac_interpolation_add(struct yac_interpolation *interp, struct yac_interp_operator *interp_type)
double const YAC_FRAC_MASK_NO_VALUE
struct yac_collection_selection const * yac_interpolation_get_collection_selection(struct yac_interpolation const *interp)
Return the collection selection associated with an interpolation.
struct Xt_redist_ * Xt_redist
Defines internal basic interpolation definitions.
#define YAC_FRAC_MASK_VALUE_IS_VALID(value)
Test whether a fractional mask value is valid.
#define xrealloc(ptr, size)
Definition ppm_xfuncs.h:67
#define xmalloc(size)
Definition ppm_xfuncs.h:66
Abstract interpolation operator type.
double frac_mask_fallback_value
struct yac_collection_selection * collection_selection
Selection of field collections to which this interpolation applies.
struct yac_interp_operator ** interps
#define YAC_ASSERT_F(exp, format,...)
Definition yac_assert.h:30