YetAnotherCoupler 3.5.2
Loading...
Searching...
No Matches
interpolation_sum_mvp_at_tgt.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"
9#include "yaxt.h"
10#include "interpolation_utils.h"
12
14 struct yac_interpolation_type * interp);
16 struct yac_interpolation_type * interp);
18 struct yac_interpolation_type * interp,
19 double *** src_fields, double *** src_frac_masks, double ** tgt_field,
20 double frac_mask_fallback_value, double scale_factor, double scale_summand);
22 struct yac_interpolation_type * interp,
23 double *** src_fields, double *** src_frac_masks,
24 int is_target, double frac_mask_fallback_value,
25 double scale_factor, double scale_summand);
27 struct yac_interpolation_type * interp, double ** tgt_field,
28 double frac_mask_fallback_value, double scale_factor, double scale_summand);
30 struct yac_interpolation_type * interp, double ** tgt_field,
31 double frac_mask_fallback_value, double scale_factor, double scale_summand);
33 struct yac_interpolation_type * interp);
35 struct yac_interpolation_type * interp);
37 struct yac_interpolation_type * interp);
39 struct yac_interpolation_type * interp);
41 struct yac_interpolation_type * interp);
42
56
58
60
63
64 /* data flow:
65 * put:
66 * I. source processes pack their source data into a buffer, in order
67 * to be able to asynchronously process the put operation
68 * - from buffer: src_fields (+src_frac_masks) provided by user
69 * - to buffer: src_send_buffer
70 * II. source processes send source data to target processes, such
71 * that each target process can compute its own target field
72 * - send buffer: src_send_buffer
73 * - recv buffer: src_recv_buffer
74 * - exchange: src2tgt
75 * get:
76 * I. target processes receive source data from source processes
77 * - send buffer: src_send_buffer
78 * - recv buffer: src_recv_buffer
79 * - exchange: src2tgt
80 * II. target process comput their target field
81 * - from buffer: src_recv_buffer
82 * - to buffer: tgt_field provied by the user
83 */
84
88
89 double *** src_fields;
90 double *** src_frac_masks;
92 size_t * tgt_pos;
93 size_t tgt_count;
95 double * weights;
96 size_t * src_field_idx;
97 size_t * src_idx;
101
103
104 // temporary data
105 double ** tgt_field;
109
111};
112
114 size_t collection_size,
115 struct yac_interpolation_buffer src_send_data,
116 struct yac_interpolation_buffer src_recv_data,
117 struct yac_interpolation_exchange * src2tgt,
118 size_t * tgt_pos, size_t tgt_count, size_t * prefix_num_src_per_tgt,
119 double * weights, size_t * src_field_idx, size_t * src_idx,
120 size_t num_src_fields, int with_frac_mask, int * ref_count) {
121
122 struct yac_interpolation_sum_mvp_at_tgt * mvp_at_tgt =
123 xmalloc(1 * sizeof(*mvp_at_tgt));
124
126 mvp_at_tgt->collection_size = collection_size;
127 mvp_at_tgt->with_frac_mask = with_frac_mask;
128 mvp_at_tgt->src_send_data = src_send_data;
129 mvp_at_tgt->src_recv_data = src_recv_data;
130 mvp_at_tgt->src2tgt = src2tgt;
131 mvp_at_tgt->src_fields =
132 xmalloc(collection_size * sizeof(*(mvp_at_tgt->src_fields)));
133 for (size_t i = 0; i < collection_size; ++i)
134 mvp_at_tgt->src_fields[i] = mvp_at_tgt->src_send_data.buffer + i * num_src_fields;
135 if (with_frac_mask) {
136 mvp_at_tgt->src_frac_masks =
137 xmalloc(collection_size * sizeof(*(mvp_at_tgt->src_frac_masks)));
138 for (size_t i = 0; i < collection_size; ++i)
139 mvp_at_tgt->src_frac_masks[i] =
141 } else {
142 mvp_at_tgt->src_frac_masks = NULL;
143 }
144 mvp_at_tgt->src_fields_buffer =
146 num_src_fields, sizeof(*(mvp_at_tgt->src_fields_buffer)));
147 mvp_at_tgt->tgt_pos = tgt_pos;
148 mvp_at_tgt->tgt_count = tgt_count;
150 mvp_at_tgt->weights = weights;
151 mvp_at_tgt->src_field_idx = src_field_idx;
152 mvp_at_tgt->src_idx = src_idx;
153 mvp_at_tgt->num_src_fields = num_src_fields;
154 mvp_at_tgt->is_source =
156 mvp_at_tgt->is_target = tgt_count > 0;
157 mvp_at_tgt->async_get_is_active = 0;
158
159 mvp_at_tgt->ref_count =
160 (ref_count == NULL)?xcalloc(1, sizeof(*mvp_at_tgt->ref_count)):ref_count;
161 ++*(mvp_at_tgt->ref_count);
162
163 return (struct yac_interpolation_type *)mvp_at_tgt;
164}
165
167 size_t collection_size, Xt_redist * src_redists, size_t * tgt_pos,
168 size_t tgt_count, size_t * num_src_per_tgt, double * weights,
169 size_t * src_field_idx, size_t * src_idx,
170 size_t num_src_fields, int with_frac_mask) {
171
172 size_t total_num_src = 0;
173 size_t * prefix_num_src_per_tgt =
174 xmalloc((tgt_count + 1) * sizeof(*prefix_num_src_per_tgt));
175 for (size_t i = 0; i < tgt_count; ++i) {
176 prefix_num_src_per_tgt[i] = total_num_src;
177 total_num_src += num_src_per_tgt[i];
178 }
179 prefix_num_src_per_tgt[tgt_count] = total_num_src;
180
181 // in case a process is both source and target, the send buffer is also used
182 // to copy the send field (and send_frac_mask) in the put for the get
183 // --> we have to make sure that the buffer contains all locally required
184 // data
185 size_t * min_buffer_sizes =
186 xcalloc(num_src_fields, sizeof(*min_buffer_sizes));
187 for (size_t i = 0, offset = 0; i < tgt_count; ++i) {
188 size_t curr_num_src = num_src_per_tgt[i];
189 for (size_t j = 0; j < curr_num_src; ++j, ++offset) {
190 size_t curr_src_field_idx = src_field_idx[offset];
191 if (curr_src_field_idx == SIZE_MAX) continue;
192 size_t curr_src_extent = (src_idx[offset] + 1) * sizeof(double);
193 if (min_buffer_sizes[curr_src_field_idx] < curr_src_extent)
194 min_buffer_sizes[curr_src_field_idx] = curr_src_extent;
195 }
196 }
197
198 struct yac_interpolation_type * interp =
200 collection_size,
202 src_redists, min_buffer_sizes, num_src_fields,
203 with_frac_mask?2*collection_size:collection_size, SEND_BUFFER),
205 src_redists, num_src_fields,
206 with_frac_mask?2*collection_size:collection_size, RECV_BUFFER),
208 src_redists, num_src_fields,
209 collection_size, with_frac_mask, "source to target"),
210 COPY_DATA(tgt_pos, tgt_count), tgt_count,
211 prefix_num_src_per_tgt,
212 (weights != NULL)?COPY_DATA(weights, total_num_src):NULL,
213 COPY_DATA(src_field_idx, total_num_src),
214 COPY_DATA(src_idx, total_num_src),
215 num_src_fields, with_frac_mask, NULL);
216
217 free(min_buffer_sizes);
218 return interp;
219}
220
222 struct yac_interpolation_type * interp) {
223
224 struct yac_interpolation_sum_mvp_at_tgt * sum_mvp_at_tgt =
225 (struct yac_interpolation_sum_mvp_at_tgt *)interp;
226
227 return sum_mvp_at_tgt->is_source;
228}
229
231 struct yac_interpolation_type * interp) {
232
233 struct yac_interpolation_sum_mvp_at_tgt * sum_mvp_at_tgt =
234 (struct yac_interpolation_sum_mvp_at_tgt *)interp;
235
236 return sum_mvp_at_tgt->is_target;
237}
238
240 struct yac_interpolation_type * interp,
241 double *** src_fields, double *** src_frac_masks, double ** tgt_field,
242 double frac_mask_fallback_value, double scale_factor, double scale_summand) {
243
244 struct yac_interpolation_sum_mvp_at_tgt * sum_mvp_at_tgt =
245 (struct yac_interpolation_sum_mvp_at_tgt *)interp;
246
248
249 int with_frac_mask = sum_mvp_at_tgt->with_frac_mask;
250 CHECK_WITH_FRAC_MASK("yac_interpolation_sum_mvp_at_tgt_execute")
251
252 size_t collection_size = sum_mvp_at_tgt->collection_size;
253 size_t num_src_fields = sum_mvp_at_tgt->num_src_fields;
254 double ** temp_src_fields = sum_mvp_at_tgt->src_fields_buffer;
255 double ** src_recv_buffer = sum_mvp_at_tgt->src_recv_data.buffer;
256 if (sum_mvp_at_tgt->is_source) {
257 for (size_t i = 0; i < collection_size; ++i)
258 for (size_t j = 0; j < num_src_fields; ++j)
259 temp_src_fields[i * num_src_fields + j] = src_fields[i][j];
260 if (with_frac_mask)
261 for (size_t i = 0; i < collection_size; ++i)
262 for (size_t j = 0; j < num_src_fields; ++j)
263 temp_src_fields
265 src_frac_masks[i][j];
266 }
267
268 // send source points to targets
270 sum_mvp_at_tgt->src2tgt, (double const **)temp_src_fields,
271 src_recv_buffer, "yac_interpolation_sum_mvp_at_tgt_execute");
272
274 (double const * restrict **)src_fields,
275 (double const * restrict **)(with_frac_mask?src_frac_masks:NULL),
276 (double const * restrict *)src_recv_buffer,
277 (double const * restrict *)(
278 with_frac_mask?(src_recv_buffer + collection_size * num_src_fields):NULL),
279 tgt_field, sum_mvp_at_tgt->tgt_pos, sum_mvp_at_tgt->tgt_count,
280 sum_mvp_at_tgt->prefix_num_src_per_tgt, sum_mvp_at_tgt->weights,
281 sum_mvp_at_tgt->src_field_idx, sum_mvp_at_tgt->src_idx,
284}
285
287 struct yac_interpolation_type * interp,
288 double *** src_fields, double *** src_frac_masks, int is_target,
289 double frac_mask_fallback_value, double scale_factor, double scale_summand) {
290
294
295 struct yac_interpolation_sum_mvp_at_tgt * sum_mvp_at_tgt =
296 (struct yac_interpolation_sum_mvp_at_tgt *)interp;
297
298 // wait until previous exchange is completed
300 sum_mvp_at_tgt->src2tgt,
301 "yac_interpolation_sum_mvp_at_tgt_execute_get") !=
304
305 double ** src_send_buffer = NULL;
306
307 if (sum_mvp_at_tgt->is_source) {
308
309 int with_frac_mask = sum_mvp_at_tgt->with_frac_mask;
310 CHECK_WITH_FRAC_MASK("yac_interpolation_sum_mvp_at_tgt_execute_put")
311
312 size_t collection_size = sum_mvp_at_tgt->collection_size;
313 size_t num_src_fields = sum_mvp_at_tgt->num_src_fields;
314 size_t * src_send_buffer_sizes = sum_mvp_at_tgt->src_send_data.buffer_sizes;
315 src_send_buffer = sum_mvp_at_tgt->src_send_data.buffer;
316 if (sum_mvp_at_tgt->is_source)
317 for (size_t i = 0; i < collection_size; ++i)
318 for (size_t j = 0; j < num_src_fields; ++j)
319 memcpy(src_send_buffer[i * num_src_fields + j], src_fields[i][j],
320 src_send_buffer_sizes[j]);
321 if (with_frac_mask) {
322 for (size_t i = 0; i < collection_size; ++i)
323 for (size_t j = 0; j < num_src_fields; ++j)
324 memcpy(
325 src_send_buffer
327 src_frac_masks[i][j], src_send_buffer_sizes[j]);
328 }
329 }
330
332 sum_mvp_at_tgt->src2tgt, (double const **)src_send_buffer,
333 "yac_interpolation_sum_mvp_at_tgt_execute_put");
334}
335
336static void compute_tgt(
337 struct yac_interpolation_sum_mvp_at_tgt * sum_mvp_at_tgt) {
338
339 int with_frac_mask = sum_mvp_at_tgt->with_frac_mask;
341 sum_mvp_at_tgt->frac_mask_fallback_value;
342 CHECK_WITH_FRAC_MASK("yac_interpolation_sum_mvp_at_tgt_execute_get")
343
344 size_t collection_size = sum_mvp_at_tgt->collection_size;
345 size_t num_src_fields = sum_mvp_at_tgt->num_src_fields;
346 double ** src_recv_buffer = sum_mvp_at_tgt->src_recv_data.buffer;
347
349 (double const * restrict **)(sum_mvp_at_tgt->src_fields),
350 (double const * restrict **)(
351 with_frac_mask?sum_mvp_at_tgt->src_frac_masks:NULL),
352 (double const * restrict *)src_recv_buffer,
353 (double const * restrict *)(
355 (src_recv_buffer + collection_size * num_src_fields):NULL),
356 sum_mvp_at_tgt->tgt_field,
357 sum_mvp_at_tgt->tgt_pos,
358 sum_mvp_at_tgt->tgt_count,
359 sum_mvp_at_tgt->prefix_num_src_per_tgt,
360 sum_mvp_at_tgt->weights,
361 sum_mvp_at_tgt->src_field_idx,
362 sum_mvp_at_tgt->src_idx,
364 sum_mvp_at_tgt->scale_factor,
365 sum_mvp_at_tgt->scale_summand);
366
367 sum_mvp_at_tgt->async_get_is_active = 0;
368}
369
371 struct yac_interpolation_type * interp, double ** tgt_field,
372 double frac_mask_fallback_value, double scale_factor, double scale_summand) {
373
374 struct yac_interpolation_sum_mvp_at_tgt * sum_mvp_at_tgt =
375 (struct yac_interpolation_sum_mvp_at_tgt*)interp;
376
377 // wait until previous exchange is completed
379 sum_mvp_at_tgt->src2tgt,
380 "yac_interpolation_sum_mvp_at_tgt_execute_get") !=
383
384 // receive source field data
386 sum_mvp_at_tgt->src2tgt, sum_mvp_at_tgt->src_recv_data.buffer,
387 "yac_interpolation_sum_mvp_at_tgt_execute_get");
388
389 sum_mvp_at_tgt->tgt_field = tgt_field;
391 sum_mvp_at_tgt->scale_factor = scale_factor;
392 sum_mvp_at_tgt->scale_summand = scale_summand;
393
394 compute_tgt(sum_mvp_at_tgt);
395}
396
398 struct yac_interpolation_type * interp, double ** tgt_field,
399 double frac_mask_fallback_value, double scale_factor, double scale_summand) {
400
402
403 struct yac_interpolation_sum_mvp_at_tgt * sum_mvp_at_tgt =
404 (struct yac_interpolation_sum_mvp_at_tgt*)interp;
405
406 // wait until previous exchange is completed
408
409 sum_mvp_at_tgt->async_get_is_active = 1;
411 sum_mvp_at_tgt->scale_factor = scale_factor;
412 sum_mvp_at_tgt->scale_summand = scale_summand;
413
414 // receive source field data
416 sum_mvp_at_tgt->src2tgt,
417 sum_mvp_at_tgt->src_recv_data.buffer,
418 "yac_interpolation_sum_mvp_at_tgt_execute_get");
419}
420
422 struct yac_interpolation_type * interp) {
423
424 struct yac_interpolation_sum_mvp_at_tgt * sum_mvp_at_tgt =
425 (struct yac_interpolation_sum_mvp_at_tgt*)interp;
426
427 int result =
429 sum_mvp_at_tgt->src2tgt,
430 "yac_interpolation_sum_mvp_at_tgt_execute_put_test");
431
432 if (result && sum_mvp_at_tgt->async_get_is_active)
433 compute_tgt(sum_mvp_at_tgt);
434
435 return result;
436}
437
439 struct yac_interpolation_type * interp) {
440
441 struct yac_interpolation_sum_mvp_at_tgt * sum_mvp_at_tgt =
442 (struct yac_interpolation_sum_mvp_at_tgt*)interp;
443
444 int result =
446 sum_mvp_at_tgt->src2tgt,
447 "yac_interpolation_sum_mvp_at_tgt_execute_get_test");
448
449 if (result && sum_mvp_at_tgt->async_get_is_active)
450 compute_tgt(sum_mvp_at_tgt);
451
452 return result;
453}
454
456 struct yac_interpolation_type * interp) {
457
458 struct yac_interpolation_sum_mvp_at_tgt * sum_mvp_at_tgt =
459 (struct yac_interpolation_sum_mvp_at_tgt*)interp;
460
462 sum_mvp_at_tgt->src2tgt,
463 "yac_interpolation_sum_mvp_at_tgt_execute_wait");
464
465 if (sum_mvp_at_tgt->async_get_is_active)
466 compute_tgt(sum_mvp_at_tgt);
467}
468
470 struct yac_interpolation_type * interp) {
471
472 struct yac_interpolation_sum_mvp_at_tgt * sum_mvp_at_tgt =
473 (struct yac_interpolation_sum_mvp_at_tgt*)interp;
474
475 return
477 sum_mvp_at_tgt->collection_size,
479 sum_mvp_at_tgt->src_send_data, sum_mvp_at_tgt->num_src_fields,
480 sum_mvp_at_tgt->with_frac_mask?
481 2*sum_mvp_at_tgt->collection_size:sum_mvp_at_tgt->collection_size),
483 sum_mvp_at_tgt->src_recv_data, sum_mvp_at_tgt->num_src_fields,
484 sum_mvp_at_tgt->with_frac_mask?
485 2*sum_mvp_at_tgt->collection_size:sum_mvp_at_tgt->collection_size),
487 sum_mvp_at_tgt->tgt_pos, sum_mvp_at_tgt->tgt_count,
488 sum_mvp_at_tgt->prefix_num_src_per_tgt, sum_mvp_at_tgt->weights,
489 sum_mvp_at_tgt->src_field_idx, sum_mvp_at_tgt->src_idx,
490 sum_mvp_at_tgt->num_src_fields, sum_mvp_at_tgt->with_frac_mask,
491 sum_mvp_at_tgt->ref_count);
492}
493
495 struct yac_interpolation_type * interp) {
496
497 if (interp == NULL) return;
498
499 struct yac_interpolation_sum_mvp_at_tgt * sum_mvp_at_tgt =
500 (struct yac_interpolation_sum_mvp_at_tgt*)interp;
501
502 free(sum_mvp_at_tgt->src_fields);
503 if (sum_mvp_at_tgt->src_frac_masks != NULL)
504 free(sum_mvp_at_tgt->src_frac_masks);
506 sum_mvp_at_tgt->src2tgt, "yac_interpolation_sum_mvp_at_tgt_delete");
509 free(sum_mvp_at_tgt->src_fields_buffer);
510
511 if (!--(*(sum_mvp_at_tgt->ref_count))) {
512 free(sum_mvp_at_tgt->tgt_pos);
513 free(sum_mvp_at_tgt->src_idx);
514 free(sum_mvp_at_tgt->src_field_idx);
515 free(sum_mvp_at_tgt->weights);
516 free(sum_mvp_at_tgt->prefix_num_src_per_tgt);
517 free(sum_mvp_at_tgt->ref_count);
518 }
519 free(sum_mvp_at_tgt);
520}
#define UNUSED(x)
Definition core.h:73
int yac_interpolation_exchange_put_test(struct yac_interpolation_exchange *exchange, char const *routine_name)
void yac_interpolation_exchange_execute_get_async(struct yac_interpolation_exchange *exchange, double **recv_data, char const *routine_name)
struct yac_interpolation_exchange * yac_interpolation_exchange_copy(struct yac_interpolation_exchange *exchange)
void yac_interpolation_exchange_delete(struct yac_interpolation_exchange *exchange, char const *routine_name)
void yac_interpolation_exchange_execute_get(struct yac_interpolation_exchange *exchange, double **recv_data, char const *routine_name)
void yac_interpolation_exchange_wait(struct yac_interpolation_exchange *exchange, char const *routine_name)
void yac_interpolation_exchange_execute_put(struct yac_interpolation_exchange *exchange, double const **send_data, char const *routine_name)
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)
void yac_interpolation_exchange_execute(struct yac_interpolation_exchange *exchange, double const **send_data_, double **recv_data_, char const *routine_name)
enum YAC_INTERP_EXCH_STATUS yac_interpolation_exchange_status(struct yac_interpolation_exchange *exchange, char const *routine_name)
int yac_interpolation_exchange_get_test(struct yac_interpolation_exchange *exchange, char const *routine_name)
int yac_interpolation_exchange_is_source(struct yac_interpolation_exchange *exchange)
@ YAC_INTERP_EXCH_WAIT_PUT
@ YAC_INTERP_EXCH_WAIT_GET
static struct yac_interpolation_type_vtable const interpolation_sum_mvp_at_tgt_vtable
static void yac_interpolation_sum_mvp_at_tgt_execute_get_async(struct yac_interpolation_type *interp, double **tgt_field, double frac_mask_fallback_value, double scale_factor, double scale_summand)
struct yac_interpolation_type * yac_interpolation_sum_mvp_at_tgt_new(size_t collection_size, 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)
static struct yac_interpolation_type * yac_interpolation_sum_mvp_at_tgt_new_(size_t collection_size, struct yac_interpolation_buffer src_send_data, struct yac_interpolation_buffer src_recv_data, struct yac_interpolation_exchange *src2tgt, size_t *tgt_pos, size_t tgt_count, size_t *prefix_num_src_per_tgt, double *weights, size_t *src_field_idx, size_t *src_idx, size_t num_src_fields, int with_frac_mask, int *ref_count)
static struct yac_interpolation_type * yac_interpolation_sum_mvp_at_tgt_copy(struct yac_interpolation_type *interp)
static int yac_interpolation_sum_mvp_at_tgt_execute_put_test(struct yac_interpolation_type *interp)
static int yac_interpolation_sum_mvp_at_tgt_is_target(struct yac_interpolation_type *interp)
static void yac_interpolation_sum_mvp_at_tgt_delete(struct yac_interpolation_type *interp)
static void yac_interpolation_sum_mvp_at_tgt_execute_get(struct yac_interpolation_type *interp, double **tgt_field, double frac_mask_fallback_value, double scale_factor, double scale_summand)
static void yac_interpolation_sum_mvp_at_tgt_execute_wait(struct yac_interpolation_type *interp)
static void yac_interpolation_sum_mvp_at_tgt_execute(struct yac_interpolation_type *interp, double ***src_fields, double ***src_frac_masks, double **tgt_field, double frac_mask_fallback_value, double scale_factor, double scale_summand)
static void yac_interpolation_sum_mvp_at_tgt_execute_put(struct yac_interpolation_type *interp, double ***src_fields, double ***src_frac_masks, int is_target, double frac_mask_fallback_value, double scale_factor, double scale_summand)
static int yac_interpolation_sum_mvp_at_tgt_is_source(struct yac_interpolation_type *interp)
static void compute_tgt(struct yac_interpolation_sum_mvp_at_tgt *sum_mvp_at_tgt)
static int yac_interpolation_sum_mvp_at_tgt_execute_get_test(struct yac_interpolation_type *interp)
struct yac_interpolation_buffer yac_interpolation_buffer_init_2(Xt_redist *redists, size_t *min_buffer_sizes, size_t num_fields, size_t collection_size, enum yac_interpolation_buffer_type type)
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_wgt(double const *restrict **src_fields, double const *restrict **src_frac_masks, double const *restrict *remote_src_fields, double const *restrict *remote_src_frac_masks, double *restrict *tgt_field, size_t const *restrict tgt_pos, size_t tgt_count, size_t const *restrict prefix_num_src_per_tgt, double const *restrict weights, size_t const *restrict src_field_idx, size_t const *restrict src_idx, size_t num_src_fields, size_t collection_size, double frac_mask_fallback_value, double scale_factor, double scale_summand)
#define CHECK_WITH_FRAC_MASK(ROUTINE)
@ SEND_BUFFER
@ RECV_BUFFER
#define xcalloc(nmemb, size)
Definition ppm_xfuncs.h:64
#define xmalloc(size)
Definition ppm_xfuncs.h:66
struct yac_interpolation_type_vtable const * vtable
struct yac_interpolation_buffer src_send_data
struct yac_interpolation_exchange * src2tgt
struct yac_interpolation_buffer src_recv_data
int(* is_source)(struct yac_interpolation_type *interp)
#define COPY_DATA(data, count)
Definition utils_core.h:237