YetAnotherCoupler 3.2.0_a
Loading...
Searching...
No Matches
interpolation_direct.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
56
70
72 size_t collection_size, struct yac_interpolation_exchange * src2tgt,
73 struct yac_interpolation_buffer src_data) {
74
75 struct yac_interpolation_direct * direct = xmalloc(1 * sizeof(*direct));
76
79 direct->src_data = src_data;
80 direct->src2tgt = src2tgt;
81 direct->src_field_buffer =
82 xcalloc(collection_size, sizeof(*(direct->src_field_buffer)));
85
86 return (struct yac_interpolation_type *)direct;
87}
88
90 size_t collection_size, Xt_redist redist_) {
91
92 return
94 collection_size,
96 &redist_, 1, collection_size, 0, "source to target"),
98 &redist_, 1, collection_size, SEND_BUFFER));
99}
100
102 struct yac_interpolation_type * interp) {
103
104 struct yac_interpolation_direct * direct =
105 (struct yac_interpolation_direct *)interp;
106
107 return direct->is_source;
108}
109
111 struct yac_interpolation_type * interp) {
112
113 struct yac_interpolation_direct * direct =
114 (struct yac_interpolation_direct *)interp;
115
116 return direct->is_target;
117}
118
120 struct yac_interpolation_type * interp,
121 double *** src_fields, double *** src_frac_masks, double ** tgt_field,
122 double frac_mask_fallback_value, double scale_factor, double scale_summand) {
123
124 struct yac_interpolation_direct * direct =
125 (struct yac_interpolation_direct *)interp;
126
127 double ** src_send_buffer = NULL;
128
130 direct->src2tgt, "yac_interpolation_direct_execute");
131
132 if (direct->is_source) {
133
134 if ((frac_mask_fallback_value != YAC_FRAC_MASK_NO_VALUE) ||
135 (scale_factor != 1.0) || (scale_summand != 0.0)) {
136
137 src_send_buffer = direct->src_data.buffer;
138
140 (double const * restrict **)src_fields,
141 (double const * restrict **)src_frac_masks, src_send_buffer,
142 direct->src_data.buffer_sizes, 1,
143 direct->collection_size, frac_mask_fallback_value,
144 scale_factor, scale_summand);
145
146 } else {
147
148 src_send_buffer = direct->src_field_buffer;
149 for (size_t i = 0; i < direct->collection_size; ++i)
150 src_send_buffer[i] = src_fields[i][0];
151 }
152 }
153
155 direct->src2tgt, (double const **)src_send_buffer, tgt_field,
156 "yac_interpolation_direct_execute");
157}
158
160 struct yac_interpolation_type * interp,
161 double *** src_fields, double *** src_frac_masks, int is_target,
162 double frac_mask_fallback_value, double scale_factor, double scale_summand) {
163
164 struct yac_interpolation_direct * direct =
165 (struct yac_interpolation_direct *)interp;
166
167 double ** src_send_buffer = NULL;
168
169 if (direct->is_source) {
170
171 // wait until previous exchange is completed
173 direct->src2tgt, "yac_interpolation_direct_execute_put") ==
176 direct->src2tgt, "yac_interpolation_direct_execute_put");
177
178 src_send_buffer = direct->src_data.buffer;
179
181 (double const * restrict **)src_fields,
182 (double const * restrict **)src_frac_masks, src_send_buffer,
183 direct->src_data.buffer_sizes, 1,
184 direct->collection_size, frac_mask_fallback_value,
185 scale_factor, scale_summand);
186 }
187
189 direct->src2tgt, (double const **)src_send_buffer,
190 "yac_interpolation_direct_execute_put");
191}
192
194 struct yac_interpolation_type * interp, double ** tgt_field,
195 double frac_mask_fallback_value, double scale_factor, double scale_summand) {
196
197 struct yac_interpolation_direct * direct =
198 (struct yac_interpolation_direct*)interp;
199
201 direct->src2tgt, tgt_field, "yac_interpolation_direct_execute_get");
202}
203
205 struct yac_interpolation_type * interp, double ** tgt_field,
206 double frac_mask_fallback_value, double scale_factor, double scale_summand) {
207
208 struct yac_interpolation_direct * direct =
209 (struct yac_interpolation_direct*)interp;
210
211 // wait until previous exchange is completed
213 direct->src2tgt, "yac_interpolation_direct_execute_get_async") ==
216 direct->src2tgt, "yac_interpolation_direct_execute_get_async");
217
219 direct->src2tgt, tgt_field, "yac_interpolation_direct_execute_get_async");
220}
221
223 struct yac_interpolation_type * interp) {
224
225 struct yac_interpolation_direct * direct =
226 (struct yac_interpolation_direct*)interp;
227
228 return
230 direct->collection_size,
233 direct->src_data, 1, direct->collection_size));
234}
235
237 struct yac_interpolation_type * interp) {
238
239 struct yac_interpolation_direct * direct =
240 (struct yac_interpolation_direct*)interp;
241
242 return
244 direct->src2tgt, "yac_interpolation_direct_execute_put_test");
245}
246
248 struct yac_interpolation_type * interp) {
249
250 struct yac_interpolation_direct * direct =
251 (struct yac_interpolation_direct*)interp;
252
253 return
255 direct->src2tgt, "yac_interpolation_direct_execute_get_test");
256}
257
259 struct yac_interpolation_type * interp) {
260
261 struct yac_interpolation_direct * direct =
262 (struct yac_interpolation_direct*)interp;
263
265 direct->src2tgt, "yac_interpolation_direct_execute_wait");
266}
267
269 struct yac_interpolation_type * interp) {
270
271 if (interp == NULL) return;
272
273 struct yac_interpolation_direct * direct =
274 (struct yac_interpolation_direct*)interp;
275
277 direct->src2tgt, "yac_interpolation_direct_delete");
279 free(direct->src_field_buffer);
280 free(direct);
281}
double const YAC_FRAC_MASK_NO_VALUE
static int yac_interpolation_direct_is_source(struct yac_interpolation_type *interp)
static void yac_interpolation_direct_execute_wait(struct yac_interpolation_type *interp)
struct yac_interpolation_type * yac_interpolation_direct_new(size_t collection_size, Xt_redist redist_)
static int yac_interpolation_direct_execute_put_test(struct yac_interpolation_type *interp)
static int yac_interpolation_direct_execute_get_test(struct yac_interpolation_type *interp)
static void yac_interpolation_direct_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 struct yac_interpolation_type * yac_interpolation_direct_new_(size_t collection_size, struct yac_interpolation_exchange *src2tgt, struct yac_interpolation_buffer src_data)
static struct yac_interpolation_type * yac_interpolation_direct_copy(struct yac_interpolation_type *interp)
static void yac_interpolation_direct_delete(struct yac_interpolation_type *interp)
static int yac_interpolation_direct_is_target(struct yac_interpolation_type *interp)
static struct yac_interpolation_type_vtable const interpolation_direct_vtable
static void yac_interpolation_direct_execute_get_async(struct yac_interpolation_type *interp, double **tgt_field, double frac_mask_fallback_value, double scale_factor, double scale_summand)
static void yac_interpolation_direct_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)
static void yac_interpolation_direct_execute_get(struct yac_interpolation_type *interp, double **tgt_field, 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_exchange * src2tgt
struct yac_interpolation_type_vtable const * vtable
int(* is_source)(struct yac_interpolation_type *interp)