/home/runner/work/DiFfRG_current/DiFfRG_current/DiFfRG/include/DiFfRG/physics/interpolation/linear_interpolator_2d.hh Source File#

DiFfRG: /home/runner/work/DiFfRG_current/DiFfRG_current/DiFfRG/include/DiFfRG/physics/interpolation/linear_interpolator_2d.hh Source File
DiFfRG
Discretization Framework for functional Renormalization Group flows
linear_interpolator_2d.hh
Go to the documentation of this file.
1#pragma once
2
3// DiFfRG
7
8namespace DiFfRG
9{
18 template <typename NT, typename Coordinates> class LinearInterpolator2D
19 {
20 static_assert(Coordinates::dim == 2, "LinearInterpolator2D requires 2D coordinates");
21
24
25 using ViewType = Kokkos::View<NT **, GPU_memory, Kokkos::MemoryTraits<Kokkos::RandomAccess>>;
26 using HostViewType = typename ViewType::host_mirror_type;
27
28 static constexpr bool has_separate_device =
29 !std::is_same_v<typename ViewType::memory_space, typename HostViewType::memory_space>;
30
31 public:
32 using ctype = typename Coordinates::ctype;
33 using value_type = NT;
34 static constexpr size_t dim = 2;
35
43 device_data("LinearInterpolator2D_data", coordinates.sizes()[0], coordinates.sizes()[1]),
44 host_data(Kokkos::create_mirror_view(device_data))
45 {
46 }
47
49 KOKKOS_DEFAULTED_FUNCTION LinearInterpolator2D(const LinearInterpolator2D &) = default;
50
62 template <typename NT2> void update(const NT2 *in_data)
63 {
64 for (size_t i = 0; i < sizes[0]; ++i)
65 for (size_t j = 0; j < sizes[1]; ++j)
66 host_data(i, j) = in_data[i * sizes[1] + j];
67
68 if constexpr (has_separate_device) {
69 typename ViewType::execution_space exec;
70 Kokkos::deep_copy(exec, device_data, host_data);
71 exec.fence();
72 }
73 }
74
78 NT operator[](size_t i) const { return host_data(i / sizes[1], i % sizes[1]); }
79
98 index(const typename Coordinates::ctype x, const typename Coordinates::ctype y) const
99 {
100 return coordinates.backward(x, y);
101 }
102
106 NT KOKKOS_FUNCTION at(const device::array<typename Coordinates::ctype, 2> &idx) const
107 {
108 const auto idx_x = idx[0];
109 const auto idx_y = idx[1];
110 // Clamped [i, i+1] stencil on bounded axes, wrapping [i, (i+1) % n] on periodic ones
111 const auto sx = make_interpolation_stencil<periodic_x>(idx_x, sizes[0]);
112 const auto sy = make_interpolation_stencil<periodic_y>(idx_y, sizes[1]);
113
114 const size_t x0 = sx.lower, x1 = sx.upper;
115 const size_t y0 = sy.lower, y1 = sy.upper;
116
117 const auto corner00 = value(x0, y0);
118 const auto corner01 = value(x0, y1);
119 const auto corner10 = value(x1, y0);
120 const auto corner11 = value(x1, y1);
121
122 const auto tx = sx.t;
123 const auto ty = sy.t;
124
125 if constexpr (std::is_arithmetic_v<NT>)
126 return Kokkos::fma(ty, Kokkos::fma(tx, corner11, Kokkos::fma(-tx, corner01, corner01)),
127 (1 - ty) * Kokkos::fma(tx, corner10, Kokkos::fma(-tx, corner00, corner00)));
128 else
129 return corner00 * (1 - tx) * (1 - ty) + corner01 * (1 - tx) * ty + corner10 * tx * (1 - ty) +
130 corner11 * tx * ty;
131 }
132
136 NT KOKKOS_FUNCTION operator()(const typename Coordinates::ctype x,
137 const typename Coordinates::ctype y) const
138 {
139 return at(index(x, y));
140 }
141
147 const Coordinates &get_coordinates() const { return coordinates; }
148
155 const NT *data() const { return host_data.data(); }
156
157 private:
159 KOKKOS_FORCEINLINE_FUNCTION NT value(const size_t i, const size_t j) const
160 {
161 KOKKOS_IF_ON_DEVICE((return device_data(i, j);))
162 KOKKOS_IF_ON_HOST((return host_data(i, j);))
163 }
164
165 const Coordinates coordinates;
167
170 };
171} // namespace DiFfRG
A linear interpolator for 2D data, callable from host AND device code.
Definition linear_interpolator_2d.hh:19
ViewType device_data
Definition linear_interpolator_2d.hh:168
typename ViewType::host_mirror_type HostViewType
Definition linear_interpolator_2d.hh:26
const NT * data() const
Read-only handle to the host values, in the mirror's storage order.
Definition linear_interpolator_2d.hh:155
static constexpr bool periodic_x
Definition linear_interpolator_2d.hh:22
device::array< typename Coordinates::ctype, 2 > KOKKOS_FUNCTION index(const typename Coordinates::ctype x, const typename Coordinates::ctype y) const
Map physical coordinates onto grid indices.
Definition linear_interpolator_2d.hh:98
const device::array< size_t, 2 > sizes
Definition linear_interpolator_2d.hh:166
NT value_type
Definition linear_interpolator_2d.hh:33
KOKKOS_DEFAULTED_FUNCTION LinearInterpolator2D(const LinearInterpolator2D &)=default
Shallow copy of BOTH views, valid in host and in device code. See LinearInterpolator1D.
NT operator[](size_t i) const
Host-side element access, in the row-major order update() takes its input in.
Definition linear_interpolator_2d.hh:78
NT KOKKOS_FUNCTION operator()(const typename Coordinates::ctype x, const typename Coordinates::ctype y) const
Interpolate the data at a given point.
Definition linear_interpolator_2d.hh:136
const Coordinates & get_coordinates() const
Get the coordinate system of the data.
Definition linear_interpolator_2d.hh:147
HostViewType host_data
Definition linear_interpolator_2d.hh:169
NT KOKKOS_FUNCTION at(const device::array< typename Coordinates::ctype, 2 > &idx) const
Interpolate at grid indices previously obtained from index().
Definition linear_interpolator_2d.hh:106
static constexpr size_t dim
Definition linear_interpolator_2d.hh:34
static constexpr bool periodic_y
Definition linear_interpolator_2d.hh:23
Kokkos::View< NT **, GPU_memory, Kokkos::MemoryTraits< Kokkos::RandomAccess > > ViewType
Definition linear_interpolator_2d.hh:25
const Coordinates coordinates
Definition linear_interpolator_2d.hh:165
static constexpr bool has_separate_device
Definition linear_interpolator_2d.hh:28
LinearInterpolator2D(const Coordinates &coordinates)
Construct a LinearInterpolator2D with internal, zeroed data and a coordinate system.
Definition linear_interpolator_2d.hh:41
KOKKOS_FORCEINLINE_FUNCTION NT value(const size_t i, const size_t j) const
Read one element from whichever buffer belongs to the executing side.
Definition linear_interpolator_2d.hh:159
void update(const NT2 *in_data)
Replace the data, leaving host AND device current. The only mutator.
Definition linear_interpolator_2d.hh:62
typename Coordinates::ctype ctype
Definition linear_interpolator_2d.hh:32
std::array< T, N > array
Definition kokkos.hh:155
Definition complex_math.hh:10
constexpr bool is_periodic_axis_v
Whether axis i of a (possibly multi-dimensional) coordinate system is periodic. Falls back to false f...
Definition coordinates.hh:59
KOKKOS_FORCEINLINE_FUNCTION InterpolationStencil< CT > make_interpolation_stencil(CT idx, const size_t n)
Resolve a fractional grid index into the linear-interpolation stencil along one axis.
Definition interpolation_stencil.hh:34
Definition kokkos.hh:538