31 static_assert((std::is_same<
typename Coordinates::ctype,
32 typename std::tuple_element<0, std::tuple<Coordinates...>>::type::ctype>::value &&
34 static_assert(
sizeof...(Coordinates) > 0,
"CoordinatePackND requires at least one coordinate system");
36 static_assert(((Coordinates::dim == 1) && ...),
"CoordinatePackND requires all coordinates to have dim 1");
39 using ctype =
typename std::tuple_element<0, std::tuple<Coordinates...>>::type::ctype;
40 static constexpr uint dim =
sizeof...(Coordinates);
49 template <
typename... I> __forceinline__ __host__ __device__ std::array<ctype, dim>
forward(I &&...i)
const
51 static_assert(
sizeof...(I) ==
sizeof...(Coordinates));
52 return forward_impl(std::make_integer_sequence<
int,
sizeof...(I)>(), std::forward<I>(i)...);
55 template <
typename... I,
int... Is>
56 __forceinline__ __host__ __device__ std::array<ctype, dim>
forward_impl(std::integer_sequence<int, Is...>,
62 template <
typename... I>
63 __forceinline__ __host__ __device__ std::array<
ctype,
sizeof...(I)>
backward(I &&...i)
const
65 static_assert(
sizeof...(I) ==
sizeof...(Coordinates));
66 return backward_impl(std::make_integer_sequence<
int,
sizeof...(I)>(), std::forward<I>(i)...);
69 template <
typename... I,
int... Is>
70 std::array<
ctype,
sizeof...(I)> __forceinline__ __host__ __device__
backward_impl(std::integer_sequence<int, Is...>,
86 std::array<
uint,
sizeof...(Coordinates)>
sizes()
const
88 std::array<
uint,
sizeof...(Coordinates)>
sizes;
106 if (
grid_extent == 0)
throw std::runtime_error(
"LinearCoordinates1D: grid_extent must be > 0");
110 template <
typename NT2>
130 NT __forceinline__ __device__ __host__
backward(
const NT &y)
const {
return (y -
start) /
a; }
151 if (
grid_extent == 0)
throw std::runtime_error(
"LogarithmicCoordinates1D: grid_extent must be > 0");
158 template <
typename NT2>
170 NT __forceinline__ __device__ __host__
forward(
const uint &x)
const
182 NT __forceinline__ __device__ __host__
backward(
const NT &y)
const
185 return log1p((y -
c) /
b) *
gem1 /
a;
200 template <
typename Coordinates>
auto make_grid(
const Coordinates &coordinates)
202 using ctype =
typename Coordinates::ctype;
203 if constexpr (Coordinates::dim == 1) {
204 std::vector<ctype> grid(coordinates.size());
205 for (
uint i = 0; i < coordinates.size(); ++i)
206 grid[i] = coordinates.forward(i);
208 }
else if constexpr (Coordinates::dim == 2) {
209 std::vector<std::array<ctype, 2>> grid(coordinates.size());
210 for (
uint i = 0; i < coordinates.sizes()[0]; ++i)
211 for (
uint j = 0; j < coordinates.sizes()[1]; ++j)
212 grid[i * coordinates.sizes()[1] + j] = coordinates.forward(i, j);
214 }
else if constexpr (Coordinates::dim == 3) {
215 std::vector<std::array<ctype, 3>> grid(coordinates.size());
216 for (
uint i = 0; i < coordinates.sizes()[0]; ++i)
217 for (
uint j = 0; j < coordinates.sizes()[1]; ++j)
218 for (
uint k = 0; k < coordinates.sizes()[2]; ++k)
219 grid[i * coordinates.sizes()[1] * coordinates.sizes()[2] + j * coordinates.sizes()[2] + k] =
220 coordinates.forward(i, j, k);
223 throw std::runtime_error(
"make_grid only works for 1D, 2D, and 3D coordinates");
227 template <
typename Coordinates>
auto make_idx_grid(
const Coordinates &coordinates) -> std::vector<double>
229 if constexpr (Coordinates::dim == 1) {
230 std::vector<double> grid(coordinates.size());
231 for (
uint i = 0; i < coordinates.size(); ++i)
234 }
else if constexpr (Coordinates::dim == 2) {
235 std::vector<double> grid(coordinates.size());
236 for (
uint i = 0; i < coordinates.sizes()[0]; ++i)
237 for (
uint j = 0; j < coordinates.sizes()[1]; ++j)
238 grid[i * coordinates.sizes()[1] + j] = i * coordinates.sizes()[1] + j;
240 }
else if constexpr (Coordinates::dim == 3) {
241 std::vector<double> grid(coordinates.size());
242 for (
uint i = 0; i < coordinates.sizes()[0]; ++i)
243 for (
uint j = 0; j < coordinates.sizes()[1]; ++j)
244 for (
uint k = 0; k < coordinates.sizes()[2]; ++k)
245 grid[i * coordinates.sizes()[1] * coordinates.sizes()[2] + j * coordinates.sizes()[2] + k] =
246 i * coordinates.sizes()[1] * coordinates.sizes()[2] + j * coordinates.sizes()[2] + k;
249 throw std::runtime_error(
"make_idx_grid only works for 1D, 2D, and 3D coordinates");
Utility class for combining multiple coordinate systems into one.
Definition coordinates.hh:29
const auto & get_coordinates() const
Definition coordinates.hh:76
typename std::tuple_element< 0, std::tuple< Coordinates... > >::type::ctype ctype
Definition coordinates.hh:39
static constexpr uint dim
Definition coordinates.hh:40
std::array< ctype, sizeof...(I)> __forceinline__ __host__ __device__ backward_impl(std::integer_sequence< int, Is... >, I &&...i) const
Definition coordinates.hh:70
const std::tuple< Coordinates... > coordinates
Definition coordinates.hh:94
__forceinline__ __host__ __device__ std::array< ctype, dim > forward_impl(std::integer_sequence< int, Is... >, I &&...i) const
Definition coordinates.hh:56
CoordinatePackND(Coordinates... coordinates)
Construct a new CoordinatePackND object.
Definition coordinates.hh:47
__forceinline__ __host__ __device__ std::array< ctype, sizeof...(I)> backward(I &&...i) const
Definition coordinates.hh:63
__forceinline__ __host__ __device__ std::array< ctype, dim > forward(I &&...i) const
Definition coordinates.hh:49
uint size() const
Definition coordinates.hh:78
std::array< uint, sizeof...(Coordinates)> sizes() const
Definition coordinates.hh:86
Definition coordinates.hh:98
NT __forceinline__ __device__ __host__ forward(const uint &x) const
Transform from the grid to the physical space.
Definition coordinates.hh:122
static constexpr uint dim
Definition coordinates.hh:101
NT a
Definition coordinates.hh:138
const NT stop
Definition coordinates.hh:134
uint size() const
Definition coordinates.hh:132
LinearCoordinates1D(uint grid_extent, double start, double stop)
Definition coordinates.hh:103
const NT start
Definition coordinates.hh:134
const uint grid_extent
Definition coordinates.hh:137
NT ctype
Definition coordinates.hh:100
LinearCoordinates1D(const LinearCoordinates1D< NT2 > &other)
Definition coordinates.hh:111
NT __forceinline__ __device__ __host__ backward(const NT &y) const
Transform from the physical space to the grid.
Definition coordinates.hh:130
Definition coordinates.hh:142
const NT gem1
Definition coordinates.hh:196
uint size() const
Definition coordinates.hh:190
NT __forceinline__ __device__ __host__ backward(const NT &y) const
Transform from the physical space to the grid.
Definition coordinates.hh:182
static constexpr uint dim
Definition coordinates.hh:145
LogarithmicCoordinates1D(const LogarithmicCoordinates1D< NT2 > &other)
Definition coordinates.hh:159
NT __forceinline__ __device__ __host__ backward_derivative(const NT &y) const
Definition coordinates.hh:188
const NT stop
Definition coordinates.hh:192
const NT gem1inv
Definition coordinates.hh:196
LogarithmicCoordinates1D(uint grid_extent, NT start, NT stop, NT bias)
Definition coordinates.hh:147
const NT start
Definition coordinates.hh:192
NT __forceinline__ __device__ __host__ forward(const uint &x) const
Transform from the grid to the physical space.
Definition coordinates.hh:170
NT a
Definition coordinates.hh:197
NT ctype
Definition coordinates.hh:144
const NT bias
Definition coordinates.hh:192
NT b
Definition coordinates.hh:197
const uint grid_extent
Definition coordinates.hh:195
NT c
Definition coordinates.hh:197
Definition coordinates.hh:15
Definition complex_math.hh:14
constexpr void constexpr_for(F &&f)
A compile-time for loop, which calls the lambda f of signature void(integer) for each index.
Definition utils.hh:27
auto make_idx_grid(const Coordinates &coordinates) -> std::vector< double >
Definition coordinates.hh:227
unsigned int uint
Definition utils.hh:22
auto make_grid(const Coordinates &coordinates)
Definition coordinates.hh:200
constexpr auto & get(DiFfRG::named_tuple< tuple_type, strs... > &ob)
Definition tuples.hh:119