YetAnotherCoupler 3.5.2
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 ((YAC_FRAC_MASK_VALUE_IS_VALID(frac_mask_fallback_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
165
166 struct yac_interpolation_direct * direct =
167 (struct yac_interpolation_direct *)interp;
168
169 double ** src_send_buffer = NULL;
170
171 if (direct->is_source) {
172
173 // wait until previous exchange is completed
175 direct->src2tgt, "yac_interpolation_direct_execute_put") ==
178 direct->src2tgt, "yac_interpolation_direct_execute_put");
179
180 src_send_buffer = direct->src_data.buffer;
181
183 (double const * restrict **)src_fields,
184 (double const * restrict **)src_frac_masks, src_send_buffer,
185 direct->src_data.buffer_sizes, 1,
186 direct->collection_size, frac_mask_fallback_value,
187 scale_factor, scale_summand);
188 }
189
191 direct->src2tgt, (double const **)src_send_buffer,
192 "yac_interpolation_direct_execute_put");
193}
194
196 struct yac_interpolation_type * interp, double ** tgt_field,
197 double frac_mask_fallback_value, double scale_factor, double scale_summand) {
198
199 UNUSED(frac_mask_fallback_value);
200 UNUSED(scale_factor);
201 UNUSED(scale_summand);
202
203 struct yac_interpolation_direct * direct =
204 (struct yac_interpolation_direct*)interp;
205
207 direct->src2tgt, tgt_field, "yac_interpolation_direct_execute_get");
208}
209
211 struct yac_interpolation_type * interp, double ** tgt_field,
212 double frac_mask_fallback_value, double scale_factor, double scale_summand) {
213
214 UNUSED(frac_mask_fallback_value);
215 UNUSED(scale_factor);
216 UNUSED(scale_summand);
217
218 struct yac_interpolation_direct * direct =
219 (struct yac_interpolation_direct*)interp;
220
221 // wait until previous exchange is completed
223 direct->src2tgt, "yac_interpolation_direct_execute_get_async") ==
226 direct->src2tgt, "yac_interpolation_direct_execute_get_async");
227
229 direct->src2tgt, tgt_field, "yac_interpolation_direct_execute_get_async");
230}
231
233 struct yac_interpolation_type * interp) {
234
235 struct yac_interpolation_direct * direct =
236 (struct yac_interpolation_direct*)interp;
237
238 return
240 direct->collection_size,
243 direct->src_data, 1, direct->collection_size));
244}
245
247 struct yac_interpolation_type * interp) {
248
249 struct yac_interpolation_direct * direct =
250 (struct yac_interpolation_direct*)interp;
251
252 return
254 direct->src2tgt, "yac_interpolation_direct_execute_put_test");
255}
256
258 struct yac_interpolation_type * interp) {
259
260 struct yac_interpolation_direct * direct =
261 (struct yac_interpolation_direct*)interp;
262
263 return
265 direct->src2tgt, "yac_interpolation_direct_execute_get_test");
266}
267
269 struct yac_interpolation_type * interp) {
270
271 struct yac_interpolation_direct * direct =
272 (struct yac_interpolation_direct*)interp;
273
275 direct->src2tgt, "yac_interpolation_direct_execute_wait");
276}
277
279 struct yac_interpolation_type * interp) {
280
281 if (interp == NULL) return;
282
283 struct yac_interpolation_direct * direct =
284 (struct yac_interpolation_direct*)interp;
285
287 direct->src2tgt, "yac_interpolation_direct_delete");
289 free(direct->src_field_buffer);
290 free(direct);
291}
#define UNUSED(x)
Definition core.h:73
#define YAC_FRAC_MASK_VALUE_IS_VALID(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)