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);
103 collection_selection,
130 double *** src_fields,
double *** src_frac_masks,
double ** tgt_field,
131 double frac_mask_fallback_value,
double scale_factor,
double scale_summand) {
136 double ** src_send_buffer = NULL;
139 direct->
src2tgt,
"yac_interp_operator_direct_execute");
146 size_t const * collection_indices =
149 if (collection_indices != NULL) {
151 double *** temp_src_fields =
156 temp_src_fields[i] = temp_src_fields[0] + i;
157 temp_src_fields[i][0] = src_fields[collection_indices[i]][0];
159 src_fields = temp_src_fields;
161 if (src_frac_masks != NULL) {
162 double *** temp_src_frac_masks =
164 temp_src_frac_masks[0] =
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];
170 src_frac_masks = temp_src_frac_masks;
175 (scale_factor != 1.0) || (scale_summand != 0.0)) {
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);
189 src_send_buffer[i] = src_fields[i][0];
192 if (collection_indices != NULL) {
195 if (src_frac_masks != NULL) {
196 free(src_frac_masks[0]);
197 free(src_frac_masks);
203 direct->
src2tgt, (
double const **)src_send_buffer, tgt_field,
204 "yac_interp_operator_direct_execute");
209 double *** src_fields,
double *** src_frac_masks,
int is_target,
210 double frac_mask_fallback_value,
double scale_factor,
double scale_summand) {
217 double ** src_send_buffer = NULL;
224 size_t const * collection_indices =
227 if (collection_indices != NULL) {
229 double *** temp_src_fields =
234 temp_src_fields[i] = temp_src_fields[0] + i;
235 temp_src_fields[i][0] = src_fields[collection_indices[i]][0];
237 src_fields = temp_src_fields;
239 if (src_frac_masks != NULL) {
240 double *** temp_src_frac_masks =
242 temp_src_frac_masks[0] =
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];
248 src_frac_masks = temp_src_frac_masks;
254 direct->
src2tgt,
"yac_interp_operator_direct_execute_put") ==
257 direct->
src2tgt,
"yac_interp_operator_direct_execute_put");
262 (
double const * restrict **)src_fields,
263 (
double const * restrict **)src_frac_masks, src_send_buffer,
266 scale_factor, scale_summand);
268 if (collection_indices != NULL) {
271 if (src_frac_masks != NULL) {
272 free(src_frac_masks[0]);
273 free(src_frac_masks);
279 direct->
src2tgt, (
double const **)src_send_buffer,
280 "yac_interp_operator_direct_execute_put");
285 double frac_mask_fallback_value,
double scale_factor,
double scale_summand) {
287 UNUSED(frac_mask_fallback_value);
295 direct->
src2tgt, tgt_field,
"yac_interp_operator_direct_execute_get");
300 double frac_mask_fallback_value,
double scale_factor,
double scale_summand) {
302 UNUSED(frac_mask_fallback_value);
311 direct->
src2tgt,
"yac_interp_operator_direct_execute_get_async") ==
314 direct->
src2tgt,
"yac_interp_operator_direct_execute_get_async");
317 direct->
src2tgt, tgt_field,
"yac_interp_operator_direct_execute_get_async");
345 "yac_interp_operator_direct_execute_put_test") ==
358 "yac_interp_operator_direct_execute_get_test") ==
369 direct->
src2tgt,
"yac_interp_operator_direct_execute_wait");
375 if (interp == NULL)
return;
381 direct->
src2tgt,
"yac_interp_operator_direct_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_new(struct yac_collection_selection const *collection_selection, Xt_redist redist_)
Create a direct redistribution interpolation operator.
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)
#define xcalloc(nmemb, size)
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
double ** src_field_buffer