30 #include "antioch_config.h"
34 #ifdef ANTIOCH_HAVE_EIGEN
35 #include "Eigen/Dense"
38 #ifdef ANTIOCH_HAVE_METAPHYSICL
39 #include "metaphysicl/numberarray.h"
42 #ifdef ANTIOCH_HAVE_VEXCL
43 #include "vexcl/vexcl.hpp"
60 #ifdef ANTIOCH_HAVE_GRVY
63 GRVY::GRVY_Timer_Class gt;
69 const long double pi(3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825);
71 template <
typename Scalar>
72 Scalar
F(
const Scalar & x)
74 return 1.L + Antioch::ant_pow(
pi,(
float)1.5)/2.L * Antioch::ant_sqrt(x)
75 + (
pi*
pi/4.L + 2.L) * x
76 + Antioch::ant_pow(
pi * x,(
float)1.5);
79 template <
typename Scalar>
80 Scalar
z(
const Scalar & T,
const Scalar & eps_kb,
const Scalar & z_298)
82 return z_298 *
F(eps_kb / 298.L) /
F(eps_kb / T);
86 template <
typename PairScalars>
87 int vectester(
const PairScalars& example,
const std::string& testname)
90 std::cout <<
"entering " << testname << std::endl;
93 const Scalar eps_kb = 97.53L;
94 const Scalar z_298 = 4.0L;
99 PairScalars T = example;
100 for (
unsigned int tuple=0; tuple != ANTIOCH_N_TUPLES; ++tuple)
102 T[2*tuple] = 1500.1L;
103 T[2*tuple+1] = 1600.1L;
108 #ifdef ANTIOCH_HAVE_GRVY
109 gt.BeginTimer(testname);
112 const PairScalars
Z = rot(T);
114 #ifdef ANTIOCH_HAVE_GRVY
115 gt.EndTimer(testname);
118 const Scalar tol = (std::numeric_limits<Scalar>::epsilon()*10 < 5e-17)?
120 std::numeric_limits<Scalar>::epsilon()*10;
122 for (
unsigned int tuple=0; tuple != ANTIOCH_N_TUPLES; ++tuple)
124 const Scalar Z_exact0 =
z( (Scalar)1500.1, eps_kb, z_298);
125 const Scalar Z_exact1 =
z( (Scalar)1600.1, eps_kb, z_298);
127 if( abs( (Z[2*tuple] - Z_exact0)/Z_exact0 ) > tol )
129 std::cout << std::scientific << std::setprecision(20)
130 <<
"Error: Mismatch in Z values in test " << testname << std::endl
131 <<
"Z(T0) = " << Z[2*tuple] << std::endl
132 <<
"Z_exact = " << Z_exact0 << std::endl
133 <<
"absolute difference = " << Z[2*tuple] - Z_exact0 << std::endl
134 <<
"relative difference = " << std::abs(Z[2*tuple] - Z_exact0) / Z_exact0 << std::endl
135 <<
"tolerance = " << tol << std::endl;
141 if( abs( (Z[2*tuple+1] - Z_exact1)/Z_exact1 ) > tol )
143 std::cout << std::scientific << std::setprecision(20)
144 <<
"Error: Mismatch in Z values in test " << testname << std::endl
145 <<
"Z(T1) = " << Z[2*tuple+1] << std::endl
146 <<
"Z_exact = " << Z_exact1 << std::endl
147 <<
"absolute difference = " << Z[2*tuple+1] - Z_exact1 << std::endl
148 <<
"relative difference = " << std::abs(Z[2*tuple+1] - Z_exact1) / Z_exact1 << std::endl
149 <<
"tolerance = " << tol << std::endl;
164 returnval = returnval ||
165 vectester (std::valarray<float>(2*ANTIOCH_N_TUPLES),
"valarray<float>");
166 returnval = returnval ||
167 vectester (std::valarray<double>(2*ANTIOCH_N_TUPLES),
"valarray<double>");
168 returnval = returnval ||
169 vectester (std::valarray<long double>(2*ANTIOCH_N_TUPLES),
"valarray<ld>");
170 #ifdef ANTIOCH_HAVE_EIGEN
171 returnval = returnval ||
172 vectester (Eigen::Array<float, 2*ANTIOCH_N_TUPLES, 1>(),
"Eigen::ArrayXf");
173 returnval = returnval ||
174 vectester (Eigen::Array<double, 2*ANTIOCH_N_TUPLES, 1>(),
"Eigen::ArrayXd");
175 returnval = returnval ||
176 vectester (Eigen::Array<long double, 2*ANTIOCH_N_TUPLES, 1>(),
"Eigen::ArrayXld");
178 #ifdef ANTIOCH_HAVE_METAPHYSICL
179 returnval = returnval ||
180 vectester (MetaPhysicL::NumberArray<2*ANTIOCH_N_TUPLES, float> (0),
"NumberArray<float>");
181 returnval = returnval ||
182 vectester (MetaPhysicL::NumberArray<2*ANTIOCH_N_TUPLES, double> (0),
"NumberArray<double>");
183 returnval = returnval ||
184 vectester (MetaPhysicL::NumberArray<2*ANTIOCH_N_TUPLES, long double> (0),
"NumberArray<ld>");
186 #ifdef ANTIOCH_HAVE_VEXCL
187 vex::Context ctx_f (vex::Filter::All);
189 returnval = returnval ||
190 vectester (vex::vector<float> (ctx_f, 2*ANTIOCH_N_TUPLES),
"vex::vector<float>");
192 vex::Context ctx_d (vex::Filter::DoublePrecision);
194 returnval = returnval ||
195 vectester (vex::vector<double> (ctx_d, 2*ANTIOCH_N_TUPLES),
"vex::vector<double>");
198 #ifdef ANTIOCH_HAVE_GRVY
Scalar Z(const Scalar &T, const Scalar &eps_kb, const Scalar &z_298)
Scalar F(const Scalar &x)
const long double pi(3.141592653589793238462643383279502884197169399375105820974944592307816406286208998628034825)
int vectester(const PairScalars &example, const std::string &testname)
Scalar z(const Scalar &T, const Scalar &eps_kb, const Scalar &z_298)