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"
59 #ifdef ANTIOCH_HAVE_GRVY
62 GRVY::GRVY_Timer_Class gt;
65 template <
typename PairScalars>
67 const PairScalars & rate,
const PairScalars & derive,
const PairScalars & T)
70 const Scalar tol = std::numeric_limits<Scalar>::epsilon() * 2;
73 for (
unsigned int tuple=0; tuple != ANTIOCH_N_TUPLES; ++tuple)
75 if( abs( (rate[2*tuple] - rate_exact[2*tuple])/rate_exact[2*tuple] ) > tol )
77 std::cout << std::scientific << std::setprecision(16)
78 <<
"Error: Mismatch in rate values." << std::endl
79 <<
"T = " << T <<
" K" << std::endl
80 <<
"rate(T) = " << rate[2*tuple] << std::endl
81 <<
"rate_exact = " << rate_exact[2*tuple] << std::endl
82 <<
"relative difference = " << abs( (rate[2*tuple] - rate_exact[2*tuple])/rate_exact[2*tuple] ) << std::endl
83 <<
"tolerance = " << tol << std::endl;
87 if( abs( (rate[2*tuple+1] - rate_exact[2*tuple+1])/rate_exact[2*tuple+1] ) > tol )
89 std::cout << std::scientific << std::setprecision(16)
90 <<
"Error: Mismatch in rate values." << std::endl
91 <<
"T = " << T <<
" K" << std::endl
92 <<
"rate(T) = " << rate[2*tuple] << std::endl
93 <<
"rate_exact = " << rate_exact[2*tuple+1] << std::endl
94 <<
"relative difference = " << abs( (rate[2*tuple] - rate_exact[2*tuple+1])/rate_exact[2*tuple+1] ) << std::endl
95 <<
"tolerance = " << tol << std::endl;
99 if( abs( (derive[2*tuple] - derive_exact[2*tuple])/derive_exact[2*tuple] ) > tol )
101 std::cout << std::scientific << std::setprecision(16)
102 <<
"Error: Mismatch in rate derivative values." << std::endl
103 <<
"T = " << T <<
" K" << std::endl
104 <<
"drate_dT(T) = " << derive[2*tuple] << std::endl
105 <<
"derive_exact = " << derive_exact[2*tuple] << std::endl
106 <<
"relative difference = " << abs( (derive[2*tuple] - derive_exact[2*tuple])/derive_exact[2*tuple] ) << std::endl
107 <<
"tolerance = " << tol << std::endl;
111 if( abs( (derive[2*tuple+1] - derive_exact[2*tuple+1])/derive_exact[2*tuple+1] ) > tol )
113 std::cout << std::scientific << std::setprecision(16)
114 <<
"Error: Mismatch in rate derivative values." << std::endl
115 <<
"T = " << T <<
" K" << std::endl
116 <<
"drate_dT(T) = " << derive[2*tuple+1] << std::endl
117 <<
"derive_exact = " << derive_exact[2*tuple+1] << std::endl
118 <<
"relative difference = " << abs( (derive[2*tuple+1] - derive_exact[2*tuple+1])/derive_exact[2*tuple+1] ) << std::endl
119 <<
"tolerance = " << tol << std::endl;
128 template <
typename PairScalars>
129 int vectester(
const PairScalars& example,
const std::string & testname)
137 const Scalar Cf = 1.4;
138 const Scalar eta = 1.2;
139 const Scalar
D = -2.5;
144 PairScalars T = example;
145 PairScalars rate_exact = example;
146 PairScalars derive_exact = example;
148 for (
unsigned int tuple=0; tuple != ANTIOCH_N_TUPLES; ++tuple)
151 T[2*tuple+1] = 1600.1;
152 rate_exact[2*tuple] = Cf*
pow(Scalar(1500.1),eta)*exp(D*1500.1);
153 rate_exact[2*tuple+1] = Cf*
pow(Scalar(1600.1),eta)*exp(D*1600.1);
154 derive_exact[2*tuple] = Cf *
pow(Scalar(1500.1),eta) * exp(D*Scalar(1500.1)) * (D + eta/Scalar(1500.1));
155 derive_exact[2*tuple+1] = Cf *
pow(Scalar(1600.1),eta) * exp(D*Scalar(1600.1)) * (D + eta/Scalar(1600.1));
162 #ifdef ANTIOCH_HAVE_GRVY
163 gt.BeginTimer(testname);
166 PairScalars rate = berthelothercourtessen_rate(cond);
167 PairScalars derive = berthelothercourtessen_rate.
derivative(cond);
169 #ifdef ANTIOCH_HAVE_GRVY
170 gt.EndTimer(testname);
175 #ifdef ANTIOCH_HAVE_GRVY
176 gt.BeginTimer(testname);
181 #ifdef ANTIOCH_HAVE_GRVY
182 gt.EndTimer(testname);
186 #ifdef ANTIOCH_HAVE_GRVY
187 gt.BeginTimer(testname);
190 rate = berthelothercourtessen_rate(T);
191 derive = berthelothercourtessen_rate.
derivative(T);
193 #ifdef ANTIOCH_HAVE_GRVY
194 gt.EndTimer(testname);
199 #ifdef ANTIOCH_HAVE_GRVY
200 gt.BeginTimer(testname);
205 #ifdef ANTIOCH_HAVE_GRVY
206 gt.EndTimer(testname);
213 std::cout <<
"Berthelot Hercourt Essen rate: " << berthelothercourtessen_rate << std::endl;
223 returnval = returnval ||
224 vectester (std::valarray<float>(2*ANTIOCH_N_TUPLES),
"valarray<float>");
225 returnval = returnval ||
226 vectester (std::valarray<double>(2*ANTIOCH_N_TUPLES),
"valarray<double>");
227 returnval = returnval ||
228 vectester (std::valarray<long double>(2*ANTIOCH_N_TUPLES),
"valarray<ld>");
229 #ifdef ANTIOCH_HAVE_EIGEN
230 returnval = returnval ||
231 vectester (Eigen::Array<float, 2*ANTIOCH_N_TUPLES, 1>(),
"Eigen::ArrayXf");
232 returnval = returnval ||
233 vectester (Eigen::Array<double, 2*ANTIOCH_N_TUPLES, 1>(),
"Eigen::ArrayXd");
234 returnval = returnval ||
235 vectester (Eigen::Array<long double, 2*ANTIOCH_N_TUPLES, 1>(),
"Eigen::ArrayXld");
237 #ifdef ANTIOCH_HAVE_METAPHYSICL
238 returnval = returnval ||
239 vectester (MetaPhysicL::NumberArray<2*ANTIOCH_N_TUPLES, float> (0),
"NumberArray<float>");
240 returnval = returnval ||
241 vectester (MetaPhysicL::NumberArray<2*ANTIOCH_N_TUPLES, double> (0),
"NumberArray<double>");
242 returnval = returnval ||
243 vectester (MetaPhysicL::NumberArray<2*ANTIOCH_N_TUPLES, long double> (0),
"NumberArray<ld>");
245 #ifdef ANTIOCH_HAVE_VEXCL
246 vex::Context ctx_f (vex::Filter::All);
248 returnval = returnval ||
249 vectester (vex::vector<float> (ctx_f, 2*ANTIOCH_N_TUPLES),
"vex::vector<float>");
251 vex::Context ctx_d (vex::Filter::DoublePrecision);
253 returnval = returnval ||
254 vectester (vex::vector<double> (ctx_d, 2*ANTIOCH_N_TUPLES),
"vex::vector<double>");
257 #ifdef ANTIOCH_HAVE_GRVY
int check_rate_and_derivative(const PairScalars &rate_exact, const PairScalars &derive_exact, const PairScalars &rate, const PairScalars &derive, const PairScalars &T)
_Cf VectorStateType VectorStateType(*) VectorStateType voi rate_and_derivative)(const KineticsConditions< StateType, VectorStateType > &T, StateType &rate, StateType &drate_dT) const
Berthelot Hercourt-Essen rate equation.
int vectester(const PairScalars &example, const std::string &testname)
Antioch::enable_if_c< Antioch::is_valarray< T >::value, typename Antioch::state_type< T >::type >::type pow(const T &in, const T2 &n)
_Cf VectorStateType VectorStateType derivative(const KineticsConditions< StateType, VectorStateType > &T) const ANTIOCH_AUTOFUNC(StateType
This class contains the conditions of the chemistry.