25#include <FETI_DP_FiniteElementData.h>
32#define fei_file "FEI_tester.cpp"
38 MPI_Comm comm,
int localProc,
int numProcs,
bool useNewFEI)
63 if (
data_.get() == NULL) {
69 const char* feiVersionString;
89 for(
int i=0; i<
data_->numElemBlocks_; ++i) {
92 CHK_ERR(
fei_->getNumBlockActNodes(elemBlockID, numBlkActNodes) );
134 std::string sname(
data_->solverLibraryName_);
135 if (sname ==
"TEST_LSC") {
140 int err =
fei_->solve(status);
144 if (err != 0 || status != 0) {
145 FEI_COUT <<
"!!!! solve returned: err: "<<err<<
", status: "<<status<<
FEI_ENDL;
175 std::string sname(
data_->solverLibraryName_);
176 if (sname ==
"TEST_LSC") {
190 data_->checkFileName_.c_str(),
"node", 1);
193 data_->checkFileName_.c_str(),
"elem", 1);
196 data_->checkFileName_.c_str(),
"mult", 1);
199 if (
MPI_SUCCESS != MPI_Allreduce(&err, &globalErr, 1, MPI_INT, MPI_SUM,
202 if (globalErr != 0) {
215 catch(std::runtime_error& exc) {
239 data_->paramStrings_,
269 for(i=0; i<
data_->numElemBlocks_; i++) {
288 for(i=0; i<
data_->numSharedNodeSets_; i++) {
297 for(i=0; i<
data_->numSlaveVars_; i++) {
312 for(i=0; i<
data_->numCRMultSets_; i++) {
315 for(
int j=0; j<1; j++) {
323 for(i=0; i<
data_->numCRPenSets_; i++) {
326 for(
int j=0; j<1; j++) {
345 for(i=0; i<
data_->numBCNodeSets_; i++) {
355 for(i=0; i<
data_->numElemBlocks_; i++) {
368 for(i=0; i<
data_->numElemBlocks_; i++) {
382 for(i=0; i<
data_->numCRMultSets_; i++) {
385 for(
int j=0; j<1; j++) {
395 for(i=0; i<
data_->numCRPenSets_; i++) {
398 for(
int j=0; j<1; j++) {
419 for(
int j=0; j<
data_->numElemBlocks_; j++) {
436 for(
int j=0; j<
data_->numElemBlocks_; j++) {
450 for(i=0; i<
data_->numBCNodeSets_; i++) {
465 int rhsScaleID =
rhsIDs[0];
466 double rhsScalar = 1.0;
469 CHK_ERR(
fei_->setRHSScalars(1, &rhsScaleID, &rhsScalar))
471 delete [] matScalars;
478 std::string sname(
data_->solverLibraryName_);
479 if (sname ==
"TEST_LSC") {
483 double* norms =
new double[
data_->numFields_];
484 int *fields =
new int[
data_->numFields_];
485 for(
int i=0; i<
data_->numFields_; ++i) {
486 fields[i] =
data_->fieldIDs_[i];
508 std::vector<int> nodeIDs(numNodes);
509 int* nodeIDsPtr = &nodeIDs[0];
511 CHK_ERR(
fei_->getLocalNodeIDList(checkNumNodes, nodeIDsPtr, numNodes) );
513 for(
int i=0; i<
data_->numFields_; ++i) {
514 int fieldID =
data_->fieldIDs_[i];
515 int fieldSize =
data_->fieldSizes_[i];
516 std::vector<double> data(numNodes*fieldSize, 0.0001);
518 CHK_ERR(
fei_->putNodalFieldData(fieldID, numNodes, nodeIDsPtr,
527 const char* solnFileName,
int numProcs,
528 int localProc,
int solveCounter)
533 int maxNumEqnsPerNode = 0;
538 std::vector<double> soln(maxNumEqnsPerNode);
543 std::vector<GlobalID> nodes(numNodes);
544 int* nodesPtr = &nodes[0];
547 CHK_ERR(
fei.getLocalNodeIDList( checkNumNodes, nodesPtr, numNodes) );
549 if (checkNumNodes != numNodes) {
554 fileName << solnFileName<<
".node."<<solveCounter<<
"."<<numProcs<<
"."<<localProc;
557 if (!outfile || outfile.bad()) {
558 FEI_COUT <<
"ERROR opening solution output file " << fileName.str() <<
FEI_ENDL;
564 std::vector<int> offsets(2);
566 for(i=0; i<numNodes; ++i) {
567 CHK_ERR(
fei.getNodalSolution(1, &(nodesPtr[i]),
568 &offsets[0], &soln[0]) );
570 int numDOF = offsets[1];
572 outfile << nodesPtr[i] <<
" " << numDOF <<
FEI_ENDL;
573 for(
int j=0; j<numDOF; j++) {
574 outfile << soln[j] <<
" ";
584 const char* solnFileName,
585 int numProcs,
int localProc,
590 fileName << solnFileName<<
".elem."<<solveCounter<<
"."<<numProcs<<
"."<<localProc;
593 if (!outfile || outfile.bad()) {
594 FEI_COUT <<
"ERROR opening elem-solution output file " << fileName.str() <<
FEI_ENDL;
599 if (returnValue != 0)
break;
605 CHK_ERR(
fei.getNumBlockElements(blockID, numElems))
608 CHK_ERR(
fei.getNumBlockElemDOF(blockID, dofPerElem))
609 int totalNumElemDOF = numElems*dofPerElem;
611 if (totalNumElemDOF < 1) {
616 if (elemIDs==NULL)
return(-1);
618 int err =
fei.getBlockElemIDList(blockID, numElems, elemIDs);
619 if (err) returnValue = 1;
621 int* offsets =
new int[numElems+1];
622 if (offsets == NULL)
return(-1);
624 if (totalNumElemDOF > 0) {
625 double* solnValues =
new double[totalNumElemDOF];
626 if (solnValues == NULL)
return(-1);
628 err =
fei.getBlockElemSolution(blockID, numElems, elemIDs,
629 dofPerElem, solnValues);
630 if (err) returnValue = 1;
633 for(
int j=0; j<numElems; j++) {
635 outfile << (int)elemIDs[j] <<
" " << dofPerElem <<
FEI_ENDL <<
" ";
636 for(
int k=0; k<dofPerElem; k++) {
637 outfile << solnValues[j*dofPerElem + k] <<
" ";
643 delete [] solnValues;
655 const char* solnFileName,
656 int numProcs,
int localProc,
int solveCounter)
662 int* globalNumCRs =
new int[numProcs];
664 if (MPI_Allgather(&numCRs, 1, MPI_INT, globalNumCRs, 1, MPI_INT,
670 int localCRStart = 0;
671 for(
int p=0; p<localProc; p++) localCRStart += globalNumCRs[p];
673 delete [] globalNumCRs;
676 fileName << solnFileName<<
".mult."<<solveCounter<<
"."<<numProcs<<
"."<<localProc;
679 if (!outfile || outfile.bad()) {
680 FEI_COUT <<
"ERROR opening mult-solution output file " << fileName.str() <<
FEI_ENDL;
684 int* CRIDs = numCRs > 0 ?
new int[numCRs] : NULL;
685 double* results = numCRs > 0 ?
new double[numCRs] : NULL;
687 if (numCRs > 0 && (CRIDs==NULL || results==NULL)) {
695 CHK_ERR(
fei.getCRMultIDList(numCRs, CRIDs) );
697 std::string sname(
data_->solverLibraryName_);
698 if (sname ==
"FETI") {
699 for(
int ii=0; ii<numCRs; ++ii) results[ii] = -999.99;
702 CHK_ERR(
fei.getCRMultipliers(numCRs, CRIDs, results));
705 for(
int i=0; i<numCRs; i++) {
706 outfile << localCRStart++ <<
" " << 1 <<
FEI_ENDL;
708 outfile <<
" " << results[i] <<
FEI_ENDL;
721 char* current_dir = NULL;
725 solnMtxName<< current_dir<<
"/A_TLSC.mtx";
730 delete [] current_dir;
double * prescribed_values_
int createFEIinstance(const char *solverName)
int initializationPhase()
int save_multiplier_soln(DataReader &data, FEI &fei, const char *solnFileName, int numProcs, int localProc, int solveCounter)
int save_block_node_soln(DataReader &data, FEI &fei, const char *solnFileName, int numProcs, int localProc, int solveCounter)
int save_block_elem_soln(DataReader &data, FEI &fei, const char *solnFileName, int numProcs, int localProc, int solveCounter)
fei::SharedPtr< FEI > fei_
int exerciseResidualNorm()
fei::SharedPtr< DataReader > data_
int exercisePutFunctions()
fei::SharedPtr< LibraryWrapper > wrapper_
FEI_tester(fei::SharedPtr< DataReader > data_reader, MPI_Comm comm, int localProc, int numProcs, bool useNewFEI=false)
void setParameter(const char *param)
#define FEI_AGGREGATE_SUM
#define FEI_SINGLE_SYSTEM
#define FEI_OSTRINGSTREAM
#define FEI_Implementation
int compareMatrices(fei::FillableMat &mat1, fei::FillableMat &mat2)
int checkSolution(int localProc, int numProcs, const char *solnFileName, const char *checkFileName, const char *extension, int solveCounter)
int readMatrix(const char *baseName, int np, fei::FillableMat &matrix)
int dirname(const char *name, char *&dir)
std::ostream & console_out()
fei::SharedPtr< LibraryWrapper > create_LibraryWrapper(MPI_Comm comm, const char *libraryName)
int getIntParamValue(const char *key, int numParams, const char *const *params, int ¶mValue)