CLASSpp Manual
Cosmology reference and developer manual
Loading...
Searching...
No Matches
quadrature.h
1#ifndef __QSS__
2#define __QSS__
3
4#define _MIN_NUMBER_OF_LAGUERRE_POINTS_ 5
5
6/******************************************/
7/* Quadrature Sampling Strategy for CLASS */
8/* 10/12 2010 */
9/* Thomas Tram */
10/******************************************/
11#include <memory>
12#include <vector>
13
14#include "common.h"
15
16enum quadrature_method {
17 qm_auto,
18 qm_Laguerre,
19 qm_trapz_indefinite,
20 qm_trapz,
21 qm_GB_Laguerre,
22 qm_FermiDirac,
23};
24
31 bool active = false;
32 double alpha = 0.;
33 double x_times_alpha = 0.;
34};
35
36/* Structures for QSS */
37
38typedef struct adaptive_integration_tree_node {
39 /* binary tree node: */
40 double I; /* Estimate of integral */
41 double err; /* Estimated error */
42 std::vector<double> x; /* Pointer to the abscissas of node */
43 std::vector<double> w; /* Pointer to the corresponding weights */
44 int leaf_childs; /* Number of leafs under current node. 1 means that the node is a leaf. */
45 /* Pointer to children: */
46 std::unique_ptr<struct adaptive_integration_tree_node> left, right; /* Pointer to left child. */
47} qss_node;
48
49void get_qsampling(double* x,
50 double* w,
51 int* N,
52 int N_max,
53 double rtol,
54 double* qvec,
55 int qsiz,
56 void (*test)(void* params_for_function, double q, double* psi),
57 void (*function)(void* params_for_function, double q, double* f0),
58 void* params_for_function);
59bool get_qsampling_manual(double* x,
60 double* w,
61 double* dq,
62 int N,
63 double qmax,
64 enum quadrature_method method,
65 double* qvec,
66 int qsiz,
67 void (*function)(void* params_for_function, double q, double* f0),
68 void* params_for_function,
69 const GBQuadParams& gb);
70void sort_x_and_w(double* x, double* w, double* workx, double* workw, int startidx, int endidx);
71void get_leaf_x_and_w(qss_node* node, int* ind, double* x, double* w, int isindefinite);
72void reduce_tree(qss_node* node, int level);
73void leaf_count(qss_node* node);
74double get_integral(qss_node* node, int level);
75void gk_adapt(std::unique_ptr<qss_node>& node,
76 void (*test)(void* params_for_function, double q, double* psi),
77 void (*function)(void* params_for_function, double q, double* f0),
78 void* params_for_function,
79 double tol,
80 int treemode,
81 double a,
82 double b,
83 int isindefinite);
84void compute_Laguerre(
85 double* x, double* w, int N, double alpha, double* b, double* c, int totalweight);
86
92bool compute_FermiDirac(double* x, double* w, int N);
93void gk_quad(void (*test)(void* params_for_function, double q, double* psi),
94 void (*function)(void* params_for_function, double q, double* f0),
95 void* params_for_function,
96 qss_node* node,
97 double a,
98 double b,
99 int isindefinite);
100
101void quadrature_gauss_legendre(double* mu, double* w8, int n, double tol);
102
103#endif
Definition quadrature.h:30