12#include <autodiff/forward/real.hpp>
24 static_assert(Coordinates::dim == 2,
"TexLinearInterpolator1DStack requires 2D coordinates");
48 template <
typename Coordinates2>
64 if (!
owner)
throw std::runtime_error(
"Cannot update data of non-owner interpolator");
66 if constexpr (std::is_same_v<NT2, autodiff::real>)
96 if constexpr (std::is_same_v<ReturnType, autodiff::real>)
97 return std::array<double, 2>{tex1D<float>(
texture[m_idx], p_idx + 0.5),
99 else if constexpr (std::is_same_v<ReturnType, float>)
100 return tex1D<float>(
texture[m_idx], p_idx + 0.5);
102 p_idx = std::max(
static_cast<decltype(p_idx)
>(0.), std::min(p_idx,
static_cast<decltype(p_idx)
>(
p_size - 1)));
103 if constexpr (std::is_same_v<ReturnType, autodiff::real>)
104 return std::array<double, 2>{{
m_data[m_idx][
uint(std::floor(p_idx))] * (1.f - p_idx + std::floor(p_idx)) +
105 m_data[m_idx][
uint(std::ceil(p_idx))] * (p_idx - std::floor(p_idx)),
106 m_data_AD[m_idx][
uint(std::floor(p_idx))] * (1.f - p_idx + std::floor(p_idx)) +
107 m_data_AD[m_idx][
uint(std::ceil(p_idx))] * (p_idx - std::floor(p_idx))}};
108 else if constexpr (std::is_same_v<ReturnType, float>)
109 return m_data[m_idx][
uint(std::floor(p_idx))] * (1.f - p_idx + std::floor(p_idx)) +
110 m_data[m_idx][
uint(std::ceil(p_idx))] * (p_idx - std::floor(p_idx));
128 std::vector<std::shared_ptr<float[]>>
m_data;
A linear interpolator for 1D data, using texture memory on the GPU and floating point arithmetic on t...
Definition tex_linear_interpolation_1D_stack.hh:23
const Coordinates & get_coordinates() const
Get the coordinate system of the data.
Definition tex_linear_interpolation_1D_stack.hh:122
const uint p_size
Definition tex_linear_interpolation_1D_stack.hh:125
const uint stack_size
Definition tex_linear_interpolation_1D_stack.hh:125
TexLinearInterpolator1DStack(const std::vector< NT > &data, const Coordinates &coordinates)
Construct a TexLinearInterpolator1D object from a vector of data and a coordinate system.
ReturnType & operator[](const uint i)
cudaTextureObject_t texture[max_stack_size]
Definition tex_linear_interpolation_1D_stack.hh:130
typename internal::__TLITypes< NT >::ReturnType ReturnType
Definition tex_linear_interpolation_1D_stack.hh:84
std::vector< cudaArray_t > device_array
Definition tex_linear_interpolation_1D_stack.hh:129
TexLinearInterpolator1DStack(const Coordinates &coordinates)
Construct a TexLinearInterpolator1D with internal, zeroed data and a coordinate system.
__device__ __host__ ReturnType operator()(const float m, const float p) const
Interpolate the data at a given point.
Definition tex_linear_interpolation_1D_stack.hh:92
void update(const NT2 *data)
Definition tex_linear_interpolation_1D_stack.hh:62
std::vector< std::shared_ptr< float[]> > m_data
Definition tex_linear_interpolation_1D_stack.hh:128
~TexLinearInterpolator1DStack()
float * data(const uint i) const
const bool owner
Definition tex_linear_interpolation_1D_stack.hh:136
std::vector< cudaArray_t > device_array_AD
Definition tex_linear_interpolation_1D_stack.hh:133
std::vector< std::shared_ptr< float[]> > m_data_AD
Definition tex_linear_interpolation_1D_stack.hh:132
const ReturnType & operator[](const uint i) const
TexLinearInterpolator1DStack(const TexLinearInterpolator1DStack &other)
Construct a copy of a TexLinearInterpolator1D object.
TexLinearInterpolator1DStack(const Coordinates2 &coordinates, const uint m_start, const uint m_end, const double T)
Definition tex_linear_interpolation_1D_stack.hh:49
cudaTextureObject_t texture_AD[max_stack_size]
Definition tex_linear_interpolation_1D_stack.hh:134
float * data_AD(const uint i) const
TexLinearInterpolator1DStack(const NT *data, const Coordinates &coordinates)
Construct a TexLinearInterpolator1D object from a pointer to data and a coordinate system.
const Coordinates coordinates
Definition tex_linear_interpolation_1D_stack.hh:126
Definition complex_math.hh:14
unsigned int uint
Definition utils.hh:22