YAC 3.12.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 "ppm/core.h"
14#include "utils_core.h"
22#include "yac_mpi_internal.h"
24
25double const YAC_FRAC_MASK_NO_VALUE = 133713371337.0;
26double const YAC_FRAC_MASK_UNDEF = -133713371337.0;
27
51
55
58 "ERROR(yac_interpolation_new): "
59 "invalid collection_selection its size has to be > 0");
61 isnormal(scale_factor) || (fabs(scale_factor) == 0.0),
62 "ERROR(yac_interpolation_new): scale_factor argument is not normale (%f)",
65 isnormal(scale_summand) || (fabs(scale_summand) == 0.0),
66 "ERROR(yac_interpolation_new): scale_summand argument is not normale (%f)",
68
69 struct yac_interpolation * interp = xmalloc(1 * sizeof(*interp));
70
71 interp->interps = NULL;
72 interp->interp_count = 0;
73
74 interp->is_source = 0;
75 interp->is_target = 0;
76 interp->collection_selection =
78
79 interp->ref_count = 1;
80
81 interp->frac_mask_fallback_value = frac_mask_fallback_value;
82
84 isnormal(scale_factor),
85 "ERROR(yac_interpolation_new): \"%lf\" is not a valid scaling factor",
88 (scale_summand == 0.0) || isnormal(scale_summand),
89 "ERROR(yac_interpolation_new): \"%lf\" is not a valid scaling summand",
91
92 interp->scale_factor = scale_factor;
93 interp->scale_summand = scale_summand;
94
95 return interp;
96}
97
99 struct yac_interpolation * interp,
100 struct yac_interp_operator * interp_type) {
101
102 if (interp_type == NULL) return;
103
104 interp->interps =
105 xrealloc(
106 interp->interps,
107 (interp->interp_count + 1) * sizeof(*(interp->interps)));
108 interp->interps[interp->interp_count] = interp_type;
109 interp->interp_count++;
110
111 interp->is_source |= yac_interp_operator_is_source(interp_type);
112 interp->is_target |= yac_interp_operator_is_target(interp_type);
113}
114
116 struct yac_interpolation * interp, double value, size_t count,
117 size_t * pos) {
118
120 interp,
122 interp->collection_selection, value, count, pos));
123}
124
126 struct yac_interpolation * interp, Xt_redist redist) {
127
129 interp, yac_interp_operator_direct_new(interp->collection_selection, redist));
130}
131
133 struct yac_interpolation * interp, Xt_redist * redists,
134 size_t num_src_fields) {
135
137 interp,
139 interp->collection_selection, redists, num_src_fields));
140}
141
143 struct yac_interpolation * interp, Xt_redist * halo_redists,
144 size_t tgt_count, size_t * num_src_per_tgt,
145 size_t * src_field_idx, size_t * src_idx,
146 size_t num_src_fields, Xt_redist result_redist) {
147
149 interp,
151 interp->collection_selection, halo_redists, tgt_count, num_src_per_tgt,
152 NULL, src_field_idx, src_idx, num_src_fields, result_redist,
153 YAC_FRAC_MASK_VALUE_IS_VALID(interp->frac_mask_fallback_value)));
154}
155
157 struct yac_interpolation * interp, Xt_redist * src_redists,
158 size_t * tgt_pos, size_t tgt_count, size_t * num_src_per_tgt,
159 size_t * src_field_idx, size_t * src_idx,
160 size_t num_src_fields) {
161
163 interp,
165 interp->collection_selection, src_redists, tgt_pos, tgt_count,
166 num_src_per_tgt, NULL, src_field_idx, src_idx, num_src_fields,
167 YAC_FRAC_MASK_VALUE_IS_VALID(interp->frac_mask_fallback_value)));
168}
169
171 struct yac_interpolation * interp, Xt_redist * halo_redists,
172 size_t tgt_count, size_t * num_src_per_tgt, double * weights,
173 size_t * src_field_idx, size_t * src_idx,
174 size_t num_src_fields, Xt_redist result_redist) {
175
177 interp,
179 interp->collection_selection, halo_redists, tgt_count, num_src_per_tgt,
180 weights, src_field_idx, src_idx, num_src_fields, result_redist,
181 YAC_FRAC_MASK_VALUE_IS_VALID(interp->frac_mask_fallback_value)));
182}
183
185 struct yac_interpolation * interp, Xt_redist * src_redists, size_t * tgt_pos,
186 size_t tgt_count, size_t * num_src_per_tgt, double * weights,
187 size_t * src_field_idx, size_t * src_idx,
188 size_t num_src_fields) {
189
191 interp,
193 interp->collection_selection, src_redists, tgt_pos, tgt_count,
194 num_src_per_tgt, weights, src_field_idx, src_idx, num_src_fields,
195 YAC_FRAC_MASK_VALUE_IS_VALID(interp->frac_mask_fallback_value)));
196}
197
199 struct yac_interpolation * interp) {
200
201 struct yac_interpolation * interp_copy =
203 interp->collection_selection, interp->frac_mask_fallback_value,
204 interp->scale_factor, interp->scale_summand);
205
206 interp_copy->interps =
207 xmalloc(interp->interp_count * sizeof(*interp_copy->interps));
208 interp_copy->interp_count = interp->interp_count;
209
210 for (size_t i = 0; i < interp->interp_count; ++i)
211 interp_copy->interps[i] =
212 yac_interp_operator_copy(interp->interps[i]);
213
214 interp_copy->is_source = interp->is_source;
215 interp_copy->is_target = interp->is_target;
216
217 return interp_copy;
218}
219
220// src_fields dimensions [collection_idx]
221// [field index]
222// [local_idx]
223// src_frac_masks dimensions [collection_idx]
224// [field index]
225// [local_idx]
226// tgt_field dimensions [collection_idx]
227// [local_idx]
229 struct yac_interpolation * interp, double *** src_fields,
230 double *** src_frac_masks, double ** tgt_field) {
231
233 YAC_FRAC_MASK_VALUE_IS_VALID(interp->frac_mask_fallback_value) ||
234 (src_frac_masks == NULL),
235 "ERROR(yac_interpolation_execute_frac): "
236 "interpolation was not built for dynamic fractional masking, "
237 "use yac_interpolation_execute instead");
238
239 for (size_t i = 0; i < interp->interp_count; ++i)
241 interp->interps[i], src_fields, src_frac_masks, tgt_field,
242 interp->frac_mask_fallback_value, interp->scale_factor,
243 interp->scale_summand);
244}
245
246// src_fields dimensions [collection_idx]
247// [field index]
248// [local_idx]
249// tgt_field dimensions [collection_idx]
250// [local_idx]
252 struct yac_interpolation * interp, double *** src_fields,
253 double ** tgt_field) {
254
256 !YAC_FRAC_MASK_VALUE_IS_VALID(interp->frac_mask_fallback_value),
257 "ERROR(yac_interpolation_execute): "
258 "interpolation was built for dynamic fractional masking, "
259 "use yac_interpolation_execute_frac instead");
260
261 yac_interpolation_execute_frac(interp, src_fields, NULL, tgt_field);
262}
263
264// src_fields dimensions [collection_idx]
265// [field index]
266// [local_idx]
267// src_frac_masks dimensions [collection_idx]
268// [field index]
269// [local_idx]
271 struct yac_interpolation * interp, double *** src_fields,
272 double *** src_frac_masks) {
273
275 YAC_FRAC_MASK_VALUE_IS_VALID(interp->frac_mask_fallback_value) ||
276 (src_frac_masks == NULL),
277 "ERROR(yac_interpolation_execute_put_frac): "
278 "interpolation was built for dynamic fractional masking, "
279 "use yac_interpolation_execute_put instead");
280
281 if (!interp->is_source) return;
282
283 for (size_t i = 0; i < interp->interp_count; ++i)
285 interp->interps[i], src_fields, src_frac_masks,
286 interp->is_target, interp->frac_mask_fallback_value,
287 interp->scale_factor, interp->scale_summand);
288}
289
290// src_fields dimensions [collection_idx]
291// [field index]
292// [local_idx]
294 struct yac_interpolation * interp, double *** src_fields) {
295
297 !YAC_FRAC_MASK_VALUE_IS_VALID(interp->frac_mask_fallback_value),
298 "ERROR(yac_interpolation_execute_put): "
299 "interpolation was built for dynamic fractional masking, "
300 "use yac_interpolation_execute_put_frac instead");
301
302 yac_interpolation_execute_put_frac(interp, src_fields, NULL);
303}
304
305// tgt_field dimensions [collection_idx]
306// [local_idx]
308 struct yac_interpolation * interp, double ** tgt_field) {
309
310 if (!interp->is_target) return;
311
312 for (size_t i = 0; i < interp->interp_count; ++i)
314 interp->interps[i], tgt_field, interp->frac_mask_fallback_value,
315 interp->scale_factor, interp->scale_summand);
316}
317
319 struct yac_interpolation * interp, double ** tgt_field) {
320
321 if (!interp->is_target) return;
322
323 for (size_t i = 0; i < interp->interp_count; ++i)
325 interp->interps[i], tgt_field, interp->frac_mask_fallback_value,
326 interp->scale_factor, interp->scale_summand);
327}
328
330
331 int put_complete = 1;
332
333 for (size_t i = 0; (i < interp->interp_count) && put_complete; ++i)
334 put_complete &=
336 interp->interps[i]) == YAC_INTERP_COMPLETE);
337
338 return put_complete;
339}
340
342
343 int get_complete = 1;
344
345 for (size_t i = 0; (i < interp->interp_count) && get_complete; ++i)
346 get_complete &=
348 interp->interps[i]) == YAC_INTERP_COMPLETE);
349
350 return get_complete;
351}
352
354
355 for (size_t i = 0; i < interp->interp_count; ++i) {
356 yac_interp_operator_execute_wait(interp->interps[i]);
357 }
358}
359
361
362 interpolation->ref_count++;
363}
364
366
367 return
369}
370
372
373 if (interp == NULL) return;
374
375 if(--(interp->ref_count)) return;
376
377 for (size_t i = 0; i < interp->interp_count; ++i) {
378 yac_interp_operator_delete(interp->interps[i]);
379 }
380 yac_collection_selection_delete(interp->collection_selection);
381 free(interp->interps);
382 free(interp);
383}
384
385struct yac_collection_selection const *
387 struct yac_interpolation const * interp) {
388
389 return (interp == NULL)?NULL:interp->collection_selection;
390}
391
395
#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 @34::@35 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.
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:19