20 double *** src_fields,
double *** src_frac_masks,
double ** tgt_field,
21 double frac_mask_fallback_value,
double scale_factor,
double scale_summand);
24 double *** src_fields,
double *** src_frac_masks,
25 int is_target,
double frac_mask_fallback_value,
26 double scale_factor,
double scale_summand);
29 double frac_mask_fallback_value,
double scale_factor,
double scale_summand);
32 double frac_mask_fallback_value,
double scale_factor,
double scale_summand);
105 Xt_redist * redists,
size_t num_src_fields) {
112 collection_selection,
139 double *** src_fields,
double *** src_frac_masks,
double ** tgt_field,
140 double frac_mask_fallback_value,
double scale_factor,
double scale_summand) {
145 double ** src_send_buffer = NULL;
152 direct_mf->
src2tgt,
"yac_interp_operator_direct_mf_execute");
156 size_t const * collection_indices =
159 if (collection_indices != NULL) {
161 double *** temp_src_fields =
168 temp_src_fields[i][j] = src_fields[collection_indices[i]][j];
170 src_fields = temp_src_fields;
172 if (src_frac_masks != NULL) {
173 double *** temp_src_frac_masks =
175 temp_src_frac_masks[0] =
179 temp_src_frac_masks[i] = temp_src_frac_masks[0] + i *
num_src_fields;
181 temp_src_frac_masks[i][j] =
182 src_frac_masks[collection_indices[i]][j];
184 src_frac_masks = temp_src_frac_masks;
189 (scale_factor != 1.0) || (scale_summand != 0.0)) {
194 (
double const * restrict **)src_fields,
195 (
double const * restrict **)src_frac_masks, src_send_buffer,
198 scale_factor, scale_summand);
208 if (collection_indices != NULL) {
211 if (src_frac_masks != NULL) {
212 free(src_frac_masks[0]);
213 free(src_frac_masks);
227 "yac_interp_operator_direct_mf_execute");
232 double *** src_fields,
double *** src_frac_masks,
int is_target,
233 double frac_mask_fallback_value,
double scale_factor,
double scale_summand) {
240 double ** src_send_buffer = NULL;
248 size_t const * collection_indices =
251 if (collection_indices != NULL) {
253 double *** temp_src_fields =
260 temp_src_fields[i][j] = src_fields[collection_indices[i]][j];
262 src_fields = temp_src_fields;
264 if (src_frac_masks != NULL) {
265 double *** temp_src_frac_masks =
267 temp_src_frac_masks[0] =
271 temp_src_frac_masks[i] = temp_src_frac_masks[0] + i *
num_src_fields;
273 temp_src_frac_masks[i][j] =
274 src_frac_masks[collection_indices[i]][j];
276 src_frac_masks = temp_src_frac_masks;
282 direct_mf->
src2tgt,
"yac_interp_operator_direct_mf_execute_put") ==
285 direct_mf->
src2tgt,
"yac_interp_operator_direct_mf_execute_put");
290 (
double const * restrict **)src_fields,
291 (
double const * restrict **)src_frac_masks, src_send_buffer,
294 scale_factor, scale_summand);
296 if (collection_indices != NULL) {
299 if (src_frac_masks != NULL) {
300 free(src_frac_masks[0]);
301 free(src_frac_masks);
307 direct_mf->
src2tgt, (
double const **)src_send_buffer,
308 "yac_interp_operator_direct_mf_execute_put");
313 double frac_mask_fallback_value,
double scale_factor,
double scale_summand) {
315 UNUSED(frac_mask_fallback_value);
337 "yac_interp_operator_direct_mf_execute_get");
342 double frac_mask_fallback_value,
double scale_factor,
double scale_summand) {
344 UNUSED(frac_mask_fallback_value);
353 direct_mf->
src2tgt,
"yac_interp_operator_direct_mf_execute_get_async") ==
356 direct_mf->
src2tgt,
"yac_interp_operator_direct_mf_execute_get_async");
373 "yac_interp_operator_direct_mf_execute_get_async");
385 "yac_interp_operator_direct_mf_execute_put_test") ==
398 "yac_interp_operator_direct_mf_execute_get_test") ==
409 direct_mf->
src2tgt,
"yac_interp_operator_direct_mf_execute_wait");
432 if (interp == NULL)
return;
438 direct_mf->
src2tgt,
"yac_interp_operator_direct_mf_delete");
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_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.
static int yac_interp_operator_direct_mf_is_target(struct yac_interp_operator *interp)
static void yac_interp_operator_direct_mf_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_direct_mf_new_(struct yac_collection_selection const *collection_selection, struct yac_interpolation_exchange *src2tgt, struct yac_interpolation_buffer src_data, size_t num_src_fields)
static void yac_interp_operator_direct_mf_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_mf_execute_get_test(struct yac_interp_operator *interp)
static void yac_interp_operator_direct_mf_execute_wait(struct yac_interp_operator *interp)
static enum YAC_INTERP_TEST_STATUS yac_interp_operator_direct_mf_execute_put_test(struct yac_interp_operator *interp)
static void yac_interp_operator_direct_mf_delete(struct yac_interp_operator *interp)
static int yac_interp_operator_direct_mf_is_source(struct yac_interp_operator *interp)
static void yac_interp_operator_direct_mf_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_vtable const interpolation_direct_mf_vtable
static void yac_interp_operator_direct_mf_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_mf_copy(struct yac_interp_operator *interp)
Multi-field 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)
#define xcalloc(nmemb, size)
double ** src_field_buffer
struct yac_interpolation_buffer src_data
struct yac_interp_operator_vtable const * vtable
struct yac_collection_selection * collection_selection
double ** tgt_field_buffer
struct yac_interpolation_exchange * src2tgt
Virtual function table for interpolation operators.
int(* is_source)(struct yac_interp_operator *interp)
Abstract interpolation operator type.