18 #ifndef BUBBLEPROFILER_INTEGRATION_UTILS_HPP_INCLUDED 19 #define BUBBLEPROFILER_INTEGRATION_UTILS_HPP_INCLUDED 24 #include <gsl/gsl_errno.h> 25 #include <gsl/gsl_integration.h> 39 double abs_tol,
double rel_tol,
40 std::size_t max_intervals,
43 gsl_integration_workspace* workspace
44 = gsl_integration_workspace_alloc(max_intervals);
50 const auto handler = gsl_set_error_handler_off();
53 [workspace, handler]() {
54 gsl_integration_workspace_free(workspace);
55 gsl_set_error_handler(handler);
59 func.function = [](
double x,
void* params) {
60 return (*static_cast<F*>(params))(x);
66 const int status = gsl_integration_qag(&func, a, b, abs_tol, rel_tol,
69 workspace, &result, &error);
71 return std::make_tuple(status, result, error);
76 double abs_tol,
double rel_tol,
77 std::size_t max_intervals)
79 gsl_integration_workspace* workspace
80 = gsl_integration_workspace_alloc(max_intervals);
86 const auto handler = gsl_set_error_handler_off();
89 [workspace, handler]() {
90 gsl_integration_workspace_free(workspace);
91 gsl_set_error_handler(handler);
95 func.function = [](
double x,
void* params) {
96 return (*static_cast<F*>(params))(x);
102 const int status = gsl_integration_qags(&func, a, b, abs_tol, rel_tol,
104 workspace, &result, &error);
106 return std::make_tuple(status, result, error);
109 template <
typename F>
113 std::size_t n_intervals)
115 if (n_intervals < 3) {
116 throw Setup_error(
"at least 3 intervals required in CQUAD routine");
119 gsl_integration_cquad_workspace* workspace
120 = gsl_integration_cquad_workspace_alloc(n_intervals);
126 const auto handler = gsl_set_error_handler_off();
129 [workspace, handler]() {
130 gsl_integration_cquad_workspace_free(workspace);
131 gsl_set_error_handler(handler);
135 func.function = [](
double x,
void* params) {
136 return (*static_cast<F*>(params))(x);
142 std::size_t n_evals = 0;
143 const int status = gsl_integration_cquad(&func, a, b, abs_tol, rel_tol,
144 workspace, &result, &error,
147 return std::make_tuple(status, result, error, n_evals);
std::tuple< int, double, double > integrate_gsl_qag(F f, double a, double b, double abs_tol, double rel_tol, std::size_t max_intervals, Integration_rule rule)
std::tuple< int, double, double, int > integrate_gsl_cquad(F f, double a, double b, double abs_tol, double rel_tol, std::size_t n_intervals)
Exception indicating that memory allocation failed.
constexpr RAII_guard< F > make_raii_guard(F f)
std::tuple< int, double, double > integrate_gsl_qags(F f, double a, double b, double abs_tol, double rel_tol, std::size_t max_intervals)
Exception indicating general setup error.
int get_integration_rule_key(Integration_rule)