00001 #include <UnitTest++.h>
00002 #include "cddefines.h"
00003 #include "thirdparty.h"
00004
00005 namespace {
00006
00007
00008
00009 TEST(TestFactorial)
00010 {
00011 CHECK( fp_equal( factorial(0), 1. ) );
00012 CHECK( fp_equal( factorial(1), 1. ) );
00013 CHECK( fp_equal( factorial(2), 2. ) );
00014 CHECK( fp_equal( factorial(10), 3628800. ) );
00015 CHECK( fp_equal( factorial(170), 7.257415615307998967396728211129316e306 ) );
00016 }
00017
00018 TEST(TestLogFactorial)
00019 {
00020 CHECK( fp_equal( lfactorial(0), 0. ) );
00021 CHECK( fp_equal( lfactorial(1), 0. ) );
00022 CHECK( fp_equal( lfactorial(2), 3.01029995663981195213738894725e-1, 10 ) );
00023 CHECK( fp_equal( lfactorial(10), 6.55976303287679375117476123996e0, 10 ) );
00024 CHECK( fp_equal( lfactorial(170), 3.06860781994828320192380273111e2, 10 ) );
00025 CHECK( fp_equal( lfactorial(1700), 4.75547688279135071178908638597e3, 10 ) );
00026 }
00027
00028 TEST(TestCDGamma)
00029 {
00030 complex<double> y = cdgamma( complex<double>(1.,0.) );
00031 CHECK( fp_equal( y.real(), 1., 10 ) && fp_equal( y.imag(), 0. ) );
00032 y = cdgamma( complex<double>(2.,0.) );
00033 CHECK( fp_equal( y.real(), 1., 10 ) && fp_equal( y.imag(), 0. ) );
00034 y = cdgamma( complex<double>(11.,0.) );
00035 CHECK( fp_equal( y.real(), 3628800., 50 ) && fp_equal( y.imag(), 0. ) );
00036 y = cdgamma( complex<double>(-0.5,0.) );
00037 CHECK( fp_equal( y.real(), -3.544907701811032054596334966682277e0, 10 ) &&
00038 fp_equal( y.imag(), 0. ) );
00039 y = cdgamma( complex<double>(0.,1.) );
00040 CHECK( fp_equal( y.real(), -1.549498283018106851249551304838863e-1, 10 ) &&
00041 fp_equal( y.imag(), -4.980156681183560427136911174621973e-1, 10 ) );
00042 y = cdgamma( complex<double>(-1.,-2.) );
00043 CHECK( fp_equal( y.real(), -3.23612885501927256868232032760969e-2, 30 ) &&
00044 fp_equal( y.imag(), -1.122942423463261735043406872030743e-2, 30 ) );
00045 }
00046
00047
00048
00049 TEST(TestBesselJ0)
00050 {
00051 CHECK( fp_equal( bessel_j0(0.), 1., 10 ) );
00052 CHECK( fp_equal_tol( bessel_j0(1.), 0.765197686557967, 1.e-15 ) );
00053 CHECK( fp_equal_tol( bessel_j0(2.9), -0.224311545791968, 1.e-15 ) );
00054 CHECK( fp_equal_tol( bessel_j0(4.8), -0.240425327291183, 1.e-15 ) );
00055 CHECK( fp_equal_tol( bessel_j0(8.3), 0.096006100895010, 1.e-15 ) );
00056 CHECK( fp_equal_tol( bessel_j0(17.4), -0.118955856336348, 1.e-15 ) );
00057 }
00058
00059 TEST(TestBesselJ1)
00060 {
00061 CHECK( fp_equal( bessel_j1(0.), 0., 10 ) );
00062 CHECK( fp_equal( bessel_j1(1.e-30), 5.e-31, 10 ) );
00063 CHECK( fp_equal_tol( bessel_j1(1.e-15), 5.e-16, 1.e-27 ) );
00064 CHECK( fp_equal_tol( bessel_j1(1.), 0.4400505857, 1.e-10 ) );
00065 CHECK( fp_equal_tol( bessel_j1(2.9), 0.3754274818, 1.e-10 ) );
00066 CHECK( fp_equal_tol( bessel_j1(4.8), -0.2984998581, 1.e-10 ) );
00067 CHECK( fp_equal_tol( bessel_j1(8.3), 0.2657393020, 1.e-10 ) );
00068 CHECK( fp_equal_tol( bessel_j1(17.4), -0.1532161760, 1.e-10 ) );
00069 }
00070
00071 TEST(TestBesselJn)
00072 {
00073 CHECK( fp_equal( bessel_jn(2,0.), 0., 10 ) );
00074 CHECK( fp_equal( bessel_jn(2,1.e-30), 1.25e-61, 10 ) );
00075 CHECK( fp_equal_tol( bessel_jn(2,2.e-15), 5.e-31, 1.e-42 ) );
00076 CHECK( fp_equal_tol( bessel_jn(2,2.e-10), 5.e-21, 1.e-32 ) );
00077 CHECK( fp_equal_tol( bessel_jn(2,0.099999999999), 0.0012489587, 1.e-10 ) );
00078 CHECK( fp_equal_tol( bessel_jn(2,0.100000000001), 0.0012489587, 1.e-10 ) );
00079 CHECK( fp_equal_tol( bessel_jn(2,1.), 0.1149034849, 1.e-10 ) );
00080 CHECK( fp_equal_tol( bessel_jn(2,2.9), 0.4832270505, 1.e-10 ) );
00081 CHECK( fp_equal_tol( bessel_jn(2,4.8), 0.1160503864, 1.e-10 ) );
00082 CHECK( fp_equal_tol( bessel_jn(2,8.3), -0.0319725341, 1.e-10 ) );
00083 CHECK( fp_equal_tol( bessel_jn(2,17.4), 0.1013448016, 1.e-10 ) );
00084
00085 CHECK( fp_equal( bessel_jn(8,0.), 0., 10 ) );
00086 CHECK( fp_equal( bessel_jn(8,2.e-20), 1.e-160/40320., 10 ) );
00087 CHECK( fp_equal_tol( bessel_jn(8,2.e-15), 1.e-120/40320., 1.e-136 ) );
00088 CHECK( fp_equal_tol( bessel_jn(8,1.), 9.4223e-8, 1.e-12 ) );
00089 CHECK( fp_equal_tol( bessel_jn(8,2.8), 2.9367e-4, 1.e-8 ) );
00090 CHECK( fp_equal_tol( bessel_jn(8,4.8), 1.4079e-2, 1.e-6 ) );
00091 CHECK( fp_equal_tol( bessel_jn(8,8.2), 0.24257, 1.e-5 ) );
00092
00093 CHECK( fp_equal_tol( bessel_jn(20,1.), 3.873503009e-25, 1.e-34 ) );
00094 CHECK( fp_equal_tol( bessel_jn(50,1.), 2.906004948e-80, 1.e-89 ) );
00095 CHECK( fp_equal_tol( bessel_jn(100,1.), 8.431828790e-189, 1.e-198 ) );
00096 CHECK( fp_equal_tol( bessel_jn(100,100.), 9.636667330e-2, 1.e-11 ) );
00097 }
00098
00099 TEST(TestBesselY0)
00100 {
00101 CHECK( fp_equal_tol( bessel_y0(1.e-30), -44.0499402279, 1.e-10 ) );
00102 CHECK( fp_equal_tol( bessel_y0(1.), 0.0882569642, 1.e-10 ) );
00103 CHECK( fp_equal_tol( bessel_y0(2.9), 0.4079117692, 1.e-10 ) );
00104 CHECK( fp_equal_tol( bessel_y0(4.8), -0.2723037945, 1.e-10 ) );
00105 CHECK( fp_equal_tol( bessel_y0(8.3), 0.2595149638, 1.e-10 ) );
00106 CHECK( fp_equal_tol( bessel_y0(17.4), -0.1497391883, 1.e-10 ) );
00107 }
00108
00109 TEST(TestBesselY1)
00110 {
00111 CHECK( fp_equal_tol( bessel_y1(1.e-30), -6.36619772368e29, 1.e18 ) );
00112 CHECK( fp_equal_tol( bessel_y1(1.), -0.7812128213, 1.e-10 ) );
00113 CHECK( fp_equal_tol( bessel_y1(2.9), 0.2959400546, 1.e-10 ) );
00114 CHECK( fp_equal_tol( bessel_y1(4.8), 0.2135651673, 1.e-10 ) );
00115 CHECK( fp_equal_tol( bessel_y1(8.3), -0.0805975035, 1.e-10 ) );
00116 CHECK( fp_equal_tol( bessel_y1(17.4), 0.1147053859, 1.e-10 ) );
00117 }
00118
00119 TEST(TestBesselYn)
00120 {
00121 CHECK( fp_equal_tol( bessel_yn(2,1.e-30), -1.27323954474e60, 1.e49 ) );
00122 CHECK( fp_equal_tol( bessel_yn(2,1.), -1.65068261, 1.e-8 ) );
00123 CHECK( fp_equal_tol( bessel_yn(2,2.9), -0.20381518, 1.e-8 ) );
00124 CHECK( fp_equal_tol( bessel_yn(2,4.8), 0.36128928, 1.e-8 ) );
00125 CHECK( fp_equal_tol( bessel_yn(2,8.3), -0.27893605, 1.e-8 ) );
00126 CHECK( fp_equal_tol( bessel_yn(2,17.4), 0.16292372, 1.e-8 ) );
00127
00128 CHECK( fp_equal_tol( bessel_yn(8,2.e-20), -1.60428182637e163, 1.e152 ) );
00129 CHECK( fp_equal_tol( bessel_yn(8,1.), -4.2567e5, 1.e1 ) );
00130 CHECK( fp_equal_tol( bessel_yn(8,2.8), -1.4486e2, 1.e-2 ) );
00131 CHECK( fp_equal_tol( bessel_yn(8,4.8), -3.5855, 1.e-4 ) );
00132 CHECK( fp_equal_tol( bessel_yn(8,8.2), -0.35049, 1.e-5 ) );
00133
00134 CHECK( fp_equal_tol( bessel_yn(20,1.), -4.113970315e22, 1.e13 ) );
00135 CHECK( fp_equal_tol( bessel_yn(50,1.), -2.191142813e77, 1.e68 ) );
00136 CHECK( fp_equal_tol( bessel_yn(100,1.), -3.775287810e185, 1.e176 ) );
00137 CHECK( fp_equal_tol( bessel_yn(100,100.), -1.669214114e-1, 1.e-10 ) );
00138 }
00139
00140 TEST(TestBesselI0)
00141 {
00142 CHECK( fp_equal( bessel_i0_scaled(0.), 1., 10 ) );
00143 CHECK( fp_equal_tol( bessel_i0_scaled(1.), 0.4657596077, 2.e-10 ) );
00144 CHECK( fp_equal_tol( bessel_i0_scaled(2.9), 0.2477557304, 1.e-10 ) );
00145 CHECK( fp_equal_tol( bessel_i0_scaled(4.8), 0.1875862042, 1.e-10 ) );
00146 CHECK( fp_equal_tol( bessel_i0_scaled(8.3), 0.1407239098, 1.e-10 ) );
00147 CHECK( fp_equal_tol( bessel_i0_scaled(17.4), 0.0963498277, 1.e-10 ) );
00148
00149 CHECK( fp_equal( bessel_i0_scaled(1.), exp(-1.)*bessel_i0(1.) ) );
00150 CHECK( fp_equal( bessel_i0_scaled(17.4), exp(-17.4)*bessel_i0(17.4) ) );
00151 }
00152
00153 TEST(TestBesselI1)
00154 {
00155 CHECK( fp_equal( bessel_i1_scaled(0.), 0., 10 ) );
00156 CHECK( fp_equal_tol( bessel_i1_scaled(1.), 0.2079104154, 1.e-10 ) );
00157 CHECK( fp_equal_tol( bessel_i1_scaled(2.9), 0.1987772816, 1.e-10 ) );
00158 CHECK( fp_equal_tol( bessel_i1_scaled(4.8), 0.1666757058, 1.e-10 ) );
00159 CHECK( fp_equal_tol( bessel_i1_scaled(8.3), 0.1319524362, 2.e-10 ) );
00160 CHECK( fp_equal_tol( bessel_i1_scaled(17.4), 0.0935388542, 1.e-10 ) );
00161
00162 CHECK( fp_equal( bessel_i1_scaled(1.), exp(-1.)*bessel_i1(1.) ) );
00163 CHECK( fp_equal( bessel_i1_scaled(17.4), exp(-17.4)*bessel_i1(17.4) ) );
00164 }
00165
00166 TEST(TestBesselK0)
00167 {
00168 CHECK( fp_equal_tol( bessel_k0(2.e-30), 68.5003371249, 1.e-10 ) );
00169 CHECK( fp_equal_tol( bessel_k0_scaled(1.), 1.1444630797, 2.e-10 ) );
00170 CHECK( fp_equal_tol( bessel_k0_scaled(2.9), 0.7089049774, 1.e-10 ) );
00171 CHECK( fp_equal_tol( bessel_k0_scaled(4.8), 0.5586133194, 1.e-10 ) );
00172 CHECK( fp_equal_tol( bessel_k0_scaled(8.3), 0.4288766329, 1.e-10 ) );
00173 CHECK( fp_equal_tol( bessel_k0_scaled(17.4), 0.2983665276, 1.e-10 ) );
00174
00175 CHECK( fp_equal( bessel_k0_scaled(1.), exp(1.)*bessel_k0(1.) ) );
00176 CHECK( fp_equal( bessel_k0_scaled(17.4), exp(17.4)*bessel_k0(17.4) ) );
00177 }
00178
00179 TEST(TestBesselK1)
00180 {
00181 CHECK( fp_equal_tol( bessel_k1(2.e-30), 5e29, 1.e18 ) );
00182 CHECK( fp_equal_tol( bessel_k1_scaled(1.), 1.6361534863, 1.e-10 ) );
00183 CHECK( fp_equal_tol( bessel_k1_scaled(2.9), 0.8230420403, 1.e-10 ) );
00184 CHECK( fp_equal_tol( bessel_k1_scaled(4.8), 0.6142566003, 1.e-10 ) );
00185 CHECK( fp_equal_tol( bessel_k1_scaled(8.3), 0.4540139001, 2.e-10 ) );
00186 CHECK( fp_equal_tol( bessel_k1_scaled(17.4), 0.3068236027, 1.e-10 ) );
00187
00188 CHECK( fp_equal( bessel_k1_scaled(1.), exp(1.)*bessel_k1(1.) ) );
00189 CHECK( fp_equal( bessel_k1_scaled(17.4), exp(17.4)*bessel_k1(17.4) ) );
00190 }
00191
00192 TEST(TestEllpk)
00193 {
00194 CHECK( fp_equal( ellpk(1.), PI/2., 10 ) );
00195 CHECK( fp_equal_tol( ellpk(0.86), 1.630575548881754, 1.e-15 ) );
00196 CHECK( fp_equal_tol( ellpk(0.56), 1.806327559107699, 1.e-15 ) );
00197 CHECK( fp_equal_tol( ellpk(0.36), 1.995302777664729, 1.e-15 ) );
00198 CHECK( fp_equal_tol( ellpk(0.13), 2.455338028321380, 1.e-15 ) );
00199 CHECK( fp_equal_tol( ellpk(0.01), 3.695637362989875, 1.e-15 ) );
00200 }
00201
00202 TEST(TestExpn)
00203 {
00204 CHECK( fp_equal_tol( expn(1,0.25), 0.25*0.9408157528 - log(0.25) - EULER, 1.e-10 ) );
00205 CHECK( fp_equal_tol( expn(1,0.79), 0.316277004, 1.e-9 ) );
00206 CHECK( fp_equal_tol( expn(1,1.97), 0.050976988, 1.e-9 ) );
00207
00208 CHECK( fp_equal_tol( expn(2,0.25), 0.8643037 + log(0.25)/4., 1.e-7 ) );
00209 CHECK( fp_equal_tol( expn(2,0.79), 0.2039860, 1.e-7 ) );
00210 CHECK( fp_equal_tol( expn(2,1.97), 0.0390322, 1.e-7 ) );
00211
00212 CHECK( fp_equal( expn(3,0.), 0.5, 10 ) );
00213 CHECK( fp_equal_tol( expn(3,0.15), 0.3822761, 1.e-7 ) );
00214 CHECK( fp_equal_tol( expn(3,0.79), 0.1463479, 1.e-7 ) );
00215 CHECK( fp_equal_tol( expn(3,1.97), 0.0312817, 1.e-7 ) );
00216
00217 CHECK( fp_equal( expn(4,0.), 1./3., 10 ) );
00218 CHECK( fp_equal_tol( expn(4,0.15), 0.2677889, 1.e-7 ) );
00219 CHECK( fp_equal_tol( expn(4,0.79), 0.1127433, 1.e-7 ) );
00220 CHECK( fp_equal_tol( expn(4,1.97), 0.0259440, 1.e-7 ) );
00221
00222 CHECK( fp_equal( expn(10,0.), 1./9., 10 ) );
00223 CHECK( fp_equal_tol( expn(10,0.15), 0.0938786, 1.e-7 ) );
00224 CHECK( fp_equal_tol( expn(10,0.79), 0.0459453, 1.e-7 ) );
00225 CHECK( fp_equal_tol( expn(10,1.97), 0.0124964, 1.e-7 ) );
00226 }
00227
00228 TEST(TestErf)
00229 {
00230
00231 CHECK( fp_equal_tol( erf(0.), 0., 1.e-22 ) );
00232
00233 CHECK( fp_equal_tol( erf(1.e-10), 1.1283791671081724525e-10, 3.e-21 ) );
00234 CHECK( fp_equal_tol( erf(1.e-5), 1.1283791670579000307e-5, 1.e-17 ) );
00235 CHECK( fp_equal_tol( erf(0.1), 1.1246291601828489259e-1, 1.e-13 ) );
00236 CHECK( fp_equal_tol( erf(0.5), 5.2049987781304653768e-1, 1.e-12 ) );
00237 CHECK( fp_equal_tol( erf(1.), 8.4270079294971486934e-1, 1.e-12 ) );
00238 CHECK( fp_equal_tol( erf(2.), 9.9532226501895273416e-1, 1.e-12 ) );
00239 CHECK( fp_equal_tol( erf(10.), 1.0, 1.e-12 ) );
00240 CHECK( fp_equal( erf(-1.), -erf(1.) ) );
00241 }
00242
00243 TEST(TestErfc)
00244 {
00245
00246 CHECK( fp_equal_tol( erfc(-1.), 1.8427007929497148693e0, 1.e-12 ) );
00247 CHECK( fp_equal_tol( erfc(0.), 1., 1.e-12 ) );
00248 CHECK( fp_equal_tol( erfc(1.e-5), 9.99988716208329421e-1, 1.e-12 ) );
00249 CHECK( fp_equal_tol( erfc(0.1), 8.8753708398171510741e-1, 1.e-12 ) );
00250 CHECK( fp_equal_tol( erfc(0.5), 4.7950012218695346232e-1, 1.e-12 ) );
00251 CHECK( fp_equal_tol( erfc(1.), 1.5729920705028513066e-1, 1.e-13 ) );
00252 CHECK( fp_equal_tol( erfc(2.), 4.6777349810472658396e-3, 1.e-15 ) );
00253 CHECK( fp_equal_tol( erfc(10.), 2.088487583762544757e-45, 1.e-57 ) );
00254 }
00255
00256 TEST(TestErfce)
00257 {
00258
00259
00260 CHECK( fp_equal_tol( erfce(0.), 1., 1.e-6 ) );
00261 CHECK( fp_equal_tol( erfce(0.01), 9.88815e-1, 1.e-6 ) );
00262 CHECK( fp_equal_tol( erfce(0.02), 9.77826e-1, 1.e-6 ) );
00263 CHECK( fp_equal_tol( erfce(0.05), 9.45990e-1, 1.e-6 ) );
00264 CHECK( fp_equal_tol( erfce(0.10), 8.96456e-1, 1.e-6 ) );
00265 CHECK( fp_equal_tol( erfce(0.20), 8.09019e-1, 1.e-6 ) );
00266 CHECK( fp_equal_tol( erfce(0.55), 5.90927e-1, 1.e-6 ) );
00267 CHECK( fp_equal_tol( erfce(1.00), 4.27583e-1, 1.e-6 ) );
00268 }
00269
00270 TEST(TestVoigtH0)
00271 {
00272
00273
00274 CHECK( fp_equal_tol( VoigtH0(0.), 1., 1.e-6 ) );
00275 CHECK( fp_equal_tol( VoigtH0(0.01), 9.88815e-1, 1.e-6 ) );
00276 CHECK( fp_equal_tol( VoigtH0(0.02), 9.77826e-1, 1.e-6 ) );
00277 CHECK( fp_equal_tol( VoigtH0(0.05), 9.45990e-1, 1.e-6 ) );
00278 CHECK( fp_equal_tol( VoigtH0(0.10), 8.96456e-1, 1.e-6 ) );
00279 CHECK( fp_equal_tol( VoigtH0(0.20), 8.09019e-1, 1.e-6 ) );
00280 CHECK( fp_equal_tol( VoigtH0(0.55), 5.90927e-1, 1.e-6 ) );
00281 CHECK( fp_equal_tol( VoigtH0(1.00), 4.27583e-1, 1.e-6 ) );
00282 }
00283
00284 TEST(TestVoigtU0)
00285 {
00286
00287
00288 CHECK( fp_equal_tol( VoigtU0(0.), 1./SQRTPI, 1.e-6 ) );
00289 CHECK( fp_equal_tol( VoigtU0(0.01), 9.88815e-1/SQRTPI, 1.e-6 ) );
00290 CHECK( fp_equal_tol( VoigtU0(0.02), 9.77826e-1/SQRTPI, 1.e-6 ) );
00291 CHECK( fp_equal_tol( VoigtU0(0.05), 9.45990e-1/SQRTPI, 1.e-6 ) );
00292 CHECK( fp_equal_tol( VoigtU0(0.10), 8.96456e-1/SQRTPI, 1.e-6 ) );
00293 CHECK( fp_equal_tol( VoigtU0(0.20), 8.09019e-1/SQRTPI, 1.e-6 ) );
00294 CHECK( fp_equal_tol( VoigtU0(0.55), 5.90927e-1/SQRTPI, 1.e-6 ) );
00295 CHECK( fp_equal_tol( VoigtU0(1.00), 4.27583e-1/SQRTPI, 1.e-6 ) );
00296 }
00297
00298 TEST(TestVoigtH)
00299 {
00300
00301 const int NP = 200;
00302 realnum v[NP], a, y[NP];
00303
00304
00305
00306
00307
00308
00309
00310
00311 a = realnum(0.0002);
00312 for( int i=0; i < 9; ++i )
00313 {
00314
00315 for( int i=0; i < NP; ++i )
00316 v[i] = realnum(i)*max(a,1.f)/realnum(5.);
00317 VoigtH( a, v, y, NP );
00318 realnum integral = realnum(0.);
00319
00320
00321
00322 for( int i=1; i < NP; ++i )
00323 integral += (y[i]+y[i-1])*(v[i]-v[i-1]);
00324
00325 integral += realnum(2.)*v[NP-1]*y[NP-1];
00326
00327 CHECK( fp_equal_tol( integral, realnum(SQRTPI), realnum(1.e-4) ) );
00328
00329 realnum h0 = realnum(VoigtH0(a));
00330 CHECK( fp_equal_tol( y[0], h0, realnum(1.e-4)*h0 ) );
00331 a *= realnum(10.);
00332 }
00333
00334
00335
00336
00337 v[0] = realnum(5.76);
00338 VoigtH( realnum(1.e-20), v, y, 1 );
00339
00340 CHECK( fp_equal_tol( y[0], realnum(3.900779639194698e-015), realnum(4.e-19) ) );
00341 v[0] = realnum(6.3e-2);
00342 v[1] = realnum(6.3e+0);
00343 v[2] = realnum(6.3e+2);
00344 VoigtH( realnum(1.e-20), v, y, 3 );
00345
00346 CHECK( fp_equal_tol( y[0], realnum(9.960388660702479e-001), realnum(1.e-4) ) );
00347 CHECK( fp_equal_tol( y[1], realnum(5.792460778844116e-018), realnum(6.e-22) ) );
00348 CHECK( fp_equal_tol( y[2], realnum(1.421495882582395e-026), realnum(1.4e-30) ) );
00349 VoigtH( realnum(1.e-14), v, y, 3 );
00350 CHECK( fp_equal_tol( y[0], realnum(9.960388660702366e-001), realnum(1.e-4) ) );
00351 CHECK( fp_equal_tol( y[1], realnum(1.536857621303163e-016), realnum(1.5e-20) ) );
00352 CHECK( fp_equal_tol( y[2], realnum(1.421495882582395e-020), realnum(1.4e-24) ) );
00353 VoigtH( realnum(1.e-12), v, y, 3 );
00354 CHECK( fp_equal_tol( y[0], realnum(9.960388660691284e-001), realnum(1.e-4) ) );
00355 CHECK( fp_equal_tol( y[1], realnum(1.479513723737753e-014), realnum(1.5e-18) ) );
00356 CHECK( fp_equal_tol( y[2], realnum(1.421495882582395e-018), realnum(1.4e-22) ) );
00357 VoigtH( realnum(1.e-10), v, y, 3 );
00358 CHECK( fp_equal_tol( y[0], realnum(9.960388659583033e-001), realnum(1.e-4) ) );
00359 CHECK( fp_equal_tol( y[1], realnum(1.478940284762099e-012), realnum(1.5e-16) ) );
00360 CHECK( fp_equal_tol( y[2], realnum(1.421495882582395e-016), realnum(1.4e-20) ) );
00361 VoigtH( realnum(1.e-6), v, y, 3 );
00362 CHECK( fp_equal_tol( y[0], realnum(9.960377466254801e-001), realnum(1.e-4) ) );
00363 CHECK( fp_equal_tol( y[1], realnum(1.478934493028404e-008), realnum(1.5e-12) ) );
00364 CHECK( fp_equal_tol( y[2], realnum(1.421495882582395e-012), realnum(1.4e-16) ) );
00365 VoigtH( realnum(1.e-2), v, y, 3 );
00366 CHECK( fp_equal_tol( y[0], realnum(9.849424862549039e-001), realnum(1.e-4) ) );
00367 CHECK( fp_equal_tol( y[1], realnum(1.478930389133934e-004), realnum(1.5e-8) ) );
00368 CHECK( fp_equal_tol( y[2], realnum(1.421495882224242e-008), realnum(1.4e-12) ) );
00369 VoigtH( realnum(1.e+1), v, y, 3 );
00370 CHECK( fp_equal_tol( y[0], realnum(5.613881832823886e-002), realnum(6.e-6) ) );
00371 CHECK( fp_equal_tol( y[1], realnum(4.040671157393835e-002), realnum(4.e-6) ) );
00372 CHECK( fp_equal_tol( y[2], realnum(1.421137820009847e-005), realnum(1.4e-9) ) );
00373 VoigtH( realnum(1.2e+1), v, y, 3 );
00374 CHECK( fp_equal_tol( y[0], realnum(4.685295149211637e-002), realnum(5.e-6) ) );
00375 CHECK( fp_equal_tol( y[1], realnum(3.684277239564798e-002), realnum(4.e-6) ) );
00376 CHECK( fp_equal_tol( y[2], realnum(1.705176395541707e-005), realnum(1.7e-9) ) );
00377 VoigtH( realnum(1.5e+1), v, y, 3 );
00378 CHECK( fp_equal_tol( y[0], realnum(3.752895161491574e-002), realnum(4.e-6) ) );
00379 CHECK( fp_equal_tol( y[1], realnum(3.194834330452605e-002), realnum(3.e-6) ) );
00380 CHECK( fp_equal_tol( y[2], realnum(2.131035743074598e-005), realnum(2.e-9) ) );
00381 VoigtH( realnum(2.e+2), v, y, 3 );
00382 CHECK( fp_equal_tol( y[0], realnum(2.820912377324508e-003), realnum(3.e-7) ) );
00383 CHECK( fp_equal_tol( y[1], realnum(2.818116555672206e-003), realnum(3.e-7) ) );
00384 CHECK( fp_equal_tol( y[2], realnum(2.582702147491469e-004), realnum(3.e-8) ) );
00385 VoigtH( realnum(1.e+5), v, y, 3 );
00386 CHECK( fp_equal_tol( y[0], realnum(5.641895835193228e-006), realnum(6.e-10) ) );
00387 CHECK( fp_equal_tol( y[1], realnum(5.641895812802746e-006), realnum(6.e-10) ) );
00388 CHECK( fp_equal_tol( y[2], realnum(5.641671917237128e-006), realnum(6.e-10) ) );
00389 v[0] = realnum(1.e+0);
00390 VoigtH( realnum(1.e-20), v, y, 1 );
00391 CHECK( fp_equal_tol( y[0], realnum(3.678794411714423e-001), realnum(4.e-5) ) );
00392 v[0] = realnum(5.5e+0);
00393 VoigtH( realnum(1.e-14), v, y, 1 );
00394 CHECK( fp_equal_tol( y[0], realnum(7.307386729528773e-014), realnum(7.e-18) ) );
00395 v[0] = realnum(3.9e+4);
00396 VoigtH( realnum(1.e+0), v, y, 1 );
00397 CHECK( fp_equal_tol( y[0], realnum(3.709333226385423e-010), realnum(4.e-14) ) );
00398 v[0] = realnum(1.e+0);
00399 VoigtH( realnum(2.8e+4), v, y, 1 );
00400 CHECK( fp_equal_tol( y[0], realnum(2.014962794529686e-005), realnum(2.e-9) ) );
00401 }
00402
00403 TEST(TestVoigtU)
00404 {
00405
00406 const int NP = 200;
00407 realnum v[NP], a, y[NP];
00408
00409
00410
00411
00412
00413
00414
00415
00416 a = realnum(0.0002);
00417 for( int i=0; i < 9; ++i )
00418 {
00419
00420 for( int i=0; i < NP; ++i )
00421 v[i] = realnum(i)*max(a,1.f)/realnum(5.);
00422 VoigtU( a, v, y, NP );
00423 realnum integral = realnum(0.);
00424
00425
00426
00427 for( int i=1; i < NP; ++i )
00428 integral += (y[i]+y[i-1])*(v[i]-v[i-1]);
00429
00430 integral += realnum(2.)*v[NP-1]*y[NP-1];
00431
00432 CHECK( fp_equal_tol( integral, realnum(1.), realnum(1.e-4) ) );
00433
00434 CHECK( fp_equal_tol( y[0], realnum(VoigtU0(a)), realnum(1.e-4) ) );
00435 a *= realnum(10.);
00436 }
00437 }
00438
00439 TEST(TestMD5string)
00440 {
00441 string test;
00442
00443 CHECK( MD5string( test ) == "d41d8cd98f00b204e9800998ecf8427e" );
00444 CHECK( MD5string( test ).length() == NMD5 );
00445
00446
00447 test = "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh";
00448 CHECK( test.length() == 55 );
00449 CHECK( MD5string( test ) == "426ec4ac35ad38d125f6efb39da03098" );
00450 test = "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh";
00451 CHECK( test.length() == 56 );
00452 CHECK( MD5string( test ) == "d03607b2c89adc0c4abf5a0f1d9e40c9" );
00453 test = "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh";
00454 CHECK( test.length() == 57 );
00455 CHECK( MD5string( test ) == "bac1b47748411cb6eee0cae3befb8377" );
00456 string test64 = "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh";
00457 test = test64 + "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh";
00458 CHECK( test.length() == 64+55 );
00459 CHECK( MD5string( test ) == "10d49aad1fc69976376fbe7c8c5ed118" );
00460 test = test64 + "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh";
00461 CHECK( test.length() == 64+56 );
00462 CHECK( MD5string( test ) == "61ec7da14576f3b585038c6d72cd5bd5" );
00463 test = test64 + "hhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh";
00464 CHECK( test.length() == 64+57 );
00465 CHECK( MD5string( test ) == "f17a0475a26d0930e2a35bb320c10e0d" );
00466
00467 test = "ghijklmn";
00468 CHECK( MD5string( test ) == "0256b9cea63bc1f97b8c5aea92c24a98" );
00469 }
00470
00471 }