47 #ifndef PACKAGES_MUELU_SRC_GRAPH_MUELU_VARIABLEDOFLAPLACIANFACTORY_DEF_HPP_ 48 #define PACKAGES_MUELU_SRC_GRAPH_MUELU_VARIABLEDOFLAPLACIANFACTORY_DEF_HPP_ 57 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
59 RCP<ParameterList> validParamList = rcp(
new ParameterList());
74 validParamList->set<
double > (
"Advanced Dirichlet: threshold", 1e-5,
"Drop tolerance for Dirichlet detection");
75 validParamList->set<
double > (
"Variable DOF amalgamation: threshold", 1.8e-9,
"Drop tolerance for amalgamation process");
76 validParamList->set<
int > (
"maxDofPerNode", 1,
"Maximum number of DOFs per node");
78 validParamList->set< RCP<const FactoryBase> >(
"A", Teuchos::null,
"Generating factory of the matrix A");
79 validParamList->set< RCP<const FactoryBase> >(
"Coordinates", Teuchos::null,
"Generating factory for Coordinates");
81 return validParamList;
84 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
87 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
89 Input(currentLevel,
"A");
90 Input(currentLevel,
"Coordinates");
98 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
101 typedef Teuchos::ScalarTraits<SC> STS;
103 const ParameterList & pL = GetParameterList();
105 RCP<Matrix> A = Get< RCP<Matrix> >(currentLevel,
"A");
107 Teuchos::RCP< const Teuchos::Comm< int > > comm = A->getRowMap()->getComm();
108 Xpetra::UnderlyingLib lib = A->getRowMap()->lib();
110 typedef Xpetra::MultiVector<double,LO,GO,NO> dxMV;
111 RCP<dxMV> Coords = Get< RCP<Xpetra::MultiVector<double,LO,GO,NO> > >(currentLevel,
"Coordinates");
113 int maxDofPerNode = pL.get<
int>(
"maxDofPerNode");
114 Scalar dirDropTol = Teuchos::as<Scalar>(pL.get<
double>(
"Advanced Dirichlet: threshold"));
115 Scalar amalgDropTol = Teuchos::as<Scalar>(pL.get<
double>(
"Variable DOF amalgamation: threshold"));
117 bool bHasZeroDiagonal =
false;
121 Teuchos::ArrayRCP<LocalOrdinal> dofPresent = currentLevel.Get< Teuchos::ArrayRCP<LocalOrdinal> >(
"DofPresent",
NoFactory::get());
129 std::vector<LocalOrdinal> map(A->getNodeNumRows());
130 this->buildPaddedMap(dofPresent, map, A->getNodeNumRows());
133 std::vector<LocalOrdinal> myLocalNodeIds(A->getColMap()->getNodeNumElements());
136 size_t nLocalNodes, nLocalPlusGhostNodes;
137 this->assignGhostLocalNodeIds(A->getRowMap(), A->getColMap(), myLocalNodeIds, map, maxDofPerNode, nLocalNodes, nLocalPlusGhostNodes, comm);
139 TEUCHOS_TEST_FOR_EXCEPTION(Teuchos::as<size_t>(dofPresent.size()) != Teuchos::as<size_t>(nLocalNodes * maxDofPerNode),
MueLu::Exceptions::RuntimeError,
"VariableDofLaplacianFactory: size of provided DofPresent array is " << dofPresent.size() <<
" but should be " << nLocalNodes * maxDofPerNode <<
" on the current processor.");
145 Teuchos::ArrayView< const GlobalOrdinal > myGids = A->getColMap()->getNodeElementList();
149 size_t nLocalDofs = A->getRowMap()->getNodeNumElements();
150 size_t nLocalPlusGhostDofs = A->getColMap()->getNodeNumElements();
154 Teuchos::Array<GlobalOrdinal> amalgRowMapGIDs(nLocalNodes);
155 Teuchos::Array<GlobalOrdinal> amalgColMapGIDs(nLocalPlusGhostNodes);
159 if (nLocalDofs > 0) {
160 amalgRowMapGIDs[count] = myGids[0];
161 amalgColMapGIDs[count] = myGids[0];
167 for(
size_t i = 1; i < nLocalDofs; i++) {
168 if(myLocalNodeIds[i] != myLocalNodeIds[i-1]) {
169 amalgRowMapGIDs[count] = myGids[i];
175 for(
size_t i = 1; i < myLocalNodeIds.size(); i++) {
176 if(myLocalNodeIds[i] != myLocalNodeIds[i-1]) {
177 amalgColMapGIDs[count2] = myGids[i];
182 Teuchos::RCP<Map> amalgRowMap = MapFactory::Build(lib,
183 Teuchos::OrdinalTraits<GlobalOrdinal>::invalid(),
185 A->getRowMap()->getIndexBase(),
188 Teuchos::RCP<Map> amalgColMap = MapFactory::Build(lib,
189 Teuchos::OrdinalTraits<GlobalOrdinal>::invalid(),
191 A->getRangeMap()->getIndexBase(),
200 Teuchos::RCP<CrsMatrixWrap> Awrap = Teuchos::rcp_dynamic_cast<CrsMatrixWrap>(A);
201 Teuchos::RCP<CrsMatrix> Acrs = Awrap->getCrsMatrix();
204 Teuchos::ArrayRCP<const size_t> rowptr(Acrs->getNodeNumRows());
205 Teuchos::ArrayRCP<const LocalOrdinal> colind(Acrs->getNodeNumEntries());
206 Teuchos::ArrayRCP<const Scalar> values(Acrs->getNodeNumEntries());
207 Acrs->getAllValues(rowptr, colind, values);
211 Teuchos::ArrayRCP<size_t> amalgRowPtr(nLocalNodes+1);
212 Teuchos::ArrayRCP<LocalOrdinal> amalgCols(rowptr[rowptr.size()-1]);
214 size_t nNonZeros = 0;
215 std::vector<bool> isNonZero(nLocalPlusGhostDofs,
false);
216 std::vector<size_t> nonZeroList(nLocalPlusGhostDofs);
219 Teuchos::RCP<Vector> diagVecUnique = VectorFactory::Build(A->getRowMap());
220 Teuchos::RCP<Vector> diagVec = VectorFactory::Build(A->getColMap());
221 A->getLocalDiagCopy(*diagVecUnique);
222 Teuchos::RCP<Import> dofImporter = ImportFactory::Build(diagVecUnique->getMap(), diagVec->getMap());
223 diagVec->doImport(*diagVecUnique, *dofImporter, Xpetra::INSERT);
224 Teuchos::ArrayRCP< const Scalar > diagVecData = diagVec->getData(0);
226 LocalOrdinal oldBlockRow = 0;
227 LocalOrdinal blockRow, blockColumn;
229 amalgRowPtr[0] = newNzs;
231 bool doNotDrop =
false;
232 if (amalgDropTol == Teuchos::ScalarTraits<Scalar>::zero()) doNotDrop =
true;
233 if (values.size() == 0) doNotDrop =
true;
235 for(decltype(rowptr.size()) i = 0; i < rowptr.size()-1; i++) {
236 blockRow = std::floor<LocalOrdinal>( map[i] / maxDofPerNode);
237 if (blockRow != oldBlockRow) {
239 for(
size_t j = 0; j < nNonZeros; j++) isNonZero[nonZeroList[j]] =
false;
241 amalgRowPtr[blockRow] = newNzs;
243 for (
size_t j = rowptr[i]; j < rowptr[i+1]; j++) {
244 if(doNotDrop ==
true ||
245 ( STS::magnitude(values[j] / sqrt(STS::magnitude(diagVecData[i]) * STS::magnitude(diagVecData[colind[j]])) ) >= STS::magnitude(amalgDropTol) )) {
246 blockColumn = myLocalNodeIds[colind[j]];
247 if(isNonZero[blockColumn] ==
false) {
248 isNonZero[blockColumn] =
true;
249 nonZeroList[nNonZeros++] = blockColumn;
250 amalgCols[newNzs++] = blockColumn;
254 oldBlockRow = blockRow;
256 amalgRowPtr[blockRow+1] = newNzs;
258 TEUCHOS_TEST_FOR_EXCEPTION((blockRow+1 != Teuchos::as<LO>(nLocalNodes)) && (nLocalNodes !=0), MueLu::Exceptions::RuntimeError,
"VariableDofsPerNodeAmalgamation: error, computed # block rows (" << blockRow+1 <<
") != nLocalNodes (" << nLocalNodes <<
")");
260 amalgCols.resize(amalgRowPtr[nLocalNodes]);
280 Teuchos::ArrayRCP<LocalOrdinal> uniqueId(nLocalPlusGhostNodes);
281 std::vector<bool> keep(amalgRowPtr[amalgRowPtr.size()-1],
true);
284 for(decltype(amalgRowPtr.size()) i = 0; i < amalgRowPtr.size()-1; i++) {
285 LocalOrdinal temp = 1;
287 for (decltype(maxDofPerNode) j = 0; j < maxDofPerNode; j++) {
288 if (dofPresent[ii++]) uniqueId[i] += temp;
293 Teuchos::RCP<Import> nodeImporter = ImportFactory::Build(amalgRowMap, amalgColMap);
295 RCP<LOVector> nodeIdSrc = Xpetra::VectorFactory<LocalOrdinal,LocalOrdinal,GlobalOrdinal,Node>::Build(amalgRowMap,
true);
296 RCP<LOVector> nodeIdTarget = Xpetra::VectorFactory<LocalOrdinal,LocalOrdinal,GlobalOrdinal,Node>::Build(amalgColMap,
true);
298 Teuchos::ArrayRCP< LocalOrdinal > nodeIdSrcData = nodeIdSrc->getDataNonConst(0);
299 for(decltype(amalgRowPtr.size()) i = 0; i < amalgRowPtr.size()-1; i++) {
300 nodeIdSrcData[i] = uniqueId[i];
303 nodeIdTarget->doImport(*nodeIdSrc, *nodeImporter, Xpetra::INSERT);
305 Teuchos::ArrayRCP< const LocalOrdinal > nodeIdTargetData = nodeIdTarget->getData(0);
306 for(decltype(uniqueId.size()) i = 0; i < uniqueId.size(); i++) {
307 uniqueId[i] = nodeIdTargetData[i];
314 for(decltype(amalgRowPtr.size()) i = 0; i < amalgRowPtr.size()-1; i++) {
315 for(
size_t j = amalgRowPtr[i]; j < amalgRowPtr[i+1]; j++) {
316 if (uniqueId[i] != uniqueId[amalgCols[j]]) keep [j] =
false;
321 Teuchos::ArrayRCP<Scalar> amalgVals;
322 this->squeezeOutNnzs(amalgRowPtr,amalgCols,amalgVals,keep);
325 typedef Xpetra::MultiVectorFactory<double,LO,GO,NO> dxMVf;
326 RCP<dxMV> ghostedCoords = dxMVf::Build(amalgColMap,Coords->getNumVectors());
328 TEUCHOS_TEST_FOR_EXCEPTION(amalgRowMap->getNodeNumElements() != Coords->getMap()->getNodeNumElements(), MueLu::Exceptions::RuntimeError,
"MueLu::VariableDofLaplacianFactory: the number of Coordinates and amalgamated nodes is inconsistent.");
336 Coords->replaceMap(amalgRowMap);
337 ghostedCoords->doImport(*Coords, *nodeImporter, Xpetra::INSERT);
339 Teuchos::ArrayRCP<Scalar> lapVals(amalgRowPtr[nLocalNodes]);
340 this->buildLaplacian(amalgRowPtr, amalgCols, lapVals, Coords->getNumVectors(), ghostedCoords);
343 for(decltype(amalgRowPtr.size()) i = 0; i < amalgRowPtr.size()-1; i++) {
344 size_t j = amalgRowPtr[i];
345 this->MueLu_az_sort<LocalOrdinal>(&(amalgCols[j]), amalgRowPtr[i+1] - j, NULL, &(lapVals[j]));
350 Teuchos::Array<char> status(nLocalNodes * maxDofPerNode);
354 for(decltype(status.size()) i = 0; i < status.size(); i++) status[i] =
's';
355 for(decltype(status.size()) i = 0; i < status.size(); i++) {
356 if(dofPresent[i] ==
false) status[i] =
'p';
358 if(dirOrNot.size() > 0) {
359 for(decltype(map.size()) i = 0; i < map.size(); i++) {
360 if(dirOrNot[i] ==
true){
361 status[map[i]] =
'd';
365 Set(currentLevel,
"DofStatus",status);
369 Teuchos::RCP<CrsMatrix> lapCrsMat = CrsMatrixFactory::Build(amalgRowMap, amalgColMap, 10);
371 for (
size_t i = 0; i < nLocalNodes; i++) {
372 lapCrsMat->insertLocalValues(i, amalgCols.view(amalgRowPtr[i],amalgRowPtr[i+1]-amalgRowPtr[i]),
373 lapVals.view(amalgRowPtr[i],amalgRowPtr[i+1]-amalgRowPtr[i]));
375 lapCrsMat->fillComplete(amalgRowMap,amalgRowMap);
377 Teuchos::RCP<Matrix> lapMat = Teuchos::rcp(
new CrsMatrixWrap(lapCrsMat));
378 Set(currentLevel,
"A",lapMat);
381 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
382 void VariableDofLaplacianFactory<Scalar, LocalOrdinal, GlobalOrdinal, Node>::buildLaplacian(
const Teuchos::ArrayRCP<size_t>& rowPtr,
const Teuchos::ArrayRCP<LocalOrdinal>& cols, Teuchos::ArrayRCP<Scalar>& vals,
const size_t& numdim,
const RCP<Xpetra::MultiVector<double,LocalOrdinal,GlobalOrdinal,Node> > & ghostedCoords)
const {
383 TEUCHOS_TEST_FOR_EXCEPTION(numdim != 2 && numdim !=3,
MueLu::Exceptions::RuntimeError,
"buildLaplacian only works for 2d or 3d examples. numdim = " << numdim);
386 Teuchos::ArrayRCP< const double > x = ghostedCoords->getData(0);
387 Teuchos::ArrayRCP< const double > y = ghostedCoords->getData(1);
389 for(decltype(rowPtr.size()) i = 0; i < rowPtr.size() - 1; i++) {
390 Scalar sum = Teuchos::ScalarTraits<Scalar>::zero();
391 LocalOrdinal diag = -1;
392 for(
size_t j = rowPtr[i]; j < rowPtr[i+1]; j++) {
393 if(cols[j] != Teuchos::as<LO>(i)){
394 vals[j] = std::sqrt( (x[i]-x[cols[j]]) * (x[i]-x[cols[j]]) +
395 (y[i]-y[cols[j]]) * (y[i]-y[cols[j]]) );
396 TEUCHOS_TEST_FOR_EXCEPTION(vals[j] == Teuchos::ScalarTraits<Scalar>::zero(),
MueLu::Exceptions::RuntimeError,
"buildLaplacian: error, " << i <<
" and " << cols[j] <<
" have same coordinates: " << x[i] <<
" and " << y[i]);
397 vals[j] = -1./vals[j];
402 if(sum == Teuchos::ScalarTraits<Scalar>::zero()) sum = Teuchos::ScalarTraits<Scalar>::one();
408 Teuchos::ArrayRCP< const double > x = ghostedCoords->getData(0);
409 Teuchos::ArrayRCP< const double > y = ghostedCoords->getData(1);
410 Teuchos::ArrayRCP< const double > z = ghostedCoords->getData(2);
412 for(decltype(rowPtr.size()) i = 0; i < rowPtr.size() - 1; i++) {
413 Scalar sum = Teuchos::ScalarTraits<Scalar>::zero();
414 LocalOrdinal diag = -1;
415 for(
size_t j = rowPtr[i]; j < rowPtr[i+1]; j++) {
416 if(cols[j] != Teuchos::as<LO>(i)){
417 vals[j] = std::sqrt( (x[i]-x[cols[j]]) * (x[i]-x[cols[j]]) +
418 (y[i]-y[cols[j]]) * (y[i]-y[cols[j]]) +
419 (z[i]-z[cols[j]]) * (z[i]-z[cols[j]]) );
421 TEUCHOS_TEST_FOR_EXCEPTION(vals[j] == Teuchos::ScalarTraits<Scalar>::zero(),
MueLu::Exceptions::RuntimeError,
"buildLaplacian: error, " << i <<
" and " << cols[j] <<
" have same coordinates: " << x[i] <<
" and " << y[i] <<
" and " << z[i]);
423 vals[j] = -1./vals[j];
428 if(sum == Teuchos::ScalarTraits<Scalar>::zero()) sum = Teuchos::ScalarTraits<Scalar>::one();
436 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
444 size_t nRows = rowPtr.size()-1;
445 if(vals.size() > 0) {
446 for(
size_t i = 0; i < nRows; i++) {
447 size_t newStart = count;
448 for(
size_t j = rowPtr[i]; j < rowPtr[i+1]; j++) {
449 if(vals[j] != Teuchos::ScalarTraits<Scalar>::zero()) {
450 cols[count ] = cols[j];
451 vals[count++] = vals[j];
454 rowPtr[i] = newStart;
457 for (
size_t i = 0; i < nRows; i++) {
458 size_t newStart = count;
459 for(
size_t j = rowPtr[i]; j < rowPtr[i+1]; j++) {
460 if (keep[j] ==
true) {
461 cols[count++] = cols[j];
464 rowPtr[i] = newStart;
467 rowPtr[nRows] = count;
470 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
473 for (decltype(dofPresent.size()) i = 0; i < dofPresent.size(); i++)
474 if(dofPresent[i] == 1) map[count++] = Teuchos::as<LocalOrdinal>(i);
475 TEUCHOS_TEST_FOR_EXCEPTION(nDofs != count,
MueLu::Exceptions::RuntimeError,
"VariableDofLaplacianFactory::buildPaddedMap: #dofs in dofPresent does not match the expected value (number of rows of A): " << nDofs <<
" vs. " << count);
478 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
479 void VariableDofLaplacianFactory<Scalar, LocalOrdinal, GlobalOrdinal, Node>::assignGhostLocalNodeIds(
const Teuchos::RCP<const Map> & rowDofMap,
const Teuchos::RCP<const Map> & colDofMap, std::vector<LocalOrdinal> & myLocalNodeIds,
const std::vector<LocalOrdinal> & dofMap,
size_t maxDofPerNode,
size_t& nLocalNodes,
size_t& nLocalPlusGhostNodes, Teuchos::RCP<
const Teuchos::Comm< int > > comm)
const {
481 size_t nLocalDofs = rowDofMap->getNodeNumElements();
482 size_t nLocalPlusGhostDofs = colDofMap->getNodeNumElements();
485 Teuchos::RCP<Import> importer = ImportFactory::Build(rowDofMap, colDofMap);
488 Teuchos::RCP<LOVector> localNodeIdsTemp = LOVectorFactory::Build(rowDofMap,
true);
489 Teuchos::RCP<LOVector> localNodeIds = LOVectorFactory::Build(colDofMap,
true);
492 Teuchos::ArrayRCP< LocalOrdinal > localNodeIdsTempData = localNodeIdsTemp->getDataNonConst(0);
493 for(
size_t i = 0; i < localNodeIdsTemp->getLocalLength(); i++)
494 localNodeIdsTempData[i] = std::floor<LocalOrdinal>( dofMap[i] / maxDofPerNode );
496 localNodeIds->doImport(*localNodeIdsTemp, *importer, Xpetra::INSERT);
497 Teuchos::ArrayRCP< const LocalOrdinal > localNodeIdsData = localNodeIds->getData(0);
503 Teuchos::RCP<LOVector> myProcTemp = LOVectorFactory::Build(rowDofMap,
true);
504 Teuchos::RCP<LOVector> myProc = LOVectorFactory::Build(colDofMap,
true);
507 Teuchos::ArrayRCP< LocalOrdinal > myProcTempData = myProcTemp->getDataNonConst(0);
508 for(
size_t i = 0; i < myProcTemp->getLocalLength(); i++)
509 myProcTempData[i] = Teuchos::as<LocalOrdinal>(comm->getRank());
510 myProc->doImport(*myProcTemp, *importer, Xpetra::INSERT);
511 Teuchos::ArrayRCP<LocalOrdinal> myProcData = myProc->getDataNonConst(0);
526 std::vector<size_t> location(nLocalPlusGhostDofs - nLocalDofs + 1);
527 std::vector<size_t> tempId (nLocalPlusGhostDofs - nLocalDofs + 1);
528 std::vector<size_t> tempProc(nLocalPlusGhostDofs - nLocalDofs + 1);
530 size_t notProcessed = nLocalDofs;
531 size_t tempIndex = 0;
532 size_t first = tempIndex;
533 LocalOrdinal neighbor;
535 while (notProcessed < nLocalPlusGhostDofs) {
536 neighbor = myProcData[notProcessed];
538 location[tempIndex] = notProcessed;
539 tempId[tempIndex++] = localNodeIdsData[notProcessed];
540 myProcData[notProcessed] = -1 - neighbor;
542 for(
size_t i = notProcessed + 1; i < nLocalPlusGhostDofs; i++) {
543 if(myProcData[i] == neighbor) {
544 location[tempIndex] = i;
545 tempId[tempIndex++] = localNodeIdsData[i];
549 this->MueLu_az_sort<size_t>(&(tempId[first]), tempIndex - first, &(location[first]), NULL);
550 for(
size_t i = first; i < tempIndex; i++) tempProc[i] = neighbor;
554 while ( (notProcessed < nLocalPlusGhostDofs) && (myProcData[notProcessed] < 0))
564 if(nLocalDofs > 0) nLocalNodes = localNodeIdsData[nLocalDofs-1] + 1;
566 nLocalPlusGhostNodes = nLocalNodes;
567 if(nLocalDofs < nLocalPlusGhostDofs) nLocalPlusGhostNodes++;
575 for (
size_t i = nLocalDofs+1; i < nLocalPlusGhostDofs; i++) {
576 lagged = nLocalPlusGhostNodes-1;
579 if ((tempId[i-nLocalDofs] != tempId[i-1-nLocalDofs]) ||
580 (tempProc[i-nLocalDofs] != tempProc[i-1-nLocalDofs]))
581 nLocalPlusGhostNodes++;
582 tempId[i-1-nLocalDofs] = lagged;
584 if (nLocalPlusGhostDofs > nLocalDofs)
585 tempId[nLocalPlusGhostDofs-1-nLocalDofs] = nLocalPlusGhostNodes - 1;
588 for(
size_t i = 0; i < nLocalDofs; i++)
589 myLocalNodeIds[i] = std::floor<LocalOrdinal>( dofMap[i] / maxDofPerNode );
592 for(
size_t i = nLocalDofs; i < nLocalPlusGhostDofs; i++)
593 myLocalNodeIds[location[i-nLocalDofs]] = tempId[i-nLocalDofs];
VariableDofLaplacianFactory()
Constructor.
void buildLaplacian(const Teuchos::ArrayRCP< size_t > &rowPtr, const Teuchos::ArrayRCP< LocalOrdinal > &cols, Teuchos::ArrayRCP< Scalar > &vals, const size_t &numdim, const RCP< Xpetra::MultiVector< double, LocalOrdinal, GlobalOrdinal, Node > > &ghostedCoords) const
Timer to be used in factories. Similar to Monitor but with additional timers.
Namespace for MueLu classes and methods.
static const NoFactory * get()
void assignGhostLocalNodeIds(const Teuchos::RCP< const Map > &rowDofMap, const Teuchos::RCP< const Map > &colDofMap, std::vector< LocalOrdinal > &myLocalNodeIds, const std::vector< LocalOrdinal > &dofMap, size_t maxDofPerNode, size_t &nLocalNodes, size_t &nLocalPlusGhostNodes, Teuchos::RCP< const Teuchos::Comm< int > > comm) const
void buildPaddedMap(const Teuchos::ArrayRCP< const LocalOrdinal > &dofPresent, std::vector< LocalOrdinal > &map, size_t nDofs) const
void squeezeOutNnzs(Teuchos::ArrayRCP< size_t > &rowPtr, Teuchos::ArrayRCP< LocalOrdinal > &cols, Teuchos::ArrayRCP< Scalar > &vals, const std::vector< bool > &keep) const
Class that holds all level-specific information.
static Teuchos::ArrayRCP< const bool > DetectDirichletRowsExt(const Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > &A, bool &bHasZeroDiagonal, const Magnitude &tol=Teuchos::ScalarTraits< Scalar >::zero())
RCP< const ParameterList > GetValidParameterList() const
Return a const parameter list of valid parameters that setParameterList() will accept.
void Build(Level ¤tLevel) const
Build an object with this factory.
bool IsAvailable(const std::string &ename, const FactoryBase *factory=NoFactory::get()) const
Test whether a need's value has been saved.
Exception throws to report errors in the internal logical of the program.
void DeclareInput(Level ¤tLevel) const
Input.
void DeclareInput(const std::string &ename, const FactoryBase *factory, const FactoryBase *requestedBy=NoFactory::get())
Callback from FactoryBase::CallDeclareInput() and FactoryBase::DeclareInput()