28#define fei_file "fei_FEI_Impl.cpp"
145 if (snlfactory != NULL) {
163 if (lsc.
get() != NULL) {
172 if (lsc.
get() != NULL) {
207 const int* matrixIDs,
211 if (numMatrices < 1 || numRHSs < 1) {
212 fei::console_out() <<
"fei::FEI_Impl::setIDLists ERROR, numMatrices and numRHSs "
213 <<
"must both be greater than 0."<<
FEI_ENDL;
218 A_.resize(numMatrices);
219 for(
int i=0; i<numMatrices; ++i) {
229 for(
int i=0; i<numRHSs; ++i) {
232 if ((
int)
rhsIDs_.size() != numRHSs) {
239 if (linSysCore.
get() != NULL) {
253 const char *
const* paramStrings)
257 paramStrings, numParams);
260 if (
wrapper_[0]->haveLinearSystemCore()) {
263 if (
wrapper_[0]->haveFiniteElementData()) {
268 std::vector<std::string> stdstrings;
286 const int *fieldSizes,
288 const int *fieldTypes)
290 rowSpace_->defineFields(numFields, fieldIDs, fieldSizes, fieldTypes);
297 int numNodesPerElement,
298 const int* numFieldsPerNode,
299 const int*
const* nodalFieldIDs,
300 int numElemDofFieldsPerElement,
301 const int* elemDOFFieldIDs,
302 int interleaveStrategy)
307 int numIDs = numNodesPerElement;
308 if (numElemDofFieldsPerElement > 0) ++numIDs;
309 std::vector<int> idTypes;
310 std::vector<int> numFieldsPerID;
311 std::vector<int> fieldIDs;
314 for(i=0; i<numNodesPerElement; ++i) {
316 numFieldsPerID.push_back(numFieldsPerNode[i]);
318 for(j=0; j<numFieldsPerNode[i]; ++j) {
319 fieldIDs.push_back(nodalFieldIDs[i][j]);
323 if (numElemDofFieldsPerElement>0) {
325 numFieldsPerID.push_back(numElemDofFieldsPerElement);
326 for(i=0; i<numElemDofFieldsPerElement; ++i) {
327 fieldIDs.push_back(elemDOFFieldIDs[i]);
334 int pattID =
matGraph_->definePattern(numIDs,
350 bool elemdof =
false;
353 std::map<int,int>::const_iterator
356 int numIDs =
matGraph_->getNumIDsPerConnectivityList(elemBlockID);
358 int* iworkPtr = &
iwork_[0];
359 for(
int i=0; i<numIDs-1; ++i) {
360 iworkPtr[i] = elemConn[i];
362 iworkPtr[numIDs-1] = elemID;
380 int offsetIntoSlaveField,
383 const int* masterFieldIDs,
384 const double* weights,
387 throw std::runtime_error(
"FEI_Impl::initSlaveVariable not implemented.");
393 throw std::runtime_error(
"FEI_Impl::deleteMultCRs not implemented.");
399 const int* numProcsPerNode,
400 const int *
const *sharingProcIDs)
413 const int *CRFieldIDs,
432 const int *CRFieldIDs,
454 A_.size() < 1 ||
b_.size() < 1) {
460 std::vector<std::string> stdstrings;
470 bool multiple_factories =
false;
473 multiple_factories =
true;
476 if (linsyscore.
get() == NULL) {
477 fei::console_out() <<
"fei::FEI_Impl ERROR, multiple matrix/rhs assembly not supported "
478 <<
"non-null LibraryWrapper holds null LinearSystemCore."<<
FEI_ENDL;
499 for(
unsigned i=1; i<
rhsIDs_.size(); ++i) {
507 =
wrapper_[0]->getLinearSystemCore();
509 linsyscore->setNumRHSVectors(1, &(
rhsIDs_[0]));
513 for(
unsigned i=1; i<num; ++i) {
516 if (i==num-1 &&
rhsIDs_.size() > num) {
518 lsc->setNumRHSVectors(numRHSs, &(
rhsIDs_[i]));
521 lsc->setNumRHSVectors(1, &(
rhsIDs_[i]));
528 wrapper_[i]->getLinearSystemCore()->setNumRHSVectors(1, &dummyID);
540 for(
unsigned i=1; i<
rhsIDs_.size(); ++i) {
562 std::vector<int>::const_iterator
564 if (iter ==
matrixIDs_.end() || *iter != matID) {
577 std::vector<int>::const_iterator
579 if (iter ==
rhsIDs_.end() || *iter != rhsID) {
580 fei::console_out() <<
"fei::FEI_Impl::setCurrentRHS: rhsID ("<<rhsID<<
") not found."
593 err +=
x_->putScalar(s);
611 return(
x_->putScalar(s) );
617 const int* offsetsIntoField,
618 const double* prescribedValues)
622 offsetsIntoField, prescribedValues) );
632 const double *
const *alpha,
633 const double *
const *beta,
634 const double *
const *gamma)
636 throw std::runtime_error(
"FEI_Impl::loadElemBCs not implemented.");
643 const double*
const* elemStiffness,
644 const double* elemLoad,
649 int num =
matGraph_->getConnectivityNumIndices(elemBlockID);
650 std::vector<int> indices(num);
663 const double*
const* elemStiffness,
676 const double* elemLoad)
678 int num =
matGraph_->getConnectivityNumIndices(elemBlockID);
679 std::vector<int> indices(num);
692 const int* CRFieldIDs,
693 const double* CRWeights,
698 CHK_ERR(
linSys_->loadLagrangeConstraint(CRMultID, CRWeights, CRValue) );
706 const int* CRFieldIDs,
707 const double* CRWeights,
713 CHK_ERR(
linSys_->loadPenaltyConstraint(CRPenID, CRWeights, penValue, CRValue) );
722 const double* coefficients)
724 CHK_ERR(
inputRHS(IDType, fieldID, numIDs, IDs, coefficients,
false) );
735 const double* coefficients)
748 const double* coefficients,
751 int fieldSize =
rowSpace_->getFieldSize(fieldID);
754 for(
int i=0; i<numIDs; ++i) {
758 for(
int j=0; j<fieldSize; ++j) {
759 int eqn = globalIndex+j;
774 const double* scalars)
778 for(
int i=0; i<numScalars; ++i) {
779 std::vector<int>::const_iterator
781 if (iter ==
matrixIDs_.end() || *iter != IDs[i]) {
796 const double* scalars)
800 for(
int i=0; i<numScalars; ++i) {
801 std::vector<int>::const_iterator
803 if (iter ==
rhsIDs_.end() || *iter != IDs[i]) {
807 unsigned index = iter -
rhsIDs_.begin();
824 fei::console_out() <<
"fei::FEI_Impl::loadComplete: loadComplete can not be called"
825 <<
" until after initComplete has been called."<<
FEI_ENDL;
830 for(
unsigned i=0; i<
A_.size(); ++i) {
834 for(
unsigned j=0; j<
b_.size(); ++j) {
845 for(
unsigned i=0; i<
b_.size(); ++i) {
847 osstr <<
"rhs_" << rhs_counter++;
873 if (lsc.
get() == NULL)
return(-1);
891 if (lsci.
get() == NULL)
return(-1);
897 CHK_ERR( lsci->getMatrixPtr(tmp) );
903 for(
unsigned i=0; i<
rhsIDs_.size(); ++i) {
905 wrapper_[i]->getLinearSystemCore() :
wrapper_[last_mat]->getLinearSystemCore();
912 CHK_ERR( lsci->getRHSVectorPtr(tmpv) );
929 int numLocalEqns = rowspace->getNumIndices_Owned();
931 std::vector<double> residValues(numLocalEqns);
932 double* residValuesPtr = &residValues[0];
934 std::vector<int> globalEqnOffsets;
935 rowspace->getGlobalIndexOffsets(globalEqnOffsets);
936 int firstLocalOffset = globalEqnOffsets[
localProc_];
948 for(
int ii=0; ii<numLocalEqns; ++ii) {
949 int index = firstLocalOffset+ii;
950 CHK_ERR( r->copyOut(1, &index, &(residValuesPtr[ii]) ) );
955 if (linSysCore.
get() != NULL) {
956 CHK_ERR( linSysCore->formResidual(residValuesPtr, numLocalEqns) );
959 fei::console_out() <<
"FEI_Impl::residualNorm: warning: residualNorm not implemented"
960 <<
" for FiniteElementData."<<
FEI_ENDL;
962 for(
int ii=0; ii<numFields; ++ii) {
963 int fieldSize = rowspace->getFieldSize(fieldIDs[ii]);
964 for(
int jj=0; jj<fieldSize; ++jj) {
965 norms[offset++] = -99.9;
972 int numLocalNodes = rowspace->getNumOwnedIDs(
nodeIDType_);
973 std::vector<int> nodeIDs(numLocalNodes);
974 int* nodeIDsPtr = &nodeIDs[0];
977 nodeIDsPtr,
check) );
978 std::vector<int> indices(numLocalEqns);
979 int* indicesPtr = &indices[0];
981 std::vector<double> tmpNorms(numFields, 0.0);
983 for(
int i=0; i<numFields; ++i) {
984 int fieldSize = rowspace->getFieldSize(fieldIDs[i]);
986 CHK_ERR( rowspace->getGlobalIndices(numLocalNodes, nodeIDsPtr,
991 for(
int j=0; j<fieldSize*numLocalNodes; ++j) {
992 if (indicesPtr[j] < 0) {
996 double val = std::abs(residValuesPtr[indicesPtr[j]-firstLocalOffset]);
999 if (val > tmp) tmp = val;
1008 fei::console_out() <<
"FEI_Impl::residualNorm: whichNorm="<<whichNorm<<
" not recognized"
1016 std::vector<double> normsArray(numFields);
1017 for(
int i=0; i<numFields; ++i) {
1018 normsArray[i] = norms[i];
1029 for(
int i=0; i<numFields; ++i) {
1030 norms[i] = normsArray[i];
1033 if (whichNorm == 2) {
1034 for(
int ii=0; ii<numFields; ++ii) {
1035 norms[ii] = std::sqrt(norms[ii]);
1048 std::vector<std::string> stdstrings;
1053 int err = solver->solve(
linSys_.get(),
1079 double& solnReturnTime)
1106 std::vector<int> fieldIDs;
1107 for(
int i=0; i<numNodes; ++i) {
1108 offsets[i] = offset;
1113 iwork_.resize( numFields*2 );
1114 int* fieldSizes = &
iwork_[0];
1118 for(j=0; j<numFields; ++j) {
1119 fieldSizes[j] =
rowSpace_->getFieldSize(fieldIDs[j]);
1120 numDOF += fieldSizes[j];
1128 int results_offset = offset;
1129 for(j=0; j<numFields; ++j) {
1132 &(results[results_offset])));
1134 results_offset += fieldSizes[j];
1140 offsets[numNodes] = offset;
1151 throw std::runtime_error(
"FEI_Impl::getBlockFieldNodeSolution not implemented.");
1158 int& numElemDOFPerElement,
1163 numElemDOFPerElement = (*b_iter).second;
1168 osstr<<
"fei::FEI_Impl::getBlockElemSolution ERROR, elemBlockID "
1169 << elemBlockID <<
" not valid.";
1170 throw std::runtime_error(osstr.str());
1180 std::vector<int> fieldIDs;
1183 for(i=0; i<numIDs; ++i) {
1185 for(
int j=0; j<numFieldsPerID[i]; ++j) {
1186 fieldIDs.push_back(fIDs[foffset++]);
1190 foffset += numFieldsPerID[i];
1193 if (fieldIDs.size() < 1) {
1198 for(i=0; i<numElems; ++i) {
1200 for(
size_t j=0; j<fieldIDs.size(); ++j) {
1205 &(results[foffset])) );
1206 foffset += fieldSize;
1209 offset += numElemDOFPerElement;
1225 multIDs, checkNum) );
1231 double *multipliers)
1235 for(
int i=0; i<numCRs; ++i) {
1248 const double *estimates)
1250 throw std::runtime_error(
"FEI_Impl::putBlockNodeSolution not implemented.");
1258 const double *estimates)
1260 throw std::runtime_error(
"FEI_Impl::putBlockFieldNodeSolution not implemented.");
1268 const double *estimates)
1270 throw std::runtime_error(
"FEI_Impl::putBlockElemSolution not implemented.");
1276 const double* multEstimates)
1278 throw std::runtime_error(
"FEI_Impl::putCRMultipliers not implemented.");
1303 osstr<<
"fei::FEI_Impl::fillNodeset ERROR, blockID "
1304 << blockID <<
" not valid.";
1305 throw std::runtime_error(osstr.str());
1310 matGraph_->getRowSpace()->getRecordCollection(nodeType, nodeRecords);
1315 for(
unsigned i=0; i<nodes.size(); ++i) {
1332 osstr<<
"fei::FEI_Impl::getBlockElemIDList ERROR, elemBlockID "
1333 << elemBlockID <<
" not valid.";
1334 throw std::runtime_error(osstr.str());
1352 numElemBlocks =
matGraph_->getNumConnectivityBlocks();
1368 throw std::runtime_error(
"fei::FEI_Impl::getNumBlockActEqns not implemented.");
1374 nodesPerElem =
matGraph_->getNumIDsPerConnectivityList(blockID);
1380 numEqns =
matGraph_->getConnectivityNumIndices(blockID);
1387 matGraph_->getConnectivityBlock(blockID);
1388 if (cblock != NULL) {
1401 else DOFPerElem = (*b_iter).second;
1415 numScalars =
rowSpace_->getFieldSize(fieldID);
1425 numEqns =
rowSpace_->getFieldSize(fieldID);
1426 CHK_ERR(
rowSpace_->getGlobalIndices(1, &ID, idType, fieldID, eqnNumbers) );
1436 nodeIDs, results) );
1457 const double* nodeData)
1461 bool data_passed =
false;
1463 std::vector<int> numbers(numNodes);
1464 for(
int i=0; i<numNodes; ++i) {
1468 << nodeIDs[i] <<
" not found."<<
FEI_ENDL;
1475 fieldSize =
rowSpace_->getFieldSize(fieldID);
1477 catch (std::runtime_error& exc) {
1483 if (linSysCore.
get() != NULL) {
1484 linSysCore->putNodalFieldData(fieldID, fieldSize,
1485 &numbers[0], numNodes, nodeData);
1492 if (fedata.
get() != NULL) {
1493 fedata->putNodalFieldData(fieldID, fieldSize, numNodes,
1494 &numbers[0], nodeData);
1506 numNodes, nodeIDs, nodeData) );
1507 if (fieldID == -3) {
1512 osstr <<
"fieldID:" << fieldID;
1517 fei::console_out() <<
"fei::FEI_Impl::putNodalFieldData ERROR, non-null LibraryWrapper"
1518 <<
" contains neither LinearSystemCore or FiniteElementData. " <<
FEI_ENDL;
1526 numNodes, nodeIDs, nodeData));
std::vector< int > & getRowConnectivities()
const std::map< int, int > & getConnectivityIDs() const
const fei::Pattern * getRowPattern() const
fei::SharedPtr< fei::LinearSystem > linSys_
std::vector< fei::SharedPtr< fei::Matrix > > A_
int loadElemBCs(int numElems, const GlobalID *elemIDs, int fieldID, const double *const *alpha, const double *const *beta, const double *const *gamma)
int resetRHSVector(double s=0.0)
std::vector< int > iwork_
fei::SharedPtr< fei::LinearSystem > getLinearSystem()
int initSlaveVariable(GlobalID slaveNodeID, int slaveFieldID, int offsetIntoSlaveField, int numMasterNodes, const GlobalID *masterNodeIDs, const int *masterFieldIDs, const double *weights, double rhsValue)
int loadCRPen(int CRPenID, int numCRNodes, const GlobalID *CRNodeIDs, const int *CRFieldIDs, const double *CRWeights, double CRValue, double penValue)
int resetMatrix(double s=0.0)
int initElem(GlobalID elemBlockID, GlobalID elemID, const GlobalID *elemConn)
int initCRPen(int numCRNodes, const GlobalID *CRNodeIDs, const int *CRFieldIDs, int &CRID)
std::vector< fei::SharedPtr< LibraryWrapper > > wrapper_
std::vector< fei::SharedPtr< fei::Factory > > factory_
int getCRMultIDList(int numMultCRs, int *multIDs)
int iterations(int &itersTaken) const
int aggregateSystem_LinSysCore()
int getNumBlockActEqns(GlobalID blockID, int &numEqns) const
std::map< int, int > block_dof_per_elem_
int putIntoRHS(int IDType, int fieldID, int numIDs, const GlobalID *IDs, const double *coefficients)
int initFields(int numFields, const int *fieldSizes, const int *fieldIDs, const int *fieldTypes=NULL)
std::vector< int > rhsIDs_
int loadComplete(bool applyBCs=true, bool globalAssemble=true)
int getEqnNumbers(GlobalID ID, int idType, int fieldID, int &numEqns, int *eqnNumbers)
int setMatScalars(int numScalars, const int *IDs, const double *scalars)
int getNumEqnsPerElement(GlobalID blockID, int &numEqns) const
int initElemBlock(GlobalID elemBlockID, int numElements, int numNodesPerElement, const int *numFieldsPerNode, const int *const *nodalFieldIDs, int numElemDofFieldsPerElement, const int *elemDOFFieldIDs, int interleaveStrategy)
fei::SharedPtr< fei::Vector > x_
int getBlockFieldNodeSolution(GlobalID elemBlockID, int fieldID, int numNodes, const GlobalID *nodeIDs, double *results)
int putBlockNodeSolution(GlobalID elemBlockID, int numNodes, const GlobalID *nodeIDs, const int *offsets, const double *estimates)
int resetSystem(double s=0.0)
bool any_blocks_have_elem_dof_
int cumulative_cpu_times(double &initTime, double &loadTime, double &solveTime, double &solnReturnTime)
int resetInitialGuess(double s=0.0)
int setRHSScalars(int numScalars, const int *IDs, const double *scalars)
int initCRMult(int numCRNodes, const GlobalID *CRNodeIDs, const int *CRFieldIDs, int &CRID)
int putBlockFieldNodeSolution(GlobalID elemBlockID, int fieldID, int numNodes, const GlobalID *nodeIDs, const double *estimates)
std::vector< fei::SharedPtr< fei::Vector > > b_
void basic_initializations()
bool initPhaseIsComplete_
int residualNorm(int whichNorm, int numFields, int *fieldIDs, double *norms)
int index_current_rhs_row_
fei::SharedPtr< fei::VectorSpace > rowSpace_
int putCRMultipliers(int numMultCRs, const int *CRIDs, const double *multEstimates)
int getNodalFieldSolution(int fieldID, int numNodes, const GlobalID *nodeIDs, double *results)
int getNumBlockActNodes(GlobalID blockID, int &numNodes) const
int loadNodeBCs(int numNodes, const GlobalID *nodeIDs, int fieldID, const int *offsetsIntoField, const double *prescribedValues)
int getNumLocalNodes(int &numNodes)
int getNumCRMultipliers(int &numMultCRs)
int getNumBlockElements(GlobalID blockID, int &numElems) const
int getNumBlockElemDOF(GlobalID blockID, int &DOFPerElem) const
int sumInElem(GlobalID elemBlockID, GlobalID elemID, const GlobalID *elemConn, const double *const *elemStiffness, const double *elemLoad, int elemFormat)
int sumInElemRHS(GlobalID elemBlockID, GlobalID elemID, const GlobalID *elemConn, const double *elemLoad)
int getNodalSolution(int numNodes, const GlobalID *nodeIDs, int *offsets, double *results)
int sumInElemMatrix(GlobalID elemBlockID, GlobalID elemID, const GlobalID *elemConn, const double *const *elemStiffness, int elemFormat)
int getFieldSize(int fieldID, int &numScalars)
int getBlockNodeIDList(GlobalID elemBlockID, int numNodes, GlobalID *nodeIDs)
int getBlockNodeSolution(GlobalID elemBlockID, int numNodes, const GlobalID *nodeIDs, int *offsets, double *results)
int getLocalNodeIDList(int &numNodes, GlobalID *nodeIDs, int lenNodeIDs)
int getBlockElemSolution(GlobalID elemBlockID, int numElems, const GlobalID *elemIDs, int &numElemDOFPerElement, double *results)
int putBlockElemSolution(GlobalID elemBlockID, int numElems, const GlobalID *elemIDs, int dofPerElem, const double *estimates)
int initSharedNodes(int numSharedNodes, const GlobalID *sharedNodeIDs, const int *numProcsPerNode, const int *const *sharingProcIDs)
int setCurrentRHS(int rhsID)
std::vector< int > matrixIDs_
fei::SharedPtr< fei::MatrixGraph > matGraph_
int parameters(int numParams, const char *const *paramStrings)
int sumIntoRHS(int IDType, int fieldID, int numIDs, const GlobalID *IDs, const double *coefficients)
int fillNodeset(int blockID) const
int getParameters(int &numParams, char **¶mStrings)
int getNumElemBlocks(int &numElemBlocks) const
std::vector< double > matScalars_
std::vector< double > rhsScalars_
int getNumSolnParams(GlobalID nodeID, int &numSolnParams) const
int loadCRMult(int CRMultID, int numCRNodes, const GlobalID *CRNodeIDs, const int *CRFieldIDs, const double *CRWeights, double CRValue)
int version(const char *&versionString)
int getBlockElemIDList(GlobalID elemBlockID, int numElems, GlobalID *elemIDs)
int setCurrentMatrix(int matrixID)
int putNodalFieldData(int fieldID, int numNodes, const GlobalID *nodeIDs, const double *nodeData)
int inputRHS(int IDType, int fieldID, int numIDs, const GlobalID *IDs, const double *rhsEntries, bool sumInto)
bool aggregateSystemFormed_
int setSolveType(int solveType)
int getCRMultipliers(int numCRs, const int *CRIDs, double *multipliers)
FEI_Impl(fei::SharedPtr< LibraryWrapper > wrapper, MPI_Comm comm, int masterRank=0)
int getNumNodesPerElement(GlobalID blockID, int &nodesPerElem) const
int setIDLists(int numMatrices, const int *matrixIDs, int numRHSs, const int *rhsIDs)
virtual fei::SharedPtr< Factory > clone() const =0
const int * getNumFieldsPerID() const
const int * getIDTypes() const
const int * getFieldIDs() const
fei::SharedPtr< LibraryWrapper > get_LibraryWrapper() const
fei::Record< int > * getRecordWithLocalID(int lid)
int check(Epetra_CrsGraph &A, int NumMyRows1, int NumGlobalRows1, int NumMyNonzeros1, int NumGlobalNonzeros1, int *MyGlobalElements, bool verbose)
#define FEI_AGGREGATE_SUM
#define FEI_OSTRINGSTREAM
void parse_strings(std::vector< std::string > &stdstrings, const char *separator_string, fei::ParameterSet ¶mset)
void char_ptrs_to_strings(int numStrings, const char *const *charstrings, std::vector< std::string > &stdstrings)
int localProc(MPI_Comm comm)
void copySetToArray(const SET_TYPE &set_obj, int lenList, int *list)
void copyKeysToArray(const MAP_TYPE &map_obj, unsigned lenList, int *list)
std::ostream & console_out()
int sortedListInsert(const T &item, std::vector< T > &list)
int GlobalMax(MPI_Comm comm, std::vector< T > &local, std::vector< T > &global)
int numProcs(MPI_Comm comm)
int GlobalSum(MPI_Comm comm, std::vector< T > &local, std::vector< T > &global)
int mergeStringLists(char **&strings, int &numStrings, const char *const *stringsToMerge, int numStringsToMerge)