/home/runner/work/DiFfRG_current/DiFfRG_current/DiFfRG/include/DiFfRG/discretization/coordinates/combined_coordinates.hh Source File#

DiFfRG: /home/runner/work/DiFfRG_current/DiFfRG_current/DiFfRG/include/DiFfRG/discretization/coordinates/combined_coordinates.hh Source File
DiFfRG
Discretization Framework for functional Renormalization Group flows
combined_coordinates.hh
Go to the documentation of this file.
1#pragma once
2
3// DiFfRG
8
9namespace DiFfRG
10{
18 template <typename Idx = int, typename NT = double, typename Radial = LogarithmicCoordinates1D<NT>>
20 {
21 public:
22 using ctype = NT;
23 static constexpr size_t dim = 2;
24 using radial_type = Radial;
25
26 BosonicCoordinates1DFiniteT(Idx m_start, Idx m_stop, NT m_T, size_t grid_extent, NT p_start, NT p_stop, NT p_bias)
27 requires std::is_same_v<Radial, LogarithmicCoordinates1D<NT>>
31 {
32 }
33
34 template <typename Idx2, typename NT2, typename Radial2>
39
40 template <typename Radial2>
47
54 device::array<NT, 2> KOKKOS_FORCEINLINE_FUNCTION forward(const size_t m, const size_t p) const
55 {
56 return {matsubara_values.forward(m), radial_coordinates.forward(p)};
57 }
58 template <typename IT> device::array<NT, 2> KOKKOS_FORCEINLINE_FUNCTION forward(const device::array<IT, 2> mp) const
59 {
60 return forward(mp[0], mp[1]);
61 }
62
69 std::tuple<Idx, NT> KOKKOS_FUNCTION backward(const NT m, const NT p) const
70 {
71 Idx m_idx = matsubara_values.backward(m);
72 NT p_idx = 0;
73 if (m_idx >= int(m_size)) {
74 m_idx = m_size - 1;
75 const auto new_p = std::sqrt(powr<2>(p) + powr<2>(m - matsubara_values.forward(m_idx)));
76 p_idx = radial_coordinates.backward(new_p);
77 } else if (m_idx < 0) {
78 m_idx = 0;
79 const auto new_p = std::sqrt(powr<2>(p) + powr<2>(m - matsubara_values.forward(m_idx)));
80 p_idx = radial_coordinates.backward(new_p);
81 } else
82 p_idx = radial_coordinates.backward(p);
83 return {m_idx, p_idx};
84 }
85
86 device::array<size_t, 2> KOKKOS_INLINE_FUNCTION from_linear_index(auto i) const
87 {
89 // calculate the index for each coordinate system
90 idx[0] = i / grid_extent; // Matsubara index
91 idx[1] = i % grid_extent; // Radial index
92
93 return idx;
94 }
95
96 size_t size() const { return m_size * grid_extent; }
98
102 const Radial &radial() const { return radial_coordinates; }
103
105
106 std::string to_string() const
107 {
108 return "Combined(" + matsubara_values.to_string() + ", " + radial_coordinates.to_string() + ")";
109 }
110
111 private:
112 const size_t grid_extent, m_size;
113
116 };
117
121 template <typename Idx = int, typename NT = double, typename Radial = LogarithmicCoordinates1D<NT>>
123 {
124 public:
125 using ctype = NT;
126 static constexpr size_t dim = 2;
127 using radial_type = Radial;
128
130 requires std::is_same_v<Radial, LogarithmicCoordinates1D<NT>>
134 {
135 }
136
137 template <typename Idx2, typename NT2, typename Radial2>
142
143 template <typename Radial2>
150
157 device::array<NT, 2> KOKKOS_FORCEINLINE_FUNCTION forward(const size_t m, const size_t p) const
158 {
159 return {matsubara_values.forward(m), radial_coordinates.forward(p)};
160 }
161 template <typename IT> device::array<NT, 2> KOKKOS_FORCEINLINE_FUNCTION forward(const device::array<IT, 2> mp) const
162 {
163 return forward(mp[0], mp[1]);
164 }
165
172 std::tuple<Idx, NT> KOKKOS_FUNCTION backward(const NT m, const NT p) const
173 {
174 Idx m_idx = matsubara_values.backward(m);
175 NT p_idx = 0;
176 if (m_idx >= int(m_size)) {
177 m_idx = m_size - 1;
178 const auto new_p = std::sqrt(powr<2>(p) + powr<2>(m - matsubara_values.forward(m_idx)));
179 p_idx = radial_coordinates.backward(new_p);
180 } else if (m_idx < 0) {
181 m_idx = 0;
182 const auto new_p = std::sqrt(powr<2>(p) + powr<2>(m - matsubara_values.forward(m_idx)));
183 p_idx = radial_coordinates.backward(new_p);
184 } else
185 p_idx = radial_coordinates.backward(p);
186 return {m_idx, p_idx};
187 }
188
189 device::array<size_t, 2> KOKKOS_INLINE_FUNCTION from_linear_index(auto i) const
190 {
192 // calculate the index for each coordinate system
193 idx[0] = i / grid_extent; // Matsubara index
194 idx[1] = i % grid_extent; // Radial index
195
196 return idx;
197 }
198
199 size_t size() const { return m_size * grid_extent; }
201
205 const Radial &radial() const { return radial_coordinates; }
206
208
209 std::string to_string() const
210 {
211 return "Combined(" + matsubara_values.to_string() + ", " + radial_coordinates.to_string() + ")";
212 }
213
214 private:
215 const size_t grid_extent, m_size;
216
219 };
220
221 // Finite-T coordinates whose radial axis is focused on an interior scale
225} // namespace DiFfRG
Matsubara frequencies combined with a radial momentum axis.
Definition combined_coordinates.hh:20
BosonicCoordinates1DFiniteT(const Radial2 &radial_coordinates, Idx m_start, Idx m_stop, NT m_T)
Definition combined_coordinates.hh:41
const size_t grid_extent
Definition combined_coordinates.hh:112
Radial radial_type
Definition combined_coordinates.hh:24
const NT m_stop
Definition combined_coordinates.hh:104
NT ctype
Definition combined_coordinates.hh:22
size_t size() const
Definition combined_coordinates.hh:96
const NT p_start
Definition combined_coordinates.hh:104
std::tuple< Idx, NT > KOKKOS_FUNCTION backward(const NT m, const NT p) const
Transform from the physical space to the grid.
Definition combined_coordinates.hh:69
const NT m_T
Definition combined_coordinates.hh:104
std::string to_string() const
Definition combined_coordinates.hh:106
const NT m_start
Definition combined_coordinates.hh:104
static constexpr size_t dim
Definition combined_coordinates.hh:23
device::array< size_t, 2 > sizes() const
Definition combined_coordinates.hh:97
BosonicMatsubaraValues< Idx, NT > matsubara_values
Definition combined_coordinates.hh:114
const size_t m_size
Definition combined_coordinates.hh:112
Radial radial_coordinates
Definition combined_coordinates.hh:115
const NT p_stop
Definition combined_coordinates.hh:104
BosonicCoordinates1DFiniteT(Idx m_start, Idx m_stop, NT m_T, size_t grid_extent, NT p_start, NT p_stop, NT p_bias)
Definition combined_coordinates.hh:26
const Radial & radial() const
The radial coordinate system, e.g. to rebuild this object with a different Idx or NT.
Definition combined_coordinates.hh:102
device::array< size_t, 2 > KOKKOS_INLINE_FUNCTION from_linear_index(auto i) const
Definition combined_coordinates.hh:86
device::array< NT, 2 > KOKKOS_FORCEINLINE_FUNCTION forward(const device::array< IT, 2 > mp) const
Definition combined_coordinates.hh:58
BosonicCoordinates1DFiniteT(const BosonicCoordinates1DFiniteT< Idx2, NT2, Radial2 > &other)
Definition combined_coordinates.hh:35
device::array< NT, 2 > KOKKOS_FORCEINLINE_FUNCTION forward(const size_t m, const size_t p) const
Transform from the grid to the physical space.
Definition combined_coordinates.hh:54
Definition stack_coordinates.hh:50
Fermionic counterpart of BosonicCoordinates1DFiniteT, see there.
Definition combined_coordinates.hh:123
const NT p_start
Definition combined_coordinates.hh:207
const Radial & radial() const
The radial coordinate system, e.g. to rebuild this object with a different Idx or NT.
Definition combined_coordinates.hh:205
device::array< NT, 2 > KOKKOS_FORCEINLINE_FUNCTION forward(const size_t m, const size_t p) const
Transform from the grid to the physical space.
Definition combined_coordinates.hh:157
const NT m_start
Definition combined_coordinates.hh:207
FermionicCoordinates1DFiniteT(Idx m_start, Idx m_stop, NT m_T, size_t grid_extent, NT p_start, NT p_stop, NT p_bias)
Definition combined_coordinates.hh:129
const NT p_stop
Definition combined_coordinates.hh:207
const NT m_stop
Definition combined_coordinates.hh:207
size_t size() const
Definition combined_coordinates.hh:199
Radial radial_coordinates
Definition combined_coordinates.hh:218
const size_t grid_extent
Definition combined_coordinates.hh:215
Radial radial_type
Definition combined_coordinates.hh:127
std::tuple< Idx, NT > KOKKOS_FUNCTION backward(const NT m, const NT p) const
Transform from the physical space to the grid.
Definition combined_coordinates.hh:172
const NT m_T
Definition combined_coordinates.hh:207
const size_t m_size
Definition combined_coordinates.hh:215
device::array< size_t, 2 > KOKKOS_INLINE_FUNCTION from_linear_index(auto i) const
Definition combined_coordinates.hh:189
FermionicCoordinates1DFiniteT(const Radial2 &radial_coordinates, Idx m_start, Idx m_stop, NT m_T)
Definition combined_coordinates.hh:144
device::array< NT, 2 > KOKKOS_FORCEINLINE_FUNCTION forward(const device::array< IT, 2 > mp) const
Definition combined_coordinates.hh:161
FermionicCoordinates1DFiniteT(const FermionicCoordinates1DFiniteT< Idx2, NT2, Radial2 > &other)
Definition combined_coordinates.hh:138
device::array< size_t, 2 > sizes() const
Definition combined_coordinates.hh:200
std::string to_string() const
Definition combined_coordinates.hh:209
static constexpr size_t dim
Definition combined_coordinates.hh:126
NT ctype
Definition combined_coordinates.hh:125
FermionicMatsubaraValues< Idx, NT > matsubara_values
Definition combined_coordinates.hh:217
Definition stack_coordinates.hh:110
std::array< T, N > array
Definition kokkos.hh:155
Definition complex_math.hh:10