71#undef MUELU_UTILITIES_SHORT
75 typedef typename Teuchos::ScalarTraits<Scalar>::magnitudeType
Magnitude;
77 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>& params = Teuchos::null);
159void leftRghtDofScalingWithinNode(
const Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>& Amat,
size_t blkSize,
size_t nSweeps, Teuchos::ArrayRCP<Scalar>& rowScaling, Teuchos::ArrayRCP<Scalar>& colScaling) {
160 LocalOrdinal nBlks = (Amat.getRowMap()->getLocalNumElements()) / blkSize;
162 Teuchos::ArrayRCP<Scalar> rowScaleUpdate(blkSize);
163 Teuchos::ArrayRCP<Scalar> colScaleUpdate(blkSize);
165 for (
size_t i = 0; i < blkSize; i++) rowScaling[i] = 1.0;
166 for (
size_t i = 0; i < blkSize; i++) colScaling[i] = 1.0;
168 for (
size_t k = 0; k < nSweeps; k++) {
170 for (
size_t i = 0; i < blkSize; i++) rowScaleUpdate[i] = 0.0;
173 for (
size_t j = 0; j < blkSize; j++) {
174 Teuchos::ArrayView<const LocalOrdinal> cols;
175 Teuchos::ArrayView<const Scalar> vals;
176 Amat.getLocalRowView(row, cols, vals);
178 for (
size_t kk = 0; kk < Teuchos::as<size_t>(vals.size()); kk++) {
179 size_t modGuy = (cols[kk] + 1) % blkSize;
180 if (modGuy == 0) modGuy = blkSize;
182 rowScaleUpdate[j] += rowScaling[j] * (Teuchos::ScalarTraits<Scalar>::magnitude(vals[kk])) * colScaling[modGuy];
188 Teuchos::ArrayRCP<Scalar> tempUpdate(blkSize);
189 Teuchos::reduceAll(*(Amat.getRowMap()->getComm()), Teuchos::REDUCE_SUM, (
LocalOrdinal)blkSize, rowScaleUpdate.getRawPtr(), tempUpdate.getRawPtr());
190 for (
size_t i = 0; i < blkSize; i++) rowScaleUpdate[i] = tempUpdate[i];
196 Scalar minUpdate = Teuchos::ScalarTraits<Scalar>::magnitude((rowScaleUpdate[0] / rowScaling[0]) / rowScaling[0]);
198 for (
size_t i = 1; i < blkSize; i++) {
199 Scalar temp = (rowScaleUpdate[i] / rowScaling[i]) / rowScaling[i];
200 if (Teuchos::ScalarTraits<Scalar>::magnitude(temp) < Teuchos::ScalarTraits<Scalar>::magnitude(minUpdate))
201 minUpdate = Teuchos::ScalarTraits<Scalar>::magnitude(temp);
203 for (
size_t i = 0; i < blkSize; i++) rowScaling[i] *= sqrt(minUpdate / rowScaleUpdate[i]);
206 for (
size_t i = 0; i < blkSize; i++) colScaleUpdate[i] = 0.0;
209 for (
size_t j = 0; j < blkSize; j++) {
210 Teuchos::ArrayView<const LocalOrdinal> cols;
211 Teuchos::ArrayView<const Scalar> vals;
212 Amat.getLocalRowView(row, cols, vals);
213 for (
size_t kk = 0; kk < Teuchos::as<size_t>(vals.size()); kk++) {
214 size_t modGuy = (cols[kk] + 1) % blkSize;
215 if (modGuy == 0) modGuy = blkSize;
217 colScaleUpdate[modGuy] += colScaling[modGuy] * (Teuchos::ScalarTraits<Scalar>::magnitude(vals[kk])) * rowScaling[j];
222 Teuchos::reduceAll(*(Amat.getRowMap()->getComm()), Teuchos::REDUCE_SUM, (
LocalOrdinal)blkSize, colScaleUpdate.getRawPtr(), tempUpdate.getRawPtr());
223 for (
size_t i = 0; i < blkSize; i++) colScaleUpdate[i] = tempUpdate[i];
229 minUpdate = Teuchos::ScalarTraits<Scalar>::magnitude((colScaleUpdate[0] / colScaling[0]) / colScaling[0]);
231 for (
size_t i = 1; i < blkSize; i++) {
232 Scalar temp = (colScaleUpdate[i] / colScaling[i]) / colScaling[i];
233 if (Teuchos::ScalarTraits<Scalar>::magnitude(temp) < Teuchos::ScalarTraits<Scalar>::magnitude(minUpdate))
234 minUpdate = Teuchos::ScalarTraits<Scalar>::magnitude(temp);
236 for (
size_t i = 0; i < blkSize; i++) colScaling[i] *= sqrt(minUpdate / colScaleUpdate[i]);
256 Teuchos::RCP<
const Xpetra::Map<LocalOrdinal, GlobalOrdinal, Node>>& localDropMap,
257 Teuchos::RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>>& Ain) {
262 using MT =
typename Teuchos::ScalarTraits<SC>::magnitudeType;
264 Teuchos::RCP<const Teuchos::Comm<int>> comm = localDropMap->getComm();
266 Teuchos::RCP<Xpetra::Vector<SC, LO, GO, NO>> toggleVec = Xpetra::VectorFactory<SC, LO, GO, NO>::Build(localDropMap);
267 toggleVec->putScalar(1);
269 Teuchos::RCP<Xpetra::Vector<SC, LO, GO, NO>> finalVec = Xpetra::VectorFactory<SC, LO, GO, NO>::Build(Ain->getColMap(),
true);
270 Teuchos::RCP<Xpetra::Import<LO, GO, NO>> importer = Xpetra::ImportFactory<LO, GO, NO>::Build(localDropMap, Ain->getColMap());
271 finalVec->doImport(*toggleVec, *importer, Xpetra::ABSMAX);
273 std::vector<GO> finalDropMapEntries = {};
274 auto finalVec_h_2D = finalVec->getLocalViewHost(Tpetra::Access::ReadOnly);
275 auto finalVec_h_1D = Kokkos::subview(finalVec_h_2D, Kokkos::ALL(), 0);
276 const size_t localLength = finalVec->getLocalLength();
278 for (
size_t k = 0; k < localLength; ++k) {
279 if (Teuchos::ScalarTraits<SC>::magnitude(finalVec_h_1D(k)) > Teuchos::ScalarTraits<MT>::zero()) {
280 finalDropMapEntries.push_back(finalVec->getMap()->getGlobalElement(k));
284 Teuchos::RCP<const Xpetra::Map<LO, GO, NO>> finalDropMap = Xpetra::MapFactory<LO, GO, NO>::Build(
285 localDropMap->lib(), Teuchos::OrdinalTraits<Tpetra::global_size_t>::invalid(), finalDropMapEntries, 0, comm);
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::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)