CORSIKA  @c8_version@
The framework to simulate particle cascades for astroparticle physics
CubicSolver.hpp
Go to the documentation of this file.
1 /*
2  * (c) Copyright 2021 CORSIKA Project, corsika-project@lists.kit.edu
3  *
4  * This software is distributed under the terms of the GNU General Public
5  * Licence version 3 (GPL Version 3). See file LICENSE for a full version of
6  * the license.
7  */
8 
9 #pragma once
10 
11 #include <vector>
12 #include <cmath>
13 #include <algorithm>
14 #include <numeric>
15 #include <complex>
16 
17 #include <corsika/framework/utility/QuadraticSolver.hpp>
19 
20 #include <boost/multiprecision/cpp_bin_float.hpp>
21 
26 namespace corsika {
27 
33  namespace andre {
37  std::vector<double> solveP3(long double a, long double b, long double c,
38  long double d, double const epsilon = 1e-12);
39  } // namespace andre
40 
44  inline std::vector<double> solve_cubic_depressed_disciminant_real(
45  long double p, long double q, long double const disc, double const epsilon = 1e-12);
46 
47  std::vector<double> solve_cubic_depressed_real(long double p, long double q,
48  double const epsilon = 1e-12);
49 
55  std::vector<double> solve_cubic_real_analytic(long double a, long double b,
56  long double c, long double d,
57  double const epsilon = 1e-12);
58 
66  template <typename T>
67  T cubic_function(T x, T a, T b, T c, T d);
68 
72  template <typename T>
73  T cubic_function_dfdx(T x, T a, T b, T c);
74 
78  template <typename T>
79  T cubic_function_d2fd2x(T x, T a, T b);
80 
86  std::vector<double> solve_cubic_real(long double a, long double b, long double c,
87  long double d, double const epsilon = 1e-12);
88 
90 
91 } // namespace corsika
92 
93 #include <corsika/detail/framework/utility/CubicSolver.inl>
T cubic_function_d2fd2x(T x, T a, T b)
std::vector< double > solveP3(long double a, long double b, long double c, long double d, double const epsilon=1e-12)
Solve a x^3 + b x^2 + c x + d = 0.
T cubic_function_dfdx(T x, T a, T b, T c)
CORSIKA8 logging utilities.
std::vector< double > solve_cubic_real(long double a, long double b, long double c, long double d, double const epsilon=1e-12)
Iterative approach to solve: a x^3 + b x^2 + c x + d = 0.
`, since they are used everywhere as integral part of the framework.
std::vector< double > solve_cubic_depressed_disciminant_real(long double p, long double q, long double const disc, double const epsilon=1e-12)
Solve depressed cubic: x^3 + p x + q = 0.
T cubic_function(T x, T a, T b, T c, T d)
Cubic function.
std::vector< double > solve_cubic_real_analytic(long double a, long double b, long double c, long double d, double const epsilon=1e-12)
Solve a x^3 + b x^2 + c x + d = 0.