OPAL (Object Oriented Parallel Accelerator Library)  2.2.0
OPAL
InverseGauss.cpp
Go to the documentation of this file.
1 // ------------------------------------------------------------------------
2 // $RCSfile: InverseGauss.cpp,v $
3 // ------------------------------------------------------------------------
4 // $Revision: 1.2 $
5 // ------------------------------------------------------------------------
6 // Copyright: see Copyright.readme
7 // ------------------------------------------------------------------------
8 //
9 // Inverse Gaussian.
10 //
11 // ------------------------------------------------------------------------
12 // Class category: Utilities
13 // ------------------------------------------------------------------------
14 //
15 // $Date: 2001/08/24 19:33:44 $
16 // $Author: jsberg $
17 //
18 // ------------------------------------------------------------------------
19 
20 #include "Utilities/InverseGauss.h"
21 #include "Utilities/DomainError.h"
22 #include <cmath>
23 
24 
25 //@ Inverse Gaussian density function.
26 double InverseGauss(double p0) {
27  static const double a0 = 2.5050240;
28  static const double a1 = 2.7724523;
29  static const double a2 = 2.1635544;
30  static const double a3 = 4.5585614e+01;
31  static const double b0 = 2.2157257;
32  static const double b1 = -1.4946512e+01;
33  static const double b2 = 7.9731883e+01;
34  static const double b3 = -2.7713713e+02;
35  static const double b4 = 4.0314354e+02;
36  static const double c0 = 2.4335936;
37  static const double c1 = -2.4719139e+01;
38  static const double c2 = 2.4648581e+02;
39  static const double c3 = -1.5585873e+03;
40  static const double c4 = 4.1394487e+03;
41  static const double d0 = 2.6346872;
42  static const double d1 = -4.1028898e+01;
43  static const double d2 = 7.4942805e+02;
44  static const double d3 = -8.5400893e+03;
45  static const double d4 = 4.0895693e+04;
46  static const double e0 = 2.8224654;
47  static const double e1 = -6.8317697e+01;
48  static const double e2 = 2.2566998e+03;
49  static const double e3 = -4.6004775e+04;
50  static const double e4 = 3.9399134e+05;
51  static const double f0 = -8.1807613e-02;
52  static const double f1 = -2.8358733;
53  static const double f2 = 1.4902469;
54  static const double pp1 = 0.334624883253;
55  static const double qq2 = 0.090230446775;
56  static const double qq3 = 0.049905685242;
57  static const double qq4 = 0.027852994157;
58  static const double qq5 = 0.015645650215;
59 
60  double p = p0 - 0.5;
61  double p1 = std::abs(p);
62  if(p1 < pp1) {
63  double p2 = p * p;
64  return (((a3 * p2 + a2) * p2 + a1) * p2 + a0) * p;
65  } else {
66  double gauinv;
67  double q = 0.5 - p1;
68 
69  if(q > qq2) {
70  gauinv = (((b4 * q + b3) * q + b2) * q + b1) * q + b0;
71  } else if(q > qq3) {
72  gauinv = (((c4 * q + c3) * q + c2) * q + c1) * q + c0;
73  } else if(q > qq4) {
74  gauinv = (((d4 * q + d3) * q + d2) * q + d1) * q + d0;
75  } else if(q > qq5) {
76  gauinv = (((e4 * q + e3) * q + e2) * q + e1) * q + e0;
77  } else if(q > 0.0) {
78  double t = sqrt(- 2.0 * log(q));
79  gauinv = t + f0 + f1 / (f2 + t);
80  } else {
81  throw DomainError("InverseGauss()");
82  }
83 
84  if(p < 0.0) gauinv = - gauinv;
85  return gauinv;
86  }
87 }
PETE_TUTree< FnAbs, typename T::PETE_Expr_t > abs(const PETE_Expr< T > &l)
double InverseGauss(double p0)
Inverse Gaussian density function.
Tps< T > log(const Tps< T > &x)
Natural logarithm.
Definition: TpsMath.h:182
constexpr double a0
Bohr radius in m.
Definition: Physics.h:73
Tps< T > sqrt(const Tps< T > &x)
Square root.
Definition: TpsMath.h:91
Domain error exception.
Definition: DomainError.h:32