/home/runner/work/DiFfRG_current/DiFfRG_current/DiFfRG/include/DiFfRG/common/quadrature/quadrature_provider.hh Source File#

DiFfRG: /home/runner/work/DiFfRG_current/DiFfRG_current/DiFfRG/include/DiFfRG/common/quadrature/quadrature_provider.hh Source File
DiFfRG
Discretization Framework for functional Renormalization Group flows
quadrature_provider.hh
Go to the documentation of this file.
1#pragma once
2
3// DiFfRG
9
10// standard library
11#include <mutex>
12#include <optional>
13
14namespace DiFfRG
15{
16 namespace internal
17 {
24 {
25 public:
30 template <typename NT = double> MatsubaraQuadrature<NT> &get_matsubara_quadrature(const NT T, const NT E)
31 {
32 std::lock_guard<std::mutex> lock(m_mutex);
33
34 if constexpr (std::is_same_v<NT, double>) {
35 auto T_it = find_T_d(T);
36 auto E_it = find_E_d(E, T_it);
37 return E_it->second;
38 } else if constexpr (std::is_same_v<NT, float>) {
39 auto T_it = find_T_f(T);
40 auto E_it = find_E_f(E, T_it);
41 return E_it->second;
42 }
43 static_assert(std::is_same_v<NT, double> || std::is_same_v<NT, float>,
44 "Unknown type requested of MatsubaraStorage::get_matsubara_quadrature");
45 }
46
55 template <typename NT = double> MatsubaraQuadrature<NT> &get_matsubara_exact_sum(const NT T, const NT freq_cutoff)
56 {
57 std::lock_guard<std::mutex> lock(m_mutex);
58
59 const int n = MatsubaraQuadrature<NT>::modes_below(T, freq_cutoff);
60
61 if constexpr (std::is_same_v<NT, double>) {
62 return find_exact_d(n, find_exact_T_d(T));
63 } else if constexpr (std::is_same_v<NT, float>) {
64 return find_exact_f(n, find_exact_T_f(T));
65 }
66 static_assert(std::is_same_v<NT, double> || std::is_same_v<NT, float>,
67 "Unknown type requested of MatsubaraStorage::get_matsubara_exact_sum");
68 }
69
79 template <typename NT = double>
80 MatsubaraQuadrature<NT> &get_finite_interval(const NT cutoff, const size_t order,
81 const Kokkos::View<const NT *, CPU_memory> gl_nodes,
82 const Kokkos::View<const NT *, CPU_memory> gl_weights)
83 {
84 std::lock_guard<std::mutex> lock(m_mutex);
85
86 if constexpr (std::is_same_v<NT, double>) {
87 return find_interval_d(cutoff, find_interval_order_d(order), gl_nodes, gl_weights);
88 } else if constexpr (std::is_same_v<NT, float>) {
89 return find_interval_f(cutoff, find_interval_order_f(order), gl_nodes, gl_weights);
90 }
91 static_assert(std::is_same_v<NT, double> || std::is_same_v<NT, float>,
92 "Unknown type requested of MatsubaraStorage::get_finite_interval");
93 }
94
95 void set_verbosity(int v);
96 void set_report_port(ReportPort port) { log = std::move(port); }
97
98 void set_vacuum_quad_size(const int size);
99 void set_min_matsubara_size(const int value);
100 void set_max_matsubara_size(const int value);
101 void set_matsubara_precision_factor(const double value);
102
105
113 template <typename NT = double> int predicted_size(const NT T, const NT typical_E) const
114 {
116 }
117
118 private:
121
122 template <typename NT = double> using StorageType = std::map<double, std::map<double, MatsubaraQuadrature<NT>>>;
123 template <typename NT = double> using SubStorageType = std::map<double, MatsubaraQuadrature<NT>>;
124
125 template <typename NT = double> using TemperatureIterator = typename StorageType<NT>::iterator;
126 template <typename NT = double> using EnergyIterator = typename StorageType<NT>::mapped_type::iterator;
127
130
133
134 template <typename NT = double> using ExactStorageType = std::map<double, std::map<int, MatsubaraQuadrature<NT>>>;
135 template <typename NT = double> using ExactTemperatureIterator = typename ExactStorageType<NT>::iterator;
136
139
142
145
148
149 template <typename NT = double>
150 using IntervalStorageType = std::map<size_t, std::map<double, MatsubaraQuadrature<NT>>>;
151 template <typename NT = double> using IntervalOrderIterator = typename IntervalStorageType<NT>::iterator;
152
155
157 const Kokkos::View<const double *, CPU_memory> n,
158 const Kokkos::View<const double *, CPU_memory> w);
160 const Kokkos::View<const float *, CPU_memory> n,
161 const Kokkos::View<const float *, CPU_memory> w);
162
165
166 int verbosity = 0;
167 // These must agree with the ConfigTree defaults read in QuadratureProvider's
168 // ConfigTree constructor, otherwise a default-constructed provider (every test, and any
169 // integrator built without a config) silently runs a different rule than production.
174
175 std::mutex m_mutex;
177 };
178
185 {
186 public:
187 template <typename NT = double> Quadrature<NT> &get_quadrature(const size_t order, const QuadratureType type)
188 {
189 std::lock_guard<std::mutex> lock(m_mutex);
190
191 if constexpr (std::is_same_v<NT, double>) {
192 auto type_it = find_type_d(type);
193 auto order_it = find_order_d(order, type_it);
194 return order_it->second;
195 } else if constexpr (std::is_same_v<NT, float>) {
196 auto type_it = find_type_f(type);
197 auto order_it = find_order_f(order, type_it);
198 return order_it->second;
199 }
200 static_assert(std::is_same_v<NT, double> || std::is_same_v<NT, float>,
201 "Unknown type requested of QuadratureStorage::get_quadrature");
202 }
203
204 void set_verbosity(int v);
205 void set_report_port(ReportPort port) { log = std::move(port); }
206
207 private:
208 Quadrature<double> &get_quadrature_d(const size_t order, const QuadratureType type);
209 Quadrature<float> &get_quadrature_f(const size_t order, const QuadratureType type);
210
211 template <typename NT = double> using StorageType = std::map<QuadratureType, std::map<size_t, Quadrature<NT>>>;
212 template <typename NT = double> using SubStorageType = std::map<size_t, Quadrature<NT>>;
213
214 template <typename NT = double> using TypeIterator = typename StorageType<NT>::iterator;
215 template <typename NT = double> using OrderIterator = typename StorageType<NT>::mapped_type::iterator;
216
219
222
225
226 int verbosity = 0;
227
228 std::mutex m_mutex;
230 };
231 } // namespace internal
232
239 {
240 public:
255
262 template <typename NT = double, typename MemorySpace = CPU_memory>
263 auto nodes(const size_t order, const QuadratureType type = QuadratureType::legendre)
264 {
265 return quadrature_storage.get_quadrature<NT>(order, type).template nodes<MemorySpace>();
266 }
267
274 template <typename NT = double, typename MemorySpace = CPU_memory>
275 auto weights(const size_t order, const QuadratureType type = QuadratureType::legendre)
276 {
277 return quadrature_storage.get_quadrature<NT>(order, type).template weights<MemorySpace>();
278 }
279
286 template <typename NT = double, typename MemorySpace = CPU_memory>
287 auto matsubara_nodes(const NT T, const NT typical_E)
288 {
289 return matsubara_storage.get_matsubara_quadrature<NT>(T, typical_E).template nodes<MemorySpace>();
290 }
291
298 template <typename NT = double, typename MemorySpace = CPU_memory>
299 auto matsubara_weights(const NT T, const NT typical_E)
300 {
301 return matsubara_storage.get_matsubara_quadrature<NT>(T, typical_E).template weights<MemorySpace>();
302 }
303
309 template <typename NT = double> const MatsubaraQuadrature<NT> &matsubara_rule(const NT T, const NT typical_E)
310 {
311 return matsubara_storage.get_matsubara_quadrature<NT>(T, typical_E);
312 }
313
316
320 template <typename NT = double> int matsubara_predicted_size(const NT T, const NT typical_E) const
321 {
322 return matsubara_storage.template predicted_size<NT>(T, typical_E);
323 }
324
329 template <typename NT = double> const MatsubaraQuadrature<NT> &matsubara_exact_sum(const NT T, const NT freq_cutoff)
330 {
331 return matsubara_storage.get_matsubara_exact_sum<NT>(T, freq_cutoff);
332 }
333
338 template <typename NT = double>
339 const MatsubaraQuadrature<NT> &matsubara_finite_interval(const NT cutoff, const size_t order)
340 {
342 return matsubara_storage.template get_finite_interval<NT>(cutoff, order, gl.template nodes<CPU_memory>(),
343 gl.template weights<CPU_memory>());
344 }
345
362 template <typename ExecutionSpace> ExecutionSpace next_execution_space()
363 {
364 if constexpr (std::is_same_v<typename ExecutionSpace::memory_space, CPU_memory>) {
365 return ExecutionSpace();
366 } else {
367 static constexpr size_t pool_size = 8;
368 static std::vector<ExecutionSpace> pool = [] {
369 const std::vector<int> weights(pool_size, 1);
370 return Kokkos::Experimental::partition_space(ExecutionSpace(), weights);
371 }();
372 static size_t next = 0;
373 return pool[next++ % pool_size];
374 }
375 }
376
377 private:
379
380 std::optional<RunReporter> own_logger;
383
385 };
386} // namespace DiFfRG
A hierarchical configuration tree, readable from JSON and TOML files.
Definition config_tree.hh:32
A quadrature rule for (bosonic) Matsubara frequencies, based on the method of Monien [1]....
Definition matsubara.hh:25
static int modes_below(const NT T, const NT freq_cutoff)
Number of positive Matsubara modes strictly inside a frequency cutoff.
static int predict_size(const NT T, const NT typical_E=1., const double precision_factor=1., const int step=2)
Nodes the Monien rule needs to reach past typical_E at this temperature.
A class that provides quadrature points and weights, in host and device memory. The quadrature points...
Definition quadrature_provider.hh:239
const MatsubaraQuadrature< NT > & matsubara_finite_interval(const NT cutoff, const size_t order)
Gauss-Legendre over the finite frequency interval a compactly supported summand lives on,...
Definition quadrature_provider.hh:339
int verbosity
Definition quadrature_provider.hh:384
internal::QuadratureStorage quadrature_storage
Definition quadrature_provider.hh:382
auto matsubara_weights(const NT T, const NT typical_E)
Get the quadrature weights for a quadrature of size quadrature_size.
Definition quadrature_provider.hh:299
int max_matsubara_size() const
The node ceiling /integration/max_matsubara_size, i.e. the budget the rule choice is made against.
Definition quadrature_provider.hh:315
auto nodes(const size_t order, const QuadratureType type=QuadratureType::legendre)
Get the quadrature points for a quadrature of size quadrature_size.
Definition quadrature_provider.hh:263
const MatsubaraQuadrature< NT > & matsubara_rule(const NT T, const NT typical_E)
The Matsubara rule itself, for callers that need more than nodes and weights – its size,...
Definition quadrature_provider.hh:309
auto matsubara_nodes(const NT T, const NT typical_E)
Get the quadrature points for a quadrature of size quadrature_size.
Definition quadrature_provider.hh:287
std::optional< RunReporter > own_logger
Definition quadrature_provider.hh:380
const MatsubaraQuadrature< NT > & matsubara_exact_sum(const NT T, const NT freq_cutoff)
The exact Matsubara sum for a summand that vanishes above freq_cutoff. See MatsubaraQuadrature::reini...
Definition quadrature_provider.hh:329
int matsubara_predicted_size(const NT T, const NT typical_E) const
Nodes the Monien rule would want at (T, typical_E). See MatsubaraStorage::predicted_size.
Definition quadrature_provider.hh:320
QuadratureProvider(const ConfigTree &config)
Construct a provider that reports the quadratures it builds.
void initialize(const ConfigTree &config, ReportPort log)
internal::MatsubaraStorage matsubara_storage
Definition quadrature_provider.hh:381
QuadratureProvider(const ConfigTree &config, ReportPort log)
auto weights(const size_t order, const QuadratureType type=QuadratureType::legendre)
Get the quadrature weights for a quadrature of size quadrature_size.
Definition quadrature_provider.hh:275
ExecutionSpace next_execution_space()
Hand out one of a small pool of execution space instances, round robin.
Definition quadrature_provider.hh:362
Definition quadrature.hh:56
Definition run_reporter.hh:96
A class that stores Matsubara quadrature points and weights for a given T, E. Its main purpose is to ...
Definition quadrature_provider.hh:24
ReportPort log
Definition quadrature_provider.hh:176
EnergyIterator< double > find_E_d(const double E, TemperatureIterator< double > T_it)
MatsubaraQuadrature< double > & find_interval_d(const double cutoff, IntervalOrderIterator< double > o_it, const Kokkos::View< const double *, CPU_memory > n, const Kokkos::View< const double *, CPU_memory > w)
int predicted_size(const NT T, const NT typical_E) const
Nodes the Monien rule would want at (T, typical_E) under THIS provider's dials.
Definition quadrature_provider.hh:113
std::map< size_t, std::map< double, MatsubaraQuadrature< NT > > > IntervalStorageType
Definition quadrature_provider.hh:150
std::map< double, std::map< int, MatsubaraQuadrature< NT > > > ExactStorageType
Definition quadrature_provider.hh:134
void set_min_matsubara_size(const int value)
ExactStorageType< float > exact_sums_f
Definition quadrature_provider.hh:147
void set_vacuum_quad_size(const int size)
MatsubaraQuadrature< float > & find_interval_f(const float cutoff, IntervalOrderIterator< float > o_it, const Kokkos::View< const float *, CPU_memory > n, const Kokkos::View< const float *, CPU_memory > w)
StorageType< double > quadratures_d
Definition quadrature_provider.hh:143
typename ExactStorageType< NT >::iterator ExactTemperatureIterator
Definition quadrature_provider.hh:135
ExactTemperatureIterator< float > find_exact_T_f(const float T)
EnergyIterator< float > find_E_f(const float E, TemperatureIterator< float > T_it)
MatsubaraQuadrature< NT > & get_matsubara_exact_sum(const NT T, const NT freq_cutoff)
The exact Matsubara sum for a summand of finite extent in the frequency.
Definition quadrature_provider.hh:55
void set_report_port(ReportPort port)
Definition quadrature_provider.hh:96
std::mutex m_mutex
Definition quadrature_provider.hh:175
void set_max_matsubara_size(const int value)
int min_matsubara_size
Definition quadrature_provider.hh:172
int vacuum_quad_size
Definition quadrature_provider.hh:170
ExactStorageType< double > exact_sums_d
Definition quadrature_provider.hh:146
MatsubaraQuadrature< NT > & get_matsubara_quadrature(const NT T, const NT E)
Return the MatsubaraQuadrature object for a given T, E.
Definition quadrature_provider.hh:30
TemperatureIterator< double > find_T_d(const double T)
IntervalOrderIterator< float > find_interval_order_f(const size_t order)
std::map< double, MatsubaraQuadrature< NT > > SubStorageType
Definition quadrature_provider.hh:123
MatsubaraQuadrature< float > & get_matsubara_quadrature_f(const float T, const float E)
IntervalStorageType< float > intervals_f
Definition quadrature_provider.hh:164
typename StorageType< NT >::mapped_type::iterator EnergyIterator
Definition quadrature_provider.hh:126
typename IntervalStorageType< NT >::iterator IntervalOrderIterator
Definition quadrature_provider.hh:151
IntervalOrderIterator< double > find_interval_order_d(const size_t order)
typename StorageType< NT >::iterator TemperatureIterator
Definition quadrature_provider.hh:125
int verbosity
Definition quadrature_provider.hh:166
MatsubaraQuadrature< double > & find_exact_d(const int n, ExactTemperatureIterator< double > T_it)
IntervalStorageType< double > intervals_d
Definition quadrature_provider.hh:163
MatsubaraQuadrature< NT > & get_finite_interval(const NT cutoff, const size_t order, const Kokkos::View< const NT *, CPU_memory > gl_nodes, const Kokkos::View< const NT *, CPU_memory > gl_weights)
Gauss-Legendre over [-cutoff, cutoff] for a summand of finite extent; see MatsubaraQuadrature::reinit...
Definition quadrature_provider.hh:80
TemperatureIterator< float > find_T_f(const float T)
ExactTemperatureIterator< double > find_exact_T_d(const double T)
MatsubaraQuadrature< float > & find_exact_f(const int n, ExactTemperatureIterator< float > T_it)
void set_matsubara_precision_factor(const double value)
double matsubara_precision_factor
Definition quadrature_provider.hh:171
int max_matsubara_size
Definition quadrature_provider.hh:173
MatsubaraQuadrature< double > & get_matsubara_quadrature_d(const double T, const double E)
StorageType< float > quadratures_f
Definition quadrature_provider.hh:144
std::map< double, std::map< double, MatsubaraQuadrature< NT > > > StorageType
Definition quadrature_provider.hh:122
int get_max_matsubara_size() const
The node ceiling every rule built here is clamped to.
Definition quadrature_provider.hh:104
A class that stores Quadrature points and weights for a given type and order Its main purpose is to a...
Definition quadrature_provider.hh:185
typename StorageType< NT >::mapped_type::iterator OrderIterator
Definition quadrature_provider.hh:215
Quadrature< NT > & get_quadrature(const size_t order, const QuadratureType type)
Definition quadrature_provider.hh:187
TypeIterator< float > find_type_f(const QuadratureType type)
std::mutex m_mutex
Definition quadrature_provider.hh:228
std::map< size_t, Quadrature< NT > > SubStorageType
Definition quadrature_provider.hh:212
int verbosity
Definition quadrature_provider.hh:226
TypeIterator< double > find_type_d(const QuadratureType type)
typename StorageType< NT >::iterator TypeIterator
Definition quadrature_provider.hh:214
void set_report_port(ReportPort port)
Definition quadrature_provider.hh:205
OrderIterator< double > find_order_d(const size_t order, TypeIterator< double > type_it)
StorageType< float > quadratures_f
Definition quadrature_provider.hh:224
Quadrature< double > & get_quadrature_d(const size_t order, const QuadratureType type)
ReportPort log
Definition quadrature_provider.hh:229
std::map< QuadratureType, std::map< size_t, Quadrature< NT > > > StorageType
Definition quadrature_provider.hh:211
OrderIterator< float > find_order_f(const size_t order, TypeIterator< float > type_it)
StorageType< double > quadratures_d
Definition quadrature_provider.hh:223
Quadrature< float > & get_quadrature_f(const size_t order, const QuadratureType type)
Definition complex_math.hh:10
@ config
/discretization/threads.
Definition quadrature.hh:44
@ legendre
Definition quadrature.hh:45