26
26
27
27
#ifdef GRINS_HAVE_CPPUNIT
28
28
29
+ #ifdef GRINS_HAVE_ANTIOCH
30
+
29
31
#include <libmesh/ignore_warnings.h>
30
32
#include <cppunit/extensions/HelperMacros.h>
31
33
#include <cppunit/TestCase.h>
34
36
#include "test_comm.h"
35
37
#include "grins_test_paths.h"
36
38
39
+ #include "absorption_coeff_testing.h"
40
+
37
41
// GRINS
38
42
#include "grins/math_constants.h"
39
43
#include "grins/grins_enums.h"
40
44
#include "grins/simulation_builder.h"
41
45
#include "grins/simulation.h"
42
46
#include "grins/variable_warehouse.h"
47
+ #include "grins/single_variable.h"
48
+ #include "grins/multicomponent_variable.h"
49
+ #include "grins/chemistry_builder.h"
50
+ #include "grins/antioch_chemistry.h"
43
51
44
52
// libMesh
45
53
#include "libmesh/parsed_function.h"
@@ -53,10 +61,9 @@ namespace GRINSTesting
53
61
{
54
62
public :
55
63
CPPUNIT_TEST_SUITE ( SpectroscopicAbsorptionTest );
56
- #if GRINS_HAVE_ANTIOCH
57
64
CPPUNIT_TEST ( single_elem_mesh );
58
65
CPPUNIT_TEST ( multi_elem_mesh );
59
- #endif
66
+ CPPUNIT_TEST ( param_derivs );
60
67
CPPUNIT_TEST_SUITE_END ();
61
68
62
69
public :
@@ -85,6 +92,43 @@ namespace GRINSTesting
85
92
this -> run_test (filename ,calc_answer );
86
93
}
87
94
95
+ void param_derivs ()
96
+ {
97
+ const std ::string filename = std ::string (GRINS_TEST_UNIT_INPUT_SRCDIR )+ "/spectroscopic_absorption_qoi.in" ;
98
+ this -> init_sim (filename );
99
+
100
+ std ::string material = "TestMaterial" ;
101
+ std ::string hitran_data = "./test_data/CO2_data.dat" ;
102
+ std ::string hitran_partition = "./test_data/CO2_partition_function.dat" ;
103
+ libMesh ::Real T_min = 290.0 ,
104
+ T_max = 310.0 ,
105
+ T_step = 0.01 ;
106
+ GRINS ::SharedPtr < GRINS ::HITRAN > hitran ( new GRINS ::HITRAN (hitran_data ,hitran_partition ,T_min ,T_max ,T_step ) );
107
+
108
+ std ::string species = "CO2" ;
109
+ libMesh ::Real thermo_pressure = 5066.25 ;
110
+ libMesh ::Real nu_desired = 3682.7649 ;
111
+ libMesh ::Real nu_min = 3682.69 ;
112
+ libMesh ::Real nu_max = 3682.8 ;
113
+ GRINS ::ChemistryBuilder chem_builder ;
114
+ libMesh ::UniquePtr < GRINS ::AntiochChemistry > chem_ptr ;
115
+ chem_builder .build_chemistry (* (_input .get ()),material ,chem_ptr );
116
+ GRINS ::SharedPtr < GRINS ::AntiochChemistry > chem (chem_ptr .release ());
117
+ GRINS ::SharedPtr < AbsorptionCoeffTesting < GRINS ::AntiochChemistry > > absorb = new AbsorptionCoeffTesting < GRINS ::AntiochChemistry > (chem ,hitran ,nu_min ,nu_max ,nu_desired ,species ,thermo_pressure );
118
+
119
+ libMesh ::Real T = 300.0 ;
120
+ libMesh ::Real P = 5066.25 ;
121
+
122
+ std ::vector < libMesh ::Real > Y = {0.0763662233 , 0.9236337767 };
123
+
124
+ for (unsigned int i = 0 ; i < 33 ; ++ i )
125
+ {
126
+ this -> T_param_derivatives (absorb ,T ,P ,Y ,i );
127
+ this -> P_param_derivatives (absorb ,T ,P ,Y ,i );
128
+ this -> Y_param_derivatives (absorb ,T ,P ,Y ,i );
129
+ }
130
+ }
131
+
88
132
private :
89
133
GRINS ::SharedPtr < GRINS ::Simulation > _sim ;
90
134
GRINS ::SharedPtr < GetPot > _input ;
@@ -114,10 +158,123 @@ namespace GRINSTesting
114
158
* TestCommWorld );
115
159
}
116
160
161
+ void T_param_derivatives (GRINS ::SharedPtr < AbsorptionCoeffTesting < GRINS ::AntiochChemistry > > absorb , libMesh ::Real T , libMesh ::Real P , std ::vector < libMesh ::Real > & Y , unsigned int i )
162
+ {
163
+ libMesh ::Real delta = 1.0e-6 ;
164
+
165
+ std ::vector < libMesh ::Real > T_analytic ;
166
+ T_analytic .push_back (absorb -> dS_dT (T ,P ,i ));
167
+ T_analytic .push_back (absorb -> d_nuC_dT (T ,P ,Y ,i ));
168
+ T_analytic .push_back (absorb -> d_nuD_dT (T ,P ,i ));
169
+ T_analytic .push_back (absorb -> d_voigt_a_dT (T ,P ,Y ,i ));
170
+ T_analytic .push_back (absorb -> d_voigt_w_dT (T ,P ,i ));
171
+ T_analytic .push_back (absorb -> d_voigt_dT (T ,P ,Y ,i ));
172
+ T_analytic .push_back (absorb -> d_kv_dT (T ,P ,Y ,i ));
173
+
174
+ std ::vector < libMesh ::Real > fd_plus ;
175
+ fd_plus .push_back (absorb -> Sw (T + delta ,P ,i ));
176
+ fd_plus .push_back (absorb -> nu_C (T + delta ,P ,Y ,i ));
177
+ fd_plus .push_back (absorb -> nu_D (T + delta ,P ,i ));
178
+ fd_plus .push_back (absorb -> voigt_a (T + delta ,P ,Y ,i ));
179
+ fd_plus .push_back (absorb -> voigt_w (T + delta ,P ,i ));
180
+ fd_plus .push_back (absorb -> voigt (T + delta ,P ,Y ,i ));
181
+ fd_plus .push_back (absorb -> kv (T + delta ,P ,Y ,i ));
182
+
183
+ std ::vector < libMesh ::Real > fd_minus ;
184
+ fd_minus .push_back (absorb -> Sw (T - delta ,P ,i ));
185
+ fd_minus .push_back (absorb -> nu_C (T - delta ,P ,Y ,i ));
186
+ fd_minus .push_back (absorb -> nu_D (T - delta ,P ,i ));
187
+ fd_minus .push_back (absorb -> voigt_a (T - delta ,P ,Y ,i ));
188
+ fd_minus .push_back (absorb -> voigt_w (T - delta ,P ,i ));
189
+ fd_minus .push_back (absorb -> voigt (T - delta ,P ,Y ,i ));
190
+ fd_minus .push_back (absorb -> kv (T - delta ,P ,Y ,i ));
191
+
192
+ check_param_derivatives (T_analytic ,fd_plus ,fd_minus ,delta );
193
+ }
194
+
195
+ void P_param_derivatives (GRINS ::SharedPtr < AbsorptionCoeffTesting < GRINS ::AntiochChemistry > > absorb , libMesh ::Real T , libMesh ::Real P , std ::vector < libMesh ::Real > & Y , unsigned int i )
196
+ {
197
+ libMesh ::Real delta = 1.0e-3 ;
198
+
199
+ std ::vector < libMesh ::Real > P_analytic ;
200
+ P_analytic .push_back (absorb -> dS_dP (T ,P ,i ));
201
+ P_analytic .push_back (absorb -> d_nuC_dP (T ,Y ,i ));
202
+ P_analytic .push_back (absorb -> d_nuD_dP (T ,i ));
203
+ P_analytic .push_back (absorb -> d_voigt_a_dP (T ,P ,Y ,i ));
204
+ P_analytic .push_back (absorb -> d_voigt_w_dP (T ,P ,i ));
205
+ P_analytic .push_back (absorb -> d_voigt_dP (T ,P ,Y ,i ));
206
+ P_analytic .push_back (absorb -> d_kv_dP (T ,P ,Y ,i ));
207
+
208
+ std ::vector < libMesh ::Real > fd_plus ;
209
+ fd_plus .push_back (absorb -> Sw (T ,P + delta ,i ));
210
+ fd_plus .push_back (absorb -> nu_C (T ,P + delta ,Y ,i ));
211
+ fd_plus .push_back (absorb -> nu_D (T ,P + delta ,i ));
212
+ fd_plus .push_back (absorb -> voigt_a (T ,P + delta ,Y ,i ));
213
+ fd_plus .push_back (absorb -> voigt_w (T ,P + delta ,i ));
214
+ fd_plus .push_back (absorb -> voigt (T ,P + delta ,Y ,i ));
215
+ fd_plus .push_back (absorb -> kv (T ,P + delta ,Y ,i ));
216
+
217
+ std ::vector < libMesh ::Real > fd_minus ;
218
+ fd_minus .push_back (absorb -> Sw (T ,P - delta ,i ));
219
+ fd_minus .push_back (absorb -> nu_C (T ,P - delta ,Y ,i ));
220
+ fd_minus .push_back (absorb -> nu_D (T ,P - delta ,i ));
221
+ fd_minus .push_back (absorb -> voigt_a (T ,P - delta ,Y ,i ));
222
+ fd_minus .push_back (absorb -> voigt_w (T ,P - delta ,i ));
223
+ fd_minus .push_back (absorb -> voigt (T ,P - delta ,Y ,i ));
224
+ fd_minus .push_back (absorb -> kv (T ,P - delta ,Y ,i ));
225
+
226
+ check_param_derivatives (P_analytic ,fd_plus ,fd_minus ,delta );
227
+ }
228
+
229
+ void Y_param_derivatives (GRINS ::SharedPtr < AbsorptionCoeffTesting < GRINS ::AntiochChemistry > > absorb , libMesh ::Real T , libMesh ::Real P , std ::vector < libMesh ::Real > & Y , unsigned int i )
230
+ {
231
+ libMesh ::Real delta = 1.0e-8 ;
232
+
233
+ libMesh ::Real y_base = Y [0 ];
234
+ std ::vector < libMesh ::Real > Y_analytic ;
235
+ Y_analytic .push_back (absorb -> dX_dY (Y ));
236
+ Y_analytic .push_back (absorb -> d_nuC_dY (T ,P ,Y ,i ));
237
+ Y_analytic .push_back (absorb -> d_voigt_a_dY (T ,P ,Y ,i ));
238
+ Y_analytic .push_back (absorb -> d_voigt_dY (T ,P ,Y ,i ));
239
+ Y_analytic .push_back (absorb -> d_kv_dY (T ,P ,Y ,i ));
240
+
241
+ std ::vector < libMesh ::Real > fd_plus ;
242
+ Y [0 ] = y_base + delta ;
243
+ fd_plus .push_back (absorb -> _chemistry -> X (absorb -> _species_idx ,absorb -> _chemistry -> M_mix (Y ),Y [absorb -> _species_idx ]));
244
+ fd_plus .push_back (absorb -> nu_C (T ,P ,Y ,i ));
245
+ fd_plus .push_back (absorb -> voigt_a (T ,P ,Y ,i ));
246
+ fd_plus .push_back (absorb -> voigt (T ,P ,Y ,i ));
247
+ fd_plus .push_back (absorb -> kv (T ,P ,Y ,i ));
248
+
249
+ std ::vector < libMesh ::Real > fd_minus ;
250
+ Y [0 ] = y_base - delta ;
251
+ fd_minus .push_back (absorb -> _chemistry -> X (absorb -> _species_idx ,absorb -> _chemistry -> M_mix (Y ),Y [absorb -> _species_idx ]));
252
+ fd_minus .push_back (absorb -> nu_C (T ,P ,Y ,i ));
253
+ fd_minus .push_back (absorb -> voigt_a (T ,P ,Y ,i ));
254
+ fd_minus .push_back (absorb -> voigt (T ,P ,Y ,i ));
255
+ fd_minus .push_back (absorb -> kv (T ,P ,Y ,i ));
256
+
257
+ Y [0 ] = y_base ;
258
+
259
+ check_param_derivatives (Y_analytic ,fd_plus ,fd_minus ,delta );
260
+ }
261
+
262
+ void check_param_derivatives (std ::vector < libMesh ::Real > & analytic , std ::vector < libMesh ::Real > & fd_plus , std ::vector < libMesh ::Real > & fd_minus , libMesh ::Real delta )
263
+ {
264
+ for (unsigned int d = 0 ; d < analytic .size (); ++ d )
265
+ {
266
+ libMesh ::Real f_analytic = analytic [d ];
267
+ libMesh ::Real fd_approx = (fd_plus [d ] - fd_minus [d ])/(2.0 * delta );
268
+
269
+ CPPUNIT_ASSERT_DOUBLES_EQUAL (fd_approx ,f_analytic ,libMesh ::TOLERANCE );
270
+ }
271
+ }
272
+
117
273
};
118
274
119
275
CPPUNIT_TEST_SUITE_REGISTRATION ( SpectroscopicAbsorptionTest );
120
276
121
277
} // end namespace GRINSTesting
122
278
279
+ #endif // GRINS_HAVE_ANTIOCH
123
280
#endif // GRINS_HAVE_CPPUNIT
0 commit comments