/home/runner/work/DiFfRG_current/DiFfRG_current/DiFfRG/include/DiFfRG/physics/integration/abstract_integrator.hh Source File#

DiFfRG: /home/runner/work/DiFfRG_current/DiFfRG_current/DiFfRG/include/DiFfRG/physics/integration/abstract_integrator.hh Source File
DiFfRG
abstract_integrator.hh
Go to the documentation of this file.
1#pragma once
2
3// DiFfRG
4#include "distribution.hh"
7
8namespace DiFfRG
9{
10 namespace internal
11 {
12 template <int dim, typename NT = double>
13 std::array<size_t, dim> make_int_grid(const JSONValue &json, const std::array<std::string, dim> &names)
14 {
15 std::array<size_t, dim> int_grid;
16 for (int i = 0; i < dim; ++i)
17 int_grid[i] = json.get_uint("/integration/" + names[i]);
18 if constexpr (get_type::is_autodiff<NT>) {
19 const double factor = json.get_double("/integration/jacobian_quadrature_factor", 0.8);
20 for (int i = 0; i < dim; ++i)
21 int_grid[i] = static_cast<size_t>(factor * int_grid[i]);
22 }
23 return int_grid;
24 }
25 } // namespace internal
26
27 template <typename KERNEL>
28 concept provides_regulator = requires { typename KERNEL::Regulator; };
29
30 template <typename NT, typename KERNEL, typename ctype, int dim, typename... ARGS>
31 NT multidim_kernel_call(const ARGS &...args)
32 {
33 if constexpr (dim == 0)
34 return KERNEL::kernel(args...);
35 else {
36 const ctype darg{};
37 return multidim_kernel_call<NT, KERNEL, ctype, dim - 1, ARGS...>(darg, args...);
38 }
39 }
40
41 template <typename NT, typename KERNEL, typename ctype, int dim, typename... ARGS>
43 requires(const ARGS &...args) { multidim_kernel_call<NT, KERNEL, ctype, dim, ARGS...>(args...); };
44
45 template <typename NT, typename KERNEL, typename... ARGS>
46 concept provides_constant = requires(const ARGS &...args) {
47 { KERNEL::constant(args...) } -> std::convertible_to<NT>;
48 };
49
50 template <typename NT, typename KERNEL, typename ctype, int dim, typename... ARGS>
52 (provides_kernel<NT, KERNEL, ctype, dim, ARGS...> && provides_constant<NT, KERNEL, ARGS...>);
53
54 template <typename NT, typename KERNEL, typename ctype, int dim, typename... ARGS>
56 {
57 static_assert(provides_kernel<NT, KERNEL, ctype, dim, ARGS...>,
58 "Kernel must provide a static 'kernel(...)' method callable with the integration arguments.");
59 static_assert(provides_constant<NT, KERNEL, ARGS...>,
60 "Kernel must provide a static 'constant(...)' method returning the numeric type.");
61 }
62
64 {
65 public:
66 void set_node_distribution(const NodeDistribution &distribution);
67
69
71
72 protected:
74 };
75} // namespace DiFfRG
Definition abstract_integrator.hh:64
void set_node_distribution(const NodeDistribution &distribution)
const NodeDistribution & get_node_distribution() const
void set_load_balancer(IntegrationLoadBalancer &load_balancer)
NodeDistribution node_distribution
Definition abstract_integrator.hh:73
Definition distribution.hh:18
A wrapper around the boost json value class.
Definition json.hh:19
double get_double(const std::string &key) const
Get the value of a key in the json object.
uint get_uint(const std::string &key) const
Get the value of a key in the json object.
Definition abstract_integrator.hh:51
Definition abstract_integrator.hh:46
Definition abstract_integrator.hh:42
Definition abstract_integrator.hh:28
constexpr bool is_autodiff
Definition types.hh:136
std::array< size_t, dim > make_int_grid(const JSONValue &json, const std::array< std::string, dim > &names)
Definition abstract_integrator.hh:13
Definition complex_math.hh:10
consteval void check_kernel_requirements()
Definition abstract_integrator.hh:55
NT multidim_kernel_call(const ARGS &...args)
Definition abstract_integrator.hh:31
Definition distribution.hh:7