/home/runner/work/DiFfRG_current/DiFfRG_current/DiFfRG/include/DiFfRG/discretization/coordinates/coordinates.hh Source File#
|
DiFfRG
Discretization Framework for functional Renormalization Group flows
|
coordinates.hh
Go to the documentation of this file.
43 template <typename T> inline constexpr bool is_periodic_coordinate_v = internal::coord_periodic<T>::value;
59 template <typename C, size_t i> inline constexpr bool is_periodic_axis_v = internal::axis_periodic<C, i>::value;
73 static_assert(sizeof...(Coordinates) > 0, "CoordinatePackND requires at least one coordinate system");
75 static_assert(((Coordinates::dim == 1) && ...), "CoordinatePackND requires all coordinates to have dim 1");
93 return forward_impl(device::make_integer_sequence<int, sizeof...(I)>(), device::forward<I>(i)...);
96 KOKKOS_FORCEINLINE_FUNCTION device::array<ctype, dim> forward(const device::array<IT, dim> &coords) const
102 device::array<ctype, dim> KOKKOS_FORCEINLINE_FUNCTION forward_impl(device::integer_sequence<int, Is...>,
108 template <typename... I> KOKKOS_FORCEINLINE_FUNCTION device::array<ctype, sizeof...(I)> backward(I &&...i) const
111 return backward_impl(device::make_integer_sequence<int, sizeof...(I)>(), device::forward<I>(i)...);
115 device::array<ctype, sizeof...(I)> KOKKOS_FORCEINLINE_FUNCTION backward_impl(device::integer_sequence<int, Is...>,
133 constexpr_for<0, sizeof...(Coordinates), 1>([&](auto i) { size *= device::get<i>(coordinates).size(); });
140 constexpr_for<0, sizeof...(Coordinates), 1>([&](auto i) { sizes[i] = device::get<i>(coordinates).size(); });
144 device::array<size_t, sizeof...(Coordinates)> KOKKOS_INLINE_FUNCTION from_linear_index(size_t s) const
149 idx[sizeof...(Coordinates) - 1 - i] = s % device::get<sizeof...(Coordinates) - 1 - i>(coordinates).size();
157 friend bool operator==(const CoordinatePackND<Coordinates...> &r, const CoordinatePackND<Coordinates2...> &l)
212 SubCoordinates(const Base &base, size_t offset, size_t size) : Base(base), m_offset(offset), m_size(size)
215 if (offset + size > base.size()) throw std::runtime_error("SubCoordinates: offset + size must be <= base.size()");
224 static_assert(dim == 1, "SubCoordinates is a linear index window, which is a per-axis box only for dim == 1.");
250 template <typename IT> KOKKOS_INLINE_FUNCTION device::array<ctype, dim> forward(device::array<IT, dim> i) const
303 template <typename IT> NT KOKKOS_FORCEINLINE_FUNCTION forward(const IT &x) const { return start + a * x; }
305 template <typename IT> device::array<NT, 1> KOKKOS_FORCEINLINE_FUNCTION forward(const device::array<IT, 1> &x) const
333 return "LinearCoordinates1D(" + std::to_string(grid_extent) + ", " + std::to_string(start) + ", " +
365 if (grid_extent == 0) throw std::runtime_error("LinearPeriodicCoordinates1D: grid_extent must be > 0");
386 template <typename IT> NT KOKKOS_FORCEINLINE_FUNCTION forward(const IT &x) const { return start + a * x; }
388 template <typename IT> device::array<NT, 1> KOKKOS_FORCEINLINE_FUNCTION forward(const device::array<IT, 1> &x) const
418 friend bool operator==(const LinearPeriodicCoordinates1D<NT> &lhs, const LinearPeriodicCoordinates1D<NT2> &rhs)
426 return "LinearPeriodicCoordinates1D(" + std::to_string(grid_extent) + ", " + std::to_string(start) + ", " +
448 if (grid_extent == 0) throw std::runtime_error("LogarithmicCoordinates1D: grid_extent must be > 0");
478 template <typename IT> device::array<NT, 1> KOKKOS_FORCEINLINE_FUNCTION forward(const device::array<IT, 1> &x) const
495 NT KOKKOS_FORCEINLINE_FUNCTION backward_derivative(const NT &y) const { return 1. / (y - c) * gem1 / a; }
504 friend bool operator==(const LogarithmicCoordinates1D<NT> &lhs, const LogarithmicCoordinates1D<NT2> &rhs)
572 if (grid_extent < 2) throw std::runtime_error("FocusedLogCoordinates1D: grid_extent must be > 1");
641 template <typename IT> device::array<NT, 1> KOKKOS_FORCEINLINE_FUNCTION forward(const device::array<IT, 1> &x) const
674 friend bool operator==(const FocusedLogCoordinates1D<NT> &lhs, const FocusedLogCoordinates1D<NT2> &rhs)
683 return "FocusedLogCoordinates1D(" + std::to_string(grid_extent) + ", " + round_trip(start) + ", " +
745 template <typename Coordinates> auto make_idx_grid(const Coordinates &coordinates) -> std::vector<double>
775 using LogLogCoordinates = CoordinatePackND<LogarithmicCoordinates1D<double>, LogarithmicCoordinates1D<double>>;
776 using LogLinCoordinates = CoordinatePackND<LogarithmicCoordinates1D<double>, LinearCoordinates1D<double>>;
777 using LinLogCoordinates = CoordinatePackND<LinearCoordinates1D<double>, LogarithmicCoordinates1D<double>>;
778 using LinLinCoordinates = CoordinatePackND<LinearCoordinates1D<double>, LinearCoordinates1D<double>>;
780 CoordinatePackND<LogarithmicCoordinates1D<double>, LogarithmicCoordinates1D<double>, LinearCoordinates1D<double>>;
782 CoordinatePackND<LogarithmicCoordinates1D<double>, LinearCoordinates1D<double>, LinearCoordinates1D<double>>;
784 CoordinatePackND<LinearCoordinates1D<double>, LinearCoordinates1D<double>, LinearCoordinates1D<double>>;
788 using FocusedLogLinCoordinates = CoordinatePackND<FocusedLogCoordinates1D<double>, LinearCoordinates1D<double>>;
789 using FocusedLogLinLinCoordinates = CoordinatePackND<FocusedLogCoordinates1D<double>, LinearCoordinates1D<double>,
796 using LogLinLinPeriodicCoordinates = CoordinatePackND<LogarithmicCoordinates1D<double>, LinearCoordinates1D<double>,
Utility class for combining multiple coordinate systems into one.
Definition coordinates.hh:67
const auto & get_coordinates() const
Definition coordinates.hh:121
KOKKOS_FORCEINLINE_FUNCTION device::array< ctype, sizeof...(I)> backward(I &&...i) const
Definition coordinates.hh:108
size_t KOKKOS_FORCEINLINE_FUNCTION size() const
Definition coordinates.hh:129
KOKKOS_FORCEINLINE_FUNCTION device::array< ctype, dim > forward(I &&...i) const
Definition coordinates.hh:90
typename device::tuple_element< i, device::tuple< Coordinates... > >::type coordinate_type
The type of the i-th axis. Used e.g. to query per-axis periodicity, see is_periodic_axis_v.
Definition coordinates.hh:127
device::array< size_t, sizeof...(Coordinates)> KOKKOS_INLINE_FUNCTION from_linear_index(size_t s) const
Definition coordinates.hh:144
CoordinatePackND(Coordinates... coordinates)
Construct a new CoordinatePackND object.
Definition coordinates.hh:86
device::array< ctype, sizeof...(I)> KOKKOS_FORCEINLINE_FUNCTION backward_impl(device::integer_sequence< int, Is... >, I &&...i) const
Definition coordinates.hh:115
friend bool operator==(const CoordinatePackND< Coordinates... > &r, const CoordinatePackND< Coordinates2... > &l)
Definition coordinates.hh:157
device::array< size_t, sizeof...(Coordinates)> KOKKOS_FORCEINLINE_FUNCTION sizes() const
Definition coordinates.hh:137
device::array< ctype, dim > KOKKOS_FORCEINLINE_FUNCTION forward_impl(device::integer_sequence< int, Is... >, I &&...i) const
Definition coordinates.hh:102
const device::tuple< Coordinates... > coordinates
Definition coordinates.hh:185
KOKKOS_FORCEINLINE_FUNCTION device::array< ctype, dim > forward(const device::array< IT, dim > &coords) const
Definition coordinates.hh:96
typename device::tuple_element< 0, device::tuple< Coordinates... > >::type::ctype ctype
Definition coordinates.hh:78
Logarithmic coordinates which cluster grid points around an interior scale.
Definition coordinates.hh:555
FocusedLogCoordinates1D(const FocusedLogCoordinates1D< NT2 > &other)
Definition coordinates.hh:607
device::array< size_t, 1 > KOKKOS_FORCEINLINE_FUNCTION from_linear_index(size_t i) const
Definition coordinates.hh:612
NT KOKKOS_FORCEINLINE_FUNCTION forward(const IT &x) const
Transform from the grid to the physical space.
Definition coordinates.hh:623
FocusedLogCoordinates1D(size_t grid_extent, NT start, NT stop, NT center, NT focus)
Construct a new FocusedLogCoordinates1D object.
Definition coordinates.hh:569
NT KOKKOS_FORCEINLINE_FUNCTION backward_derivative(const NT &y) const
Definition coordinates.hh:659
NT KOKKOS_FORCEINLINE_FUNCTION backward(const NT &y) const
Transform from the physical space to the grid.
Definition coordinates.hh:652
static std::string round_trip(const NT value)
Format a parameter with the fewest digits that still identify it uniquely.
Definition coordinates.hh:699
std::string to_string() const
Definition coordinates.hh:681
NT KOKKOS_FORCEINLINE_FUNCTION s_of_u(const NT u) const
asinh(c * (u - u0)), written out to pick the cancellation-free branch.
Definition coordinates.hh:718
friend bool operator==(const FocusedLogCoordinates1D< NT > &lhs, const FocusedLogCoordinates1D< NT2 > &rhs)
Definition coordinates.hh:674
size_t KOKKOS_FORCEINLINE_FUNCTION size() const
Definition coordinates.hh:667
device::array< NT, 1 > KOKKOS_FORCEINLINE_FUNCTION forward(const device::array< IT, 1 > &x) const
Definition coordinates.hh:641
device::array< size_t, 1 > KOKKOS_FORCEINLINE_FUNCTION sizes() const
Definition coordinates.hh:669
Definition coordinates.hh:274
device::array< size_t, 1 > KOKKOS_FORCEINLINE_FUNCTION from_linear_index(size_t i) const
Definition coordinates.hh:292
friend bool operator==(const LinearCoordinates1D< NT > &lhs, const LinearCoordinates1D< NT2 > &rhs)
Definition coordinates.hh:325
LinearCoordinates1D(size_t grid_extent, double start, double stop)
Definition coordinates.hh:279
NT KOKKOS_FORCEINLINE_FUNCTION backward(const NT &y) const
Transform from the physical space to the grid.
Definition coordinates.hh:316
size_t KOKKOS_FORCEINLINE_FUNCTION size() const
Definition coordinates.hh:318
NT KOKKOS_FORCEINLINE_FUNCTION forward(const IT &x) const
Transform from the grid to the physical space.
Definition coordinates.hh:303
LinearCoordinates1D(const LinearCoordinates1D< NT2 > &other)
Definition coordinates.hh:287
device::array< size_t, 1 > KOKKOS_FORCEINLINE_FUNCTION sizes() const
Definition coordinates.hh:320
device::array< NT, 1 > KOKKOS_FORCEINLINE_FUNCTION forward(const device::array< IT, 1 > &x) const
Definition coordinates.hh:305
Linear coordinates on a periodic axis of period (stop - start).
Definition coordinates.hh:356
LinearPeriodicCoordinates1D(const LinearPeriodicCoordinates1D< NT2 > &other)
Definition coordinates.hh:370
NT KOKKOS_FORCEINLINE_FUNCTION backward(const NT &y) const
Transform from the physical space to the grid, folded into [0, grid_extent)
Definition coordinates.hh:399
std::string to_string() const
Definition coordinates.hh:424
NT KOKKOS_FORCEINLINE_FUNCTION forward(const IT &x) const
Transform from the grid to the physical space.
Definition coordinates.hh:386
static constexpr bool periodic
Definition coordinates.hh:360
friend bool operator==(const LinearPeriodicCoordinates1D< NT > &lhs, const LinearPeriodicCoordinates1D< NT2 > &rhs)
Definition coordinates.hh:418
device::array< size_t, 1 > KOKKOS_FORCEINLINE_FUNCTION from_linear_index(size_t i) const
Definition coordinates.hh:375
size_t KOKKOS_FORCEINLINE_FUNCTION size() const
Definition coordinates.hh:411
LinearPeriodicCoordinates1D(size_t grid_extent, double start, double stop)
Definition coordinates.hh:362
device::array< NT, 1 > KOKKOS_FORCEINLINE_FUNCTION forward(const device::array< IT, 1 > &x) const
Definition coordinates.hh:388
const size_t grid_extent
Definition coordinates.hh:431
device::array< size_t, 1 > KOKKOS_FORCEINLINE_FUNCTION sizes() const
Definition coordinates.hh:413
Definition coordinates.hh:439
LogarithmicCoordinates1D(const LogarithmicCoordinates1D< NT2 > &other)
Definition coordinates.hh:456
device::array< size_t, 1 > KOKKOS_FORCEINLINE_FUNCTION from_linear_index(size_t i) const
Definition coordinates.hh:461
NT KOKKOS_FORCEINLINE_FUNCTION backward_derivative(const NT &y) const
Definition coordinates.hh:495
friend bool operator==(const LogarithmicCoordinates1D< NT > &lhs, const LogarithmicCoordinates1D< NT2 > &rhs)
Definition coordinates.hh:504
device::array< size_t, 1 > KOKKOS_FORCEINLINE_FUNCTION sizes() const
Definition coordinates.hh:499
std::string to_string() const
Definition coordinates.hh:511
NT KOKKOS_FORCEINLINE_FUNCTION forward(const IT &x) const
Transform from the grid to the physical space.
Definition coordinates.hh:472
NT KOKKOS_FORCEINLINE_FUNCTION backward(const NT &y) const
Transform from the physical space to the grid.
Definition coordinates.hh:489
size_t KOKKOS_FORCEINLINE_FUNCTION size() const
Definition coordinates.hh:497
device::array< NT, 1 > KOKKOS_FORCEINLINE_FUNCTION forward(const device::array< IT, 1 > &x) const
Definition coordinates.hh:478
LogarithmicCoordinates1D(size_t grid_extent, NT start, NT stop, NT bias)
Definition coordinates.hh:444
A contiguous window into the linear index range of another coordinate system.
Definition coordinates.hh:207
KOKKOS_FORCEINLINE_FUNCTION device::array< ctype, dim > forward(I &&...i) const
Definition coordinates.hh:243
KOKKOS_INLINE_FUNCTION device::array< ctype, dim > forward(device::array< IT, dim > i) const
Takes a base multi-index, i.e. what from_linear_index() above returns.
Definition coordinates.hh:250
size_t KOKKOS_FORCEINLINE_FUNCTION size() const
Definition coordinates.hh:228
device::array< size_t, dim > KOKKOS_INLINE_FUNCTION from_linear_index(size_t s) const
Definition coordinates.hh:233
SubCoordinates(const Base &base, size_t offset, size_t size)
Definition coordinates.hh:212
device::array< size_t, dim > KOKKOS_FORCEINLINE_FUNCTION sizes() const
Definition coordinates.hh:222
Definition coordinates.hh:22
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
std::vector< typename Coordinates::ctype > dump_grid(const Coordinates &coordinates)
Definition coordinates.hh:759
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:31
auto make_idx_grid(const Coordinates &coordinates) -> std::vector< double >
Definition coordinates.hh:745
constexpr bool is_periodic_coordinate_v
Whether a 1D coordinate class describes a periodic axis, i.e. one where the last grid point is follow...
Definition coordinates.hh:43
Definition coordinates.hh:47
Definition coordinates.hh:32
Generated by