YetAnotherCoupler 3.5.2
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 ((YAC_FRAC_MASK_VALUE_IS_VALID(frac_mask_fallback_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
183
184 struct yac_interpolation_direct_mf * direct_mf =
185 (struct yac_interpolation_direct_mf *)interp;
186
187 double ** src_send_buffer = NULL;
188
189 if (direct_mf->is_source) {
190
191 // wait until previous exchange is completed
193 direct_mf->src2tgt, "yac_interpolation_direct_mf_execute_put") ==
196 direct_mf->src2tgt, "yac_interpolation_direct_mf_execute_put");
197
198 src_send_buffer = direct_mf->src_data.buffer;
199
201 (double const * restrict **)src_fields,
202 (double const * restrict **)src_frac_masks, src_send_buffer,
203 direct_mf->src_data.buffer_sizes, direct_mf->num_src_fields,
204 direct_mf->collection_size, frac_mask_fallback_value,
205 scale_factor, scale_summand);
206 }
207
209 direct_mf->src2tgt, (double const **)src_send_buffer,
210 "yac_interpolation_direct_mf_execute_put");
211}
212
214 struct yac_interpolation_type * interp, double ** tgt_field,
215 double frac_mask_fallback_value, double scale_factor, double scale_summand) {
216
217 UNUSED(frac_mask_fallback_value);
218 UNUSED(scale_factor);
219 UNUSED(scale_summand);
220
221 struct yac_interpolation_direct_mf * direct_mf =
222 (struct yac_interpolation_direct_mf*)interp;
223
224 double ** tgt_field_buffer = NULL;
225
226 if (direct_mf->is_target) {
228 size_t collection_size = direct_mf->collection_size;
229 size_t num_src_fields = direct_mf->num_src_fields;
230 for (size_t i = 0; i < collection_size; ++i)
231 for (size_t j = 0; j < num_src_fields; ++j)
232 tgt_field_buffer[i * num_src_fields + j] = tgt_field[i];
233 }
234
236 direct_mf->src2tgt, tgt_field_buffer,
237 "yac_interpolation_direct_mf_execute_get");
238}
239
241 struct yac_interpolation_type * interp, double ** tgt_field,
242 double frac_mask_fallback_value, double scale_factor, double scale_summand) {
243
244 UNUSED(frac_mask_fallback_value);
245 UNUSED(scale_factor);
246 UNUSED(scale_summand);
247
248 struct yac_interpolation_direct_mf * direct_mf =
249 (struct yac_interpolation_direct_mf*)interp;
250
251 // wait until previous exchange is completed
253 direct_mf->src2tgt, "yac_interpolation_direct_mf_execute_get_async") ==
256 direct_mf->src2tgt, "yac_interpolation_direct_mf_execute_get_async");
257
258 double ** tgt_field_buffer = NULL;
259
260 if (direct_mf->is_target) {
262 size_t collection_size = direct_mf->collection_size;
263 size_t num_src_fields = direct_mf->num_src_fields;
264 for (size_t i = 0; i < collection_size; ++i)
265 for (size_t j = 0; j < num_src_fields; ++j)
266 tgt_field_buffer[i * num_src_fields + j] = tgt_field[i];
267 }
268
270 direct_mf->src2tgt, tgt_field_buffer,
271 "yac_interpolation_direct_mf_execute_get_async");
272}
273
275 struct yac_interpolation_type * interp) {
276
277 struct yac_interpolation_direct_mf * direct_mf =
278 (struct yac_interpolation_direct_mf*)interp;
279
280 return
282 direct_mf->src2tgt, "yac_interpolation_direct_mf_execute_put_test");
283}
284
286 struct yac_interpolation_type * interp) {
287
288 struct yac_interpolation_direct_mf * direct_mf =
289 (struct yac_interpolation_direct_mf*)interp;
290
291 return
293 direct_mf->src2tgt, "yac_interpolation_direct_mf_execute_get_test");
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
303 direct_mf->src2tgt, "yac_interpolation_direct_mf_execute_wait");
304}
305
307 struct yac_interpolation_type * interp) {
308
309 struct yac_interpolation_direct_mf * direct_mf =
310 (struct yac_interpolation_direct_mf*)interp;
311
312 return
314 direct_mf->collection_size,
317 direct_mf->src_data, direct_mf->num_src_fields,
318 direct_mf->collection_size),
319 direct_mf->num_src_fields);
320}
321
323 struct yac_interpolation_type * interp) {
324
325 if (interp == NULL) return;
326
327 struct yac_interpolation_direct_mf * direct_mf =
328 (struct yac_interpolation_direct_mf*)interp;
329
331 direct_mf->src2tgt, "yac_interpolation_direct_mf_delete");
333 free(direct_mf->src_field_buffer);
334 free(direct_mf->tgt_field_buffer);
335 free(direct_mf);
336}
#define UNUSED(x)
Definition core.h:73
#define YAC_FRAC_MASK_VALUE_IS_VALID(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)