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) {
54 return x;
55 } else if (x == PI) {
56 return 0;
57 }
58
59 double h = 0;
60
61 if (x < PIH) {
62 const double P[] = {
63 1.3888888888888889e-02, -4.3286930203743071e-04,
64 3.2779814789973427e-06, -3.6001540369575084e-09
65 };
66 const double Q[] = {
67 1.0000000000000000e+00, -3.6166589746694121e-02,
68 3.6015827281202639e-04, -8.3646182842184428e-07
69 };
70 const double y = x*x;
71 const double y2 = y*y;
72 const double p = P[0] + y * P[1] + y2 * (P[2] + y * P[3]);
73 const double q = Q[0] + y * Q[1] + y2 * (Q[2] + y * Q[3]);
74
75 h = x*(1 - std::log(x) + y*p/q);
76 } else {
77 const double P[] = {
78 6.4005702446195512e-01, -2.0641655351338783e-01,
79 2.4175305223497718e-02, -1.2355955287855728e-03,
80 2.5649833551291124e-05, -1.4783829128773320e-07
81 };
82 const double Q[] = {
83 1.0000000000000000e+00, -2.5299102015666356e-01,
84 2.2148751048467057e-02, -7.8183920462457496e-04,
85 9.5432542196310670e-06, -1.8184302880448247e-08
86 };
87 const double y = PI - x;
88 const double z = y*y - PI28;
89 const double z2 = z*z;
90 const double z4 = z2*z2;
91 const double p = P[0] + z * P[1] + z2 * (P[2] + z * P[3]) +
92 z4 * (P[4] + z * P[5]);
93 const double q = Q[0] + z * Q[1] + z2 * (Q[2] + z * Q[3]) +
94 z4 * (Q[4] + z * Q[5]);
95
96 h = y*p/q;
97 }
98
99 return sgn*h;
100}
101
112long double Cl2(long double x) noexcept
113{
114 const long double PI = 3.14159265358979323846264338327950288L;
115 const long double PI2 = 2*PI, PIH = PI/2, PI28 = PI*PI/8;
116 long double sgn = 1;
117
118 if (x < 0) {
119 x = -x;
120 sgn = -1;
121 }
122
123 if (x >= PI2) {
124 x = std::fmod(x, PI2);
125 }
126
127 if (x > PI) {
128 const long double p0 = 6.28125L;
129 const long double p1 = 0.0019353071795864769252867665590057683943L;
130 x = (p0 - x) + p1;
131 sgn = -sgn;
132 }
133
134 if (x == 0) {
135 return x;
136 } else if (x == PI) {
137 return 0;
138 }
139
140 long double h = 0;
141
142 if (x < PIH) {
143 const long double P[] = {
144 1.397578291120963523206040867955323306427e-02L,
145 -1.352264019891065415863834380176236559873e-03L,
146 5.292882735889014643812912154970234565053e-05L,
147 -1.073753987723414895538739538414225390109e-06L,
148 1.200707648340635046555652744163248062266e-08L,
149 -7.252858952718044684640648391665783926850e-11L,
150 2.140267450520462605982610727277758328875e-13L,
151 -2.396401118613241903411604342093433593468e-16L,
152 4.441828690926415235588391389499684215009e-20L
153 };
154 const long double Q[] = {
155 1.000000000000000000000000000000000000000e+00L,
156 -1.018694323414614410071369720193716012304e-01L,
157 4.248408782245281612900840467370146443889e-03L,
158 -9.337710301347963985908084056584187570954e-05L,
159 1.159379163193822053103946363960603543601e-06L,
160 -8.083352720393357000801675734774176899515e-09L,
161 2.949313240431512997069808854213308209519e-11L,
162 -4.742700419624204182400715964695278593777e-14L,
163 2.158380636740175386190809152807629331877e-17L
164 };
165 const long double y = x*x;
166 const long double z = y - PI28;
167 const long double z2 = z*z;
168 const long double z4 = z2*z2;
169 const long double z8 = z4*z4;
170 const long double p = P[0] + z * P[1] + z2 * (P[2] + z * P[3]) +
171 z4 * (P[4] + z * P[5] + z2 * (P[6] + z * P[7])) + z8 * P[8];
172 const long double q = Q[0] + z * Q[1] + z2 * (Q[2] + z * Q[3]) +
173 z4 * (Q[4] + z * Q[5] + z2 * (Q[6] + z * Q[7])) + z8 * Q[8];
174
175 h = x*(1 - std::log(x) + y*p/q);
176 } else {
177 const long double P[] = {
178 6.400570244619551220929428522356830562481e-01L,
179 -4.651631624886004423703445967760673575997e-01L,
180 1.487130845262105644024901814213146749895e-01L,
181 -2.749665174801454303884783494225610407035e-02L,
182 3.251522465413666561950482170352156048203e-03L,
183 -2.567438381297475310848635518657180974512e-04L,
184 1.372076105130164861564020074178493529151e-05L,
185 -4.924179093673498700461153483531075799113e-07L,
186 1.153267936031337440182387313169828395860e-08L,
187 -1.667578310677508029208023423625588832295e-10L,
188 1.348437292247918547169070120217729056878e-12L,
189 -5.052245092698477071447850656280954693011e-15L,
190 5.600638109466570497480415519182233229048e-18L
191 };
192 const long double Q[] = {
193 1.000000000000000000000000000000000000000e+00L,
194 -6.572465772185054284667746526549393897676e-01L,
195 1.886234634096976582977630140163583172173e-01L,
196 -3.103347567899737687117030083178445406132e-02L,
197 3.230860399291224478336071920154030050234e-03L,
198 -2.216546569335921728108984951507368387512e-04L,
199 1.011949972138985643994631167412420906088e-05L,
200 -3.033400935206767852937290458763547850384e-07L,
201 5.748454611964843057644023468691231929690e-09L,
202 -6.408350048413952604351408631173781906861e-11L,
203 3.678584366662951864267349037579031493395e-13L,
204 -8.240439699357036167611014086997683837396e-16L,
205 3.041049046123062158788159773779755292771e-19L
206 };
207 const long double y = PI - x;
208 const long double z = y*y - PI28;
209 const long double z2 = z*z;
210 const long double z4 = z2*z2;
211 const long double z8 = z4*z4;
212 const long double p = P[0] + z * P[1] + z2 * (P[2] + z * P[3]) +
213 z4 * (P[4] + z * P[5] + z2 * (P[6] + z * P[7])) +
214 z8 * (P[8] + z * P[9] + z2 * (P[10] + z * P[11]) + z4 * P[12]);
215 const long double q = Q[0] + z * Q[1] + z2 * (Q[2] + z * Q[3]) +
216 z4 * (Q[4] + z * Q[5] + z2 * (Q[6] + z * Q[7])) +
217 z8 * (Q[8] + z * Q[9] + z2 * (Q[10] + z * Q[11]) + z4 * Q[12]);
218
219 h = y*p/q;
220 }
221
222 return sgn*h;
223}
224
225} // namespace flexiblesusy
#define P(i)
Definition defs.h:630
double Cl2(double x) noexcept
Clausen function .
Definition Cl2.cpp:31