YAC 3.12.0
Yet Another Coupler
Loading...
Searching...
No Matches
interp_operator_direct.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#include <string.h>
6
8#include "utils_core.h"
13
15 struct yac_interp_operator * interp);
17 struct yac_interp_operator * interp);
19 struct yac_interp_operator * interp,
20 double *** src_fields, double *** src_frac_masks, double ** tgt_field,
21 double frac_mask_fallback_value, double scale_factor, double scale_summand);
23 struct yac_interp_operator * interp,
24 double *** src_fields, double *** src_frac_masks,
25 int is_target, double frac_mask_fallback_value,
26 double scale_factor, double scale_summand);
28 struct yac_interp_operator * interp, double ** tgt_field,
29 double frac_mask_fallback_value, double scale_factor, double scale_summand);
31 struct yac_interp_operator * interp, double ** tgt_field,
32 double frac_mask_fallback_value, double scale_factor, double scale_summand);
34 struct yac_interp_operator * interp);
36 struct yac_interp_operator * interp);
38 struct yac_interp_operator * interp);
40 struct yac_interp_operator * interp);
42 struct yac_interp_operator * interp);
43
57
71
73 struct yac_collection_selection const * collection_selection,
74 struct yac_interpolation_exchange * src2tgt,
75 struct yac_interpolation_buffer src_data) {
76
77 struct yac_interpolation_direct * direct = xmalloc(1 * sizeof(*direct));
78
80 direct->collection_selection =
82 direct->src_data = src_data;
83 direct->src2tgt = src2tgt;
84 direct->src_field_buffer =
85 xcalloc(
87 sizeof(*(direct->src_field_buffer)));
90
91 return (struct yac_interp_operator *)direct;
92}
93
95 struct yac_collection_selection const * collection_selection,
96 Xt_redist redist_) {
97
98 size_t collection_size =
100
101 return
103 collection_selection,
105 &redist_, 1, collection_size, 0, "source to target"),
107 &redist_, 1, collection_size, SEND_BUFFER));
108}
109
111 struct yac_interp_operator * interp) {
112
113 struct yac_interpolation_direct * direct =
114 (struct yac_interpolation_direct *)interp;
115
116 return direct->is_source;
117}
118
120 struct yac_interp_operator * interp) {
121
122 struct yac_interpolation_direct * direct =
123 (struct yac_interpolation_direct *)interp;
124
125 return direct->is_target;
126}
127
129 struct yac_interp_operator * interp,
130 double *** src_fields, double *** src_frac_masks, double ** tgt_field,
131 double frac_mask_fallback_value, double scale_factor, double scale_summand) {
132
133 struct yac_interpolation_direct * direct =
134 (struct yac_interpolation_direct *)interp;
135
136 double ** src_send_buffer = NULL;
137
139 direct->src2tgt, "yac_interp_operator_direct_execute");
140
141 if (direct->is_source) {
142
143 size_t collection_size =
145 direct->collection_selection);
146 size_t const * collection_indices =
148
149 if (collection_indices != NULL) {
150
151 double *** temp_src_fields =
152 xmalloc(collection_size * sizeof(*temp_src_fields));
153 temp_src_fields[0] =
154 xmalloc(collection_size * sizeof(**temp_src_fields));
155 for (size_t i = 0; i < collection_size; ++i) {
156 temp_src_fields[i] = temp_src_fields[0] + i;
157 temp_src_fields[i][0] = src_fields[collection_indices[i]][0];
158 }
159 src_fields = temp_src_fields;
160
161 if (src_frac_masks != NULL) {
162 double *** temp_src_frac_masks =
163 xmalloc(collection_size * sizeof(*temp_src_frac_masks));
164 temp_src_frac_masks[0] =
165 xmalloc(collection_size * sizeof(**temp_src_frac_masks));
166 for (size_t i = 0; i < collection_size; ++i) {
167 temp_src_frac_masks[i] = temp_src_frac_masks[0] + i;
168 temp_src_frac_masks[i][0] = src_frac_masks[collection_indices[i]][0];
169 }
170 src_frac_masks = temp_src_frac_masks;
171 }
172 }
173
174 if ((YAC_FRAC_MASK_VALUE_IS_VALID(frac_mask_fallback_value)) ||
175 (scale_factor != 1.0) || (scale_summand != 0.0)) {
176
177 src_send_buffer = direct->src_data.buffer;
178
180 (double const * restrict **)src_fields,
181 (double const * restrict **)src_frac_masks, src_send_buffer,
183 frac_mask_fallback_value, scale_factor, scale_summand);
184
185 } else {
186
187 src_send_buffer = direct->src_field_buffer;
188 for (size_t i = 0; i < collection_size; ++i)
189 src_send_buffer[i] = src_fields[i][0];
190 }
191
192 if (collection_indices != NULL) {
193 free(src_fields[0]);
194 free(src_fields);
195 if (src_frac_masks != NULL) {
196 free(src_frac_masks[0]);
197 free(src_frac_masks);
198 }
199 }
200 }
201
203 direct->src2tgt, (double const **)src_send_buffer, tgt_field,
204 "yac_interp_operator_direct_execute");
205}
206
208 struct yac_interp_operator * interp,
209 double *** src_fields, double *** src_frac_masks, int is_target,
210 double frac_mask_fallback_value, double scale_factor, double scale_summand) {
211
213
214 struct yac_interpolation_direct * direct =
215 (struct yac_interpolation_direct *)interp;
216
217 double ** src_send_buffer = NULL;
218
219 if (direct->is_source) {
220
221 size_t collection_size =
223 direct->collection_selection);
224 size_t const * collection_indices =
226
227 if (collection_indices != NULL) {
228
229 double *** temp_src_fields =
230 xmalloc(collection_size * sizeof(*temp_src_fields));
231 temp_src_fields[0] =
232 xmalloc(collection_size * sizeof(**temp_src_fields));
233 for (size_t i = 0; i < collection_size; ++i) {
234 temp_src_fields[i] = temp_src_fields[0] + i;
235 temp_src_fields[i][0] = src_fields[collection_indices[i]][0];
236 }
237 src_fields = temp_src_fields;
238
239 if (src_frac_masks != NULL) {
240 double *** temp_src_frac_masks =
241 xmalloc(collection_size * sizeof(*temp_src_frac_masks));
242 temp_src_frac_masks[0] =
243 xmalloc(collection_size * sizeof(**temp_src_frac_masks));
244 for (size_t i = 0; i < collection_size; ++i) {
245 temp_src_frac_masks[i] = temp_src_frac_masks[0] + i;
246 temp_src_frac_masks[i][0] = src_frac_masks[collection_indices[i]][0];
247 }
248 src_frac_masks = temp_src_frac_masks;
249 }
250 }
251
252 // wait until previous exchange is completed
254 direct->src2tgt, "yac_interp_operator_direct_execute_put") ==
257 direct->src2tgt, "yac_interp_operator_direct_execute_put");
258
259 src_send_buffer = direct->src_data.buffer;
260
262 (double const * restrict **)src_fields,
263 (double const * restrict **)src_frac_masks, src_send_buffer,
264 direct->src_data.buffer_sizes, 1,
265 collection_size, frac_mask_fallback_value,
266 scale_factor, scale_summand);
267
268 if (collection_indices != NULL) {
269 free(src_fields[0]);
270 free(src_fields);
271 if (src_frac_masks != NULL) {
272 free(src_frac_masks[0]);
273 free(src_frac_masks);
274 }
275 }
276 }
277
279 direct->src2tgt, (double const **)src_send_buffer,
280 "yac_interp_operator_direct_execute_put");
281}
282
284 struct yac_interp_operator * interp, double ** tgt_field,
285 double frac_mask_fallback_value, double scale_factor, double scale_summand) {
286
287 UNUSED(frac_mask_fallback_value);
288 UNUSED(scale_factor);
289 UNUSED(scale_summand);
290
291 struct yac_interpolation_direct * direct =
292 (struct yac_interpolation_direct*)interp;
293
295 direct->src2tgt, tgt_field, "yac_interp_operator_direct_execute_get");
296}
297
299 struct yac_interp_operator * interp, double ** tgt_field,
300 double frac_mask_fallback_value, double scale_factor, double scale_summand) {
301
302 UNUSED(frac_mask_fallback_value);
303 UNUSED(scale_factor);
304 UNUSED(scale_summand);
305
306 struct yac_interpolation_direct * direct =
307 (struct yac_interpolation_direct*)interp;
308
309 // wait until previous exchange is completed
311 direct->src2tgt, "yac_interp_operator_direct_execute_get_async") ==
314 direct->src2tgt, "yac_interp_operator_direct_execute_get_async");
315
317 direct->src2tgt, tgt_field, "yac_interp_operator_direct_execute_get_async");
318}
319
335
337 struct yac_interp_operator * interp) {
338
339 struct yac_interpolation_direct * direct =
340 (struct yac_interpolation_direct*)interp;
341
342 return
344 direct->src2tgt,
345 "yac_interp_operator_direct_execute_put_test") ==
347}
348
350 struct yac_interp_operator * interp) {
351
352 struct yac_interpolation_direct * direct =
353 (struct yac_interpolation_direct*)interp;
354
355 return
357 direct->src2tgt,
358 "yac_interp_operator_direct_execute_get_test") ==
360}
361
363 struct yac_interp_operator * interp) {
364
365 struct yac_interpolation_direct * direct =
366 (struct yac_interpolation_direct*)interp;
367
369 direct->src2tgt, "yac_interp_operator_direct_execute_wait");
370}
371
373 struct yac_interp_operator * interp) {
374
375 if (interp == NULL) return;
376
377 struct yac_interpolation_direct * direct =
378 (struct yac_interpolation_direct*)interp;
379
381 direct->src2tgt, "yac_interp_operator_direct_delete");
383 free(direct->src_field_buffer);
385 free(direct);
386}
#define UNUSED(x)
Definition core.h:73
size_t yac_collection_selection_get_collection_size(struct yac_collection_selection const *collection_selection)
Get the size of the collection selection.
size_t const * yac_collection_selection_get_indices(struct yac_collection_selection const *collection_selection)
Get explicit selection indices if non-contiguous.
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_new(struct yac_collection_selection const *collection_selection, Xt_redist redist_)
Create a direct redistribution interpolation operator.
YAC_INTERP_TEST_STATUS
@ YAC_INTERP_INCOMPLETE
@ YAC_INTERP_COMPLETE
static int yac_interp_operator_direct_is_source(struct yac_interp_operator *interp)
static void yac_interp_operator_direct_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)
static enum YAC_INTERP_TEST_STATUS yac_interp_operator_direct_execute_get_test(struct yac_interp_operator *interp)
static void yac_interp_operator_direct_execute_get(struct yac_interp_operator *interp, double **tgt_field, double frac_mask_fallback_value, double scale_factor, double scale_summand)
static struct yac_interp_operator * yac_interp_operator_direct_copy(struct yac_interp_operator *interp)
static void yac_interp_operator_direct_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)
static int yac_interp_operator_direct_is_target(struct yac_interp_operator *interp)
static void yac_interp_operator_direct_execute_get_async(struct yac_interp_operator *interp, double **tgt_field, double frac_mask_fallback_value, double scale_factor, double scale_summand)
static struct yac_interp_operator_vtable const interpolation_direct_vtable
static void yac_interp_operator_direct_delete(struct yac_interp_operator *interp)
static enum YAC_INTERP_TEST_STATUS yac_interp_operator_direct_execute_put_test(struct yac_interp_operator *interp)
static void yac_interp_operator_direct_execute_wait(struct yac_interp_operator *interp)
static struct yac_interp_operator * yac_interpolation_direct_new_(struct yac_collection_selection const *collection_selection, struct yac_interpolation_exchange *src2tgt, struct yac_interpolation_buffer src_data)
Direct redistribution operator in YAC.
int yac_interpolation_exchange_is_target(struct yac_interpolation_exchange *exchange)
Query whether the current process participates as target.
void yac_interpolation_exchange_execute_get_async(struct yac_interpolation_exchange *exchange, double **recv_data, char const *routine_name)
Execute the get phase asynchronously.
enum YAC_INTERP_EXCH_TEST_STATUS yac_interpolation_exchange_put_test(struct yac_interpolation_exchange *exchange, char const *routine_name)
Test whether the put phase has completed.
struct yac_interpolation_exchange * yac_interpolation_exchange_copy(struct yac_interpolation_exchange *exchange)
Create a deep copy of an interpolation exchange.
void yac_interpolation_exchange_delete(struct yac_interpolation_exchange *exchange, char const *routine_name)
Delete an interpolation exchange and release resources.
void yac_interpolation_exchange_execute_get(struct yac_interpolation_exchange *exchange, double **recv_data, char const *routine_name)
Execute the get phase and receive target data synchronously.
void yac_interpolation_exchange_wait(struct yac_interpolation_exchange *exchange, char const *routine_name)
Wait for completion of pending put/get phases.
enum YAC_INTERP_EXCH_TEST_STATUS yac_interpolation_exchange_get_test(struct yac_interpolation_exchange *exchange, char const *routine_name)
Test whether the get phase has completed.
void yac_interpolation_exchange_execute_put(struct yac_interpolation_exchange *exchange, double const **send_data, char const *routine_name)
Execute only the put phase asynchronously.
struct yac_interpolation_exchange * yac_interpolation_exchange_new(Xt_redist *redists, size_t num_fields, size_t collection_size, int with_frac_mask, char const *name)
Create a new interpolation exchange object.
void yac_interpolation_exchange_execute(struct yac_interpolation_exchange *exchange, double const **send_data_, double **recv_data_, char const *routine_name)
Execute the full exchange (put + get) synchronously.
enum YAC_INTERP_EXCH_STATUS yac_interpolation_exchange_status(struct yac_interpolation_exchange *exchange, char const *routine_name)
int yac_interpolation_exchange_is_source(struct yac_interpolation_exchange *exchange)
Query whether the current process participates as source.
Interpolation exchange object for temporary buffers and MPI exchanges.
@ YAC_INTERP_EXCH_COMPLETE
No ongoing operation.
@ YAC_INTERP_EXCH_ACTIVE
Exchange is active.
#define YAC_FRAC_MASK_VALUE_IS_VALID(value)
Test whether a fractional mask value is valid.
struct yac_interpolation_buffer yac_interpolation_buffer_copy(struct yac_interpolation_buffer src, size_t num_fields, size_t collection_size)
void yac_interpolation_buffer_free(struct yac_interpolation_buffer *buffer)
struct yac_interpolation_buffer yac_interpolation_buffer_init(Xt_redist *redists, size_t num_fields, size_t collection_size, enum yac_interpolation_buffer_type type)
static void compute_tgt_field(double const *restrict **src_fields, double const *restrict **src_frac_masks, double *restrict *tgt_field, size_t *restrict tgt_buffer_sizes, size_t num_src_fields, size_t collection_size, double frac_mask_fallback_value, double scale_factor, double scale_summand)
@ SEND_BUFFER
#define xcalloc(nmemb, size)
Definition ppm_xfuncs.h:64
#define xmalloc(size)
Definition ppm_xfuncs.h:66
Virtual function table for interpolation operators.
int(* is_source)(struct yac_interp_operator *interp)
Abstract interpolation operator type.
struct yac_interpolation_buffer src_data
struct yac_interpolation_exchange * src2tgt
struct yac_collection_selection * collection_selection
struct yac_interp_operator_vtable const * vtable
int collection_size