8 #ifndef MUELU_ALGEBRAICPERMUTATIONSTRATEGY_DEF_HPP_ 9 #define MUELU_ALGEBRAICPERMUTATIONSTRATEGY_DEF_HPP_ 13 #include <Xpetra_MultiVector.hpp> 14 #include <Xpetra_Matrix.hpp> 15 #include <Xpetra_CrsGraph.hpp> 16 #include <Xpetra_Vector.hpp> 17 #include <Xpetra_MultiVectorFactory.hpp> 18 #include <Xpetra_VectorFactory.hpp> 19 #include <Xpetra_CrsMatrixWrap.hpp> 20 #include <Xpetra_Export.hpp> 21 #include <Xpetra_ExportFactory.hpp> 22 #include <Xpetra_Import.hpp> 23 #include <Xpetra_ImportFactory.hpp> 24 #include <Xpetra_MatrixMatrix.hpp> 26 #include "MueLu_Utilities.hpp" 31 template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
35 int numProcs = comm->getSize();
36 int myRank = comm->getRank();
38 size_t nDofsPerNode = 1;
39 if (A->IsView(
"stridedMaps")) {
41 nDofsPerNode = Teuchos::rcp_dynamic_cast<
const StridedMap>(permRowMapStrided)->getFixedBlockSize();
44 std::vector<std::pair<GlobalOrdinal, GlobalOrdinal> > permutedDiagCandidates;
45 std::vector<std::pair<GlobalOrdinal, GlobalOrdinal> > keepDiagonalEntries;
46 std::vector<Scalar> Weights;
50 for (
size_t row = 0; row < A->getRowMap()->getNodeNumElements(); row++) {
51 GlobalOrdinal grow = A->getRowMap()->getGlobalElement(row);
53 if(permRowMap->isNodeGlobalElement(grow) ==
true)
continue;
55 size_t nnz = A->getNumEntriesInLocalRow(row);
60 A->getLocalRowView(row, indices, vals);
65 GlobalOrdinal gMaxValIdx = 0;
69 for (
size_t j = 0; j < Teuchos::as<size_t>(indices.
size()); j++) {
73 gMaxValIdx = A->getColMap()->getGlobalElement(indices[j]);
77 if(grow == gMaxValIdx)
78 keepDiagonalEntries.push_back(std::make_pair(grow,grow));
83 for (
size_t row = 0; row < permRowMap->getNodeNumElements(); row++) {
84 GlobalOrdinal grow = permRowMap->getGlobalElement(row);
85 LocalOrdinal lArow = A->getRowMap()->getLocalElement(grow);
86 size_t nnz = A->getNumEntriesInLocalRow(lArow);
91 A->getLocalRowView(lArow, indices, vals);
96 GlobalOrdinal gMaxValIdx = 0;
100 for (
size_t j = 0; j < Teuchos::as<size_t>(indices.
size()); j++) {
104 gMaxValIdx = A->getColMap()->getGlobalElement(indices[j]);
109 permutedDiagCandidates.push_back(std::make_pair(grow,gMaxValIdx));
110 Weights.push_back(maxVal/(norm1*Teuchos::as<Scalar>(nnz)));
112 std::cout <<
"ATTENTION: row " << grow <<
" has only zero entries -> singular matrix!" << std::endl;
118 std::vector<int> permutation;
129 gColVec->putScalar(0.0);
130 gDomVec->putScalar(0.0);
133 for (
typename std::vector<std::pair<GlobalOrdinal, GlobalOrdinal> >::const_iterator p = keepDiagonalEntries.begin(); p != keepDiagonalEntries.end(); ++p) {
134 gColVec->sumIntoGlobalValue((*p).second,1.0);
138 gDomVec->doExport(*gColVec,*exporter,Xpetra::ADD);
139 gColVec->doImport(*gDomVec,*exporter,Xpetra::INSERT);
141 std::vector<std::pair<GlobalOrdinal, GlobalOrdinal> > permutedDiagCandidatesFiltered;
142 std::map<GlobalOrdinal, Scalar> gColId2Weight;
145 for(
size_t i = 0; i < permutedDiagCandidates.size(); ++i) {
147 std::pair<GlobalOrdinal, GlobalOrdinal> pp = permutedDiagCandidates[permutation[i]];
148 GlobalOrdinal grow = pp.first;
149 GlobalOrdinal gcol = pp.second;
151 LocalOrdinal lcol = A->getColMap()->getLocalElement(gcol);
160 permutedDiagCandidatesFiltered.push_back(std::make_pair(grow,gcol));
161 gColId2Weight[gcol] = Weights[permutation[i]];
165 gDomVec->doExport(*gColVec,*exporter,Xpetra::ADD);
166 gColVec->doImport(*gDomVec,*exporter,Xpetra::INSERT);
173 std::vector<GlobalOrdinal> multipleColRequests;
177 std::queue<GlobalOrdinal> unusedColIdx;
179 for(
size_t sz = 0; sz<gDomVec->getLocalLength(); ++sz) {
188 multipleColRequests.push_back(gDomVec->getMap()->getGlobalElement(sz));
191 unusedColIdx.push(gDomVec->getMap()->getGlobalElement(sz));
196 LocalOrdinal localMultColRequests = Teuchos::as<LocalOrdinal>(multipleColRequests.size());
197 LocalOrdinal globalMultColRequests = 0;
200 MueLu_sumAll(gDomVec->getMap()->getComm(), (LocalOrdinal)localMultColRequests, globalMultColRequests);
202 if(globalMultColRequests > 0) {
208 std::vector<GlobalOrdinal> numMyMultColRequests(numProcs,0);
209 std::vector<GlobalOrdinal> numGlobalMultColRequests(numProcs,0);
210 numMyMultColRequests[myRank] = localMultColRequests;
211 Teuchos::reduceAll(*comm,Teuchos::REDUCE_MAX,numProcs,&numMyMultColRequests[0],&numGlobalMultColRequests[0]);
215 for (
int i=0; i<myRank-1; i++)
216 nMyOffset += numGlobalMultColRequests[i];
218 GlobalOrdinal zero=0;
219 std::vector<GlobalOrdinal> procMultRequestedColIds(globalMultColRequests,zero);
220 std::vector<GlobalOrdinal> global_procMultRequestedColIds(globalMultColRequests,zero);
223 for(
size_t i = 0; i < multipleColRequests.size(); i++) {
224 procMultRequestedColIds[nMyOffset + i] = multipleColRequests[i];
228 Teuchos::reduceAll(*comm, Teuchos::REDUCE_MAX, Teuchos::as<int>(globalMultColRequests), &procMultRequestedColIds[0], &global_procMultRequestedColIds[0]);
231 for (
size_t k = 0; k<global_procMultRequestedColIds.size(); k++) {
232 GlobalOrdinal globColId = global_procMultRequestedColIds[k];
234 std::vector<Scalar> MyWeightForColId(numProcs,0);
235 std::vector<Scalar> GlobalWeightForColId(numProcs,0);
237 if(gColVec->getMap()->isNodeGlobalElement(globColId)) {
238 MyWeightForColId[myRank] = gColId2Weight[globColId];
240 MyWeightForColId[myRank] = 0.0;
243 Teuchos::reduceAll(*comm, Teuchos::REDUCE_MAX, numProcs, &MyWeightForColId[0], &GlobalWeightForColId[0]);
245 if(gColVec->getMap()->isNodeGlobalElement(globColId)) {
249 MT winnerValue = 0.0;
250 int winnerProcRank = 0;
251 for (
int proc = 0; proc < numProcs; proc++) {
254 winnerProcRank = proc;
261 if(myRank != winnerProcRank) {
263 typename std::vector<std::pair<GlobalOrdinal, GlobalOrdinal> >::iterator p = permutedDiagCandidatesFiltered.begin();
264 while(p != permutedDiagCandidatesFiltered.end() )
266 if((*p).second == globColId)
267 p = permutedDiagCandidatesFiltered.erase(p);
279 std::vector<std::pair<GlobalOrdinal, GlobalOrdinal> > RowColPairs;
280 RowColPairs.insert( RowColPairs.end(), keepDiagonalEntries.begin(), keepDiagonalEntries.end());
281 RowColPairs.insert( RowColPairs.end(), permutedDiagCandidatesFiltered.begin(), permutedDiagCandidatesFiltered.end());
286 gColVec->putScalar(0.0);
287 gDomVec->putScalar(0.0);
288 typename std::vector<std::pair<GlobalOrdinal, GlobalOrdinal> >::iterator pl = RowColPairs.begin();
289 while(pl != RowColPairs.end() )
292 GlobalOrdinal jk = (*pl).second;
294 gColVec->sumIntoGlobalValue(jk,1.0);
297 gDomVec->doExport(*gColVec,*exporter,Xpetra::ADD);
298 for(
size_t sz = 0; sz<gDomVec->getLocalLength(); ++sz) {
300 if(arrDomVec[sz] > 1.0) {
301 GetOStream(
Runtime0) <<
"RowColPairs has multiple column [" << sz <<
"]=" << arrDomVec[sz] << std::endl;
302 }
else if(arrDomVec[sz] == 0.0) {
303 GetOStream(
Runtime0) <<
"RowColPairs has empty column [" << sz <<
"]=" << arrDomVec[sz] << std::endl;
343 Pperm->putScalar(0.0);
344 Qperm->putScalar(0.0);
345 lQperm->putScalar(0.0);
358 RowIdStatus->putScalar(0.0);
359 ColIdStatus->putScalar(0.0);
360 lColIdStatus->putScalar(0.0);
361 ColIdUsed->putScalar(0.0);
366 LocalOrdinal lWideRangeRowPermutations = 0;
367 GlobalOrdinal gWideRangeRowPermutations = 0;
368 LocalOrdinal lWideRangeColPermutations = 0;
369 GlobalOrdinal gWideRangeColPermutations = 0;
372 typename std::vector<std::pair<GlobalOrdinal, GlobalOrdinal> >::iterator p = RowColPairs.
begin();
373 while(p != RowColPairs.end() )
375 GlobalOrdinal ik = (*p).first;
376 GlobalOrdinal jk = (*p).second;
378 LocalOrdinal lik = A->getRowMap()->getLocalElement(ik);
379 LocalOrdinal ljk = A->getColMap()->getLocalElement(jk);
381 if(RowIdStatusArray[lik] == 0.0) {
382 RowIdStatusArray[lik] = 1.0;
383 lColIdStatusArray[ljk] = 1.0;
384 Pperm->replaceLocalValue(lik, ik);
385 lQperm->replaceLocalValue(ljk, ik);
386 ColIdUsed->replaceGlobalValue(ik,1.0);
387 p = RowColPairs.erase(p);
390 if(floor(ik/nDofsPerNode) != floor(jk/nDofsPerNode)) {
391 lWideRangeColPermutations++;
399 Qperm->doExport(*lQperm,*QpermExporter,Xpetra::ABSMAX);
400 ColIdStatus->doExport(*lColIdStatus,*QpermExporter,Xpetra::ABSMAX);
403 if(RowColPairs.size()>0) GetOStream(
Warnings0) <<
"MueLu::PermutationFactory: There are Row/Col pairs left!!!" << std::endl;
408 size_t cntFreeRowIdx = 0;
409 std::queue<GlobalOrdinal> qFreeGRowIdx;
410 for (
size_t lik = 0; lik < RowIdStatus->getLocalLength(); ++lik) {
411 if(RowIdStatusArray[lik] == 0.0) {
413 qFreeGRowIdx.push(RowIdStatus->getMap()->getGlobalElement(lik));
418 for (
size_t lik = 0; lik < RowIdStatus->getLocalLength(); ++lik) {
419 if(RowIdStatusArray[lik] == 0.0) {
420 RowIdStatusArray[lik] = 1.0;
421 Pperm->replaceLocalValue(lik, qFreeGRowIdx.front());
423 if(floor(qFreeGRowIdx.front()/nDofsPerNode) != floor(RowIdStatus->getMap()->getGlobalElement(lik)/nDofsPerNode)) {
424 lWideRangeRowPermutations++;
431 size_t cntFreeColIdx = 0;
432 std::queue<GlobalOrdinal> qFreeGColIdx;
433 for (
size_t ljk = 0; ljk < ColIdStatus->getLocalLength(); ++ljk) {
434 if(ColIdStatusArray[ljk] == 0.0) {
436 qFreeGColIdx.push(ColIdStatus->getMap()->getGlobalElement(ljk));
440 size_t cntUnusedColIdx = 0;
441 std::queue<GlobalOrdinal> qUnusedGColIdx;
442 for (
size_t ljk = 0; ljk < ColIdUsed->getLocalLength(); ++ljk) {
443 if(ColIdUsedArray[ljk] == 0.0) {
445 qUnusedGColIdx.push(ColIdUsed->getMap()->getGlobalElement(ljk));
450 for (
size_t ljk = 0; ljk < ColIdStatus->getLocalLength(); ++ljk) {
452 if(cntUnusedColIdx == 0)
break;
454 if(ColIdStatusArray[ljk] == 0.0) {
455 ColIdStatusArray[ljk] = 1.0;
456 Qperm->replaceLocalValue(ljk, qUnusedGColIdx.front());
457 ColIdUsed->replaceGlobalValue(qUnusedGColIdx.front(),1.0);
459 if(floor(qUnusedGColIdx.front()/nDofsPerNode) != floor(ColIdStatus->getMap()->getGlobalElement(ljk)/nDofsPerNode)) {
460 lWideRangeColPermutations++;
462 qUnusedGColIdx.pop();
474 for (
size_t ljk = 0; ljk < ColIdStatus->getLocalLength(); ++ljk) {
475 if(ColIdStatusArray[ljk] == 0.0) {
480 GlobalOrdinal global_cntFreeColIdx = 0;
481 LocalOrdinal local_cntFreeColIdx = cntFreeColIdx;
482 MueLu_sumAll(comm, Teuchos::as<GlobalOrdinal>(local_cntFreeColIdx), global_cntFreeColIdx);
484 std::cout <<
"global # of empty column idx entries in Qperm: " << global_cntFreeColIdx << std::endl;
488 if(global_cntFreeColIdx > 0) {
491 GlobalOrdinal global_cntUnusedColIdx = 0;
492 LocalOrdinal local_cntUnusedColIdx = cntUnusedColIdx;
493 MueLu_sumAll(comm, Teuchos::as<GlobalOrdinal>(local_cntUnusedColIdx), global_cntUnusedColIdx);
495 std::cout <<
"global # of unused column idx: " << global_cntUnusedColIdx << std::endl;
499 std::vector<LocalOrdinal> local_UnusedColIdxOnProc (numProcs);
500 std::vector<LocalOrdinal> global_UnusedColIdxOnProc(numProcs);
501 local_UnusedColIdxOnProc[myRank] = local_cntUnusedColIdx;
502 Teuchos::reduceAll(*comm, Teuchos::REDUCE_MAX, numProcs, &local_UnusedColIdxOnProc[0], &global_UnusedColIdxOnProc[0]);
505 std::cout <<
"PROC " << myRank <<
" global num unused indices per proc: ";
506 for (
size_t ljk = 0; ljk < global_UnusedColIdxOnProc.size(); ++ljk) {
507 std::cout <<
" " << global_UnusedColIdxOnProc[ljk];
509 std::cout << std::endl;
513 std::vector<GlobalOrdinal> local_UnusedColIdxVector(Teuchos::as<size_t>(global_cntUnusedColIdx));
514 std::vector<GlobalOrdinal> global_UnusedColIdxVector(Teuchos::as<size_t>(global_cntUnusedColIdx));
515 GlobalOrdinal global_cntUnusedColIdxStartIter = 0;
516 for(
int proc=0; proc<myRank; proc++) {
517 global_cntUnusedColIdxStartIter += global_UnusedColIdxOnProc[proc];
519 for(GlobalOrdinal k = global_cntUnusedColIdxStartIter; k < global_cntUnusedColIdxStartIter+local_cntUnusedColIdx; k++) {
520 local_UnusedColIdxVector[k] = qUnusedGColIdx.front();
521 qUnusedGColIdx.pop();
523 Teuchos::reduceAll(*comm, Teuchos::REDUCE_MAX, Teuchos::as<int>(global_cntUnusedColIdx), &local_UnusedColIdxVector[0], &global_UnusedColIdxVector[0]);
525 std::cout <<
"PROC " << myRank <<
" global UnusedGColIdx: ";
526 for (
size_t ljk = 0; ljk < global_UnusedColIdxVector.size(); ++ljk) {
527 std::cout <<
" " << global_UnusedColIdxVector[ljk];
529 std::cout << std::endl;
536 std::vector<LocalOrdinal> local_EmptyColIdxOnProc (numProcs);
537 std::vector<LocalOrdinal> global_EmptyColIdxOnProc(numProcs);
538 local_EmptyColIdxOnProc[myRank] = local_cntFreeColIdx;
539 Teuchos::reduceAll(*comm, Teuchos::REDUCE_MAX, numProcs, &local_EmptyColIdxOnProc[0], &global_EmptyColIdxOnProc[0]);
542 std::cout <<
"PROC " << myRank <<
" global num of needed column indices: ";
543 for (
size_t ljk = 0; ljk < global_EmptyColIdxOnProc.size(); ++ljk) {
544 std::cout <<
" " << global_EmptyColIdxOnProc[ljk];
546 std::cout << std::endl;
551 GlobalOrdinal global_UnusedColStartIdx = 0;
552 for(
int proc=0; proc<myRank; proc++) {
553 global_UnusedColStartIdx += global_EmptyColIdxOnProc[proc];
557 GetOStream(
Statistics0) <<
"PROC " << myRank <<
" is allowd to use the following column gids: ";
558 for(GlobalOrdinal k = global_UnusedColStartIdx; k < global_UnusedColStartIdx + Teuchos::as<GlobalOrdinal>(cntFreeColIdx); k++) {
559 GetOStream(
Statistics0) << global_UnusedColIdxVector[k] <<
" ";
565 GlobalOrdinal array_iter = 0;
566 for (
size_t ljk = 0; ljk < ColIdStatus->getLocalLength(); ++ljk) {
568 if(ColIdStatusArray[ljk] == 0.0) {
569 ColIdStatusArray[ljk] = 1.0;
570 Qperm->replaceLocalValue(ljk, global_UnusedColIdxVector[global_UnusedColStartIdx + array_iter]);
571 ColIdUsed->replaceGlobalValue(global_UnusedColIdxVector[global_UnusedColStartIdx + array_iter],1.0);
573 if(floor(global_UnusedColIdxVector[global_UnusedColStartIdx + array_iter]/nDofsPerNode) != floor(ColIdStatus->getMap()->getGlobalElement(ljk)/nDofsPerNode)) {
574 lWideRangeColPermutations++;
588 for(
size_t row=0; row<A->getNodeNumRows(); row++) {
595 permPTmatrix->insertGlobalValues(A->getRowMap()->getGlobalElement(row), indoutP.
view(0,indoutP.
size()), valout.
view(0,valout.
size()));
596 permQTmatrix->insertGlobalValues (A->getRowMap()->getGlobalElement(row), indoutQ.
view(0,indoutQ.
size()), valout.
view(0,valout.
size()));
599 permPTmatrix->fillComplete();
600 permQTmatrix->fillComplete();
604 for(
size_t row=0; row<permPTmatrix->getNodeNumRows(); row++) {
605 if(permPTmatrix->getNumEntriesInLocalRow(row) != 1)
606 GetOStream(
Warnings0) <<
"#entries in row " << row <<
" of permPTmatrix is " << permPTmatrix->getNumEntriesInLocalRow(row) << std::endl;
607 if(permPmatrix->getNumEntriesInLocalRow(row) != 1)
608 GetOStream(
Warnings0) <<
"#entries in row " << row <<
" of permPmatrix is " << permPmatrix->getNumEntriesInLocalRow(row) << std::endl;
609 if(permQTmatrix->getNumEntriesInLocalRow(row) != 1)
610 GetOStream(
Warnings0) <<
"#entries in row " << row <<
" of permQmatrix is " << permQTmatrix->getNumEntriesInLocalRow(row) << std::endl;
614 Teuchos::RCP<Matrix> ApermQt = Xpetra::MatrixMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::Multiply(*A,
false, *permQTmatrix,
false, GetOStream(
Statistics2));
615 Teuchos::RCP<Matrix> permPApermQt = Xpetra::MatrixMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::Multiply(*permPmatrix,
false, *ApermQt,
false, GetOStream(
Statistics2));
629 permPApermQt->getLocalDiagCopy(*diagVec);
630 for(
size_t i = 0; i<diagVec->getMap()->getNodeNumElements(); ++i) {
631 if(diagVecData[i] != 0.0)
635 GetOStream(
Statistics0) <<
"MueLu::PermutationFactory: found zero on diagonal in row " << i << std::endl;
641 for(
size_t row=0; row<A->getNodeNumRows(); row++) {
644 diagScalingOp->insertGlobalValues(A->getRowMap()->getGlobalElement(row), indout.view(0,indout.size()), valout.
view(0,valout.
size()));
646 diagScalingOp->fillComplete();
648 Teuchos::RCP<Matrix> scaledA = Xpetra::MatrixMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::Multiply(*diagScalingOp,
false, *permPApermQt,
false, GetOStream(
Statistics2));
649 currentLevel.
Set(
"A", Teuchos::rcp_dynamic_cast<Matrix>(scaledA), genFactory);
651 currentLevel.
Set(
"permA", Teuchos::rcp_dynamic_cast<Matrix>(permPApermQt), genFactory);
652 currentLevel.
Set(
"permP", Teuchos::rcp_dynamic_cast<Matrix>(permPmatrix), genFactory);
653 currentLevel.
Set(
"permQT", Teuchos::rcp_dynamic_cast<Matrix>(permQTmatrix), genFactory);
654 currentLevel.
Set(
"permScaling", Teuchos::rcp_dynamic_cast<Matrix>(diagScalingOp), genFactory);
659 permPmatrix->getLocalDiagCopy(*diagPVec);
661 LocalOrdinal lNumRowPermutations = 0;
662 GlobalOrdinal gNumRowPermutations = 0;
663 for(
size_t i = 0; i<diagPVec->getMap()->getNodeNumElements(); ++i) {
664 if(diagPVecData[i] == 0.0) {
665 lNumRowPermutations++;
670 MueLu_sumAll(diagPVec->getMap()->getComm(), Teuchos::as<GlobalOrdinal>(lNumRowPermutations), gNumRowPermutations);
675 permQTmatrix->getLocalDiagCopy(*diagQTVec);
677 LocalOrdinal lNumColPermutations = 0;
678 GlobalOrdinal gNumColPermutations = 0;
679 for(
size_t i = 0; i<diagQTVec->getMap()->getNodeNumElements(); ++i) {
680 if(diagQTVecData[i] == 0.0) {
681 lNumColPermutations++;
686 MueLu_sumAll(diagQTVec->getMap()->getComm(), Teuchos::as<GlobalOrdinal>(lNumColPermutations), gNumColPermutations);
688 currentLevel.
Set(
"#RowPermutations", gNumRowPermutations, genFactory);
689 currentLevel.
Set(
"#ColPermutations", gNumColPermutations, genFactory);
690 currentLevel.
Set(
"#WideRangeRowPermutations", gWideRangeRowPermutations, genFactory);
691 currentLevel.
Set(
"#WideRangeColPermutations", gWideRangeColPermutations, genFactory);
693 GetOStream(
Statistics0) <<
"#Row permutations/max possible permutations: " << gNumRowPermutations <<
"/" << diagPVec->getMap()->getGlobalNumElements() << std::endl;
694 GetOStream(
Statistics0) <<
"#Column permutations/max possible permutations: " << gNumColPermutations <<
"/" << diagQTVec->getMap()->getGlobalNumElements() << std::endl;
695 GetOStream(
Runtime1) <<
"#wide range row permutations: " << gWideRangeRowPermutations <<
" #wide range column permutations: " << gWideRangeColPermutations << std::endl;
Important warning messages (one line)
#define MueLu_sumAll(rcpComm, in, out)
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
void sortingPermutation(const std::vector< Scalar > &values, std::vector< LocalOrdinal > &v)
void BuildPermutation(const Teuchos::RCP< Matrix > &A, const Teuchos::RCP< const Map > permRowMap, Level ¤tLevel, const FactoryBase *genFactory) const
build permutation operators
static magnitudeType real(T a)
One-liner description of what is happening.
Namespace for MueLu classes and methods.
Print even more statistics.
Base class for factories (e.g., R, P, and A_coarse).
Print statistics that do not involve significant additional computation.
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
Class that holds all level-specific information.
static RCP< Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > Transpose(Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > &Op, bool optimizeTranspose=false, const std::string &label=std::string(), const Teuchos::RCP< Teuchos::ParameterList > ¶ms=Teuchos::null)
TEUCHOS_DEPRECATED void reduceAll(const Comm< Ordinal > &comm, const EReductionType reductType, const Packet &send, Packet *globalReduct)
void Set(const std::string &ename, const T &entry, const FactoryBase *factory=NoFactory::get())
static magnitudeType magnitude(T a)
ArrayView< T > view(size_type lowerOffset, size_type size) const
Exception throws to report errors in the internal logical of the program.
Description of what is happening (more verbose)