38 #define fei_file "FEDataFilter.cpp"
41 #define ASSEMBLE_PUT 0
42 #define ASSEMBLE_SUM 1
49 std::vector<int>& nodeNumbers,
50 std::vector<int>& dof_ids)
52 nodeNumbers.resize(numEqns);
53 dof_ids.resize(numEqns);
55 for(
int i=0; i<numEqns; ++i) {
68 dof_ids[i] = fdmap.
get_dof_id(fieldID, offset);
74 int fieldID,
int fieldSize,
75 int numNodes,
const GlobalID* nodeIDs,
76 std::vector<int>& eqns)
78 eqns.assign(numNodes*fieldSize, -1);
81 for(
int i=0; i<numNodes; ++i) {
91 for(
int j=0; j<fieldSize; ++j) {
92 eqns[offset++] = eqn+j;
121 masterRank_(masterRank),
122 problemStructure_(probStruct),
128 eqnCommMgr_put_(NULL),
134 constraintBlocks_(0, 16),
135 constraintNodeOffsets_(),
154 fei::console_out() <<
"FEDataFilter::FEDataFilter ERROR, must be constructed with a "
155 <<
"FiniteElementData interface. Aborting." <<
FEI_ENDL;
167 char** paramStrings = NULL;
202 problemStructure_(NULL),
208 eqnCommMgr_put_(NULL),
214 constraintBlocks_(0, 16),
215 constraintNodeOffsets_(),
317 numNodes -= numRemoteNodes;
321 std::vector<int> numElemsPerBlock(numElemBlocks);
322 std::vector<int> numNodesPerElem(numElemBlocks);
323 std::vector<int> elemMatrixSizePerBlock(numElemBlocks);
325 for(
int blk=0; blk<numElemBlocks; blk++) {
335 elemMatrixSizePerBlock[blk] = 0;
337 for(
int nn=0; nn<numNodesPerElem[blk]; nn++) {
338 if (fieldsPerNode[nn] <= 0)
ERReturn(-1);
340 for(
int nf=0; nf<fieldsPerNode[nn]; nf++) {
341 elemMatrixSizePerBlock[blk] +=
358 std::map<GlobalID,ConstraintType*>::const_iterator
366 std::vector<int> numConstraintsPerBlock;
367 std::vector<int> numDofPerConstraint;
371 while(cr_iter != cr_end) {
376 int insertPoint = -1;
382 numConstraintsPerBlock.insert(numConstraintsPerBlock.begin()+insertPoint, 1);
383 numDofPerConstraint.insert(numDofPerConstraint.begin()+insertPoint, 0);
385 if (insertPoint > 0) {
390 offset = insertPoint;
393 numConstraintsPerBlock[offset]++;
399 int* fieldIDs = &fieldIDsvec[0];
400 for(
int k=0; k<nNodes; ++k) {
403 numDofPerConstraint[offset] += fieldSize;
411 numElemsPerBlock.push_back(numConstraintsPerBlock[i]);
413 elemMatrixSizePerBlock.push_back(numDofPerConstraint[i]);
419 &numElemsPerBlock[0],
421 &elemMatrixSizePerBlock[0],
427 std::vector<int> numDofPerNode;
428 std::vector<int> dof_ids;
431 for(
int i=0; i<numElemBlocks; i++) {
445 numDofPerNode.resize(0);
446 int total_num_dof = 0;
447 for(
int nn=0; nn<numNodesPerElem[i]; nn++) {
448 if (fieldsPerNode[nn] <= 0)
ERReturn(-1);
449 numDofPerNode.push_back(0);
450 int indx = numDofPerNode.size()-1;
452 for(
int nf=0; nf<fieldsPerNode[nn]; nf++) {
455 total_num_dof += numDofPerNode[indx];
458 dof_ids.resize(total_num_dof);
460 for(
int nn=0; nn<numNodesPerElem[i]; ++nn) {
461 for(
int nf=0; nf<fieldsPerNode[nn]; ++nf) {
463 for(
int dof_offset=0; dof_offset<fieldSize; ++dof_offset) {
464 dof_ids[doffset++] = fdmap.
get_dof_id(fieldIDsTable[nn][nf], dof_offset);
473 numRegularElems_ += numElems;
474 for(
int j=0; j<numElems; j++) {
476 for(
int k=0; k<nodesPerElement; k++) {
489 std::vector<int> nodeNumbers;
492 while(cr_iter != cr_end) {
494 std::vector<GlobalID>& nodeIDsvec = cr.
getMasters();
502 int total_num_dof = 0;
504 for(
size_t k=0; k<masterFieldIDs.size(); ++k) {
508 dof_ids.resize(total_num_dof);
510 for(
size_t k=0; k<masterFieldIDs.size(); ++k) {
512 for(
int dof_offset=0; dof_offset<field_size; ++dof_offset) {
513 dof_ids[doffset++] = fdmap.
get_dof_id(masterFieldIDs[k], dof_offset);
517 int blockNum = numElemBlocks + index;
519 nodeNumbers.resize(nNodes);
521 for(
int k=0; k<nNodes; ++k) {
539 catch(std::runtime_error& exc) {
572 debugOutput(
"#FEDataFilter leaving deleteMultCRs");
624 debugOutput(
"#FEDataFilter leaving resetRHSVector");
637 os <<
"FEI: resetInitialGuess" <<
FEI_ENDL;
638 os <<
"#value to which initial guess is to be set" <<
FEI_ENDL;
645 debugOutput(
"#FEDataFilter leaving resetInitialGuess");
654 const int* offsetsIntoField,
655 const double* prescribedValues)
662 fei::console_out() <<
"FEI Warning: loadNodeBCs called for fieldID "<<fieldID
663 <<
", which was defined with size "<<size<<
" (should be positive)."<<
FEI_ENDL;
674 for(
int j=0; j<numNodes; j++) {
675 int nodeID = nodeIDs[j];
677 (*
logStream())<< offsetsIntoField[j]<<
" ";
684 std::vector<int> essEqns(numNodes);
685 std::vector<double> alpha(numNodes);
686 std::vector<double> gamma(numNodes);
688 for(
int i=0; i<numNodes; ++i) {
692 fei::console_out() <<
"fei_FEDataFilter::loadNodeBCs ERROR, node " << nodeIDs[i]
702 essEqns[i] = eqn + offsetsIntoField[i];
703 gamma[i] = prescribedValues[i];
707 if (essEqns.size() > 0) {
709 &gamma[0], essEqns.size()) );
719 const double *
const *alpha,
720 const double *
const *beta,
721 const double *
const *gamma)
731 for(
int i=0; i<nb; i++) {
758 const double*
const* elemStiffness,
759 const double* elemLoad,
764 << static_cast<int>(elemBlockID) <<
FEI_ENDL
765 <<
"# elemID " << FEI_ENDL << static_cast<int>(elemID) <<
FEI_ENDL;
768 int numNodes = block->getNumNodesPerElement();
771 for(
int i=0; i<numNodes; ++i) {
773 (*
logStream())<<static_cast<int>(nodeID)<<
" ";
779 elemLoad, elemFormat));
786 const double*
const* elemStiffness,
791 <<
"#elemBlockID" <<
FEI_ENDL << static_cast<int>(elemBlockID)
792 <<
"# elemID" << FEI_ENDL << static_cast<int>(elemID) <<
FEI_ENDL;
795 int numNodes = block->getNumNodesPerElement();
798 for(
int i=0; i<numNodes; ++i) {
800 (*
logStream())<<static_cast<int>(nodeID)<<
" ";
813 const double* elemLoad)
817 <<static_cast<int>(elemBlockID)
818 <<
"# elemID " << FEI_ENDL << static_cast<int>(elemID) <<
FEI_ENDL;
821 int numNodes = block->getNumNodesPerElement();
824 for(
int i=0; i<numNodes; ++i) {
826 (*
logStream())<<static_cast<int>(nodeID)<<
" ";
839 const double*
const* elemStiffness,
840 const double* elemLoad,
851 const double*
const* elemStiffness,
852 const double* elemLoad,
869 const double*
const* stiff = NULL;
870 if (elemStiffness != NULL) stiff = elemStiffness;
872 const double* load = NULL;
873 if (elemLoad != NULL) load = elemLoad;
883 if (stiff != NULL || load != NULL)
newData_ =
true;
889 <<
"#elem-stiff (after being copied into dense-row format)"
891 for(
int i=0; i<numElemRows; i++) {
892 const double* stiff_i = stiff[i];
893 for(
int j=0; j<numElemRows; j++) {
902 for(
int i=0; i<numElemRows; i++) {
915 getBlockConnectivity(elemBlockID);
917 std::map<GlobalID,int>::iterator
918 iter = connTable.
elemIDs.find(elemID);
919 if (iter == connTable.
elemIDs.end()) {
925 int elemIndex = iter->second;
936 int total_num_dofs = 0;
937 if (numDistinctFields == 1) {
939 for(
int i=0; i<numNodes; ++i) {
940 total_num_dofs += fieldSize*fieldsPerNode[i];
942 dof_id = fdmap.
get_dof_id(fieldIDsTable[0][0], 0);
945 for(
int i=0; i<numNodes; ++i) {
946 for(
int nf=0; nf<fieldsPerNode[i]; ++nf) {
952 static std::vector<int> iwork;
953 iwork.resize(2*numNodes+total_num_dofs);
955 int* dofsPerNode = &iwork[0];
956 int* nodeNumbers = dofsPerNode+numNodes;
957 int* dof_ids = nodeNumbers+numNodes;
959 for(
int i=0; i<numNodes; ++i) {
968 for(
int nn=0; nn<numNodes; nn++) {
972 if (numDistinctFields == 1) {
973 for(
int nf=0; nf<fieldsPerNode[nn]; nf++) {
974 dofsPerNode[nn] += fieldSize;
975 for(
int dof_offset=0; dof_offset<fieldSize; ++dof_offset) {
976 dof_ids[doffset++] = dof_id;
981 for(
int nf=0; nf<fieldsPerNode[nn]; nf++) {
983 int dof_id = fdmap.
get_dof_id(fieldIDsTable[nn][nf], 0);
984 dofsPerNode[nn] += fieldSize;
985 for(
int dof_offset=0; dof_offset<fieldSize; ++dof_offset) {
986 dof_ids[doffset++] = dof_id + dof_offset;
994 nodeNumbers, dofsPerNode, dof_ids, stiff) );
999 nodeNumbers, dofsPerNode, dof_ids, load) );
1010 const double* rhsEntries)
1020 if (checkNumEqns != numIDs*fieldSize) {
1036 const double* rhsEntries)
1046 if (checkNumEqns != numIDs*fieldSize) {
1060 const double* coefficients)
1065 std::vector<int> eqns;
1068 std::vector<int> nodeNumbers, dof_ids;
1070 nodeDB, eqns.size(), &eqns[0],
1071 nodeNumbers, dof_ids);
1073 std::vector<int> ones(nodeNumbers.size(), 1);
1076 &ones[0], &nodeNumbers[0], &dof_ids[0], coefficients));
1082 const double* alpha,
1083 const double* gamma,
1086 std::vector<double> values;
1087 std::vector<int> nodeNumbers;
1088 std::vector<int> dof_ids;
1091 for(
int i=0; i<numEqns; i++) {
1092 int reducedEqn = -1;
1094 translateToReducedEqn(eqns[i], reducedEqn);
1095 if (isSlave)
continue;
1099 nodeNumbers.push_back(nodeNumber);
1103 getNodeWithNumber(nodeNumber, node));
1105 int fieldID, offset;
1107 dof_ids.push_back( fdmap.
get_dof_id(fieldID, offset) );
1109 values.push_back(gamma[i]/alpha[i]);
1113 &nodeNumbers[0], &dof_ids[0], &values[0]) );
1124 const int* CRFields,
1125 const double* CRWeights,
1131 os<<
"#num-nodes"<<FEI_ENDL<<numCRNodes<<
FEI_ENDL;
1134 for(i=0; i<numCRNodes; ++i) {
1136 os << static_cast<int>(nodeID) <<
" ";
1138 os << FEI_ENDL <<
"#fields:"<<
FEI_ENDL;
1139 for(i=0; i<numCRNodes; ++i) os << CRFields[i] <<
" ";
1140 os << FEI_ENDL <<
"#field-sizes:"<<
FEI_ENDL;
1141 for(i=0; i<numCRNodes; ++i) {
1145 os << FEI_ENDL<<
"#weights:"<<
FEI_ENDL;
1147 for(i=0; i<numCRNodes; ++i) {
1149 for(
int j=0; j<size; ++j) {
1150 os << CRWeights[offset++] <<
" ";
1153 os << FEI_ENDL<<
"#CRValue:"<<FEI_ENDL<<CRValue<<
FEI_ENDL;
1156 if (numCRNodes <= 0)
return(0);
1158 std::vector<int> nodeNumbers;
1159 std::vector<int> dof_ids;
1160 std::vector<double> weights;
1165 double fei_min = std::numeric_limits<double>::min();
1168 for(
int i=0; i<numCRNodes; i++) {
1177 int dof_id = fdmap.
get_dof_id(CRFields[i], 0);
1179 for(
int f=0;
f<fieldSize;
f++) {
1180 double weight = CRWeights[offset++];
1181 if (std::abs(weight) > fei_min) {
1183 dof_ids.push_back(dof_id+
f);
1184 weights.push_back(weight);
1190 &nodeNumbers[0], &dof_ids[0],
1191 &weights[0], CRValue) );
1201 const int* CRFields,
1202 const double* CRWeights,
1206 if (numCRNodes <= 0)
return(0);
1208 std::vector<int> nodeNumbers;
1209 std::vector<int> dofsPerNode;
1210 std::vector<int> dof_ids;
1211 std::vector<double> weights;
1217 for(
int i=0; i<numCRNodes; i++) {
1220 if(node == NULL)
continue;
1225 if (!hasField)
continue;
1230 dofsPerNode.push_back(fieldSize);
1232 for(
int f=0;
f<fieldSize;
f++) {
1233 dof_ids.push_back(fdmap.
get_dof_id(CRFields[i],
f));
1234 double weight = CRWeights[offset++];
1235 weights.push_back(weight);
1239 std::vector<double*> matrixCoefs(weights.size());
1240 std::vector<double> rhsCoefs(weights.size());
1242 for(
size_t i=0; i<weights.size(); ++i) {
1243 double* coefPtr =
new double[weights.size()];
1244 for(
size_t j=0; j<weights.size(); ++j) {
1245 coefPtr[j] = weights[i]*weights[j]*penValue;
1247 matrixCoefs[i] = coefPtr;
1248 rhsCoefs[i] = weights[i]*penValue*CRValue;
1266 &nodeNumbers[0], &dofsPerNode[0], &dof_ids[0], &rhsCoefs[0]) );
1270 for(
size_t i=0; i<weights.size(); ++i) {
1271 delete [] matrixCoefs[i];
1281 const int* CRFields,
1282 const double* CRWeights,
1300 const int* CRFields,
1301 const double* CRWeights,
1313 CRValue, penValue) );
1325 if (numParams == 0 || paramStrings == NULL) {
1326 debugOutput(
"#FEDataFilter::parameters --- no parameters.");
1338 <<
"# --- numParams: "<< numParams<<
FEI_ENDL;
1339 for(
int i=0; i<numParams; i++){
1340 (*
logStream())<<
"#------ paramStrings["<<i<<
"]: "
1348 debugOutput(
"#FEDataFilter leaving parameters function");
1356 debugOutput(
"#FEDataFilter calling FEData matrixLoadComplete");
1367 int* fieldIDs,
double* norms,
double& residTime)
1388 while(offset < numFields && i < fdbNumFields) {
1389 if (fdbFieldIDs[i] >= 0) {
1390 fieldIDs[offset++] = fdbFieldIDs[i];
1394 for(i=0; i<numFields; ++i) {
1400 for(i=offset; i<numFields; ++i) {
1421 debugOutput(
"#FEDataFilter in solve, calling launchSolver...");
1437 if (status != 0)
return(1);
1463 std::vector<int>::iterator iter =
1475 int numPtCols,
const int* ptCols,
1476 const double*
const* values,
int mode)
1481 std::vector<int> rowNodeNumbers, row_dof_ids, colNodeNumbers, col_dof_ids;
1490 for(i=0; i<numPtRows; i++) {
1495 int fieldID, offset;
1496 node->
getFieldID(ptRows[i], fieldID, offset);
1498 rowNodeNumbers.push_back(nodeNumber);
1499 row_dof_ids.push_back(fdmap.
get_dof_id(fieldID, offset));
1502 for(i=0; i<numPtCols; i++) {
1507 int fieldID, offset;
1508 node->
getFieldID(ptCols[i], fieldID, offset);
1510 colNodeNumbers.push_back(nodeNumber);
1511 col_dof_ids.push_back(fdmap.
get_dof_id(fieldID, offset));
1518 int len = numPtRows*numPtCols;
1519 std::vector<int> allColNodeNumbers(len), all_col_dof_ids(len);
1520 std::vector<double> allValues(len);
1523 for(i=0; i<numPtRows; i++) {
1524 for(
int j=0; j<numPtCols; j++) {
1525 allColNodeNumbers[offset] = colNodeNumbers[j];
1526 all_col_dof_ids[offset] = col_dof_ids[j];
1527 allValues[offset++] = values[i][j];
1533 std::vector<int> numColsPerRow(numPtRows, numPtCols);
1542 &allColNodeNumbers[0],
1543 &all_col_dof_ids[0],
1551 int numPtCols,
const int* ptCols,
1552 const double*
const* values,
int mode)
1557 std::vector<int> rowNodeNumbers, row_dof_ids, colNodeNumbers, col_dof_ids;
1566 for(i=0; i<numPtRows; i++) {
1571 int fieldID, offset;
1572 node->
getFieldID(ptRows[i], fieldID, offset);
1574 rowNodeNumbers.push_back(nodeNumber);
1575 row_dof_ids.push_back(fdmap.
get_dof_id(fieldID, offset));
1578 for(i=0; i<numPtCols; i++) {
1583 int fieldID, offset;
1584 node->
getFieldID(ptCols[i], fieldID, offset);
1586 colNodeNumbers.push_back(nodeNumber);
1587 col_dof_ids.push_back(fdmap.
get_dof_id(fieldID, offset));
1594 int len = numPtRows*numPtCols;
1595 std::vector<int> allColNodeNumbers(len), all_col_dof_ids(len);
1596 std::vector<double> allValues(len);
1599 for(i=0; i<numPtRows; i++) {
1600 for(
int j=0; j<numPtCols; j++) {
1601 allColNodeNumbers[offset] = colNodeNumbers[j];
1602 all_col_dof_ids[offset] = col_dof_ids[j];
1603 allValues[offset++] = values[i][j];
1609 std::vector<int> numColsPerRow(numPtRows, numPtCols);
1618 &allColNodeNumbers[0],
1619 &all_col_dof_ids[0],
1627 const int* rowColOffsets,
const int* ptCols,
1628 int numColsPerRow,
double** values)
1648 const int* indices,
int mode)
1650 std::vector<int> workspace(num*2);
1651 int* rowNodeNumbers = &workspace[0];
1652 int* row_dof_ids = rowNodeNumbers+num;
1656 for(
int i=0; i<num; ++i) {
1660 rowNodeNumbers[i] = -1;
1661 row_dof_ids[i] = -1;
1667 int fieldID, offset;
1668 nodeptr->
getFieldID(indices[i], fieldID, offset);
1670 row_dof_ids[i] = fdmap.
get_dof_id(fieldID, offset);
1691 const int* indices,
int mode)
1693 std::vector<int> rowNodeNumbers, row_dof_ids;
1697 for(
int i=0; i<num; i++) {
1704 int fieldID, offset;
1705 node->
getFieldID(indices[i], fieldID, offset);
1707 rowNodeNumbers.push_back(nodeNumber);
1708 row_dof_ids.push_back(fdmap.
get_dof_id(fieldID, offset));
1714 &row_dof_ids[0], values) );
1719 &row_dof_ids[0], values) );
1760 fei::console_out() <<
"FEDataFilter::getSharedRemoteSolnEntry: ERROR, eqn "
1761 << eqnNumber <<
" not found." <<
FEI_ENDL;
1764 solnValue = remoteSoln[index];
1781 if (nodeNumber < 0) {solnValue = -999.99;
return(
FEI_SUCCESS);}
1795 int fieldID, offset;
1799 bool fetiHasNode =
true;
1811 fei::console_out() <<
"FEDataFilter::getReducedSolnEntry: nodeNumber " << nodeNumber
1831 (*
logStream())<<
"# entering unpackSolution, outputLevel: "
1844 for(
int i=0; i<numRecvEqns; i++) {
1845 int eqn = recvEqnNumbers[i];
1848 fei::console_out() <<
"FEDataFilter::unpackSolution: ERROR, 'recv' eqn (" << eqn
1849 <<
") out of local range." <<
FEI_ENDL;
1853 double solnValue = 0.0;
1862 debugOutput(
"#FEDataFilter leaving unpackSolution");
1885 if (numActiveNodes <= 0)
return(0);
1887 int numSolnParams = 0;
1896 for(
int i=0; i<numActiveNodes; i++) {
1900 if (offset == numNodes)
break;
1905 offsets[offset++] = numSolnParams;
1929 for(
int j=0; j<numFields; j++) {
1940 for(
int k=0; k<size; k++) {
1942 results[numSolnParams++] = answer;
1948 offsets[numNodes] = numSolnParams;
1964 if (numActiveNodes <= 0)
return(0);
1966 int numSolnParams = 0;
1972 for(
int i=0; i<numActiveNodes; i++) {
1976 if (offset == numNodes)
break;
1981 offsets[offset++] = numSolnParams;
2005 for(
int j=0; j<numFields; j++) {
2015 for(
int k=0; k<size; k++) {
2017 results[numSolnParams++] = answer;
2022 offsets[numNodes] = numSolnParams;
2039 if (numActiveNodes <= 0)
return(0);
2048 fei::console_out() <<
"FEDataFilter::getBlockFieldNodeSolution WARNING: fieldID " << fieldID
2049 <<
" not contained in element-block " <<
static_cast<int>(elemBlockID) <<
FEI_ENDL;
2056 for(
int i=0; i<numNodes; i++) {
2083 if (!hasField)
continue;
2085 int offset = fieldSize*i;
2086 for(
int j=0; j<fieldSize; j++) {
2087 double answer = 0.0;
2089 results[offset+j] = answer;
2107 if (numActiveNodes <= 0)
return(0);
2110 fei::console_out() <<
"FEDataFilter::getEqnSolnEntry ERROR FETI-support is not currently"
2111 <<
" compatible with the FEI's constraint reduction." <<
FEI_ENDL;
2116 if (fieldSize <= 0) {
2123 for(
int i=0; i<numNodes; i++) {
2155 if (!hasField)
continue;
2159 int offset = fieldSize*i;
2161 for(
int j=0; j<fieldSize; j++) {
2169 fei::console_out() <<
"FEDataFilter::getReducedSolnEntry: nodeNumber " << nodeNumber
2170 <<
" (nodeID " << nodeID <<
"), dof_id "<<dof_id
2185 const double *estimates) {
2191 if (numActiveNodes <= 0)
return(0);
2203 for(
int i=0; i<numNodes; i++) {
2205 int err = nodeDB.getNodeWithID(nodeIDs[i], node);
2207 if (err != 0)
continue;
2220 int offs = offsets[i];
2222 for(
int j=0; j<numFields; j++) {
2226 for(
int k=0; k<size; k++) {
2229 translateToReducedEqn(fieldEqnNumbers[j]+k, reducedEqn);
2244 const double *estimates)
2258 std::vector<int> numbers(numNodes);
2263 std::vector<double> data;
2266 if (fieldSize < 1) {
2267 fei::console_out() <<
"FEI Warning, putBlockFieldNodeSolution called for field "
2268 << fieldID<<
", which has size "<<fieldSize<<
FEI_ENDL;
2272 numbers.resize(numNodes*fieldSize);
2273 data.resize(numNodes*fieldSize);
2275 catch(std::runtime_error& exc) {
2283 for(
int i=0; i<numNodes; i++) {
2292 for(
int j=0; j<fieldSize; j++) {
2293 data[count] = estimates[i*fieldSize + j];
2303 numNodes, &numbers[0],
2314 int& numElemDOFPerElement,
2327 getBlockConnectivity(elemBlockID).elemIDs;
2332 if (len > numElems) len = numElems;
2339 if (numElemDOFPerElement <= 0)
return(0);
2341 std::map<GlobalID,int>::const_iterator
2342 elemid_end = elemIDList.end(),
2343 elemid_itr = elemIDList.begin();
2345 for(
int i=0; i<len; i++) {
2350 if (elemid_itr->first != elemIDs[i]) {
2351 index = elemid_itr->second;
2354 if (index < 0)
continue;
2356 int offset = i*numElemDOFPerElement;
2358 for(
int j=0; j<numElemDOFPerElement; j++) {
2359 int eqn = elemDOFEqnNumbers[index] + j;
2363 results[offset+j] = answer;
2377 const double *estimates)
2385 getBlockConnectivity(elemBlockID).elemIDs;
2388 if (len > numElems) len = numElems;
2391 if (DOFPerElement != dofPerElem) {
2392 fei::console_out() <<
"FEI ERROR, putBlockElemSolution called with bad 'dofPerElem' ("
2393 <<dofPerElem<<
"), block "<<elemBlockID<<
" should have dofPerElem=="
2400 if (DOFPerElement <= 0)
return(0);
2402 std::map<GlobalID,int>::const_iterator
2403 elemid_end = elemIDList.end(),
2404 elemid_itr = elemIDList.begin();
2406 for(
int i=0; i<len; i++) {
2408 if (elemid_itr->first != elemIDs[i]) {
2409 index = elemid_itr->second;
2412 if (index < 0)
continue;
2414 for(
int j=0; j<DOFPerElement; j++) {
2417 translateToReducedEqn(elemDOFEqnNumbers[i] + j, reducedEqn);
2434 double* multipliers)
2436 for(
int i=0; i<numCRs; i++) {
2439 multipliers[i] = -999.99;
2448 const double *multEstimates)
2459 const double* nodeData)
2466 std::vector<int> nodeNumbers(numNodes);
2468 for(
int i=0; i<numNodes; i++) {
2473 if (nodeNumber < 0) {
2475 fei::console_out() <<
"FEDataFilter::putNodalFieldData ERROR, node with ID "
2476 <<
static_cast<int>(nodeID) <<
" doesn't have an associated nodeNumber "
2477 <<
"assigned. putNodalFieldData shouldn't be called until after the "
2478 <<
"initComplete method has been called." <<
FEI_ENDL;
2482 nodeNumbers[i] = nodeNumber;
2486 numNodes, &nodeNumbers[0],
2496 const double* nodeData)
2507 std::vector<int> eqnNumbers(fieldSize);
2509 for(
int i=0; i<numNodes; i++) {
2515 if (!hasField)
continue;
2525 const int* rowNumbers,
2526 const int* colIndices,
2527 const double*
const* coefs,
2528 bool structurallySymmetric,
2533 const int* indPtr = colIndices;
2534 for(
int i=0; i<numRows; i++) {
2535 int row = rowNumbers[i];
2537 const double* coefPtr = coefs[i];
2541 if (!structurallySymmetric) indPtr += numCols;
2550 const double* coefs,
2561 for(
int i = 0; i < numValues; i++) {
2562 int eqn = indices[i];
2563 if (eqn < 0)
continue;
int loadFEDataMultCR(int CRID, int numCRNodes, const GlobalID *CRNodes, const int *CRFields, const double *CRWeights, double CRValue)
int getParameters(int &numParams, char **¶mStrings)
int getNumElemDOFPerElement()
std::vector< int > & localEqnNumbers()
int getFieldSize(int fieldID)
const int * getFieldIDsPtr()
FEDataFilter(FEI_Implementation *owner, MPI_Comm comm, SNL_FEI_Structure *probStruct, LibraryWrapper *wrapper, int masterRank=0)
int resetMatrix(double s)
int sumIntoMatrixDiagonal(int IDType, int fieldID, int numIDs, const GlobalID *IDs, const double *coefficients)
std::vector< int > & getMasterFieldIDs()
int getBlockDescriptor_index(int index, BlockDescriptor *&block)
int getNodeWithNumber(int nodeNumber, const NodeDescriptor *&node) const
fei::FieldDofMap< int > & getFieldDofMap()
bool hasBlockIndex(unsigned blk_idx) const
virtual int loadComplete()=0
int putIntoRHS(int IDType, int fieldID, int numIDs, const GlobalID *IDs, const double *rhsEntries)
int putBlockElemSolution(GlobalID elemBlockID, int numElems, const GlobalID *elemIDs, int dofPerElem, const double *estimates)
std::ostream * logStream()
int getReducedSolnEntry(int eqnNumber, double &solnValue)
const int * getFieldIDList() const
std::vector< int > rhsIDs_
int sumInElemMatrix(GlobalID elemBlockID, GlobalID elemID, const GlobalID *elemConn, const double *const *elemStiffness, int elemFormat)
virtual int deleteConstraints()=0
int getEqnNumbers(GlobalID ID, int idType, int fieldID, int &numEqns, int *eqnNumbers)
int getBlockElemSolution(GlobalID elemBlockID, int numElems, const GlobalID *elemIDs, int &numElemDOFPerElement, double *results)
NodeDatabase & getNodeDatabase()
int resetTheRHSVector(double s)
int loadCRPen(int CRPenID, int numCRNodes, const GlobalID *CRNodes, const int *CRFields, const double *CRWeights, double CRValue, double penValue)
const int * getFieldEqnNumbers() const
int setCurrentRHS(int rhsID)
int resetRHSVector(double s)
bool getFieldEqnNumber(int fieldID, int &eqnNumber) const
int getFromMatrix(int numPtRows, const int *ptRows, const int *rowColOffsets, const int *ptCols, int numColsPerRow, double **values)
EqnCommMgr & getEqnCommMgr()
int putBlockFieldNodeSolution(GlobalID elemBlockID, int fieldID, int numNodes, const GlobalID *nodeIDs, const double *estimates)
virtual int parameters(int numParams, const char *const *paramStrings)
int getNodalFieldSolution(int fieldID, int numNodes, const GlobalID *nodeIDs, double *results)
int putNodalFieldSolution(int fieldID, int numNodes, const GlobalID *nodeIDs, const double *nodeData)
void setEqnCommMgr(EqnCommMgr *eqnCommMgr)
std::vector< int > elemNumbers
std::vector< int > packedFieldSizes_
int enforceEssentialBCs(const int *eqns, const double *alpha, const double *gamma, int numEqns)
int parameters(int numParams, const char *const *paramStrings)
int setNumRHSVectors(int numRHSs, int *rhsIDs)
LocalOrdinal get_dof_id(LocalOrdinal fieldID, LocalOrdinal offset)
std::vector< int > rowIndices_
int loadNodeBCs(int numNodes, const GlobalID *nodeIDs, int fieldID, const int *offsetsIntoField, const double *prescribedValues)
virtual int exchangeRemoteEquations()
int giveToLocalReducedMatrix(int numPtRows, const int *ptRows, int numPtCols, const int *ptCols, const double *const *values, int mode)
int ** fieldIDsTablePtr()
virtual int setConnectivity(int elemBlockID, int elemID, int numNodes, const int *nodeNumbers, const int *numDofPerNode, const int *dof_ids)=0
std::vector< GlobalID > & getLocalNodeIDs()
static void copyStiffness(const double *const *elemStiff, int numRows, int elemFormat, double **copy)
virtual int putIntoRHSVector(int numNodes, const int *nodeNumbers, const int *dof_ids, const double *coefs)=0
int binarySearch(const T &item, const T *list, int len)
int giveToLocalReducedRHS(int num, const double *values, const int *indices, int mode)
int getNodeWithEqn(int eqnNumber, const NodeDescriptor *&node) const
int getSharedRemoteSolnEntry(int eqnNumber, double &solnValue)
int giveToMatrix(int numPtRows, const int *ptRows, int numPtCols, const int *ptCols, const double *const *values, int mode)
virtual int putNodalFieldData(int fieldID, int fieldSize, int numNodes, const int *nodeNumbers, const double *coefs)=0
std::vector< int > & elemDOFEqnNumbers()
std::vector< NodeDescriptor * > * elem_conn_ptrs
virtual int setLookup(Lookup &lookup)=0
int assembleEqns(int numPtRows, int numPtCols, const int *rowNumbers, const int *colIndices, const double *const *coefs, bool structurallySymmetric, int mode)
int getEqnsFromMatrix(ProcEqns &procEqns, EqnBuffer &eqnData)
int residualNorm(int whichNorm, int numFields, int *fieldIDs, double *norms, double &residTime)
int getEqnsFromRHS(ProcEqns &procEqns, EqnBuffer &eqnData)
int putBlockNodeSolution(GlobalID elemBlockID, int numNodes, const GlobalID *nodeIDs, const int *offsets, const double *estimates)
void getNodeAtIndex(int i, const NodeDescriptor *&node) const
std::map< GlobalID, snl_fei::Constraint< GlobalID > * > & getPenConstRecords()
GlobalID getGlobalNodeID() const
std::vector< int > & getGlobalEqnOffsets()
virtual int setElemVector(int elemBlockID, int elemID, int numNodes, const int *nodeNumbers, const int *numDofPerNode, const int *dof_ids, const double *coefs)=0
std::map< GlobalID, int > elemIDs
int solve(int &status, double &sTime)
int sumInElemRHS(GlobalID elemBlockID, GlobalID elemID, const GlobalID *elemConn, const double *elemLoad)
fei::SharedPtr< FiniteElementData > feData_
std::vector< int > & sendEqnNumbersPtr()
bool containsField(int fieldID)
bool isInLocalElement(int nodeNumber)
int resetTheMatrix(double s)
int createEqnCommMgr_put()
int formResidual(double *residValues, int numLocalEqns)
int resetSystem(double s)
int getBlockFieldNodeSolution(GlobalID elemBlockID, int fieldID, int numNodes, const GlobalID *nodeIDs, double *results)
fei::SharedPtr< FiniteElementData > getFiniteElementData()
int getNumDistinctFields()
virtual int launchSolver(int &solveStatus, int &iterations)=0
int getNumNodesPerElement() const
void convert_field_and_nodes_to_eqns(const NodeDatabase &nodeDB, int fieldID, int fieldSize, int numNodes, const GlobalID *nodeIDs, std::vector< int > &eqns)
void debugOutput(const char *mesg)
int generalElemInput(GlobalID elemBlockID, GlobalID elemID, const double *const *elemStiffness, const double *elemLoad, int elemFormat)
int getFromRHS(int num, double *values, const int *indices)
int getNodalSolution(int numNodes, const GlobalID *nodeIDs, int *offsets, double *results)
int getBlockDescriptor(GlobalID blockID, BlockDescriptor *&block)
int resetInitialGuess(double s)
int loadCRMult(int CRMultID, int numCRNodes, const GlobalID *CRNodes, const int *CRFields, const double *CRWeights, double CRValue)
bool translateToReducedEqn(int eqn, int &reducedEqn)
EqnCommMgr * eqnCommMgr_put_
ConnectivityTable & getBlockConnectivity(GlobalID blockID)
std::ostream & console_out()
const NodeDescriptor * findNode(GlobalID nodeID) const
int assembleRHS(int numValues, const int *indices, const double *coefs, int mode)
int getAssociatedNodeNumber(int eqnNumber)
virtual int setMultiplierCR(int CRID, int numNodes, const int *nodeNumbers, const int *dof_ids, const double *coefWeights, double rhsValue)=0
virtual int setElemMatrix(int elemBlockID, int elemID, int numNodes, const int *nodeNumbers, const int *numDofPerNode, const int *dof_ids, const double *const *coefs)=0
virtual int sumIntoMatrix(int numRowNodes, const int *rowNodeNumbers, const int *row_dof_ids, const int *numColNodesPerRow, const int *colNodeNumbers, const int *col_dof_ids, const double *coefs)=0
int sumInElem(GlobalID elemBlockID, GlobalID elemID, const GlobalID *elemConn, const double *const *elemStiffness, const double *elemLoad, int elemFormat)
int localProc(MPI_Comm comm)
int putNodalFieldData(int fieldID, int numNodes, const GlobalID *nodeIDs, const double *nodeData)
int loadElemBCs(int numElems, const GlobalID *elemIDs, int fieldID, const double *const *alpha, const double *const *beta, const double *const *gamma)
GlobalID getGlobalBlockID()
virtual int getSolnEntry(int nodeNumber, int dof_id, double &value)=0
void setNumRHSs(int numRHSs)
LibraryWrapper * wrapper_
int giveToRHS(int num, const double *values, const int *indices, int mode)
void getFieldID(int eqnNumber, int &fieldID, int &offset_into_field) const
int putCRMultipliers(int numMultCRs, const int *CRIDs, const double *multEstimates)
int getBlockNodeSolution(GlobalID elemBlockID, int numNodes, const GlobalID *nodeIDs, int *offsets, double *results)
SNL_FEI_Structure * problemStructure_
int loadFEDataPenCR(int CRID, int numCRNodes, const GlobalID *CRNodes, const int *CRFields, const double *CRWeights, double CRValue, double penValue)
std::vector< int > & getMasters()
int getNumNodeDescriptors() const
int getNumPenConstRecords()
int translateFromReducedEqn(int reducedEqn)
bool haveFiniteElementData()
std::vector< GlobalID > penCRIDs_
int getNodeWithID(GlobalID nodeID, const NodeDescriptor *&node) const
int getNumMultConstRecords()
int getIntParamValue(const char *key, int numParams, const char *const *params, int ¶mValue)
int getNumEqnsPerElement()
size_t getNumSharedNodes()
snl_fei::Constraint< GlobalID > ConstraintType
int getCRMultipliers(int numCRs, const int *CRIDs, double *multipliers)
std::vector< int > constraintNodeOffsets_
virtual int describeStructure(int numElemBlocks, const int *numElemsPerBlock, const int *numNodesPerElem, const int *elemMatrixSizePerBlock, int totalNumNodes, int numSharedNodes, int numMultCRs)=0
virtual int sumIntoRHSVector(int numNodes, const int *nodeNumbers, const int *dof_ids, const double *coefs)=0
std::vector< GlobalID > & getSharedNodeIDs()
void addSolnValues(int *eqnNumbers, double *values, int num)
int getNodeNumber() const
void convert_eqns_to_nodenumbers_and_dof_ids(fei::FieldDofMap< int > &fdmap, const NodeDatabase &nodeDB, int numEqns, const int *eqns, std::vector< int > &nodeNumbers, std::vector< int > &dof_ids)
double * sendEqnSolnPtr()
std::vector< int > constraintBlocks_
virtual int setDirichletBCs(int numBCs, const int *nodeNumbers, const int *dof_ids, const double *values)=0
int numProcs(MPI_Comm comm)
int sumIntoRHS(int IDType, int fieldID, int numIDs, const GlobalID *IDs, const double *rhsEntries)
NodeCommMgr & getNodeCommMgr()
int getIndexOfBlock(GlobalID blockID) const
int getEqnSolnEntry(int eqnNumber, double &solnValue)