flexiblesusy is hosted by Hepforge, IPPP Durham
FlexibleSUSY
Cl2.cpp
Go to the documentation of this file.
1// ====================================================================
2// This file is part of FlexibleSUSY.
3//
4// FlexibleSUSY is free software: you can redistribute it and/or modify
5// it under the terms of the GNU General Public License as published
6// by the Free Software Foundation, either version 3 of the License,
7// or (at your option) any later version.
8//
9// FlexibleSUSY is distributed in the hope that it will be useful, but
10// WITHOUT ANY WARRANTY; without even the implied warranty of
11// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12// General Public License for more details.
13//
14// You should have received a copy of the GNU General Public License
15// along with FlexibleSUSY. If not, see
16// <http://www.gnu.org/licenses/>.
17// ====================================================================
18
19#include "Cl2.hpp"
20#include <cmath>
21
22namespace flexiblesusy {
23
31double Cl2(double x) noexcept
32{
33 const double PI = 3.14159265358979324;
34 const double PI2 = 2*PI, PIH = PI/2, PI28 = PI*PI/8;
35 double sgn = 1;
36
37 if (x < 0) {
38 x = -x;
39 sgn = -1;
40 }
41
42 if (x >= PI2) {
43 x = std::fmod(x, PI2);
44 }
45
46 if (x > PI) {
47 const double p0 = 6.28125;
48 const double p1 = 0.0019353071795864769253;
49 x = (p0 - x) + p1;
50 sgn = -sgn;
51 }
52
53 if (x == 0 || x == PI) {
54 return 0;
55 }
56
57 double h = 0;
58
59 if (x < PIH) {
60 const double P[] = {
61 1.3888888888888889e-02, -4.3286930203743071e-04,
62 3.2779814789973427e-06, -3.6001540369575084e-09
63 };
64 const double Q[] = {
65 1.0000000000000000e+00, -3.6166589746694121e-02,
66 3.6015827281202639e-04, -8.3646182842184428e-07
67 };
68 const double y = x*x;
69 const double y2 = y*y;
70 const double p = P[0] + y * P[1] + y2 * (P[2] + y * P[3]);
71 const double q = Q[0] + y * Q[1] + y2 * (Q[2] + y * Q[3]);
72
73 h = x*(1 - std::log(x) + y*p/q);
74 } else {
75 const double P[] = {
76 6.4005702446195512e-01, -2.0641655351338783e-01,
77 2.4175305223497718e-02, -1.2355955287855728e-03,
78 2.5649833551291124e-05, -1.4783829128773320e-07
79 };
80 const double Q[] = {
81 1.0000000000000000e+00, -2.5299102015666356e-01,
82 2.2148751048467057e-02, -7.8183920462457496e-04,
83 9.5432542196310670e-06, -1.8184302880448247e-08
84 };
85 const double y = PI - x;
86 const double z = y*y - PI28;
87 const double z2 = z*z;
88 const double z4 = z2*z2;
89 const double p = P[0] + z * P[1] + z2 * (P[2] + z * P[3]) +
90 z4 * (P[4] + z * P[5]);
91 const double q = Q[0] + z * Q[1] + z2 * (Q[2] + z * Q[3]) +
92 z4 * (Q[4] + z * Q[5]);
93
94 h = y*p/q;
95 }
96
97 return sgn*h;
98}
99
110long double Cl2(long double x) noexcept
111{
112 const long double PI = 3.14159265358979323846264338327950288L;
113 const long double PI2 = 2*PI, PIH = PI/2, PI28 = PI*PI/8;
114 long double sgn = 1;
115
116 if (x < 0) {
117 x = -x;
118 sgn = -1;
119 }
120
121 if (x >= PI2) {
122 x = std::fmod(x, PI2);
123 }
124
125 if (x > PI) {
126 const long double p0 = 6.28125L;
127 const long double p1 = 0.0019353071795864769252867665590057683943L;
128 x = (p0 - x) + p1;
129 sgn = -sgn;
130 }
131
132 if (x == 0 || x == PI) {
133 return 0;
134 }
135
136 long double h = 0;
137
138 if (x < PIH) {
139 const long double P[] = {
140 1.397578291120963523206040867955323306427e-02L,
141 -1.352264019891065415863834380176236559873e-03L,
142 5.292882735889014643812912154970234565053e-05L,
143 -1.073753987723414895538739538414225390109e-06L,
144 1.200707648340635046555652744163248062266e-08L,
145 -7.252858952718044684640648391665783926850e-11L,
146 2.140267450520462605982610727277758328875e-13L,
147 -2.396401118613241903411604342093433593468e-16L,
148 4.441828690926415235588391389499684215009e-20L
149 };
150 const long double Q[] = {
151 1.000000000000000000000000000000000000000e+00L,
152 -1.018694323414614410071369720193716012304e-01L,
153 4.248408782245281612900840467370146443889e-03L,
154 -9.337710301347963985908084056584187570954e-05L,
155 1.159379163193822053103946363960603543601e-06L,
156 -8.083352720393357000801675734774176899515e-09L,
157 2.949313240431512997069808854213308209519e-11L,
158 -4.742700419624204182400715964695278593777e-14L,
159 2.158380636740175386190809152807629331877e-17L
160 };
161 const long double y = x*x;
162 const long double z = y - PI28;
163 const long double z2 = z*z;
164 const long double z4 = z2*z2;
165 const long double z8 = z4*z4;
166 const long double p = P[0] + z * P[1] + z2 * (P[2] + z * P[3]) +
167 z4 * (P[4] + z * P[5] + z2 * (P[6] + z * P[7])) + z8 * P[8];
168 const long double q = Q[0] + z * Q[1] + z2 * (Q[2] + z * Q[3]) +
169 z4 * (Q[4] + z * Q[5] + z2 * (Q[6] + z * Q[7])) + z8 * Q[8];
170
171 h = x*(1 - std::log(x) + y*p/q);
172 } else {
173 const long double P[] = {
174 6.400570244619551220929428522356830562481e-01L,
175 -4.651631624886004423703445967760673575997e-01L,
176 1.487130845262105644024901814213146749895e-01L,
177 -2.749665174801454303884783494225610407035e-02L,
178 3.251522465413666561950482170352156048203e-03L,
179 -2.567438381297475310848635518657180974512e-04L,
180 1.372076105130164861564020074178493529151e-05L,
181 -4.924179093673498700461153483531075799113e-07L,
182 1.153267936031337440182387313169828395860e-08L,
183 -1.667578310677508029208023423625588832295e-10L,
184 1.348437292247918547169070120217729056878e-12L,
185 -5.052245092698477071447850656280954693011e-15L,
186 5.600638109466570497480415519182233229048e-18L
187 };
188 const long double Q[] = {
189 1.000000000000000000000000000000000000000e+00L,
190 -6.572465772185054284667746526549393897676e-01L,
191 1.886234634096976582977630140163583172173e-01L,
192 -3.103347567899737687117030083178445406132e-02L,
193 3.230860399291224478336071920154030050234e-03L,
194 -2.216546569335921728108984951507368387512e-04L,
195 1.011949972138985643994631167412420906088e-05L,
196 -3.033400935206767852937290458763547850384e-07L,
197 5.748454611964843057644023468691231929690e-09L,
198 -6.408350048413952604351408631173781906861e-11L,
199 3.678584366662951864267349037579031493395e-13L,
200 -8.240439699357036167611014086997683837396e-16L,
201 3.041049046123062158788159773779755292771e-19L
202 };
203 const long double y = PI - x;
204 const long double z = y*y - PI28;
205 const long double z2 = z*z;
206 const long double z4 = z2*z2;
207 const long double z8 = z4*z4;
208 const long double p = P[0] + z * P[1] + z2 * (P[2] + z * P[3]) +
209 z4 * (P[4] + z * P[5] + z2 * (P[6] + z * P[7])) +
210 z8 * (P[8] + z * P[9] + z2 * (P[10] + z * P[11]) + z4 * P[12]);
211 const long double q = Q[0] + z * Q[1] + z2 * (Q[2] + z * Q[3]) +
212 z4 * (Q[4] + z * Q[5] + z2 * (Q[6] + z * Q[7])) +
213 z8 * (Q[8] + z * Q[9] + z2 * (Q[10] + z * Q[11]) + z4 * Q[12]);
214
215 h = y*p/q;
216 }
217
218 return sgn*h;
219}
220
221} // namespace flexiblesusy
#define P(i)
Definition: defs.h:630
double Cl2(double x) noexcept
Clausen function .
Definition: Cl2.cpp:31
Complex< T > log(const Complex< T > &z) noexcept
Definition: complex.hpp:54