FEI Version of the Day
Loading...
Searching...
No Matches
feiDriver_main.cpp
1/*--------------------------------------------------------------------*/
2/* Copyright 2005 Sandia Corporation. */
3/* Under the terms of Contract DE-AC04-94AL85000, there is a */
4/* non-exclusive license for use of this work by or on behalf */
5/* of the U.S. Government. Export of this program may require */
6/* a license from the United States Government. */
7/*--------------------------------------------------------------------*/
8
9//
10// This is a simple program to exercise the FEI.
11//
12#include <fei_macros.hpp>
13
14
15//Including the header fei_base.hpp gets us the declaration for
16//most FEI classes.
17
18#include <fei_base.hpp>
19#include <FEI_Implementation.hpp>
20
21#include <fei_LibraryWrapper.hpp>
22#include <test_utils/LibraryFactory.hpp>
23
24#include <test_utils/Poisson_Elem.hpp>
25#include <test_utils/PoissonData.hpp>
26
27#include <test_utils/ElemBlock.hpp>
28#include <test_utils/CRSet.hpp>
29#include <test_utils/BCNodeSet.hpp>
30#include <test_utils/CommNodeSet.hpp>
31#include <test_utils/DataReader.hpp>
32#include <test_utils/driverData.hpp>
33#include <test_utils/fei_test_utils.hpp>
34#include <test_utils/SolnCheck.hpp>
35
36#undef fei_file
37#define fei_file "feiDriver.cpp"
38#include <fei_ErrMacros.hpp>
39
40//==============================================================================
41//Here's the main...
42//==============================================================================
43int feiDriver_main(int argc, char** argv,
44 MPI_Comm comm, int numProcs, int localProc){
45
46 std::vector<std::string> stdstrings;
48 comm, localProc,
49 stdstrings) );
50 const char** params = NULL;
51 int numParams = 0;
52 fei::utils::strings_to_char_ptrs(stdstrings, numParams, params);
53
54 fei::ParameterSet paramset;
55 fei::utils::parse_strings(stdstrings, " ", paramset);
56
57 std::string solverName;
58 std::string inputFileName;
59 int errcode = paramset.getStringParamValue("SOLVER_LIBRARY", solverName);
60 errcode += paramset.getStringParamValue("INPUT_FILE", inputFileName);
61 if (errcode != 0) {
62 fei::console_out() << "Expected to find both 'SOLVER_NAME' and 'INPUT_FILE' "
63 <<"in input-file."<<FEI_ENDL;
64 return(-1);
65 }
66
67 //let's add the appropriate file-name extension to the file-name obtained from
68 //the input...
69 FEI_OSTRINGSTREAM fullFileName;
70 fullFileName<< inputFileName<<"."<<numProcs<<"."<< localProc;
71
72 driverData drv;
73 CHK_ERR( drv.readData(fullFileName.str().c_str()) );
74
75 //ok, all the data is in the 'data' object, so we're ready to start
76 //handing it all over to an instantiation of the FEI.
77
78 //first, we have to instantiate a LibraryWrapper and an FEI...
79
81 try {
82 wrapper = fei::create_LibraryWrapper(comm, solverName.c_str());
83 }
84 catch (std::runtime_error& exc) {
85 fei::console_out() << exc.what() << FEI_ENDL;
86 ERReturn(-1);
87 }
88
89 fei::SharedPtr<FEI> fei(new FEI_Implementation(wrapper, comm));
90
91 const char* feiVersionString;
92 CHK_ERR( fei->version(feiVersionString) );
93
94 FEI_COUT << FEI_ENDL << "FEI version: " << feiVersionString << FEI_ENDL << FEI_ENDL;
95
96 CHK_ERR( fei->parameters(numParams, params) );
97
98 std::vector<const char*>& methodNames = drv.get_methodNames();
99
100 for(size_t i=0; i<methodNames.size(); i++) {
101 if (!strcmp("destructor", methodNames[i])) {
102 //In some cases the input file indicates that the FEI should be
103 //destroyed and then re-allocated before continuing. Note that we
104 //assume here that the solver-layer (linsyscore, wrapper or feData)
105 //should also be destroyed and re-allocated at the same time.
106 FEI_COUT << "feiDriver: proc " << localProc << " destroying/reallocing FEI"
107 << FEI_ENDL;
108
109 fei.reset();
110 wrapper.reset();
111 try {
112 wrapper = fei::create_LibraryWrapper(comm, solverName.c_str());
113 }
114 catch (std::runtime_error& exc) {
115 fei::console_out() << exc.what()<<FEI_ENDL;
116 ERReturn(-1);
117 }
118
119 fei.reset(new FEI_Implementation(wrapper, comm));
120
121 CHK_ERR( fei->parameters(numParams, params) );
122
123 continue;
124 }
125
126 FEI_COUT << "feiDriver: proc " << localProc << " calling FEI method: "
127 << methodNames[i] << FEI_ENDL;
128 int feierror = drv.call_fei_method(methodNames[i], fei.get());
129 if (feierror > 0) continue;
130 if (feierror < 0) {
131 //for testing purposes, temporarily, don't bail out if an fei method
132 //returns an error.
133 continue;
134 //return(-1);
135 }
136 }
137
138 MPI_Barrier(comm);
139
140 if (localProc == 0) {
141 FEI_COUT << "feiDriver: TEST PASSED" << FEI_ENDL;
142
143 //This is something the SIERRA runtest tool looks for in test output...
144 FEI_COUT << "SIERRA execution successful" << FEI_ENDL;
145#ifdef SIERRA_BUILD_DATE
146 FEI_COUT.setf(IOS_FIXED, IOS_FLOATFIELD);
147 FEI_COUT << "Maximum CPU time: 0.0 seconds." << FEI_ENDL;
148#endif
149 }
150
151 delete [] params;
152
153 return(0);
154}
int getStringParamValue(const char *name, std::string &paramValue) const
void reset(T *p=0)
void parse_strings(std::vector< std::string > &stdstrings, const char *separator_string, fei::ParameterSet &paramset)
Definition: fei_utils.cpp:191
void strings_to_char_ptrs(std::vector< std::string > &stdstrings, int &numStrings, const char **&charPtrs)
Definition: fei_utils.cpp:178
int get_filename_and_read_input(int argc, char **argv, MPI_Comm comm, int localProc, std::vector< std::string > &stdstrings)
int localProc(MPI_Comm comm)
std::ostream & console_out()
fei::SharedPtr< LibraryWrapper > create_LibraryWrapper(MPI_Comm comm, const char *libraryName)
int numProcs(MPI_Comm comm)