74 const ParameterList &pL = GetParameterList();
75 const std::string parameterName =
"droppingScheme";
76 if (pL.get<std::string>(parameterName) ==
"blockmap") {
77 BuildBasedOnBlockmap(currentLevel);
78 }
else if (pL.get<std::string>(parameterName) ==
"map-pair") {
79 BuildBasedOnMapPair(currentLevel);
82 "MueLu::SegregatedAFactory::Build(): Unknown map type of user input. "
83 "Set a valid value for the parameter \""
84 << parameterName <<
"\".")
90 FactoryMonitor m(*
this,
"Matrix filtering (segregation, blockmap)", currentLevel);
92 RCP<Matrix> Ain = Get<RCP<Matrix>>(currentLevel,
"A");
93 RCP<const Map> dropMap1 = Teuchos::null;
94 const std::string dropMap1Name =
"dropMap1";
99 GetOStream(
Statistics0) <<
"User provided dropMap1 \"" << dropMap1Name <<
"\": length dimension=" << dropMap1->getGlobalNumElements() << std::endl;
101 dropMap1 = Get<RCP<const Map>>(currentLevel, dropMap1Name);
103 TEUCHOS_ASSERT(!dropMap1.is_null());
106 Teuchos::RCP<Matrix> Aout = MatrixFactory::Build(Ain->getRowMap(), Ain->getGlobalMaxNumRowEntries());
108 size_t numLocalRows = Ain->getLocalNumRows();
109 for (
size_t row = 0; row < numLocalRows; row++) {
110 GlobalOrdinal grid = Ain->getRowMap()->getGlobalElement(row);
111 bool isInMap = dropMap1->isNodeGlobalElement(grid);
114 auto lclMat = Ain->getLocalMatrixHost();
115 auto rowView = lclMat.row(row);
118 Teuchos::ArrayRCP<GO> indout(rowView.length, Teuchos::ScalarTraits<GO>::zero());
119 Teuchos::ArrayRCP<SC> valout(rowView.length, Teuchos::ScalarTraits<SC>::zero());
121 size_t nNonzeros = 0;
122 for (LO jj = 0; jj < rowView.length; ++jj) {
123 LO lcid = rowView.colidx(jj);
124 GO gcid = Ain->getColMap()->getGlobalElement(lcid);
125 auto val = rowView.value(jj);
126 bool isInMap2 = dropMap1->isNodeGlobalElement(gcid);
128 if (isInMap == isInMap2) {
129 indout[nNonzeros] = gcid;
130 valout[nNonzeros] = val;
134 indout.resize(nNonzeros);
135 valout.resize(nNonzeros);
137 Aout->insertGlobalValues(Ain->getRowMap()->getGlobalElement(row), indout.view(0, indout.size()), valout.view(0, valout.size()));
140 Aout->fillComplete(Ain->getDomainMap(), Ain->getRangeMap());
143 Aout->SetFixedBlockSize(Ain->GetFixedBlockSize());
145 GetOStream(
Statistics0, 0) <<
"Nonzeros in A (input): " << Ain->getGlobalNumEntries() <<
", Nonzeros after filtering A: " << Aout->getGlobalNumEntries() << std::endl;
147 Set(currentLevel,
"A", Aout);
152 FactoryMonitor m(*
this,
"Matrix filtering (segregation, map-pair)", currentLevel);
154 RCP<Matrix> Ain = Get<RCP<Matrix>>(currentLevel,
"A");
157 RCP<const Map> dropMap1 = Teuchos::null;
158 RCP<const Map> dropMap2 = Teuchos::null;
160 const std::string dropMap1Name =
"dropMap1";
161 const std::string dropMap2Name =
"dropMap2";
166 GetOStream(
Statistics0) <<
"User provided dropMap1 \"" << dropMap1Name <<
"\": length dimension=" << dropMap1->getGlobalNumElements() << std::endl;
167 GetOStream(
Statistics0) <<
"User provided dropMap2 \"" << dropMap2Name <<
"\": length dimension=" << dropMap2->getGlobalNumElements() << std::endl;
169 dropMap1 = Get<RCP<const Map>>(currentLevel, dropMap1Name);
170 dropMap2 = Get<RCP<const Map>>(currentLevel, dropMap2Name);
173 TEUCHOS_ASSERT(!dropMap1.is_null());
174 TEUCHOS_ASSERT(!dropMap2.is_null());
177 Teuchos::RCP<Matrix> Aout = MatrixFactory::Build(Ain->getRowMap(), Ain->getGlobalMaxNumRowEntries());
180 Teuchos::RCP<const Map> finalDropMap1 = Teuchos::null;
181 Teuchos::RCP<const Map> finalDropMap2 = Teuchos::null;
188 size_t numLocalMatrixRows = Ain->getLocalNumRows();
190 for (
size_t row = 0; row < numLocalMatrixRows; row++) {
191 GO grid = Ain->getRowMap()->getGlobalElement(row);
192 bool rowIsInMap1 = finalDropMap1->isNodeGlobalElement(grid);
193 bool rowIsInMap2 = finalDropMap2->isNodeGlobalElement(grid);
196 auto lclMat = Ain->getLocalMatrixHost();
197 auto rowView = lclMat.row(row);
200 Teuchos::ArrayRCP<GO> indout(rowView.length, Teuchos::ScalarTraits<GO>::zero());
201 Teuchos::ArrayRCP<SC> valout(rowView.length, Teuchos::ScalarTraits<SC>::zero());
203 size_t nNonzeros = 0;
204 for (LO jj = 0; jj < rowView.length; ++jj) {
205 LO lcid = rowView.colidx(jj);
206 GO gcid = Ain->getColMap()->getGlobalElement(lcid);
207 auto val = rowView.value(jj);
208 bool colIsInMap1 = finalDropMap1->isNodeGlobalElement(gcid);
209 bool colIsInMap2 = finalDropMap2->isNodeGlobalElement(gcid);
211 if ((rowIsInMap1 && colIsInMap2) || (rowIsInMap2 && colIsInMap1)) {
214 indout[nNonzeros] = gcid;
215 valout[nNonzeros] = val;
219 indout.resize(nNonzeros);
220 valout.resize(nNonzeros);
221 Aout->insertGlobalValues(Ain->getRowMap()->getGlobalElement(row), indout.view(0, indout.size()), valout.view(0, valout.size()));
224 Aout->fillComplete(Ain->getDomainMap(), Ain->getRangeMap());
227 Aout->SetFixedBlockSize(Ain->GetFixedBlockSize());
229 GetOStream(
Statistics0, 0) <<
"Nonzeros in A (input): " << Ain->getGlobalNumEntries() <<
", Nonzeros after filtering A: " << Aout->getGlobalNumEntries() << std::endl;
231 currentLevel.
Set(
"A", Aout,
this);
Teuchos::RCP< const Xpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > importOffRankDroppingInfo(Teuchos::RCP< const Xpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > &localDropMap, Teuchos::RCP< Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > &Ain)