58 "ERROR(yac_interpolation_new): "
59 "invalid collection_selection its size has to be > 0");
62 "ERROR(yac_interpolation_new): scale_factor argument is not normale (%f)",
66 "ERROR(yac_interpolation_new): scale_summand argument is not normale (%f)",
71 interp->interps = NULL;
72 interp->interp_count = 0;
74 interp->is_source = 0;
75 interp->is_target = 0;
76 interp->collection_selection =
79 interp->ref_count = 1;
85 "ERROR(yac_interpolation_new): \"%lf\" is not a valid scaling factor",
89 "ERROR(yac_interpolation_new): \"%lf\" is not a valid scaling summand",
102 if (interp_type == NULL)
return;
107 (interp->interp_count + 1) *
sizeof(*(interp->interps)));
108 interp->interps[interp->interp_count] = interp_type;
109 interp->interp_count++;
122 interp->collection_selection,
value, count, pos));
134 size_t num_src_fields) {
139 interp->collection_selection, redists, num_src_fields));
144 size_t tgt_count,
size_t * num_src_per_tgt,
145 size_t * src_field_idx,
size_t * src_idx,
146 size_t num_src_fields, Xt_redist result_redist) {
151 interp->collection_selection, halo_redists, tgt_count, num_src_per_tgt,
152 NULL, src_field_idx, src_idx, num_src_fields, result_redist,
158 size_t * tgt_pos,
size_t tgt_count,
size_t * num_src_per_tgt,
159 size_t * src_field_idx,
size_t * src_idx,
160 size_t num_src_fields) {
165 interp->collection_selection, src_redists, tgt_pos, tgt_count,
166 num_src_per_tgt, NULL, src_field_idx, src_idx, num_src_fields,
172 size_t tgt_count,
size_t * num_src_per_tgt,
double * weights,
173 size_t * src_field_idx,
size_t * src_idx,
174 size_t num_src_fields, Xt_redist result_redist) {
179 interp->collection_selection, halo_redists, tgt_count, num_src_per_tgt,
180 weights, src_field_idx, src_idx, num_src_fields, result_redist,
186 size_t tgt_count,
size_t * num_src_per_tgt,
double * weights,
187 size_t * src_field_idx,
size_t * src_idx,
188 size_t num_src_fields) {
193 interp->collection_selection, src_redists, tgt_pos, tgt_count,
194 num_src_per_tgt, weights, src_field_idx, src_idx, num_src_fields,
203 interp->collection_selection, interp->frac_mask_fallback_value,
204 interp->scale_factor, interp->scale_summand);
210 for (
size_t i = 0; i < interp->interp_count; ++i)
214 interp_copy->
is_source = interp->is_source;
215 interp_copy->
is_target = interp->is_target;
230 double *** src_frac_masks,
double ** tgt_field) {
234 (src_frac_masks == NULL),
235 "ERROR(yac_interpolation_execute_frac): "
236 "interpolation was not built for dynamic fractional masking, "
237 "use yac_interpolation_execute instead");
239 for (
size_t i = 0; i < interp->interp_count; ++i)
241 interp->interps[i], src_fields, src_frac_masks, tgt_field,
242 interp->frac_mask_fallback_value, interp->scale_factor,
243 interp->scale_summand);
253 double ** tgt_field) {
257 "ERROR(yac_interpolation_execute): "
258 "interpolation was built for dynamic fractional masking, "
259 "use yac_interpolation_execute_frac instead");
272 double *** src_frac_masks) {
276 (src_frac_masks == NULL),
277 "ERROR(yac_interpolation_execute_put_frac): "
278 "interpolation was built for dynamic fractional masking, "
279 "use yac_interpolation_execute_put instead");
281 if (!interp->is_source)
return;
283 for (
size_t i = 0; i < interp->interp_count; ++i)
285 interp->interps[i], src_fields, src_frac_masks,
286 interp->is_target, interp->frac_mask_fallback_value,
287 interp->scale_factor, interp->scale_summand);
298 "ERROR(yac_interpolation_execute_put): "
299 "interpolation was built for dynamic fractional masking, "
300 "use yac_interpolation_execute_put_frac instead");
310 if (!interp->is_target)
return;
312 for (
size_t i = 0; i < interp->interp_count; ++i)
314 interp->interps[i], tgt_field, interp->frac_mask_fallback_value,
315 interp->scale_factor, interp->scale_summand);
321 if (!interp->is_target)
return;
323 for (
size_t i = 0; i < interp->interp_count; ++i)
325 interp->interps[i], tgt_field, interp->frac_mask_fallback_value,
326 interp->scale_factor, interp->scale_summand);
331 int put_complete = 1;
333 for (
size_t i = 0; (i < interp->interp_count) && put_complete; ++i)
343 int get_complete = 1;
345 for (
size_t i = 0; (i < interp->interp_count) && get_complete; ++i)
355 for (
size_t i = 0; i < interp->interp_count; ++i) {
373 if (interp == NULL)
return;
375 if(--(interp->ref_count))
return;
377 for (
size_t i = 0; i < interp->interp_count; ++i) {
381 free(interp->interps);
389 return (interp == NULL)?NULL:interp->collection_selection;
#define YAC_ASSERT(exp, msg)
size_t yac_collection_selection_get_collection_size(struct yac_collection_selection const *collection_selection)
Get the size of the collection selection.
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.
struct yac_interp_operator * yac_interp_operator_sum_mvp_at_tgt_new(struct yac_collection_selection const *collection_selection, 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)
Create a sum (weighted or unweighted) interpolation operator computed on the target processes.
struct yac_interp_operator * yac_interp_operator_fixed_new(struct yac_collection_selection const *collection_selection, double value, size_t count, size_t const *pos)
Create a fixed-value interpolation operator.
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.
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.
void yac_interp_operator_execute_wait(struct yac_interp_operator *interp)
Wait for all pending put/get operations to finish.
int yac_interp_operator_is_target(struct yac_interp_operator *interp)
Checks if the current process holds target data for the interpolation operator.
struct yac_interp_operator * yac_interp_operator_copy(struct yac_interp_operator *interp)
Create a deep copy of the interpolation operator.
enum YAC_INTERP_TEST_STATUS yac_interp_operator_execute_put_test(struct yac_interp_operator *interp)
Test whether the put phase has completed.
int yac_interp_operator_is_source(struct yac_interp_operator *interp)
Checks if the current process holds source data for the interpolation operator.
enum YAC_INTERP_TEST_STATUS yac_interp_operator_execute_get_test(struct yac_interp_operator *interp)
Test whether the get phase has completed.
void yac_interp_operator_execute_get(struct yac_interp_operator *interp, double **tgt_field, double frac_mask_fallback_value, double scale_factor, double scale_summand)
void yac_interp_operator_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)
void yac_interp_operator_execute_get_async(struct yac_interp_operator *interp, double **tgt_field, double frac_mask_fallback_value, double scale_factor, double scale_summand)
void yac_interp_operator_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)
void yac_interp_operator_delete(struct yac_interp_operator *interp)
Delete the interpolation operator and free resources.
Direct redistribution operator in YAC.
Multi-field direct redistribution operator in YAC.
Fixed-value interpolation operator in YAC.
Weighted/unweighted sum operator at source in YAC.
Weighted/unweighted sum operator at target in YAC.
void yac_interpolation_add_sum_at_src(struct yac_interpolation *interp, Xt_redist *halo_redists, size_t tgt_count, size_t *num_src_per_tgt, size_t *src_field_idx, size_t *src_idx, size_t num_src_fields, Xt_redist result_redist)
Add a sum operator where accumulation occurs on source processes.
struct yac_interpolation * yac_interpolation_copy(struct yac_interpolation *interp)
Create a deep copy of an interpolation object.
void yac_interpolation_inc_ref_count(struct yac_interpolation *interpolation)
Increase the reference count of an interpolation.
void yac_interpolation_add_weight_sum_mvp_at_tgt(struct yac_interpolation *interp, 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)
Add a weighted sum operator (distributed matrix-vector product), which computes the product at the ta...
void yac_interpolation_execute(struct yac_interpolation *interp, double ***src_fields, double **tgt_field)
Execute interpolation synchronously and write results to the target field.
int yac_interpolation_with_frac_mask(struct yac_interpolation *interpolation)
Query whether interpolation uses fractional masks.
void yac_interpolation_add_direct_mf(struct yac_interpolation *interp, Xt_redist *redists, size_t num_src_fields)
Add a direct redistribution operator for multiple source fields.
void yac_interpolation_delete(struct yac_interpolation *interp)
Free an interpolation object and release all resources.
void yac_interpolation_add_sum_at_tgt(struct yac_interpolation *interp, Xt_redist *src_redists, size_t *tgt_pos, size_t tgt_count, size_t *num_src_per_tgt, size_t *src_field_idx, size_t *src_idx, size_t num_src_fields)
Add a sum operator where accumulation occurs on target processes.
int yac_interpolation_execute_put_test(struct yac_interpolation *interp)
Test whether the asynchronous put phase has completed.
void yac_interpolation_add_fixed(struct yac_interpolation *interp, double value, size_t count, size_t *pos)
Add a fixed-value operator to an interpolation.
void yac_interpolation_execute_wait(struct yac_interpolation *interp)
Wait for completion of pending asynchronous interpolation operations.
void yac_interpolation_execute_frac(struct yac_interpolation *interp, double ***src_fields, double ***src_frac_masks, double **tgt_field)
Execute interpolation with fractional masks and write results to the target field.
void yac_interpolation_execute_get(struct yac_interpolation *interp, double **tgt_field)
Complete interpolation and write results to the target field (get phase).
void yac_interpolation_execute_get_async(struct yac_interpolation *interp, double **tgt_field)
Complete interpolation asynchronously and write results to the target field (get phase).
double const YAC_FRAC_MASK_UNDEF
void yac_interpolation_add_direct(struct yac_interpolation *interp, Xt_redist redist)
Add a direct redistribution operator.
double yac_interpolation_get_const_frac_mask_no_value_c2f()
struct yac_interpolation * yac_interpolation_new(struct yac_collection_selection const *collection_selection, double frac_mask_fallback_value, double scale_factor, double scale_summand)
Create a new interpolation object.
void yac_interpolation_execute_put_frac(struct yac_interpolation *interp, double ***src_fields, double ***src_frac_masks)
Provide source field data with fractional masks and start asynchronous execution of interpolation (pu...
void yac_interpolation_execute_put(struct yac_interpolation *interp, double ***src_fields)
Provide source field data and start asynchronous execution of interpolation (put phase).
void yac_interpolation_add_weight_sum_mvp_at_src(struct yac_interpolation *interp, 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)
Add a weighted sum operator (distributed matrix-vector product), which computes the productes at the ...
int yac_interpolation_execute_get_test(struct yac_interpolation *interp)
Test whether the asynchronous get phase has completed.
double yac_interpolation_get_const_frac_mask_undef_c2f()
static void yac_interpolation_add(struct yac_interpolation *interp, struct yac_interp_operator *interp_type)
double const YAC_FRAC_MASK_NO_VALUE
struct yac_collection_selection const * yac_interpolation_get_collection_selection(struct yac_interpolation const *interp)
Return the collection selection associated with an interpolation.
Defines internal basic interpolation definitions.
#define YAC_FRAC_MASK_VALUE_IS_VALID(value)
Test whether a fractional mask value is valid.
#define xrealloc(ptr, size)
Abstract interpolation operator type.
double frac_mask_fallback_value
struct yac_collection_selection * collection_selection
Selection of field collections to which this interpolation applies.
struct yac_interp_operator ** interps
#define YAC_ASSERT_F(exp, format,...)