DiFfRG
Loading...
Searching...
No Matches
linear_interpolation_1D.hh
Go to the documentation of this file.
1#pragma once
2
3// DiFfRG
7
8// standard library
9#include <memory>
10
11// external libraries
12#include <autodiff/forward/real.hpp>
13
14namespace DiFfRG
15{
22 template <typename NT, typename Coordinates> class LinearInterpolator1D
23 {
24 static_assert(Coordinates::dim == 1, "LinearInterpolator1D requires 1D coordinates");
25
26 public:
33 LinearInterpolator1D(const std::vector<NT> &data, const Coordinates &coordinates);
41 LinearInterpolator1D(const NT *data, const Coordinates &coordinates);
48 LinearInterpolator1D(const Coordinates &coordinates);
55
56 template <typename NT2> void update(const NT2 *data)
57 {
58 if (!owner) throw std::runtime_error("Cannot update data of non-owner interpolator");
59
60 for (uint i = 0; i < size; ++i)
61 m_data[i] = NT(data[i]);
62
63 update();
64 }
65 void update();
66
67 NT *data() const;
68
75 __device__ __host__ NT operator()(const typename Coordinates::ctype x) const
76 {
77#ifndef __CUDA_ARCH__
78 using std::ceil;
79 using std::floor;
80 using std::max;
81 using std::min;
82#endif
83
84 auto idx = coordinates.backward(x);
85 idx = max(static_cast<decltype(idx)>(0), min(idx, static_cast<decltype(idx)>(size - 1)));
86#ifndef __CUDA_ARCH__
87 return m_data[uint(floor(idx))] * (NT(1) - idx + floor(idx)) + m_data[uint(ceil(idx))] * (idx - floor(idx));
88#else
89 return device_data_ptr[uint(floor(idx))] * (NT(1) - idx + floor(idx)) +
90 device_data_ptr[uint(ceil(idx))] * (idx - floor(idx));
91#endif
92 }
93
94 NT &operator[](const uint i);
95 const NT &operator[](const uint i) const;
96
102 const Coordinates &get_coordinates() const { return coordinates; }
103
104 private:
105 const uint size;
106 const Coordinates coordinates;
107
108 std::shared_ptr<NT[]> m_data;
109 std::shared_ptr<thrust::device_vector<NT>> device_data;
111
112 const bool owner;
113 };
114} // namespace DiFfRG
A linear interpolator for 1D data, both on GPU and CPU.
Definition linear_interpolation_1D.hh:23
const uint size
Definition linear_interpolation_1D.hh:105
void update(const NT2 *data)
Definition linear_interpolation_1D.hh:56
const NT & operator[](const uint i) const
const Coordinates coordinates
Definition linear_interpolation_1D.hh:106
__device__ __host__ NT operator()(const typename Coordinates::ctype x) const
Interpolate the data at a given point.
Definition linear_interpolation_1D.hh:75
std::shared_ptr< thrust::device_vector< NT > > device_data
Definition linear_interpolation_1D.hh:109
LinearInterpolator1D(const std::vector< NT > &data, const Coordinates &coordinates)
Construct a LinearInterpolator1D object from a vector of data and a coordinate system.
std::shared_ptr< NT[]> m_data
Definition linear_interpolation_1D.hh:108
const bool owner
Definition linear_interpolation_1D.hh:112
LinearInterpolator1D(const Coordinates &coordinates)
Construct a LinearInterpolator1D with internal, zeroed data and a coordinate system.
const NT * device_data_ptr
Definition linear_interpolation_1D.hh:110
LinearInterpolator1D(const LinearInterpolator1D &other)
Construct a copy of a LinearInterpolator1D object.
LinearInterpolator1D(const NT *data, const Coordinates &coordinates)
Construct a LinearInterpolator1D object from a pointer to data and a coordinate system.
NT & operator[](const uint i)
const Coordinates & get_coordinates() const
Get the coordinate system of the data.
Definition linear_interpolation_1D.hh:102
Definition complex_math.hh:14
unsigned int uint
Definition utils.hh:22