YAC 3.21.0
Yet Another Coupler
Loading...
Searching...
No Matches
interpolation_utils.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
7#include <mpi.h>
8#include <yaxt.h>
9
10#include "utils_core.h"
12#include "yac_mpi_internal.h"
13
15 Xt_redist redist, MPI_Datatype(*xt_redist_get_MPI_Datatype)(Xt_redist, int)) {
16
17 if (redist == NULL) return 0;
18
19 MPI_Comm comm = xt_redist_get_MPI_Comm(redist);
20 int comm_size;
21 yac_mpi_call(MPI_Comm_size(comm, &comm_size), comm);
22
23 size_t max_size = 0;
24
25 for (int i = 0; i < comm_size; ++i) {
26
27 MPI_Datatype dt = xt_redist_get_MPI_Datatype(redist, i);
28 if (dt == MPI_DATATYPE_NULL) continue;
29 MPI_Aint lb, extent;
30 yac_mpi_call(MPI_Type_get_extent(dt, &lb, &extent), comm);
31 size_t curr_size = (size_t)extent + (size_t)lb;
32 if (curr_size > max_size) max_size = curr_size;
33 yac_mpi_call(MPI_Type_free(&dt), comm);
34 }
35 return max_size;
36}
37
39
40 return xt_redist_get_buffer_size(redist, xt_redist_get_send_MPI_Datatype);
41}
42
44
45 return xt_redist_get_buffer_size(redist, xt_redist_get_recv_MPI_Datatype);
46}
47
48static size_t * get_buffer_sizes(
49 Xt_redist * redists, size_t num_fields,
51
53 (type == SEND_BUFFER) || (type == RECV_BUFFER), "invalid buffer type");
54
56 (type == SEND_BUFFER)?
58
59 size_t * buffer_sizes;
60 if (redists == NULL) {
61 buffer_sizes = xcalloc(num_fields, sizeof(*buffer_sizes));
62 } else {
63 buffer_sizes = xmalloc(num_fields * sizeof(*buffer_sizes));
64 for (size_t i = 0; i < num_fields; ++i)
65 buffer_sizes[i] = xt_redist_get_buffer_size(redists[i]);
66 }
67 return buffer_sizes;
68}
69
70static double ** allocate_buffer(
71 size_t * buffer_sizes, size_t num_fields, size_t collection_size) {
72
73 size_t total_buffer_size = 0;
74 for (size_t i = 0; i < num_fields; ++i)
75 total_buffer_size += buffer_sizes[i];
76 double ** buffer_data =
77 xmalloc(collection_size * num_fields * sizeof(*buffer_data));
78 buffer_data[0] = xmalloc(collection_size * total_buffer_size);
79 for (size_t i = 0, offset = 0; i < collection_size; ++i) {
80 for (size_t j = 0; j < num_fields; offset += buffer_sizes[j++]) {
81 buffer_data[i * num_fields + j] =
82 (double*)((char*)(buffer_data[0]) + offset);
83 }
84 }
85 return buffer_data;
86}
87
99
101 Xt_redist * redists, size_t * min_buffer_sizes, size_t num_fields,
103
104
105 size_t * buffer_sizes = get_buffer_sizes(redists, num_fields, type);
106 for (size_t i = 0; i < num_fields; ++i)
107 if (min_buffer_sizes[i] > buffer_sizes[i])
108 buffer_sizes[i] = min_buffer_sizes[i];
109
110 return
111 (struct yac_interpolation_buffer) {
112 .buffer_sizes = buffer_sizes,
114}
115
118 size_t collection_size) {
119
120 return
121 (struct yac_interpolation_buffer) {
122 .buffer_sizes = COPY_DATA(src.buffer_sizes, num_fields),
123 .buffer =
125}
126
128
129 free(buffer->buffer[0]);
130 free(buffer->buffer);
131 free(buffer->buffer_sizes);
132}
unsigned num_fields
#define YAC_ASSERT(exp, msg)
enum callback_type type
struct Xt_redist_ * Xt_redist
static double ** allocate_buffer(size_t *buffer_sizes, size_t num_fields, size_t collection_size)
static size_t xt_redist_get_buffer_size(Xt_redist redist, MPI_Datatype(*xt_redist_get_MPI_Datatype)(Xt_redist, int))
struct yac_interpolation_buffer yac_interpolation_buffer_init_2(Xt_redist *redists, size_t *min_buffer_sizes, size_t num_fields, size_t collection_size, enum yac_interpolation_buffer_type type)
static size_t xt_redist_get_recv_buffer_size(Xt_redist redist)
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)
static size_t * get_buffer_sizes(Xt_redist *redists, size_t num_fields, enum yac_interpolation_buffer_type type)
static size_t xt_redist_get_send_buffer_size(Xt_redist redist)
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)
Utility macros and functions for interpolation operators. This file contains utility macros for targe...
yac_interpolation_buffer_type
@ SEND_BUFFER
@ RECV_BUFFER
Definition __init__.py:1
#define xcalloc(nmemb, size)
Definition ppm_xfuncs.h:64
#define xmalloc(size)
Definition ppm_xfuncs.h:66
int collection_size
double * buffer
#define COPY_DATA(data, count)
Definition utils_core.h:270
#define yac_mpi_call(call, comm)