8 #ifndef MUELU_LOCALPERMUTATIONSTRATEGY_DEF_HPP_
9 #define MUELU_LOCALPERMUTATIONSTRATEGY_DEF_HPP_
19 #include <Xpetra_CrsMatrixWrap.hpp>
21 #include "MueLu_Utilities.hpp"
26 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
28 permWidth_ = nDofsPerNode;
30 result_permvecs_.clear();
34 for (
size_t t = 0; t < nDofsPerNode; t++)
36 std::string cs = ss.str();
41 std::vector<int> newPerm(cs.length(), -1);
42 for (
size_t len = 0; len < cs.length(); len++) {
43 newPerm[len] = Teuchos::as<int>(cs[len] -
'0');
45 result_permvecs_.push_back(newPerm);
47 }
while (std::next_permutation(cs.begin(), cs.end()));
50 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
54 size_t nDofsPerNode = 1;
55 if (A->IsView(
"stridedMaps")) {
57 nDofsPerNode = Teuchos::rcp_dynamic_cast<
const StridedMap>(permRowMapStrided)->getFixedBlockSize();
63 std::vector<std::pair<GlobalOrdinal, GlobalOrdinal> > RowColPairs;
66 if (permWidth_ != nDofsPerNode)
67 BuildPermutations(nDofsPerNode);
70 LocalOrdinal lonDofsPerNode = Teuchos::as<LocalOrdinal>(nDofsPerNode);
74 std::vector<GlobalOrdinal> growIds(nDofsPerNode);
78 LocalOrdinal numLocalNodes = A->getRowMap()->getLocalNumElements() / nDofsPerNode;
79 for (
LocalOrdinal node = 0; node < numLocalNodes; ++node) {
86 for (
LocalOrdinal lrdof = 0; lrdof < lonDofsPerNode; ++lrdof) {
88 growIds[lrdof] = grow;
91 A->getLocalRowView(A->getRowMap()->getLocalElement(grow), indices, vals);
96 for (
size_t j = 0; j < Teuchos::as<size_t>(indices.size()); j++) {
104 for (
size_t j = 0; j < Teuchos::as<size_t>(indices.size()); j++) {
105 GlobalOrdinal gcol = A->getColMap()->getGlobalElement(indices[j]);
107 if (grnodeid == gcnodeid) {
109 subBlockMatrix(lrdof, gcol % nDofsPerNode) = vals[j] / maxVal;
111 subBlockMatrix(lrdof, gcol % nDofsPerNode) = vals[j];
112 std::cout <<
"maxVal never should be zero!!!!" << std::endl;
131 std::vector<Scalar> performance_vector = std::vector<Scalar>(result_permvecs_.size());
132 for (
size_t t = 0; t < result_permvecs_.size(); t++) {
133 std::vector<int> vv = result_permvecs_[t];
135 for (
size_t j = 0; j < vv.size(); j++) {
136 value = value * subBlockMatrix(j, vv[j]);
138 performance_vector[t] = value;
153 size_t maxPerformancePermutationIdx = 0;
154 for (
size_t j = 0; j < Teuchos::as<size_t>(performance_vector.size()); j++) {
157 maxPerformancePermutationIdx = j;
162 std::vector<int> bestPerformancePermutation = result_permvecs_[maxPerformancePermutationIdx];
163 for (
size_t t = 0; t < nDofsPerNode; t++) {
164 RowColPairs.push_back(std::make_pair(growIds[t], growIds[bestPerformancePermutation[t]]));
173 Pperm->putScalar(SC_ZERO);
174 Qperm->putScalar(SC_ZERO);
179 typename std::vector<std::pair<GlobalOrdinal, GlobalOrdinal> >::iterator p = RowColPairs.
begin();
180 while (p != RowColPairs.end()) {
185 LocalOrdinal ljk = A->getDomainMap()->getLocalElement(jk);
187 Pperm->replaceLocalValue(lik, ik);
188 Qperm->replaceLocalValue(ljk, ik);
190 p = RowColPairs.erase(p);
193 if (RowColPairs.size() > 0) GetOStream(
Warnings0) <<
"MueLu::LocalPermutationStrategy: There are Row/col pairs left!" << std::endl;
202 for (
size_t row = 0; row < A->getLocalNumRows(); row++) {
206 permPTmatrix->insertGlobalValues(A->getRowMap()->getGlobalElement(row), indoutP.
view(0, indoutP.
size()), valout.
view(0, valout.
size()));
207 permQTmatrix->insertGlobalValues(A->getRowMap()->getGlobalElement(row), indoutQ.
view(0, indoutQ.
size()), valout.
view(0, valout.
size()));
210 permPTmatrix->fillComplete();
211 permQTmatrix->fillComplete();
239 LO lCntZeroDiagonals = 0;
240 permPApermQt->getLocalDiagCopy(*diagVec);
242 for (
size_t i = 0; i < diagVec->getMap()->getLocalNumElements(); ++i) {
243 if (diagVecData[i] != SC_ZERO)
253 GO gCntZeroDiagonals = 0;
254 GO glCntZeroDiagonals = Teuchos::as<GlobalOrdinal>(lCntZeroDiagonals);
255 MueLu_sumAll(comm,glCntZeroDiagonals,gCntZeroDiagonals);
256 GetOStream(
Statistics0) <<
"MueLu::LocalPermutationStrategy: found " << gCntZeroDiagonals <<
" zeros on diagonal" << std::endl;
261 for (
size_t row = 0; row < A->getLocalNumRows(); row++) {
264 diagScalingOp->insertGlobalValues(A->getRowMap()->getGlobalElement(row), indout.view(0, indout.size()), valout.
view(0, valout.
size()));
266 diagScalingOp->fillComplete();
269 currentLevel.
Set(
"A", Teuchos::rcp_dynamic_cast<Matrix>(scaledA), genFactory);
271 currentLevel.
Set(
"permA", Teuchos::rcp_dynamic_cast<Matrix>(permPApermQt), genFactory);
272 currentLevel.
Set(
"permP", Teuchos::rcp_dynamic_cast<Matrix>(permPmatrix), genFactory);
273 currentLevel.
Set(
"permQT", Teuchos::rcp_dynamic_cast<Matrix>(permQTmatrix), genFactory);
274 currentLevel.
Set(
"permScaling", Teuchos::rcp_dynamic_cast<Matrix>(diagScalingOp), genFactory);
279 permPmatrix->getLocalDiagCopy(*diagPVec);
283 for (
size_t i = 0; i < diagPVec->getMap()->getLocalNumElements(); ++i) {
284 if (diagPVecData[i] == SC_ZERO) {
285 lNumRowPermutations++;
290 MueLu_sumAll(diagPVec->getMap()->getComm(), lNumRowPermutations, gNumRowPermutations);
295 permQTmatrix->getLocalDiagCopy(*diagQTVec);
299 for (
size_t i = 0; i < diagQTVec->getMap()->getLocalNumElements(); ++i) {
300 if (diagQTVecData[i] == SC_ZERO) {
301 lNumColPermutations++;
306 MueLu_sumAll(diagQTVec->getMap()->getComm(), lNumColPermutations, gNumColPermutations);
308 currentLevel.
Set(
"#RowPermutations", gNumRowPermutations, genFactory );
309 currentLevel.
Set(
"#ColPermutations", gNumColPermutations, genFactory );
310 currentLevel.
Set(
"#WideRangeRowPermutations", 0, genFactory );
311 currentLevel.
Set(
"#WideRangeColPermutations", 0, genFactory );
313 GetOStream(
Statistics0) <<
"#Row permutations/max possible permutations: " << gNumRowPermutations <<
"/" << diagPVec->getMap()->getGlobalNumElements() << std::endl;
314 GetOStream(
Statistics0) <<
"#Column permutations/max possible permutations: " << gNumColPermutations <<
"/" << diagQTVec->getMap()->getGlobalNumElements() << std::endl;
317 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
319 size_t nDofsPerNode = 1;
320 if (A->IsView(
"stridedMaps")) {
322 nDofsPerNode = Teuchos::rcp_dynamic_cast<
const StridedMap>(permRowMapStrided)->getFixedBlockSize();
325 LocalOrdinal localDofId = localNodeId * nDofsPerNode + localDof;
327 return A->getRowMap()->getGlobalElement(localDofId);
330 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
332 size_t nDofsPerNode = 1;
333 if (A->IsView(
"stridedMaps")) {
335 nDofsPerNode = Teuchos::rcp_dynamic_cast<
const StridedMap>(permRowMapStrided)->getFixedBlockSize();
Important warning messages (one line)
#define MueLu_sumAll(rcpComm, in, out)
MueLu::DefaultLocalOrdinal LocalOrdinal
void BuildPermutation(const Teuchos::RCP< Matrix > &A, const Teuchos::RCP< const Map > permRowMap, Level ¤tLevel, const FactoryBase *genFactory) const
build permutation operators
Print even more statistics.
GlobalOrdinal getGlobalDofId(const Teuchos::RCP< Matrix > &A, LocalOrdinal localNodeId, LocalOrdinal localDof) const
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)
MueLu::DefaultScalar Scalar
MueLu::DefaultGlobalOrdinal GlobalOrdinal
Class that holds all level-specific information.
void BuildPermutations(size_t nDofsPerNode) const
int putScalar(const ScalarType value=Teuchos::ScalarTraits< ScalarType >::zero())
GlobalOrdinal globalDofId2globalNodeId(const Teuchos::RCP< Matrix > &A, GlobalOrdinal grid) const
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)
void Set(const std::string &ename, const T &entry, const FactoryBase *factory=NoFactory::get())
static magnitudeType magnitude(T a)
static void Multiply(const Matrix &A, bool transposeA, const Matrix &B, bool transposeB, Matrix &C, bool call_FillComplete_on_result=true, bool doOptimizeStorage=true, const std::string &label=std::string(), const RCP< ParameterList > ¶ms=null)
ArrayView< T > view(size_type lowerOffset, size_type size) const