YAC 3.12.0
Yet Another Coupler
Loading...
Searching...
No Matches
interp_operator_sum_mvp_at_src.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);
33static enum YAC_INTERP_TEST_STATUS
35 struct yac_interp_operator * interp);
36static enum YAC_INTERP_TEST_STATUS
38 struct yac_interp_operator * interp);
40 struct yac_interp_operator * interp);
42 struct yac_interp_operator * interp);
44 struct yac_interp_operator * interp);
45
59
61
63
66
67 /* data flow:
68 * put:
69 * I. source processes collectively exchange data, such that each process
70 * can process its stencils
71 * - send buffer: src_fields (+src_frac_masks) provided by user
72 * - recv buffer: halo_data
73 * - exchange: src2halo
74 * II. all source processes process their stencils to compute the target
75 * field
76 * - from buffer: src_fields (+src_frac_masks) provided by user
77 * halo_data
78 * - to buffer: result_data
79 * III. source processes send target field to target processes
80 * - send buffer: result_data
81 * - recv buffer: tgt_field provided by user
82 * - exchange: result2tgt
83 * get:
84 * I. target processes receive target field from source processes
85 * - send buffer: result_data
86 * - recv buffer: tgt_field provided by user
87 * - exchange: result2tgt
88 */
89
90 /*
91 * The following arrays are shared between multiple copies of the same
92 * interpolation operation and are only freed when the reference counter
93 * reaches zero:
94 * - src_idx
95 * - src_field_idx
96 * - weights
97 * - prefix_num_src_per_tgt
98 * - ref_count
99 */
100
105
106 size_t tgt_count;
111 double * weights;
113 size_t * src_idx;
116
121
123};
124
241 struct yac_collection_selection const * collection_selection,
242 struct yac_interpolation_buffer halo_data,
243 struct yac_interpolation_buffer result_data,
244 struct yac_interpolation_exchange * src2halo,
245 struct yac_interpolation_exchange * result2tgt,
246 size_t tgt_count, size_t * prefix_num_src_per_tgt, double * weights,
247 size_t * src_field_idx, size_t * src_idx, size_t num_src_fields,
248 int with_frac_mask, int * ref_count) {
249
250 struct yac_interp_operator_sum_mvp_at_src * mvp_at_src =
251 xmalloc(1 * sizeof(*mvp_at_src));
252
253 size_t collection_size =
255
257 mvp_at_src->collection_selection =
259 mvp_at_src->with_frac_mask = with_frac_mask;
260 mvp_at_src->halo_data = halo_data;
261 mvp_at_src->result_data = result_data;
262 mvp_at_src->src2halo = src2halo;
263 mvp_at_src->result2tgt = result2tgt;
264 mvp_at_src->tgt_count = tgt_count;
266 mvp_at_src->weights = weights;
267 mvp_at_src->src_field_idx = src_field_idx;
268 mvp_at_src->src_idx = src_idx;
269 mvp_at_src->num_src_fields = num_src_fields;
270 mvp_at_src->src_fields_buffer =
271 xmalloc(
273 sizeof(*(mvp_at_src->src_fields_buffer)));
274 mvp_at_src->is_source =
278 mvp_at_src->is_target =
280
281 mvp_at_src->ref_count =
282 (ref_count == NULL)?xcalloc(1, sizeof(*mvp_at_src->ref_count)):ref_count;
283 ++*(mvp_at_src->ref_count);
284
285 return (struct yac_interp_operator *)mvp_at_src;
286}
287
289 struct yac_collection_selection const * collection_selection,
290 Xt_redist * halo_redists, size_t tgt_count, size_t * num_src_per_tgt,
291 double * weights, size_t * src_field_idx, size_t * src_idx,
292 size_t num_src_fields, Xt_redist result_redist_, int with_frac_mask) {
293
294 size_t collection_size =
296
297 size_t total_num_src = 0;
298 size_t * prefix_num_src_per_tgt =
299 xmalloc((tgt_count + 1) * sizeof(*prefix_num_src_per_tgt));
300 for (size_t i = 0; i < tgt_count; ++i) {
301 prefix_num_src_per_tgt[i] = total_num_src;
302 total_num_src += num_src_per_tgt[i];
303 }
304 prefix_num_src_per_tgt[tgt_count] = total_num_src;
305
306 // some consistency checking
307 for (size_t i = 0; i < total_num_src; ++i) {
309 (src_field_idx[i] == SIZE_MAX) || (src_field_idx[i] < num_src_fields),
310 "ERROR(yac_interp_operator_sum_mvp_at_src_new): "
311 "invalid src_field_idx value "
312 "(has to be either SIZE_MAX or < num_src_fields(= %zu))"
313 "src_field_idx[%zu] = %zu", num_src_fields, i, src_field_idx[i]);
314 }
315
316 return
318 collection_selection,
320 halo_redists, num_src_fields,
323 &result_redist_, 1, collection_size, SEND_BUFFER),
325 halo_redists, num_src_fields,
326 collection_size, with_frac_mask, "source to halo"),
328 &result_redist_, 1, collection_size, 0, "result to target"),
329 tgt_count, prefix_num_src_per_tgt,
330 (weights != NULL)?COPY_DATA(weights, total_num_src):NULL,
331 COPY_DATA(src_field_idx, total_num_src),
332 COPY_DATA(src_idx, total_num_src),
333 num_src_fields, with_frac_mask, NULL);
334}
335
337 struct yac_interp_operator * interp) {
338
339 struct yac_interp_operator_sum_mvp_at_src * sum_mvp_at_src =
340 (struct yac_interp_operator_sum_mvp_at_src *)interp;
341
342 return sum_mvp_at_src->is_source;
343}
344
346 struct yac_interp_operator * interp) {
347
348 struct yac_interp_operator_sum_mvp_at_src * sum_mvp_at_src =
349 (struct yac_interp_operator_sum_mvp_at_src *)interp;
350
351 return sum_mvp_at_src->is_target;
352}
353
355 struct yac_interp_operator * interp,
356 double *** src_fields, double *** src_frac_masks, double ** tgt_field,
357 double frac_mask_fallback_value, double scale_factor, double scale_summand) {
358
359 struct yac_interp_operator_sum_mvp_at_src * sum_mvp_at_src =
360 (struct yac_interp_operator_sum_mvp_at_src *)interp;
361
362 // make sure that there are no open exchanges from a previous exchange
364 sum_mvp_at_src->result2tgt,
365 "yac_interp_operator_sum_mvp_at_src_execute");
366
367 double ** results = sum_mvp_at_src->result_data.buffer;
368
369 if (sum_mvp_at_src->is_source) {
370
371 int with_frac_mask = sum_mvp_at_src->with_frac_mask;
372 CHECK_WITH_FRAC_MASK("yac_interp_operator_sum_mvp_at_src_execute")
373
374 size_t collection_size =
376 sum_mvp_at_src->collection_selection);
377 size_t const * collection_indices =
379 sum_mvp_at_src->collection_selection);
380 size_t num_src_fields = sum_mvp_at_src->num_src_fields;
381
382 // if the collection selection is not contiguous
383 if (collection_indices != NULL) {
384
385 double *** temp_src_fields =
386 xmalloc(collection_size * sizeof(*temp_src_fields));
387 temp_src_fields[0] =
388 xmalloc(collection_size * num_src_fields * sizeof(**temp_src_fields));
389 for (size_t i = 0; i < collection_size; ++i) {
390 temp_src_fields[i] = temp_src_fields[0] + i * num_src_fields;
391 for (size_t j = 0; j < num_src_fields; ++j)
392 temp_src_fields[i][j] = src_fields[collection_indices[i]][j];
393 }
394 src_fields = temp_src_fields;
395
396 if (src_frac_masks != NULL) {
397 double *** temp_src_frac_masks =
398 xmalloc(collection_size * sizeof(*temp_src_frac_masks));
399 temp_src_frac_masks[0] =
400 xmalloc(
401 collection_size * num_src_fields * sizeof(**temp_src_frac_masks));
402 for (size_t i = 0; i < collection_size; ++i) {
403 temp_src_frac_masks[i] = temp_src_frac_masks[0] + i * num_src_fields;
404 for (size_t j = 0; j < num_src_fields; ++j)
405 temp_src_frac_masks[i][j] =
406 src_frac_masks[collection_indices[i]][j];
407 }
408 src_frac_masks = temp_src_frac_masks;
409 }
410 }
411
412 double ** temp_src_fields = sum_mvp_at_src->src_fields_buffer;
413 double ** halo_buffers = sum_mvp_at_src->halo_data.buffer;
414
415 for (size_t i = 0; i < collection_size; ++i)
416 for (size_t j = 0; j < num_src_fields; ++j)
417 temp_src_fields[i * num_src_fields + j] = src_fields[i][j];
418 if (with_frac_mask)
419 for (size_t i = 0; i < collection_size; ++i)
420 for (size_t j = 0; j < num_src_fields; ++j)
421 temp_src_fields[
423 src_frac_masks[i][j];
424
425 // do halo exchange
427 sum_mvp_at_src->src2halo, (double const **)temp_src_fields,
428 halo_buffers, "yac_interp_operator_sum_mvp_at_src_execute");
429
431 (double const * restrict **)src_fields,
432 (double const * restrict **)(with_frac_mask?src_frac_masks:NULL),
433 (double const * restrict *)halo_buffers,
434 (double const * restrict *)(
435 with_frac_mask?(halo_buffers + collection_size * num_src_fields):NULL),
436 results, NULL, sum_mvp_at_src->tgt_count,
437 sum_mvp_at_src->prefix_num_src_per_tgt,
438 sum_mvp_at_src->weights, sum_mvp_at_src->src_field_idx,
439 sum_mvp_at_src->src_idx, num_src_fields, collection_size,
440 frac_mask_fallback_value, scale_factor, scale_summand);
441
442 if (sum_mvp_at_src->is_source && (collection_indices != NULL)) {
443 free(src_fields[0]);
444 free(src_fields);
445 if (src_frac_masks != NULL) {
446 free(src_frac_masks[0]);
447 free(src_frac_masks);
448 }
449 }
450 }
451
452 // redistribute results
454 sum_mvp_at_src->result2tgt, (double const **)results, tgt_field,
455 "yac_interp_operator_sum_mvp_at_src_execute");
456}
457
459 struct yac_interp_operator * interp,
460 double *** src_fields, double *** src_frac_masks, int is_target,
461 double frac_mask_fallback_value, double scale_factor, double scale_summand) {
462
464
465 struct yac_interp_operator_sum_mvp_at_src * sum_mvp_at_src =
466 (struct yac_interp_operator_sum_mvp_at_src *)interp;
467
468 // If the local process sends target points in the results exchange
469 // operation and a previous exchange is still active, wait until it is
470 // completed. This ensures that the send buffers are free to use and
471 // new target points can be sent.
472 // It is possible that there is an open target point exchange operation
473 // due to get_async being called beforehand. The if-condition avoids a
474 // potential deadlock.
477 sum_mvp_at_src->result2tgt,
478 "yac_interp_operator_sum_mvp_at_src_execute_put") ==
481 sum_mvp_at_src->result2tgt,
482 "yac_interp_operator_sum_mvp_at_src_execute_put");
483
484 int with_frac_mask = sum_mvp_at_src->with_frac_mask;
485 CHECK_WITH_FRAC_MASK("yac_interp_operator_sum_mvp_at_src_execute_put")
486
487 size_t collection_size =
489 sum_mvp_at_src->collection_selection);
490 size_t const * collection_indices =
492 size_t num_src_fields = sum_mvp_at_src->num_src_fields;
493
494 // if the collection selection is not contiguous
495 if (collection_indices != NULL) {
496
497 double *** temp_src_fields =
498 xmalloc(collection_size * sizeof(*temp_src_fields));
499 temp_src_fields[0] =
500 xmalloc(collection_size * num_src_fields * sizeof(**temp_src_fields));
501 for (size_t i = 0; i < collection_size; ++i) {
502 temp_src_fields[i] = temp_src_fields[0] + i * num_src_fields;
503 for (size_t j = 0; j < num_src_fields; ++j)
504 temp_src_fields[i][j] = src_fields[collection_indices[i]][j];
505 }
506 src_fields = temp_src_fields;
507
508 if (src_frac_masks != NULL) {
509 double *** temp_src_frac_masks =
510 xmalloc(collection_size * sizeof(*temp_src_frac_masks));
511 temp_src_frac_masks[0] =
512 xmalloc(
513 collection_size * num_src_fields * sizeof(**temp_src_frac_masks));
514 for (size_t i = 0; i < collection_size; ++i) {
515 temp_src_frac_masks[i] = temp_src_frac_masks[0] + i * num_src_fields;
516 for (size_t j = 0; j < num_src_fields; ++j)
517 temp_src_frac_masks[i][j] =
518 src_frac_masks[collection_indices[i]][j];
519 }
520 src_frac_masks = temp_src_frac_masks;
521 }
522 }
523
524 double ** temp_src_fields = sum_mvp_at_src->src_fields_buffer;
525 double ** halo_buffers = sum_mvp_at_src->halo_data.buffer;
526
527 for (size_t i = 0; i < collection_size; ++i)
528 for (size_t j = 0; j < num_src_fields; ++j)
529 temp_src_fields[i * num_src_fields + j] = src_fields[i][j];
530 if (with_frac_mask) {
531 for (size_t i = 0; i < collection_size; ++i)
532 for (size_t j = 0; j < num_src_fields; ++j)
533 temp_src_fields[
535 src_frac_masks[i][j];
536 }
537
538 // do halo exchange
540 sum_mvp_at_src->src2halo, (double const **)temp_src_fields, halo_buffers,
541 "yac_interp_operator_sum_mvp_at_src_execute_put");
542
543 double ** results = sum_mvp_at_src->result_data.buffer;
544
546 (double const * restrict **)src_fields,
547 (double const * restrict **)(with_frac_mask?src_frac_masks:NULL),
548 (double const * restrict *)halo_buffers,
549 (double const * restrict *)(
550 with_frac_mask?(halo_buffers + collection_size * num_src_fields):NULL),
551 results, NULL, sum_mvp_at_src->tgt_count,
552 sum_mvp_at_src->prefix_num_src_per_tgt, sum_mvp_at_src->weights,
553 sum_mvp_at_src->src_field_idx, sum_mvp_at_src->src_idx,
554 num_src_fields, collection_size, frac_mask_fallback_value,
555 scale_factor, scale_summand);
556
557 if (collection_indices != NULL) {
558 free(src_fields[0]);
559 free(src_fields);
560 if (src_frac_masks != NULL) {
561 free(src_frac_masks[0]);
562 free(src_frac_masks);
563 }
564 }
565
567 sum_mvp_at_src->result2tgt, (double const **)results,
568 "yac_interp_operator_sum_mvp_at_src_execute_put");
569}
570
572 struct yac_interp_operator * interp, double ** tgt_field,
573 double frac_mask_fallback_value, double scale_factor, double scale_summand) {
574
575 UNUSED(frac_mask_fallback_value);
576 UNUSED(scale_factor);
577 UNUSED(scale_summand);
578
579 struct yac_interp_operator_sum_mvp_at_src * sum_mvp_at_src =
581
583 sum_mvp_at_src->result2tgt, tgt_field,
584 "yac_interp_operator_sum_mvp_at_src_execute_get");
585}
586
588 struct yac_interp_operator * interp, double ** tgt_field,
589 double frac_mask_fallback_value, double scale_factor, double scale_summand) {
590
591 UNUSED(frac_mask_fallback_value);
592 UNUSED(scale_factor);
593 UNUSED(scale_summand);
594
595 struct yac_interp_operator_sum_mvp_at_src * sum_mvp_at_src =
597
598 // wait until previous exchange is completed
600 sum_mvp_at_src->result2tgt,
601 "yac_interp_operator_sum_mvp_at_src_execute_get_async") ==
604 sum_mvp_at_src->result2tgt,
605 "yac_interp_operator_sum_mvp_at_src_execute_get_async");
606
608 sum_mvp_at_src->result2tgt, tgt_field,
609 "yac_interp_operator_sum_mvp_at_src_execute_get_async");
610}
611
612static enum YAC_INTERP_TEST_STATUS
614 struct yac_interp_operator * interp) {
615
616 struct yac_interp_operator_sum_mvp_at_src * sum_mvp_at_src =
618
619 return
621 sum_mvp_at_src->result2tgt,
622 "yac_interp_operator_sum_mvp_at_src_execute_put_test") ==
624}
625
626static enum YAC_INTERP_TEST_STATUS
628 struct yac_interp_operator * interp) {
629
630 struct yac_interp_operator_sum_mvp_at_src * sum_mvp_at_src =
632
633 return
635 sum_mvp_at_src->result2tgt,
636 "yac_interp_operator_sum_mvp_at_src_execute_get_test") ==
638}
639
641 struct yac_interp_operator * interp) {
642
643 struct yac_interp_operator_sum_mvp_at_src * sum_mvp_at_src =
645
647 sum_mvp_at_src->result2tgt,
648 "yac_interp_operator_sum_mvp_at_src_execute_wait");
649}
650
651static struct yac_interp_operator *
653 struct yac_interp_operator * interp) {
654
655 struct yac_interp_operator_sum_mvp_at_src * sum_mvp_at_src =
657
658 size_t collection_size =
660 sum_mvp_at_src->collection_selection);
661
662 return
664 sum_mvp_at_src->collection_selection,
666 sum_mvp_at_src->halo_data, sum_mvp_at_src->num_src_fields,
669 sum_mvp_at_src->result_data, 1, collection_size),
672 sum_mvp_at_src->tgt_count,
673 sum_mvp_at_src->prefix_num_src_per_tgt, sum_mvp_at_src->weights,
674 sum_mvp_at_src->src_field_idx, sum_mvp_at_src->src_idx,
675 sum_mvp_at_src->num_src_fields,
676 sum_mvp_at_src->with_frac_mask, sum_mvp_at_src->ref_count);
677}
678
680 struct yac_interp_operator * interp) {
681
682 if (interp == NULL) return;
683
684 struct yac_interp_operator_sum_mvp_at_src * sum_mvp_at_src =
686
688 sum_mvp_at_src->result2tgt, "yac_interp_operator_sum_mvp_at_src_delete");
689 yac_interpolation_buffer_free(&(sum_mvp_at_src->result_data));
691 sum_mvp_at_src->src2halo, "yac_interp_operator_sum_mvp_at_src_delete");
692 yac_interpolation_buffer_free(&(sum_mvp_at_src->halo_data));
693 free(sum_mvp_at_src->src_fields_buffer);
694
695 if (!--(*(sum_mvp_at_src->ref_count))) {
696 free(sum_mvp_at_src->prefix_num_src_per_tgt);
697 free(sum_mvp_at_src->src_idx);
698 free(sum_mvp_at_src->src_field_idx);
699 free(sum_mvp_at_src->weights);
700 free(sum_mvp_at_src->ref_count);
701 }
703 free(sum_mvp_at_src);
704}
#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_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.
YAC_INTERP_TEST_STATUS
@ YAC_INTERP_INCOMPLETE
@ YAC_INTERP_COMPLETE
static void yac_interp_operator_sum_mvp_at_src_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 * yac_interp_operator_sum_mvp_at_src_new_(struct yac_collection_selection const *collection_selection, struct yac_interpolation_buffer halo_data, struct yac_interpolation_buffer result_data, struct yac_interpolation_exchange *src2halo, struct yac_interpolation_exchange *result2tgt, 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)
Internal constructor for the "sum_mvp_at_src" interpolation operator.
static enum YAC_INTERP_TEST_STATUS yac_interp_operator_sum_mvp_at_src_execute_get_test(struct yac_interp_operator *interp)
static struct yac_interp_operator_vtable const interpolation_sum_mvp_at_src_vtable
static void yac_interp_operator_sum_mvp_at_src_execute_wait(struct yac_interp_operator *interp)
static void yac_interp_operator_sum_mvp_at_src_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 void yac_interp_operator_sum_mvp_at_src_delete(struct yac_interp_operator *interp)
static void yac_interp_operator_sum_mvp_at_src_execute_get(struct yac_interp_operator *interp, double **tgt_field, double frac_mask_fallback_value, double scale_factor, double scale_summand)
static void yac_interp_operator_sum_mvp_at_src_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 struct yac_interp_operator * yac_interp_operator_sum_mvp_at_src_copy(struct yac_interp_operator *interp)
static enum YAC_INTERP_TEST_STATUS yac_interp_operator_sum_mvp_at_src_execute_put_test(struct yac_interp_operator *interp)
static int yac_interp_operator_sum_mvp_at_src_is_source(struct yac_interp_operator *interp)
static int yac_interp_operator_sum_mvp_at_src_is_target(struct yac_interp_operator *interp)
Weighted/unweighted sum operator at source 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.
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)
Compute target field values optionally using weighted sums of source data and optionally applying fra...
#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_collection_selection * collection_selection
struct yac_interpolation_exchange * result2tgt
struct yac_interp_operator_vtable const * vtable
struct yac_interpolation_exchange * src2halo
Virtual function table for interpolation operators.
int(* is_source)(struct yac_interp_operator *interp)
Abstract interpolation operator type.
int collection_size
#define COPY_DATA(data, count)
Definition utils_core.h:257
#define YAC_ASSERT_F(exp, format,...)
Definition yac_assert.h:19