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());
61 validParamList->set<
double > (
"Advanced Dirichlet: threshold", 1e-5,
"Drop tolerance for Dirichlet detection");
62 validParamList->set<
double > (
"Variable DOF amalgamation: threshold", 1.8e-9,
"Drop tolerance for amalgamation process");
63 validParamList->set<
int > (
"maxDofPerNode", 1,
"Maximum number of DOFs per node");
65 validParamList->set< RCP<const FactoryBase> >(
"A", Teuchos::null,
"Generating factory of the matrix A");
66 validParamList->set< RCP<const FactoryBase> >(
"Coordinates", Teuchos::null,
"Generating factory for Coordinates");
68 return validParamList;
71 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
74 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
76 Input(currentLevel,
"A");
77 Input(currentLevel,
"Coordinates");
85 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
88 typedef Teuchos::ScalarTraits<SC> STS;
90 const ParameterList & pL = GetParameterList();
92 RCP<Matrix> A = Get< RCP<Matrix> >(currentLevel,
"A");
94 Teuchos::RCP< const Teuchos::Comm< int > > comm = A->getRowMap()->getComm();
95 Xpetra::UnderlyingLib lib = A->getRowMap()->lib();
97 typedef Xpetra::MultiVector<typename Teuchos::ScalarTraits<Scalar>::magnitudeType,LO,GO,NO> dxMV;
98 RCP<dxMV> Coords = Get< RCP<Xpetra::MultiVector<typename Teuchos::ScalarTraits<Scalar>::magnitudeType,LO,GO,NO> > >(currentLevel,
"Coordinates");
100 int maxDofPerNode = pL.get<
int>(
"maxDofPerNode");
101 Scalar dirDropTol = Teuchos::as<Scalar>(pL.get<
double>(
"Advanced Dirichlet: threshold"));
102 Scalar amalgDropTol = Teuchos::as<Scalar>(pL.get<
double>(
"Variable DOF amalgamation: threshold"));
104 bool bHasZeroDiagonal =
false;
108 Teuchos::ArrayRCP<LocalOrdinal> dofPresent;
110 dofPresent = currentLevel.
Get< Teuchos::ArrayRCP<LocalOrdinal> >(
"DofPresent",
NoFactory::get());
113 dofPresent = Teuchos::ArrayRCP<LocalOrdinal>(A->getRowMap()->getLocalNumElements(),1);
122 std::vector<LocalOrdinal> map(A->getLocalNumRows());
123 this->buildPaddedMap(dofPresent, map, A->getLocalNumRows());
126 std::vector<LocalOrdinal> myLocalNodeIds(A->getColMap()->getLocalNumElements());
129 size_t nLocalNodes, nLocalPlusGhostNodes;
130 this->assignGhostLocalNodeIds(A->getRowMap(), A->getColMap(), myLocalNodeIds, map, maxDofPerNode, nLocalNodes, nLocalPlusGhostNodes, comm);
134 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.");
140 Teuchos::ArrayView< const GlobalOrdinal > myGids = A->getColMap()->getLocalElementList();
144 size_t nLocalDofs = A->getRowMap()->getLocalNumElements();
145 size_t nLocalPlusGhostDofs = A->getColMap()->getLocalNumElements();
149 Teuchos::Array<GlobalOrdinal> amalgRowMapGIDs(nLocalNodes);
150 Teuchos::Array<GlobalOrdinal> amalgColMapGIDs(nLocalPlusGhostNodes);
154 if (nLocalDofs > 0) {
155 amalgRowMapGIDs[count] = myGids[0];
156 amalgColMapGIDs[count] = myGids[0];
160 for(
size_t i = 1; i < nLocalDofs; i++) {
161 if (myLocalNodeIds[i] != myLocalNodeIds[i-1]) {
162 amalgRowMapGIDs[count] = myGids[i];
163 amalgColMapGIDs[count] = myGids[i];
168 RCP<GOVector> tempAmalgColVec = GOVectorFactory::Build(A->getDomainMap());
170 Teuchos::ArrayRCP<GlobalOrdinal> tempAmalgColVecData = tempAmalgColVec->getDataNonConst(0);
171 for (
size_t i = 0; i < A->getDomainMap()->getLocalNumElements(); i++)
172 tempAmalgColVecData[i] = amalgColMapGIDs[ myLocalNodeIds[i]];
175 RCP<GOVector> tempAmalgColVecTarget = GOVectorFactory::Build(A->getColMap());
176 Teuchos::RCP<Import> dofImporter = ImportFactory::Build(A->getDomainMap(), A->getColMap());
177 tempAmalgColVecTarget->doImport(*tempAmalgColVec, *dofImporter, Xpetra::INSERT);
180 Teuchos::ArrayRCP<const GlobalOrdinal> tempAmalgColVecBData = tempAmalgColVecTarget->getData(0);
182 for (
size_t i = 0; i < myLocalNodeIds.size(); i++)
183 amalgColMapGIDs[ myLocalNodeIds[i]] = tempAmalgColVecBData[i];
186 Teuchos::RCP<Map> amalgRowMap = MapFactory::Build(lib,
187 Teuchos::OrdinalTraits<GlobalOrdinal>::invalid(),
189 A->getRowMap()->getIndexBase(),
192 Teuchos::RCP<Map> amalgColMap = MapFactory::Build(lib,
193 Teuchos::OrdinalTraits<GlobalOrdinal>::invalid(),
195 A->getRangeMap()->getIndexBase(),
203 Teuchos::RCP<CrsMatrixWrap> Awrap = Teuchos::rcp_dynamic_cast<CrsMatrixWrap>(A);
204 Teuchos::RCP<CrsMatrix> Acrs = Awrap->getCrsMatrix();
207 size_t nNonZeros = 0;
208 std::vector<bool> isNonZero(nLocalPlusGhostDofs,
false);
209 std::vector<size_t> nonZeroList(nLocalPlusGhostDofs);
212 Teuchos::RCP<Vector> diagVecUnique = VectorFactory::Build(A->getRowMap());
213 Teuchos::RCP<Vector> diagVec = VectorFactory::Build(A->getColMap());
214 A->getLocalDiagCopy(*diagVecUnique);
215 diagVec->doImport(*diagVecUnique, *dofImporter, Xpetra::INSERT);
216 Teuchos::ArrayRCP< const Scalar > diagVecData = diagVec->getData(0);
218 Teuchos::ArrayRCP<const size_t> rowptr(Acrs->getLocalNumRows());
219 Teuchos::ArrayRCP<const LocalOrdinal> colind(Acrs->getLocalNumEntries());
220 Teuchos::ArrayRCP<const Scalar> values(Acrs->getLocalNumEntries());
221 Acrs->getAllValues(rowptr, colind, values);
225 Teuchos::ArrayRCP<size_t> amalgRowPtr(nLocalNodes+1);
226 Teuchos::ArrayRCP<LocalOrdinal> amalgCols(rowptr[rowptr.size()-1]);
233 amalgRowPtr[0] = newNzs;
235 bool doNotDrop =
false;
236 if (amalgDropTol == Teuchos::ScalarTraits<Scalar>::zero()) doNotDrop =
true;
237 if (values.size() == 0) doNotDrop =
true;
239 for(
decltype(rowptr.size()) i = 0; i < rowptr.size()-1; i++) {
240 blockRow = std::floor<LocalOrdinal>( map[i] / maxDofPerNode);
241 if (blockRow != oldBlockRow) {
243 for(
size_t j = 0; j < nNonZeros; j++) isNonZero[nonZeroList[j]] =
false;
245 amalgRowPtr[blockRow] = newNzs;
247 for (
size_t j = rowptr[i]; j < rowptr[i+1]; j++) {
248 if(doNotDrop ==
true ||
249 ( STS::magnitude(values[j] / STS::magnitude(sqrt(STS::magnitude(diagVecData[i]) * STS::magnitude(diagVecData[colind[j]]))) ) >= STS::magnitude(amalgDropTol) )) {
250 blockColumn = myLocalNodeIds[colind[j]];
251 if(isNonZero[blockColumn] ==
false) {
252 isNonZero[blockColumn] =
true;
253 nonZeroList[nNonZeros++] = blockColumn;
254 amalgCols[newNzs++] = blockColumn;
258 oldBlockRow = blockRow;
260 amalgRowPtr[blockRow+1] = newNzs;
262 TEUCHOS_TEST_FOR_EXCEPTION((blockRow+1 != Teuchos::as<LO>(nLocalNodes)) && (nLocalNodes !=0),
MueLu::Exceptions::RuntimeError,
"VariableDofsPerNodeAmalgamation: error, computed # block rows (" << blockRow+1 <<
") != nLocalNodes (" << nLocalNodes <<
")");
264 amalgCols.resize(amalgRowPtr[nLocalNodes]);
283 Teuchos::ArrayRCP<LocalOrdinal> uniqueId(nLocalPlusGhostNodes);
284 std::vector<bool> keep(amalgRowPtr[amalgRowPtr.size()-1],
true);
287 for(
decltype(amalgRowPtr.size()) i = 0; i < amalgRowPtr.size()-1; i++) {
290 for (
decltype(maxDofPerNode) j = 0; j < maxDofPerNode; j++) {
291 if (dofPresent[ii++]) uniqueId[i] += temp;
296 Teuchos::RCP<Import> nodeImporter = ImportFactory::Build(amalgRowMap, amalgColMap);
298 RCP<LOVector> nodeIdSrc = Xpetra::VectorFactory<LocalOrdinal,LocalOrdinal,GlobalOrdinal,Node>::Build(amalgRowMap,
true);
299 RCP<LOVector> nodeIdTarget = Xpetra::VectorFactory<LocalOrdinal,LocalOrdinal,GlobalOrdinal,Node>::Build(amalgColMap,
true);
301 Teuchos::ArrayRCP< LocalOrdinal > nodeIdSrcData = nodeIdSrc->getDataNonConst(0);
302 for(
decltype(amalgRowPtr.size()) i = 0; i < amalgRowPtr.size()-1; i++) {
303 nodeIdSrcData[i] = uniqueId[i];
306 nodeIdTarget->doImport(*nodeIdSrc, *nodeImporter, Xpetra::INSERT);
308 Teuchos::ArrayRCP< const LocalOrdinal > nodeIdTargetData = nodeIdTarget->getData(0);
309 for(
decltype(uniqueId.size()) i = 0; i < uniqueId.size(); i++) {
310 uniqueId[i] = nodeIdTargetData[i];
317 for(
decltype(amalgRowPtr.size()) i = 0; i < amalgRowPtr.size()-1; i++) {
318 for(
size_t j = amalgRowPtr[i]; j < amalgRowPtr[i+1]; j++) {
319 if (uniqueId[i] != uniqueId[amalgCols[j]]) keep [j] =
false;
324 Teuchos::ArrayRCP<Scalar> amalgVals;
325 this->squeezeOutNnzs(amalgRowPtr,amalgCols,amalgVals,keep);
327 typedef Xpetra::MultiVectorFactory<typename Teuchos::ScalarTraits<Scalar>::magnitudeType,LO,GO,NO> dxMVf;
328 RCP<dxMV> ghostedCoords = dxMVf::Build(amalgColMap,Coords->getNumVectors());
330 TEUCHOS_TEST_FOR_EXCEPTION(amalgRowMap->getLocalNumElements() != Coords->getMap()->getLocalNumElements(),
MueLu::Exceptions::RuntimeError,
"MueLu::VariableDofLaplacianFactory: the number of Coordinates and amalgamated nodes is inconsistent.");
338 Coords->replaceMap(amalgRowMap);
339 ghostedCoords->doImport(*Coords, *nodeImporter, Xpetra::INSERT);
341 Teuchos::ArrayRCP<Scalar> lapVals(amalgRowPtr[nLocalNodes]);
342 this->buildLaplacian(amalgRowPtr, amalgCols, lapVals, Coords->getNumVectors(), ghostedCoords);
345 for(
decltype(amalgRowPtr.size()) i = 0; i < amalgRowPtr.size()-1; i++) {
346 size_t j = amalgRowPtr[i];
347 this->MueLu_az_sort<LocalOrdinal>(&(amalgCols[j]), amalgRowPtr[i+1] - j, NULL, &(lapVals[j]));
351 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);
379 Teuchos::RCP<Matrix> lapMat = Teuchos::rcp(
new CrsMatrixWrap(lapCrsMat));
380 Set(currentLevel,
"A",lapMat);
383 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
384 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<
typename Teuchos::ScalarTraits<Scalar>::magnitudeType,
LocalOrdinal,
GlobalOrdinal,
Node> > & ghostedCoords)
const {
385 TEUCHOS_TEST_FOR_EXCEPTION(numdim != 2 && numdim !=3,
MueLu::Exceptions::RuntimeError,
"buildLaplacian only works for 2d or 3d examples. numdim = " << numdim);
388 Teuchos::ArrayRCP< const typename Teuchos::ScalarTraits<Scalar>::magnitudeType > x = ghostedCoords->getData(0);
389 Teuchos::ArrayRCP< const typename Teuchos::ScalarTraits<Scalar>::magnitudeType > y = ghostedCoords->getData(1);
391 for(
decltype(rowPtr.size()) i = 0; i < rowPtr.size() - 1; i++) {
392 Scalar sum = Teuchos::ScalarTraits<Scalar>::zero();
394 for(
size_t j = rowPtr[i]; j < rowPtr[i+1]; j++) {
395 if(cols[j] != Teuchos::as<LO>(i)){
396 vals[j] = std::sqrt( (x[i]-x[cols[j]]) * (x[i]-x[cols[j]]) +
397 (y[i]-y[cols[j]]) * (y[i]-y[cols[j]]) );
398 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]);
399 vals[j] = -Teuchos::ScalarTraits<SC>::one()/vals[j];
404 if(sum == Teuchos::ScalarTraits<Scalar>::zero()) sum = Teuchos::ScalarTraits<Scalar>::one();
410 Teuchos::ArrayRCP< const typename Teuchos::ScalarTraits<Scalar>::magnitudeType > x = ghostedCoords->getData(0);
411 Teuchos::ArrayRCP< const typename Teuchos::ScalarTraits<Scalar>::magnitudeType > y = ghostedCoords->getData(1);
412 Teuchos::ArrayRCP< const typename Teuchos::ScalarTraits<Scalar>::magnitudeType > z = ghostedCoords->getData(2);
414 for(
decltype(rowPtr.size()) i = 0; i < rowPtr.size() - 1; i++) {
415 Scalar sum = Teuchos::ScalarTraits<Scalar>::zero();
417 for(
size_t j = rowPtr[i]; j < rowPtr[i+1]; j++) {
418 if(cols[j] != Teuchos::as<LO>(i)){
419 vals[j] = std::sqrt( (x[i]-x[cols[j]]) * (x[i]-x[cols[j]]) +
420 (y[i]-y[cols[j]]) * (y[i]-y[cols[j]]) +
421 (z[i]-z[cols[j]]) * (z[i]-z[cols[j]]) );
423 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]);
425 vals[j] = -Teuchos::ScalarTraits<SC>::one()/vals[j];
430 if(sum == Teuchos::ScalarTraits<Scalar>::zero()) sum = Teuchos::ScalarTraits<Scalar>::one();
438 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
446 size_t nRows = rowPtr.size()-1;
447 if(vals.size() > 0) {
448 for(
size_t i = 0; i < nRows; i++) {
449 size_t newStart = count;
450 for(
size_t j = rowPtr[i]; j < rowPtr[i+1]; j++) {
451 if(vals[j] != Teuchos::ScalarTraits<Scalar>::zero()) {
452 cols[count ] = cols[j];
453 vals[count++] = vals[j];
456 rowPtr[i] = newStart;
459 for (
size_t i = 0; i < nRows; i++) {
460 size_t newStart = count;
461 for(
size_t j = rowPtr[i]; j < rowPtr[i+1]; j++) {
462 if (keep[j] ==
true) {
463 cols[count++] = cols[j];
466 rowPtr[i] = newStart;
469 rowPtr[nRows] = count;
472 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
475 for (
decltype(dofPresent.size()) i = 0; i < dofPresent.size(); i++)
476 if(dofPresent[i] == 1) map[count++] = Teuchos::as<LocalOrdinal>(i);
477 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);
480 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
481 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 {
483 size_t nLocalDofs = rowDofMap->getLocalNumElements();
484 size_t nLocalPlusGhostDofs = colDofMap->getLocalNumElements();
487 Teuchos::RCP<Import> importer = ImportFactory::Build(rowDofMap, colDofMap);
490 Teuchos::RCP<LOVector> localNodeIdsTemp = LOVectorFactory::Build(rowDofMap,
true);
491 Teuchos::RCP<LOVector> localNodeIds = LOVectorFactory::Build(colDofMap,
true);
495 Teuchos::ArrayRCP< LocalOrdinal > localNodeIdsTempData = localNodeIdsTemp->getDataNonConst(0);
496 for(
size_t i = 0; i < localNodeIdsTemp->getLocalLength(); i++)
497 localNodeIdsTempData[i] = std::floor<LocalOrdinal>( dofMap[i] / maxDofPerNode );
500 localNodeIds->doImport(*localNodeIdsTemp, *importer, Xpetra::INSERT);
501 Teuchos::ArrayRCP< const LocalOrdinal > localNodeIdsData = localNodeIds->getData(0);
507 Teuchos::RCP<LOVector> myProcTemp = LOVectorFactory::Build(rowDofMap,
true);
508 Teuchos::RCP<LOVector> myProc = LOVectorFactory::Build(colDofMap,
true);
512 Teuchos::ArrayRCP< LocalOrdinal > myProcTempData = myProcTemp->getDataNonConst(0);
513 for(
size_t i = 0; i < myProcTemp->getLocalLength(); i++)
514 myProcTempData[i] = Teuchos::as<LocalOrdinal>(comm->getRank());
516 myProc->doImport(*myProcTemp, *importer, Xpetra::INSERT);
517 Teuchos::ArrayRCP<LocalOrdinal> myProcData = myProc->getDataNonConst(0);
532 std::vector<size_t> location(nLocalPlusGhostDofs - nLocalDofs + 1);
533 std::vector<size_t> tempId (nLocalPlusGhostDofs - nLocalDofs + 1);
534 std::vector<size_t> tempProc(nLocalPlusGhostDofs - nLocalDofs + 1);
536 size_t notProcessed = nLocalDofs;
537 size_t tempIndex = 0;
538 size_t first = tempIndex;
541 while (notProcessed < nLocalPlusGhostDofs) {
542 neighbor = myProcData[notProcessed];
544 location[tempIndex] = notProcessed;
545 tempId[tempIndex++] = localNodeIdsData[notProcessed];
546 myProcData[notProcessed] = -1 - neighbor;
548 for(
size_t i = notProcessed + 1; i < nLocalPlusGhostDofs; i++) {
549 if(myProcData[i] == neighbor) {
550 location[tempIndex] = i;
551 tempId[tempIndex++] = localNodeIdsData[i];
555 this->MueLu_az_sort<size_t>(&(tempId[first]), tempIndex - first, &(location[first]), NULL);
556 for(
size_t i = first; i < tempIndex; i++) tempProc[i] = neighbor;
560 while ( (notProcessed < nLocalPlusGhostDofs) && (myProcData[notProcessed] < 0))
570 if(nLocalDofs > 0) nLocalNodes = localNodeIdsData[nLocalDofs-1] + 1;
572 nLocalPlusGhostNodes = nLocalNodes;
573 if(nLocalDofs < nLocalPlusGhostDofs) nLocalPlusGhostNodes++;
580 for (
size_t i = nLocalDofs+1; i < nLocalPlusGhostDofs; i++) {
581 size_t lagged = nLocalPlusGhostNodes-1;
584 if ((tempId[i-nLocalDofs] != tempId[i-1-nLocalDofs]) ||
585 (tempProc[i-nLocalDofs] != tempProc[i-1-nLocalDofs]))
586 nLocalPlusGhostNodes++;
587 tempId[i-1-nLocalDofs] = lagged;
589 if (nLocalPlusGhostDofs > nLocalDofs)
590 tempId[nLocalPlusGhostDofs-1-nLocalDofs] = nLocalPlusGhostNodes - 1;
593 for(
size_t i = 0; i < nLocalDofs; i++)
594 myLocalNodeIds[i] = std::floor<LocalOrdinal>( dofMap[i] / maxDofPerNode );
597 for(
size_t i = nLocalDofs; i < nLocalPlusGhostDofs; i++)
598 myLocalNodeIds[location[i-nLocalDofs]] = tempId[i-nLocalDofs];
MueLu::DefaultLocalOrdinal LocalOrdinal
MueLu::DefaultScalar Scalar
MueLu::DefaultGlobalOrdinal GlobalOrdinal
Exception throws to report errors in the internal logical of the program.
Timer to be used in factories. Similar to Monitor but with additional timers.
Class that holds all level-specific information.
bool IsAvailable(const std::string &ename, const FactoryBase *factory=NoFactory::get()) const
Test whether a need's value has been saved.
void DeclareInput(const std::string &ename, const FactoryBase *factory, const FactoryBase *requestedBy=NoFactory::get())
Callback from FactoryBase::CallDeclareInput() and FactoryBase::DeclareInput()
T & Get(const std::string &ename, const FactoryBase *factory=NoFactory::get())
Get data without decrementing associated storage counter (i.e., read-only access)....
static const NoFactory * get()
static Teuchos::ArrayRCP< const bool > DetectDirichletRowsExt(const Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > &A, bool &bHasZeroDiagonal, const Magnitude &tol=Teuchos::ScalarTraits< Scalar >::zero())
void Build(Level ¤tLevel) const
Build an object with this factory.
VariableDofLaplacianFactory()
Constructor.
void squeezeOutNnzs(Teuchos::ArrayRCP< size_t > &rowPtr, Teuchos::ArrayRCP< LocalOrdinal > &cols, Teuchos::ArrayRCP< Scalar > &vals, const std::vector< bool > &keep) const
RCP< const ParameterList > GetValidParameterList() const
Return a const parameter list of valid parameters that setParameterList() will accept.
void DeclareInput(Level ¤tLevel) const
Input.
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< typename Teuchos::ScalarTraits< Scalar >::magnitudeType, LocalOrdinal, GlobalOrdinal, Node > > &ghostedCoords) const
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
Namespace for MueLu classes and methods.