25 #include "grins_config.h"
35 #include "libmesh/exact_solution.h"
36 #include "libmesh/parsed_function.h"
37 #include "libmesh/composite_function.h"
40 const std::string& system_name,
41 const std::string& var,
42 const std::string& norm,
43 const libMesh::Real exact_error,
46 int main(
int argc,
char* argv[])
48 GetPot command_line(argc,argv);
50 if( !command_line.have_variable(
"input") )
52 std::cerr <<
"ERROR: Must specify input file on command line with input=<file>."
57 if( !command_line.have_variable(
"test_data_prefix") )
59 std::cerr <<
"ERROR: Must specify solution test data filename prefix on command line with test_data_prefix=<string>."
64 if( !command_line.have_variable(
"mesh_data_prefix") )
66 std::cerr <<
"ERROR: Must specify solution mesh data filename prefix on command line with test_data_prefix=<string>."
71 if( !command_line.have_variable(
"gold_data_prefix") )
73 std::cerr <<
"ERROR: Must specify solution gold data filename prefix on command line with gold_data_prefix=<string>."
78 if( !command_line.have_variable(
"gold_mesh_prefix") )
80 std::cerr <<
"ERROR: Must specify gold mesh data filename prefix on command line with gold_mesh_prefix=<string>."
85 if( !command_line.have_variable(
"vars") )
87 std::cerr <<
"ERROR: Must specify variables on command line with vars='var1 var2'"
92 if( !command_line.have_variable(
"norms") )
94 std::cerr <<
"ERROR: Must specify error norms on command line with norms='L2 H1'"
99 if( !command_line.have_variable(
"tol") )
101 std::cerr <<
"ERROR: Must specify test tolerance on command line with tol=<double>"
106 if( !command_line.have_variable(
"n_steps") )
108 std::cerr <<
"ERROR: Must specify n_steps on command line with n_steps=<int>"
116 unsigned int n_vars = command_line.vector_variable_size(
"vars");
117 std::vector<std::string> vars(n_vars);
118 for(
unsigned int v = 0; v < n_vars; v++ )
120 vars[v] = command_line(
"vars",
"DIE!", v);
124 unsigned int n_norms = command_line.vector_variable_size(
"norms");
125 std::vector<std::string> norms(n_norms);
126 for(
unsigned int n = 0; n < n_norms; n++ )
128 norms[n] = command_line(
"norms",
"DIE!", n);
129 if( norms[n] != std::string(
"L2") )
131 std::cerr <<
"ERROR: Invalid norm input " << norms[n] << std::endl
132 <<
" Valid values are: L2" << std::endl;
137 std::string input_filename = command_line(
"input",
"DIE!");
141 std::ifstream i(input_filename.c_str());
144 std::cerr <<
"Error: Could not read from input file "
145 << input_filename << std::endl;
151 GetPot input( input_filename );
154 libMesh::LibMeshInit libmesh_init(argc, argv);
156 std::string test_data_prefix = command_line(
"test_data_prefix",
"DIE!" );
157 std::string mesh_data_prefix = command_line(
"mesh_data_prefix",
"DIE!" );
159 std::string gold_data_prefix = command_line(
"gold_data_prefix",
"DIE!" );
160 std::string gold_mesh_prefix = command_line(
"gold_mesh_prefix",
"DIE!" );
162 unsigned int n_steps = command_line(
"n_steps", 0);
166 std::string system_name =
"GRINS-TEST";
168 for(
unsigned int s = 0; s < n_steps; s++ )
170 std::stringstream step_string;
174 std::string mesh_filename = mesh_data_prefix+
"."+step_string.str()+
"_mesh.xda";
176 std::ifstream i( mesh_filename.c_str());
179 std::cerr <<
"Error: Could not read from mesh_data file "
180 << mesh_filename << std::endl;
185 libMesh::Mesh mesh(libmesh_init.comm());
186 mesh.read(mesh_filename);
190 std::string test_data = test_data_prefix+
"."+step_string.str()+
".xdr";
193 std::ifstream i(test_data.c_str());
196 std::cerr <<
"Error: Could not read from test_data file "
197 << test_data << std::endl;
202 libMesh::EquationSystems es(mesh);
205 libMesh::EquationSystems::READ_HEADER |
206 libMesh::EquationSystems::READ_DATA |
207 libMesh::EquationSystems::READ_ADDITIONAL_DATA);
211 std::string gold_mesh_filename = gold_mesh_prefix+
"_mesh."+step_string.str()+
".exo";
213 std::ifstream i( gold_mesh_filename.c_str());
216 std::cerr <<
"Error: Could not read from gold_mesh file "
217 << gold_mesh_filename << std::endl;
222 libMesh::Mesh gold_mesh(libmesh_init.comm());
223 gold_mesh.read(gold_mesh_filename);
227 std::string gold_data = gold_data_prefix+
"."+step_string.str()+
".xdr";
230 std::ifstream i(gold_data.c_str());
233 std::cerr <<
"Error: Could not read from test_data file "
234 << gold_data << std::endl;
239 libMesh::EquationSystems es_gold(gold_mesh);
240 es_gold.read(gold_data,
242 libMesh::EquationSystems::READ_HEADER |
243 libMesh::EquationSystems::READ_DATA |
244 libMesh::EquationSystems::READ_ADDITIONAL_DATA);
247 libMesh::ExactSolution exact_sol(es);
249 exact_sol.attach_reference_solution( &es_gold );
252 for(
unsigned int v = 0; v < n_vars; v++ )
254 exact_sol.compute_error(system_name, vars[v]);
257 double tol = command_line(
"tol", 1.0e-10);
263 double exact_error = 0.0;
266 for(
unsigned int v = 0; v < n_vars; v++ )
268 for(
unsigned int n = 0; n < n_norms; n++ )
270 test_flag =
test_error_norm( exact_sol, system_name, vars[v], norms[n], exact_error, tol );
278 if( return_flag == 1 )
286 const std::string& system_name,
287 const std::string& var,
288 const std::string& norm,
289 const libMesh::Real exact_error,
296 std::cout <<
"==========================================================" << std::endl
297 <<
"Checking variable " << var <<
" using error norm " << norm <<
" with tol " << tol <<
"...";
299 if( norm == std::string(
"L2") )
301 error = exact_sol.l2_error(system_name, var);
303 else if( norm == std::string(
"H1") )
305 error = exact_sol.h1_error(system_name, var);
309 std::cerr <<
"ERROR: Invalid norm " << norm << std::endl;
313 if( std::abs(error-exact_error) > tol )
317 std::cerr <<
"Tolerance exceeded for generic regression test!" << std::endl
318 <<
"tolerance = " << tol << std::endl
319 <<
"norm of error = " << error << std::endl
320 <<
"exact error = " << exact_error << std::endl
321 <<
"norm type = " << norm << std::endl
322 <<
"var = " << var << std::endl;
326 std::cout <<
"PASSED!" << std::endl
327 <<
"==========================================================" << std::endl;
int test_error_norm(libMesh::ExactSolution &exact_sol, const std::string &system_name, const std::string &var, const std::string &norm, const libMesh::Real exact_error, const double tol)
int main(int argc, char *argv[])