YetAnotherCoupler 3.2.0_a
Loading...
Searching...
No Matches
interpolation_direct_mf.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
57
73
75 size_t collection_size, struct yac_interpolation_exchange * src2tgt,
76 struct yac_interpolation_buffer src_data, size_t num_src_fields) {
77
78 struct yac_interpolation_direct_mf * direct_mf = xmalloc(1 * sizeof(*direct_mf));
79
82 direct_mf->src_data = src_data;
83 direct_mf->src2tgt = src2tgt;
84 direct_mf->src_field_buffer =
86 sizeof(*(direct_mf->src_field_buffer)));
87 direct_mf->tgt_field_buffer =
89 sizeof(*(direct_mf->tgt_field_buffer)));
90 direct_mf->num_src_fields = num_src_fields;
93
94 return (struct yac_interpolation_type *)direct_mf;
95}
96
98 size_t collection_size, Xt_redist * redists, size_t num_src_fields) {
99
100 return
102 collection_size,
104 redists, num_src_fields, collection_size, 0, "source to target"),
106 redists, num_src_fields, collection_size, SEND_BUFFER), num_src_fields);
107}
108
110 struct yac_interpolation_type * interp) {
111
112 struct yac_interpolation_direct_mf * direct_mf =
113 (struct yac_interpolation_direct_mf *)interp;
114
115 return direct_mf->is_source;
116}
117
119 struct yac_interpolation_type * interp) {
120
121 struct yac_interpolation_direct_mf * direct_mf =
122 (struct yac_interpolation_direct_mf *)interp;
123
124 return direct_mf->is_target;
125}
126
128 struct yac_interpolation_type * interp,
129 double *** src_fields, double *** src_frac_masks, double ** tgt_field,
130 double frac_mask_fallback_value, double scale_factor, double scale_summand) {
131
132 struct yac_interpolation_direct_mf * direct_mf =
133 (struct yac_interpolation_direct_mf *)interp;
134
135 double ** src_send_buffer = NULL;
136 size_t collection_size = direct_mf->collection_size;
137 size_t num_src_fields = direct_mf->num_src_fields;
138
140 direct_mf->src2tgt, "yac_interpolation_direct_mf_execute");
141
142 if (direct_mf->is_source) {
143
144 if ((frac_mask_fallback_value != YAC_FRAC_MASK_NO_VALUE) ||
145 (scale_factor != 1.0) || (scale_summand != 0.0)) {
146
147 src_send_buffer = direct_mf->src_data.buffer;
148
150 (double const * restrict **)src_fields,
151 (double const * restrict **)src_frac_masks, src_send_buffer,
153 collection_size, frac_mask_fallback_value,
154 scale_factor, scale_summand);
155
156 } else {
157
158 src_send_buffer = direct_mf->src_field_buffer;
159 for (size_t i = 0; i < collection_size; ++i)
160 for (size_t j = 0; j < num_src_fields; ++j)
161 src_send_buffer[i * num_src_fields + j] = src_fields[i][j];
162 }
163 }
164
165 double ** tgt_field_buffer = direct_mf->tgt_field_buffer;
166 if (direct_mf->is_target)
167 for (size_t i = 0; i < collection_size; ++i)
168 for (size_t j = 0; j < num_src_fields; ++j)
169 tgt_field_buffer[i * num_src_fields + j] = tgt_field[i];
170
171 // send source points to the target processes
173 direct_mf->src2tgt, (double const **)src_send_buffer, tgt_field_buffer,
174 "yac_interpolation_direct_mf_execute");
175}
176
178 struct yac_interpolation_type * interp,
179 double *** src_fields, double *** src_frac_masks, int is_target,
180 double frac_mask_fallback_value, double scale_factor, double scale_summand) {
181
182 struct yac_interpolation_direct_mf * direct_mf =
183 (struct yac_interpolation_direct_mf *)interp;
184
185 double ** src_send_buffer = NULL;
186
187 if (direct_mf->is_source) {
188
189 // wait until previous exchange is completed
191 direct_mf->src2tgt, "yac_interpolation_direct_mf_execute_put") ==
194 direct_mf->src2tgt, "yac_interpolation_direct_mf_execute_put");
195
196 src_send_buffer = direct_mf->src_data.buffer;
197
199 (double const * restrict **)src_fields,
200 (double const * restrict **)src_frac_masks, src_send_buffer,
201 direct_mf->src_data.buffer_sizes, direct_mf->num_src_fields,
202 direct_mf->collection_size, frac_mask_fallback_value,
203 scale_factor, scale_summand);
204 }
205
207 direct_mf->src2tgt, (double const **)src_send_buffer,
208 "yac_interpolation_direct_mf_execute_put");
209}
210
212 struct yac_interpolation_type * interp, double ** tgt_field,
213 double frac_mask_fallback_value, double scale_factor, double scale_summand) {
214
215 struct yac_interpolation_direct_mf * direct_mf =
216 (struct yac_interpolation_direct_mf*)interp;
217
218 double ** tgt_field_buffer = NULL;
219
220 if (direct_mf->is_target) {
222 size_t collection_size = direct_mf->collection_size;
223 size_t num_src_fields = direct_mf->num_src_fields;
224 for (size_t i = 0; i < collection_size; ++i)
225 for (size_t j = 0; j < num_src_fields; ++j)
226 tgt_field_buffer[i * num_src_fields + j] = tgt_field[i];
227 }
228
230 direct_mf->src2tgt, tgt_field_buffer,
231 "yac_interpolation_direct_mf_execute_get");
232}
233
235 struct yac_interpolation_type * interp, double ** tgt_field,
236 double frac_mask_fallback_value, double scale_factor, double scale_summand) {
237
238 struct yac_interpolation_direct_mf * direct_mf =
239 (struct yac_interpolation_direct_mf*)interp;
240
241 // wait until previous exchange is completed
243 direct_mf->src2tgt, "yac_interpolation_direct_mf_execute_get_async") ==
246 direct_mf->src2tgt, "yac_interpolation_direct_mf_execute_get_async");
247
248 double ** tgt_field_buffer = NULL;
249
250 if (direct_mf->is_target) {
252 size_t collection_size = direct_mf->collection_size;
253 size_t num_src_fields = direct_mf->num_src_fields;
254 for (size_t i = 0; i < collection_size; ++i)
255 for (size_t j = 0; j < num_src_fields; ++j)
256 tgt_field_buffer[i * num_src_fields + j] = tgt_field[i];
257 }
258
260 direct_mf->src2tgt, tgt_field_buffer,
261 "yac_interpolation_direct_mf_execute_get_async");
262}
263
265 struct yac_interpolation_type * interp) {
266
267 struct yac_interpolation_direct_mf * direct_mf =
268 (struct yac_interpolation_direct_mf*)interp;
269
270 return
272 direct_mf->src2tgt, "yac_interpolation_direct_mf_execute_put_test");
273}
274
276 struct yac_interpolation_type * interp) {
277
278 struct yac_interpolation_direct_mf * direct_mf =
279 (struct yac_interpolation_direct_mf*)interp;
280
281 return
283 direct_mf->src2tgt, "yac_interpolation_direct_mf_execute_get_test");
284}
285
287 struct yac_interpolation_type * interp) {
288
289 struct yac_interpolation_direct_mf * direct_mf =
290 (struct yac_interpolation_direct_mf*)interp;
291
293 direct_mf->src2tgt, "yac_interpolation_direct_mf_execute_wait");
294}
295
297 struct yac_interpolation_type * interp) {
298
299 struct yac_interpolation_direct_mf * direct_mf =
300 (struct yac_interpolation_direct_mf*)interp;
301
302 return
304 direct_mf->collection_size,
307 direct_mf->src_data, direct_mf->num_src_fields,
308 direct_mf->collection_size),
309 direct_mf->num_src_fields);
310}
311
313 struct yac_interpolation_type * interp) {
314
315 if (interp == NULL) return;
316
317 struct yac_interpolation_direct_mf * direct_mf =
318 (struct yac_interpolation_direct_mf*)interp;
319
321 direct_mf->src2tgt, "yac_interpolation_direct_mf_delete");
323 free(direct_mf->src_field_buffer);
324 free(direct_mf->tgt_field_buffer);
325 free(direct_mf);
326}
double const YAC_FRAC_MASK_NO_VALUE
static void yac_interpolation_direct_mf_execute_wait(struct yac_interpolation_type *interp)
static struct yac_interpolation_type * yac_interpolation_direct_mf_copy(struct yac_interpolation_type *interp)
static void yac_interpolation_direct_mf_execute_get_async(struct yac_interpolation_type *interp, double **tgt_field, double frac_mask_fallback_value, double scale_factor, double scale_summand)
static int yac_interpolation_direct_mf_execute_get_test(struct yac_interpolation_type *interp)
static void yac_interpolation_direct_mf_delete(struct yac_interpolation_type *interp)
static int yac_interpolation_direct_mf_execute_put_test(struct yac_interpolation_type *interp)
static struct yac_interpolation_type * yac_interpolation_direct_mf_new_(size_t collection_size, struct yac_interpolation_exchange *src2tgt, struct yac_interpolation_buffer src_data, size_t num_src_fields)
static int yac_interpolation_direct_mf_is_source(struct yac_interpolation_type *interp)
static struct yac_interpolation_type_vtable const interpolation_direct_mf_vtable
static void yac_interpolation_direct_mf_execute_get(struct yac_interpolation_type *interp, double **tgt_field, double frac_mask_fallback_value, double scale_factor, double scale_summand)
static int yac_interpolation_direct_mf_is_target(struct yac_interpolation_type *interp)
struct yac_interpolation_type * yac_interpolation_direct_mf_new(size_t collection_size, Xt_redist *redists, size_t num_src_fields)
static void yac_interpolation_direct_mf_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_direct_mf_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)
int yac_interpolation_exchange_put_test(struct yac_interpolation_exchange *exchange, char const *routine_name)
int yac_interpolation_exchange_is_target(struct yac_interpolation_exchange *exchange)
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_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(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)
@ SEND_BUFFER
#define xcalloc(nmemb, size)
Definition ppm_xfuncs.h:64
#define xmalloc(size)
Definition ppm_xfuncs.h:66
struct yac_interpolation_buffer src_data
struct yac_interpolation_type_vtable const * vtable
struct yac_interpolation_exchange * src2tgt
int(* is_source)(struct yac_interpolation_type *interp)