8 #include <fei_sstream.hpp>
9 #include <fei_fstream.hpp>
11 #include <fei_test_utils.hpp>
13 #include <snl_fei_Utils.hpp>
14 #include <fei_VectorSpace.hpp>
15 #include <fei_MatrixGraph.hpp>
16 #include <fei_Matrix.hpp>
21 #define fei_file "fei_test_utils.cpp"
22 #include <fei_ErrMacros.hpp>
24 namespace fei_test_utils {
28 std::string path(
".");
32 int dashDarg = whichArg(argc, argv,
"-d");
34 int dashIarg = whichArg(argc, argv,
"-i");
37 fei::console_out() <<
"fei_test_utils::construct_filename: argument '-i' not found."
42 if (dashDarg > -1 && argc > dashDarg+1) {
43 if (argv[dashDarg+1] != 0) {
44 path = argv[dashDarg+1];
48 if (argc > dashIarg+1) {
49 if (argv[dashIarg+1] != 0) {
50 filename = argv[dashIarg+1];
54 FEI_OSTRINGSTREAM osstr;
57 std::size_t string_length = path.size();
58 if (path[string_length-1] !=
'/') osstr <<
"/";
62 return( osstr.str() );
65 int initialize_mpi(
int argc,
char** argv,
int& localProc,
int& numProcs)
68 if (MPI_Init(&argc, &argv) != MPI_SUCCESS) ERReturn(-1);
69 if (MPI_Comm_rank(MPI_COMM_WORLD, &localProc) != MPI_SUCCESS) ERReturn(-1);
70 if (MPI_Comm_size(MPI_COMM_WORLD, &numProcs) != MPI_SUCCESS) ERReturn(-1);
78 bool bool_arg(
const char* flag,
int argc,
char** argv,
81 int arg_index = whichArg(argc, argv, flag);
82 bool result = default_result;
84 if (argc > arg_index+1) {
85 if (argv[arg_index+1] != 0) {
86 std::string strarg(argv[arg_index+1]);
87 if (strarg ==
"yes" || strarg ==
"Yes" || strarg ==
"YES" ||
88 strarg ==
"true" || strarg ==
"True" || strarg ==
"TRUE") {
92 if (strarg ==
"no" || strarg ==
"No" || strarg ==
"NO" ||
93 strarg ==
"false" || strarg ==
"False" || strarg ==
"FALSE") {
103 std::string
get_arg_value(
const char* flag,
int argc,
char** argv)
106 int arg_index = whichArg(argc, argv, flag);
107 if (arg_index > -1) {
108 if (argc > arg_index+1) {
109 if (argv[arg_index+1] != 0) {
110 result = argv[arg_index+1];
123 int numprocs = 1, localproc = 0;
124 MPI_Comm_size(MPI_COMM_WORLD, &numprocs);
125 MPI_Comm_rank(MPI_COMM_WORLD, &localproc);
130 if (localproc == root) {
131 int length = strg.size();
132 MPI_Bcast(&length, 1, MPI_INT, root, comm);
133 char* cstr =
const_cast<char*
>(strg.c_str());
134 MPI_Bcast(cstr, strg.size(), MPI_CHAR, root, comm);
138 MPI_Bcast(&length, 1, MPI_INT, root, comm);
139 char* charstr =
new char[length+1];
140 MPI_Bcast(charstr, length, MPI_CHAR, root, comm);
141 charstr[length] =
'\0';
151 std::vector<std::string>& file_contents)
153 FEI_IFSTREAM infile(filename);
155 FEI_OSTRINGSTREAM osstr;
156 osstr <<
"fei_test_utils::read_file_lines_into_strings ERROR, couldn't open file '"
158 throw std::runtime_error(osstr.str());
161 file_contents.clear();
165 getline(infile, line);
166 while(!infile.eof()) {
167 file_contents.push_back(line);
170 getline(infile, line);
175 MPI_Comm comm,
int localProc,
176 std::vector<std::string>& stdstrings)
178 std::string filename;
179 if (localProc == 0) {
186 catch(std::runtime_error& exc) {
196 std::vector<std::string>& file_contents)
201 MPI_Comm_rank(comm, &localProc);
202 MPI_Comm_size(comm, &numProcs);
205 if (localProc == 0) {
210 int num = file_contents.size();
212 MPI_Bcast(&num, 1, MPI_INT, 0, comm);
214 for(
int j=0; j<num; ++j) {
215 const char* cptr = file_contents[j].c_str();
216 int length = strlen(cptr) + 1;
217 MPI_Bcast(&length, 1, MPI_INT, 0, comm);
218 MPI_Bcast((
void*)cptr, length, MPI_CHAR, 0, comm);
226 MPI_Bcast(&num, 1, MPI_INT, 0, comm);
228 file_contents.resize(0);
230 for(
int j=0; j<num; ++j) {
232 MPI_Bcast(&length, 1, MPI_INT, 0, comm);
233 char* newstring =
new char[length];
234 MPI_Bcast(newstring, length, MPI_CHAR, 0, comm);
235 std::string strg(newstring);
236 file_contents.push_back(strg);
244 const char* testname)
246 std::vector<std::string> file_contents;
249 double file_benchmark = 0.0;
250 int err2 = snl_fei::getDoubleParamValue(testname,
254 throw std::runtime_error(
"fei_test_utils::get_file_benchmark failed to find named benchmark");
257 return(file_benchmark);
264 double maxval = std::abs(value1) > std::abs(value2) ? std::abs(value1) : std::abs(value2);
265 if (maxval < 1.e-14) {
270 double difference = std::abs(value2 - value1);
271 double lhs = 100.0*(difference/maxval);
272 double rhs = 1.0*margin;
273 return( lhs <= rhs );
276 int whichArg(
int argc,
const char*
const* argv,
const char* findarg)
278 for(
int i=0; i<argc; i++) {
279 if (argv[i] != NULL) {
280 if (strcmp(findarg, argv[i]) == 0)
return(i);
286 bool check_and_cout_test_result(std::string testname,
292 FEI_COUT << testname <<
" " << value <<
" ";
296 FEI_COUT <<
"within "<<margin<<
"% of file value " << file_value <<
". ";
299 FEI_COUT <<
"passed."<<FEI_ENDL;
302 FEI_COUT <<
"FAILED."<<FEI_ENDL;
307 std::string check_test_result(
double value,
312 return( result ?
"passed" :
"FAILED");
315 int compare_with_file_benchmark(
const char* name,
317 const char* filename)
319 if (name == NULL)
return(-1);
322 #if defined(FEI_PLATFORM) && defined(FEI_OPT_LEVEL)
324 FEI_OSTRINGSTREAM testname;
325 testname << name<<
"_"<<FEI_PLATFORM<<
"_"<<FEI_OPT_LEVEL;
327 double file_benchmark = 0.0;
328 bool file_benchmark_available =
true;
332 catch (std::runtime_error& exc) {
333 file_benchmark_available =
false;
336 if (file_benchmark_available) {
337 bool test_passed = check_and_cout_test_result(testname.str(),
341 returnValue = test_passed ? 0 : 1;
342 if (returnValue != 0) {
348 FEI_COUT <<
"(compile with -DFEI_PLATFORM=<platform> -DFEI_OPT_LEVEL=<opt|dbg>)"<<FEI_ENDL;
354 int dirname(
const char* name,
char*& dir)
360 int i, len = strlen(name);
362 for(i=0; i<len; ++i) {
380 if (i==0) dir[i] =
'.';
385 void print_args(
int argc,
char** argv){
386 FEI_COUT <<
"argc: " << argc << FEI_ENDL;
388 for(
int i=0; i<argc; i++){
389 if (argv[i] != NULL) {
390 FEI_COUT <<
"argv["<<i<<
"]: " << argv[i] << FEI_ENDL;
393 FEI_COUT << FEI_ENDL;
396 int compareMatrices(fei::FillableMat& mat1, fei::FillableMat& mat2,
double tol)
398 if (mat1 == mat2)
return 0;
399 FEI_COUT <<
"compareMatrices returned not-equal, tol=="<<tol << FEI_ENDL;
403 int readMatrix(
const char* baseName,
int np, fei::FillableMat& matrix)
405 for(
int i=0; i<np; i++) {
406 FEI_OSTRINGSTREAM fileName;
407 fileName <<baseName<<
"."<<np<<
"."<<i;
408 FEI_IFSTREAM infile(fileName.str().c_str());
410 infile.setf(IOS_SCIENTIFIC, IOS_FLOATFIELD);
412 int row, col, tmp, numRows, numCols;
419 while(!infile.eof()) {
423 matrix.putCoef(row, col, value);
432 int readMatrix(
const char* fileName, fei::FillableMat& matrix)
436 FEI_IFSTREAM infile(fileName);
438 FEI_COUT <<
"ERROR opening file " << fileName << FEI_ENDL;
442 infile.setf(IOS_SCIENTIFIC, IOS_FLOATFIELD);
444 int row, col, tmp, numRows, numCols;
451 while(!infile.eof()) {
455 matrix.putCoef(row, col, value);
463 int writeMatrix(
const char* fileName, fei::FillableMat& matrix)
465 FEI_OFSTREAM outfile(fileName);
467 FEI_COUT <<
"ERROR opening file " << fileName << FEI_ENDL;
471 outfile.setf(IOS_SCIENTIFIC, IOS_FLOATFIELD);
478 int copy_feiMatrix_to_FillableMat(
fei::Matrix& feimat, fei::FillableMat& fmat)
488 std::vector<int> globalOffsets;
490 int numLocalRows = globalOffsets[localProc+1]-globalOffsets[localProc];
491 int firstLocalRow = globalOffsets[localProc];
493 for(
int i=0; i<numLocalRows; ++i) {
494 int row = firstLocalRow+i;
498 std::vector<int> colindices(rowLen);
499 std::vector<double> coefs(rowLen);
501 feimat.
copyOutRow(row, rowLen, &coefs[0], &colindices[0]);
503 fmat.putRow(row, &colindices[0], &coefs[0], rowLen);
MPI_Comm getCommunicator() const
std::string construct_filename(int argc, char **argv)
void read_file_lines_into_strings(const char *filename, std::vector< std::string > &file_contents)
bool bool_arg(const char *flag, int argc, char **argv, bool default_result)
virtual fei::SharedPtr< fei::VectorSpace > getRowSpace()=0
double get_file_benchmark(const char *filename, const char *testname)
int get_filename_and_read_input(int argc, char **argv, MPI_Comm comm, int localProc, std::vector< std::string > &stdstrings)
virtual int getRowLength(int row, int &length) const =0
int initialize_mpi(int argc, char **argv, int &localProc, int &numProcs)
virtual fei::SharedPtr< fei::MatrixGraph > getMatrixGraph() const =0
void read_input_file(const char *filename, MPI_Comm comm, std::vector< std::string > &file_contents)
void broadcast_string(MPI_Comm comm, int root, std::string &strg)
std::ostream & console_out()
void getGlobalIndexOffsets(std::vector< int > &globalOffsets) const
bool within_percentage_margin(double value1, double value2, unsigned margin)
int localProc(MPI_Comm comm)
std::string get_arg_value(const char *flag, int argc, char **argv)
virtual int copyOutRow(int row, int len, double *coefs, int *indices) const =0