46 #ifndef MUELU_TENTATIVEPFACTORY_DEF_HPP
47 #define MUELU_TENTATIVEPFACTORY_DEF_HPP
64 #include "MueLu_Aggregates.hpp"
65 #include "MueLu_AmalgamationFactory.hpp"
66 #include "MueLu_AmalgamationInfo.hpp"
67 #include "MueLu_CoarseMapFactory.hpp"
70 #include "MueLu_NullspaceFactory.hpp"
71 #include "MueLu_PerfUtils.hpp"
72 #include "MueLu_Utilities.hpp"
76 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
80 #define SET_VALID_ENTRY(name) validParamList->setEntry(name, MasterList::getEntry(name))
83 #undef SET_VALID_ENTRY
88 validParamList->
set<
RCP<const FactoryBase> >(
"UnAmalgamationInfo", Teuchos::null,
"Generating factory of UnAmalgamationInfo");
91 validParamList->
set<
RCP<const FactoryBase> >(
"Node Comm", Teuchos::null,
"Generating factory of the node level communicator");
95 norecurse.disableRecursiveValidation();
96 validParamList->
set<
ParameterList> (
"matrixmatrix: kernel params", norecurse,
"MatrixMatrix kernel parameters");
98 return validParamList;
101 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
106 Input(fineLevel,
"A");
107 Input(fineLevel,
"Aggregates");
108 Input(fineLevel,
"Nullspace");
109 Input(fineLevel,
"UnAmalgamationInfo");
110 Input(fineLevel,
"CoarseMap");
113 pL.
get<
bool>(
"tentative: build coarse coordinates") ) {
114 bTransferCoordinates_ =
true;
115 Input(fineLevel,
"Coordinates");
116 }
else if (bTransferCoordinates_) {
117 Input(fineLevel,
"Coordinates");
121 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
123 return BuildP(fineLevel, coarseLevel);
126 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
133 RCP<Matrix> A = Get< RCP<Matrix> > (fineLevel,
"A");
134 RCP<Aggregates> aggregates = Get< RCP<Aggregates> > (fineLevel,
"Aggregates");
136 RCP<MultiVector> fineNullspace = Get< RCP<MultiVector> > (fineLevel,
"Nullspace");
137 RCP<const Map> coarseMap = Get< RCP<const Map> > (fineLevel,
"CoarseMap");
139 if(bTransferCoordinates_) {
140 fineCoords = Get< RCP<RealValuedMultiVector> >(fineLevel,
"Coordinates");
144 if(fineLevel.IsAvailable(
"Node Comm")) {
146 Set<RCP<const Teuchos::Comm<int> > >(coarseLevel,
"Node Comm", nodeComm);
156 if(bTransferCoordinates_) {
161 if (rcp_dynamic_cast<const StridedMap>(coarseMap) != Teuchos::null)
162 blkSize = rcp_dynamic_cast<
const StridedMap>(coarseMap)->getFixedBlockSize();
163 GO indexBase = coarseMap->getIndexBase();
164 size_t numNodes = elementAList.
size() / blkSize;
166 const int numDimensions = fineCoords->getNumVectors();
168 for (
LO i = 0; i < Teuchos::as<LO>(numNodes); i++) {
169 nodeList[i] = (elementAList[i*blkSize]-indexBase)/blkSize + indexBase;
171 RCP<const Map> coarseCoordsMap = MapFactory::Build(fineCoords->getMap()->lib(),
175 fineCoords->getMap()->getComm());
176 coarseCoords = RealValuedMultiVectorFactory::Build(coarseCoordsMap, numDimensions);
180 if (aggregates->AggregatesCrossProcessors()) {
184 ghostedCoords = RealValuedMultiVectorFactory::Build(aggMap, numDimensions);
187 ghostedCoords = fineCoords;
191 int myPID = coarseCoordsMap->getComm()->getRank();
192 LO numAggs = aggregates->GetNumAggregates();
193 ArrayRCP<LO> aggSizes = aggregates->ComputeAggregateSizes();
198 for (
int dim = 0; dim < numDimensions; ++dim) {
202 for (
LO lnode = 0; lnode < Teuchos::as<LO>(numNodes); lnode++) {
203 if (procWinner[lnode] == myPID &&
204 lnode < vertex2AggID.
size() &&
205 lnode < fineCoordsData.
size() &&
206 vertex2AggID[lnode] < coarseCoordsData.
size() &&
208 coarseCoordsData[vertex2AggID[lnode]] += fineCoordsData[lnode];
211 for (
LO agg = 0; agg < numAggs; agg++) {
212 coarseCoordsData[agg] /= aggSizes[agg];
217 if (!aggregates->AggregatesCrossProcessors())
218 BuildPuncoupled(A, aggregates, amalgInfo, fineNullspace, coarseMap, Ptentative, coarseNullspace,coarseLevel.
GetLevelID());
220 BuildPcoupled (A, aggregates, amalgInfo, fineNullspace, coarseMap, Ptentative, coarseNullspace);
230 if (A->IsView(
"stridedMaps") ==
true)
231 Ptentative->CreateView(
"stridedMaps", A->getRowMap(
"stridedMaps"), coarseMap);
233 Ptentative->CreateView(
"stridedMaps", Ptentative->getRangeMap(), coarseMap);
235 if(bTransferCoordinates_) {
236 Set(coarseLevel,
"Coordinates", coarseCoords);
238 Set(coarseLevel,
"Nullspace", coarseNullspace);
239 Set(coarseLevel,
"P", Ptentative);
243 params->
set(
"printLoadBalancingInfo",
true);
248 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
255 const size_t numRows = rowMap->getNodeNumElements();
258 typedef typename STS::magnitudeType Magnitude;
259 const SC zero = STS::zero();
260 const SC one = STS::one();
264 const size_t NSDim = fineNullspace->getNumVectors();
269 bool goodMap = isGoodMap(*rowMap, *colMap);
280 GetOStream(
Runtime1) <<
"Column map is consistent with the row map, good." << std::endl;
284 GetOStream(
Warnings0) <<
"Column map is not consistent with the row map\n"
285 <<
"using GO->LO conversion with performance penalty" << std::endl;
288 coarseNullspace = MultiVectorFactory::Build(coarseMap, NSDim);
291 const bool &doQRStep = pL.
get<
bool>(
"tentative: calculate qr");
296 for (
size_t i = 0; i < NSDim; i++) {
297 fineNS[i] = fineNullspace->getData(i);
298 if (coarseMap->getNodeNumElements() > 0)
299 coarseNS[i] = coarseNullspace->getDataNonConst(i);
302 size_t nnzEstimate = numRows * NSDim;
306 RCP<CrsMatrix> PtentCrs = rcp_dynamic_cast<CrsMatrixWrap>(Ptentative)->getCrsMatrix();
312 PtentCrs->allocateAllValues(nnzEstimate, iaPtent, jaPtent, valPtent);
319 for (
size_t i = 1; i <= numRows; i++)
320 ia[i] = ia[i-1] + NSDim;
322 for (
size_t j = 0; j < nnzEstimate; j++) {
332 for (
GO agg = 0; agg < numAggs; agg++) {
333 LO aggSize = aggStart[agg+1] - aggStart[agg];
342 for (
size_t j = 0; j < NSDim; j++)
343 for (
LO k = 0; k < aggSize; k++)
344 localQR(k,j) = fineNS[j][aggToRowMapLO[aggStart[agg]+k]];
346 for (
size_t j = 0; j < NSDim; j++)
347 for (
LO k = 0; k < aggSize; k++)
348 localQR(k,j) = fineNS[j][rowMap->getLocalElement(aggToRowMapGO[aggStart[agg]+k])];
352 for (
size_t j = 0; j < NSDim; j++) {
353 bool bIsZeroNSColumn =
true;
355 for (
LO k = 0; k < aggSize; k++)
356 if (localQR(k,j) != zero)
357 bIsZeroNSColumn =
false;
360 "MueLu::TentativePFactory::MakeTentative: fine level NS part has a zero column");
365 if (aggSize >= Teuchos::as<LO>(NSDim)) {
369 Magnitude norm = STS::magnitude(zero);
370 for (
size_t k = 0; k < Teuchos::as<size_t>(aggSize); k++)
371 norm += STS::magnitude(localQR(k,0)*localQR(k,0));
375 coarseNS[0][offset] = norm;
378 for (
LO i = 0; i < aggSize; i++)
379 localQR(i,0) /= norm;
387 for (
size_t j = 0; j < NSDim; j++)
388 for (
size_t k = 0; k <= j; k++)
389 coarseNS[j][offset+k] = localQR(k,j);
395 for (
size_t j = 0; j < NSDim; j++)
396 for (
size_t i = 0; i < Teuchos::as<size_t>(aggSize); i++)
397 localQR(i,j) = (*qFactor)(i,j);
428 for (
size_t j = 0; j < NSDim; j++)
429 for (
size_t k = 0; k < NSDim; k++)
430 if (k < as<size_t>(aggSize))
431 coarseNS[j][offset+k] = localQR(k,j);
433 coarseNS[j][offset+k] = (k == j ? one : zero);
436 for (
size_t i = 0; i < as<size_t>(aggSize); i++)
437 for (
size_t j = 0; j < NSDim; j++)
438 localQR(i,j) = (j == i ? one : zero);
444 for (
LO j = 0; j < aggSize; j++) {
445 LO localRow = (goodMap ? aggToRowMapLO[aggStart[agg]+j] : rowMap->getLocalElement(aggToRowMapGO[aggStart[agg]+j]));
447 size_t rowStart = ia[localRow];
448 for (
size_t k = 0, lnnz = 0; k < NSDim; k++) {
450 if (localQR(j,k) != zero) {
451 ja [rowStart+lnnz] = offset + k;
452 val[rowStart+lnnz] = localQR(j,k);
460 GetOStream(
Runtime1) <<
"TentativePFactory : bypassing local QR phase" << std::endl;
462 GetOStream(
Warnings0) <<
"TentativePFactor : for nontrivial nullspace, this may degrade performance" << std::endl;
472 for (
GO agg = 0; agg < numAggs; agg++) {
473 const LO aggSize = aggStart[agg+1] - aggStart[agg];
478 for (
LO j = 0; j < aggSize; j++) {
483 const LO localRow = aggToRowMapLO[aggStart[agg]+j];
485 const size_t rowStart = ia[localRow];
487 for (
size_t k = 0, lnnz = 0; k < NSDim; k++) {
489 const SC qr_jk = fineNS[k][aggToRowMapLO[aggStart[agg]+j]];
491 ja [rowStart+lnnz] = offset + k;
492 val[rowStart+lnnz] = qr_jk;
497 for (
size_t j = 0; j < NSDim; j++)
498 coarseNS[j][offset+j] = one;
502 for (
GO agg = 0; agg < numAggs; agg++) {
503 const LO aggSize = aggStart[agg+1] - aggStart[agg];
505 for (
LO j = 0; j < aggSize; j++) {
507 const LO localRow = rowMap->getLocalElement(aggToRowMapGO[aggStart[agg]+j]);
509 const size_t rowStart = ia[localRow];
511 for (
size_t k = 0, lnnz = 0; k < NSDim; k++) {
513 const SC qr_jk = fineNS[k][rowMap->getLocalElement(aggToRowMapGO[aggStart[agg]+j])];
515 ja [rowStart+lnnz] = offset + k;
516 val[rowStart+lnnz] = qr_jk;
521 for (
size_t j = 0; j < NSDim; j++)
522 coarseNS[j][offset+j] = one;
531 size_t ia_tmp = 0, nnz = 0;
532 for (
size_t i = 0; i < numRows; i++) {
533 for (
size_t j = ia_tmp; j < ia[i+1]; j++)
534 if (ja[j] != INVALID) {
550 GetOStream(
Runtime1) <<
"TentativePFactory : aggregates do not cross process boundaries" << std::endl;
552 PtentCrs->setAllValues(iaPtent, jaPtent, valPtent);
557 if(pL.
isSublist(
"matrixmatrix: kernel params"))
562 FCparams->
set(
"compute global constants",FCparams->
get(
"compute global constants",
false));
563 std::string levelIDs =
toString(levelID);
564 FCparams->
set(
"Timer Label",std::string(
"MueLu::TentativeP-")+levelIDs);
568 PtentCrs->expertStaticFillComplete(coarseMap, A->getDomainMap(),dummy_i,dummy_e,FCparams);
571 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
576 typedef typename STS::magnitudeType Magnitude;
577 const SC zero = STS::zero();
578 const SC one = STS::one();
593 for (
GO i=0; i<numAggs; ++i) {
594 LO sizeOfThisAgg = aggStart[i+1] - aggStart[i];
595 if (sizeOfThisAgg > maxAggSize) maxAggSize = sizeOfThisAgg;
599 const size_t NSDim = fineNullspace->getNumVectors();
602 GO indexBase=A->getRowMap()->getIndexBase();
607 RCP<MultiVector> fineNullspaceWithOverlap = MultiVectorFactory::Build(nonUniqueMap,NSDim);
608 fineNullspaceWithOverlap->doImport(*fineNullspace,*importer,
Xpetra::INSERT);
612 for (
size_t i=0; i<NSDim; ++i)
613 fineNS[i] = fineNullspaceWithOverlap->getData(i);
616 coarseNullspace = MultiVectorFactory::Build(coarseMap, NSDim);
619 for (
size_t i=0; i<NSDim; ++i)
620 if (coarseMap->getNodeNumElements() > 0) coarseNS[i] = coarseNullspace->getDataNonConst(i);
626 const Map& rowMapForPtentRef = *rowMapForPtent;
641 for (
LO j=0; j<numAggs; ++j) {
642 for (
LO k=aggStart[j]; k<aggStart[j+1]; ++k) {
643 if (rowMapForPtentRef.isNodeGlobalElement(aggToRowMap[k]) ==
false) {
648 ghostQMap = MapFactory::Build(A->getRowMap()->lib(),
651 indexBase, A->getRowMap()->getComm());
653 ghostQvalues = MultiVectorFactory::Build(ghostQMap,NSDim);
657 ghostQcolumns.
resize(NSDim);
658 for (
size_t i=0; i<NSDim; ++i)
661 if (ghostQvalues->getLocalLength() > 0) {
664 for (
size_t i=0; i<NSDim; ++i) {
665 ghostQvals[i] = ghostQvalues->getDataNonConst(i);
666 ghostQcols[i] = ghostQcolumns[i]->getDataNonConst(0);
668 ghostQrows = ghostQrowNums->getDataNonConst(0);
672 importer = ImportFactory::Build(ghostQMap, A->getRowMap());
678 Array<GO> globalColPtr(maxAggSize*NSDim,0);
679 Array<LO> localColPtr(maxAggSize*NSDim,0);
683 const Map& coarseMapRef = *coarseMap;
703 PtentCrs = PtentCrsWrap->getCrsMatrix();
704 Ptentative = PtentCrsWrap;
710 const Map& nonUniqueMapRef = *nonUniqueMap;
712 size_t total_nnz_count=0;
714 for (
GO agg=0; agg<numAggs; ++agg)
716 LO myAggSize = aggStart[agg+1]-aggStart[agg];
720 for (
size_t j=0; j<NSDim; ++j) {
721 bool bIsZeroNSColumn =
true;
722 for (
LO k=0; k<myAggSize; ++k)
727 SC nsVal = fineNS[j][ nonUniqueMapRef.getLocalElement(aggToRowMap[aggStart[agg]+k]) ];
728 localQR(k,j) = nsVal;
729 if (nsVal != zero) bIsZeroNSColumn =
false;
732 GetOStream(
Runtime1,-1) <<
"length of fine level nsp: " << fineNullspace->getGlobalLength() << std::endl;
733 GetOStream(
Runtime1,-1) <<
"length of fine level nsp w overlap: " << fineNullspaceWithOverlap->getGlobalLength() << std::endl;
734 GetOStream(
Runtime1,-1) <<
"(local?) aggId=" << agg << std::endl;
735 GetOStream(
Runtime1,-1) <<
"aggSize=" << myAggSize << std::endl;
736 GetOStream(
Runtime1,-1) <<
"agg DOF=" << k << std::endl;
737 GetOStream(
Runtime1,-1) <<
"NS vector j=" << j << std::endl;
738 GetOStream(
Runtime1,-1) <<
"j*myAggSize + k = " << j*myAggSize + k << std::endl;
739 GetOStream(
Runtime1,-1) <<
"aggToRowMap["<<agg<<
"][" << k <<
"] = " << aggToRowMap[aggStart[agg]+k] << std::endl;
740 GetOStream(
Runtime1,-1) <<
"id aggToRowMap[agg][k]=" << aggToRowMap[aggStart[agg]+k] <<
" is global element in nonUniqueMap = " <<
741 nonUniqueMapRef.isNodeGlobalElement(aggToRowMap[aggStart[agg]+k]) << std::endl;
742 GetOStream(
Runtime1,-1) <<
"colMap local id aggToRowMap[agg][k]=" << nonUniqueMapRef.getLocalElement(aggToRowMap[aggStart[agg]+k]) << std::endl;
743 GetOStream(
Runtime1,-1) <<
"fineNS...=" << fineNS[j][ nonUniqueMapRef.getLocalElement(aggToRowMap[aggStart[agg]+k]) ] << std::endl;
744 GetOStream(
Errors,-1) <<
"caught an error!" << std::endl;
752 if(myAggSize >= Teuchos::as<LocalOrdinal>(NSDim)) {
757 SC tau = localQR(0,0);
762 for (
size_t k = 0; k < Teuchos::as<size_t>(myAggSize); ++k) {
763 Magnitude tmag = STS::magnitude(localQR(k,0));
768 localQR(0,0) = dtemp;
777 for (
size_t j=0; j<NSDim; ++j) {
778 for (
size_t k=0; k<=j; ++k) {
780 if (coarseMapRef.isNodeLocalElement(offset+k)) {
781 coarseNS[j][offset+k] = localQR(k, j);
785 GetOStream(
Errors,-1) <<
"caught error in coarseNS insert, j="<<j<<
", offset+k = "<<offset+k<<std::endl;
798 for (LocalOrdinal i=0; i<myAggSize; ++i) {
799 localQR(i,0) *= dtemp ;
804 for (
size_t j=0; j<NSDim; j++) {
805 for (
size_t i = 0; i < Teuchos::as<size_t>(myAggSize); i++) {
806 localQR(i,j) = (*qFactor)(i,j);
816 for (
size_t j = 0; j < NSDim; j++)
817 for (
size_t k = 0; k < NSDim; k++) {
819 "Caught error in coarseNS insert, j=" << j <<
", offset+k = " << offset+k);
821 if (k < as<size_t>(myAggSize))
822 coarseNS[j][offset+k] = localQR(k,j);
824 coarseNS[j][offset+k] = (k == j ? one : zero);
828 for (
size_t i = 0; i < as<size_t>(myAggSize); i++)
829 for (
size_t j = 0; j < NSDim; j++)
830 localQR(i,j) = (j == i ? one : zero);
837 for (
GO j=0; j<myAggSize; ++j) {
841 GO globalRow = aggToRowMap[aggStart[agg]+j];
844 if (rowMapForPtentRef.isNodeGlobalElement(globalRow) == false ) {
845 ghostQrows[qctr] = globalRow;
846 for (
size_t k=0; k<NSDim; ++k) {
847 ghostQcols[k][qctr] = coarseMapRef.getGlobalElement(agg*NSDim+k);
848 ghostQvals[k][qctr] = localQR(j,k);
853 for (
size_t k=0; k<NSDim; ++k) {
856 localColPtr[nnz] = agg * NSDim + k;
857 globalColPtr[nnz] = coarseMapRef.getGlobalElement(localColPtr[nnz]);
858 valPtr[nnz] = localQR(j,k);
864 GetOStream(
Errors,-1) <<
"caught error in colPtr/valPtr insert, current index="<<nnz<<std::endl;
869 Ptentative->insertGlobalValues(globalRow,globalColPtr.
view(0,nnz),valPtr.
view(0,nnz));
872 GetOStream(
Errors,-1) <<
"pid " << A->getRowMap()->getComm()->getRank()
873 <<
"caught error during Ptent row insertion, global row "
874 << globalRow << std::endl;
885 GetOStream(
Runtime1) <<
"TentativePFactory : aggregates may cross process boundaries" << std::endl;
889 targetQrowNums->putScalar(-1);
890 targetQrowNums->doImport(*ghostQrowNums,*importer,
Xpetra::INSERT);
903 gidsToImport, indexBase, A->getRowMap()->getComm() );
906 importer = ImportFactory::Build(ghostQMap, reducedMap);
909 for (
size_t i=0; i<NSDim; ++i) {
911 targetQcolumns[i]->doImport(*(ghostQcolumns[i]),*importer,
Xpetra::INSERT);
913 RCP<MultiVector> targetQvalues = MultiVectorFactory::Build(reducedMap,NSDim);
918 if (targetQvalues->getLocalLength() > 0) {
919 targetQvals.
resize(NSDim);
920 targetQcols.
resize(NSDim);
921 for (
size_t i=0; i<NSDim; ++i) {
922 targetQvals[i] = targetQvalues->getDataNonConst(i);
923 targetQcols[i] = targetQcolumns[i]->getDataNonConst(0);
930 if (targetQvalues->getLocalLength() > 0) {
931 for (
size_t j=0; j<NSDim; ++j) {
932 valPtr[j] = targetQvals[j][reducedMap->getLocalElement(*r)];
933 globalColPtr[j] = targetQcols[j][reducedMap->getLocalElement(*r)];
935 Ptentative->insertGlobalValues(*r, globalColPtr.
view(0,NSDim), valPtr.
view(0,NSDim));
939 Ptentative->fillComplete(coarseMap, A->getDomainMap());
942 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
947 const size_t numElements = rowElements.
size();
950 for (
size_t i = 0; i < numElements; i++)
951 if (rowElements[i] != colElements[i]) {
963 #define MUELU_TENTATIVEPFACTORY_SHORT
964 #endif // MUELU_TENTATIVEPFACTORY_DEF_HPP
void BuildPuncoupled(RCP< Matrix > A, RCP< Aggregates > aggregates, RCP< AmalgamationInfo > amalgInfo, RCP< MultiVector > fineNullspace, RCP< const Map > coarseMap, RCP< Matrix > &Ptentative, RCP< MultiVector > &coarseNullspace, const int levelID) const
void Build(Level &fineLevel, Level &coarseLevel) const
Build an object with this factory.
Important warning messages (one line)
void reserve(size_type n)
int setMatrix(const RCP< SerialDenseMatrix< OrdinalType, ScalarType > > &A)
void BuildPcoupled(RCP< Matrix > A, RCP< Aggregates > aggregates, RCP< AmalgamationInfo > amalgInfo, RCP< MultiVector > fineNullspace, RCP< const Map > coarseMap, RCP< Matrix > &Ptentative, RCP< MultiVector > &coarseNullspace) const
std::string toString(const T &what)
Little helper function to convert non-string types to strings.
RCP< const ParameterList > GetValidParameterList() const
Return a const parameter list of valid parameters that setParameterList() will accept.
void DeclareInput(Level &fineLevel, Level &coarseLevel) const
Input.
T & get(const std::string &name, T def_value)
void UnamalgamateAggregates(const Aggregates &aggregates, Teuchos::ArrayRCP< LocalOrdinal > &aggStart, Teuchos::ArrayRCP< GlobalOrdinal > &aggToRowMap) const
UnamalgamateAggregates.
ParameterList & set(std::string const &name, T const &value, std::string const &docString="", RCP< const ParameterEntryValidator > const &validator=null)
ArrayView< T > view(size_type offset, size_type size)
Timer to be used in factories. Similar to Monitor but with additional timers.
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
void UnamalgamateAggregatesLO(const Aggregates &aggregates, Teuchos::ArrayRCP< LocalOrdinal > &aggStart, Teuchos::ArrayRCP< LO > &aggToRowMap) const
static const NoFactory * get()
Print even more statistics.
#define SET_VALID_ENTRY(name)
void resize(const size_type n, const T &val=T())
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
Class that holds all level-specific information.
Teuchos::RCP< Xpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > ComputeUnamalgamatedImportDofMap(const Aggregates &aggregates) const
ComputeUnamalgamatedImportDofMap build overlapping dof row map from aggregates needed for overlapping...
bool isSublist(const std::string &name) const
LO GetNumAggregates() const
returns the number of aggregates of the current processor. Note: could/should be renamed to GetNumLoc...
void resize(size_type new_size, const value_type &x=value_type())
static std::string PrintMatrixInfo(const Matrix &A, const std::string &msgTag, RCP< const Teuchos::ParameterList > params=Teuchos::null)
static bool isnaninf(const T &x)
static RCP< Vector > Build(const Teuchos::RCP< const Map > &map, bool zeroOut=true)
bool isGoodMap(const Map &rowMap, const Map &colMap) const
static magnitudeType magnitude(T a)
void push_back(const value_type &x)
ParameterList & sublist(const std::string &name, bool mustAlreadyExist=false, const std::string &docString="")
int GetLevelID() const
Return level number.
RCP< SerialDenseMatrix< OrdinalType, ScalarType > > getQ() const
Exception throws to report errors in the internal logical of the program.
void BuildP(Level &fineLevel, Level &coarseLevel) const
Abstract Build method.
Description of what is happening (more verbose)
bool IsAvailable(const std::string &ename, const FactoryBase *factory=NoFactory::get()) const
Test whether a need's value has been saved.