Skip to content

Commit

Permalink
Xpetra: Fix includes for Xpetra::BlockedCrsMatrix
Browse files Browse the repository at this point in the history
Signed-off-by: Daniel Arndt <arndtd@ornl.gov>
  • Loading branch information
masterleinad committed Feb 20, 2025
1 parent 9c5d962 commit f322661
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 32 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,6 @@
#include "Xpetra_MapExtractor.hpp"
#include "Xpetra_MapExtractorFactory.hpp"

#include "Xpetra_Matrix.hpp"
#include "Xpetra_MatrixFactory.hpp"
#include "Xpetra_CrsMatrixWrap.hpp"

#ifdef HAVE_XPETRA_THYRA
Expand All @@ -40,7 +38,7 @@
#include <Thyra_LinearOpBase.hpp>
#include <Thyra_BlockedLinearOpBase.hpp>
#include <Thyra_PhysicallyBlockedLinearOpBase.hpp>
#include "Xpetra_ThyraUtils.hpp"
#include "Xpetra_ThyraUtils_decl.hpp"
#endif

#include "Xpetra_VectorFactory.hpp"
Expand Down Expand Up @@ -117,7 +115,7 @@ class BlockedCrsMatrix : public Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node
* Helper function only used in constructor of Xpetra_BlockedCrsMatrix for transforming a Thyra::BlockedLinearOp object
* All GID entries are sorted and duplicates are eliminated.
*/
Teuchos::RCP<const Map> mergeMaps(std::vector<Teuchos::RCP<const Xpetra::Map<LocalOrdinal, GlobalOrdinal, Node> > >& subMaps);
Teuchos::RCP<const Xpetra::Map<LocalOrdinal, GlobalOrdinal, Node>> mergeMaps(std::vector<Teuchos::RCP<const Xpetra::Map<LocalOrdinal, GlobalOrdinal, Node> > >& subMaps);

public:
#endif
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
#include "Xpetra_Exceptions.hpp"

#include "Xpetra_BlockedCrsMatrix_decl.hpp"
#include "Xpetra_BlockedMap_decl.hpp"
#include "Xpetra_MapFactory.hpp"
#include "Xpetra_MultiVector.hpp"
#include "Xpetra_BlockedMultiVector.hpp"
Expand Down Expand Up @@ -113,7 +114,7 @@ BlockedCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::BlockedCrsMatrix(co
if (thyraOp->blockExists(r, c)) {
// we only need at least one block in each block row to extract the range map
Teuchos::RCP<const Thyra::LinearOpBase<Scalar>> const_op = thyraOp->getBlock(r, c); // nonConst access is not allowed.
Teuchos::RCP<const Xpetra::Matrix<Scalar, LO, GO, Node>> xop =
Teuchos::RCP<const Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xop =
Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::toXpetra(const_op);
subRangeMaps[r] = xop->getRangeMap();
if (r != c) is_diagonal_ = false;
Expand All @@ -131,7 +132,7 @@ BlockedCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::BlockedCrsMatrix(co
numAllElements += subRangeMaps[v]->getGlobalNumElements();
}
if (fullRangeMap->getGlobalNumElements() != numAllElements) bRangeUseThyraStyleNumbering = true;
rangemaps_ = Teuchos::rcp(new Xpetra::MapExtractor<Scalar, LocalOrdinal, GlobalOrdinal, Node>(fullRangeMap, subRangeMaps, bRangeUseThyraStyleNumbering));
rangemaps_ = Teuchos::rcp(new Xpetra::MapExtractor(fullRangeMap, subRangeMaps, bRangeUseThyraStyleNumbering));

// build domain map extractor from Thyra::BlockedLinearOpBase object
std::vector<Teuchos::RCP<const Xpetra::Map<LocalOrdinal, GlobalOrdinal, Node>>> subDomainMaps(numDomainBlocks);
Expand All @@ -140,8 +141,8 @@ BlockedCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::BlockedCrsMatrix(co
if (thyraOp->blockExists(r, c)) {
// we only need at least one block in each block row to extract the range map
Teuchos::RCP<const Thyra::LinearOpBase<Scalar>> const_op = thyraOp->getBlock(r, c); // nonConst access is not allowed.
Teuchos::RCP<const Xpetra::Matrix<Scalar, LO, GO, Node>> xop =
Xpetra::ThyraUtils<Scalar, LO, GO, Node>::toXpetra(const_op);
Teuchos::RCP<const Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xop =
Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::toXpetra(const_op);
subDomainMaps[c] = xop->getDomainMap();
break;
}
Expand All @@ -155,7 +156,7 @@ BlockedCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::BlockedCrsMatrix(co
numAllElements += subDomainMaps[v]->getGlobalNumElements();
}
if (fullDomainMap->getGlobalNumElements() != numAllElements) bDomainUseThyraStyleNumbering = true;
domainmaps_ = Teuchos::rcp(new Xpetra::MapExtractor<Scalar, LocalOrdinal, GlobalOrdinal, Node>(fullDomainMap, subDomainMaps, bDomainUseThyraStyleNumbering));
domainmaps_ = Teuchos::rcp(new Xpetra::MapExtractor(fullDomainMap, subDomainMaps, bDomainUseThyraStyleNumbering));

// store numbering mode
bRangeThyraMode_ = bRangeUseThyraStyleNumbering;
Expand All @@ -169,10 +170,10 @@ BlockedCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::BlockedCrsMatrix(co
// TODO we do not support nested Thyra operators here!
Teuchos::RCP<const Thyra::LinearOpBase<Scalar>> const_op = thyraOp->getBlock(r, c); // nonConst access is not allowed.
Teuchos::RCP<Thyra::LinearOpBase<Scalar>> op = Teuchos::rcp_const_cast<Thyra::LinearOpBase<Scalar>>(const_op); // cast away const
Teuchos::RCP<Xpetra::Matrix<Scalar, LO, GO, Node>> xop =
Xpetra::ThyraUtils<Scalar, LO, GO, Node>::toXpetra(op);
Teuchos::RCP<Xpetra::CrsMatrixWrap<Scalar, LO, GO, Node>> xwrap =
Teuchos::rcp_dynamic_cast<Xpetra::CrsMatrixWrap<Scalar, LO, GO, Node>>(xop, true);
Teuchos::RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xop =
Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::toXpetra(op);
Teuchos::RCP<Xpetra::CrsMatrixWrap<Scalar, LocalOrdinal, GlobalOrdinal, Node>> xwrap =
Teuchos::rcp_dynamic_cast<Xpetra::CrsMatrixWrap<Scalar, LocalOrdinal, GlobalOrdinal, Node>>(xop, true);
blocks_.push_back(xwrap);
} else {
// add empty block
Expand Down Expand Up @@ -208,10 +209,10 @@ Teuchos::RCP<const Xpetra::Map<LocalOrdinal, GlobalOrdinal, Node>> BlockedCrsMat
// since we use this to detect Thyra-style numbering or Xpetra-style
// numbering. In Thyra-style numbering mode, the Xpetra::MapExtractor builds
// the correct row maps.
const GO INVALID = Teuchos::OrdinalTraits<Xpetra::global_size_t>::invalid();
const GlobalOrdinal INVALID = Teuchos::OrdinalTraits<Xpetra::global_size_t>::invalid();
std::sort(gids.begin(), gids.end());
gids.erase(std::unique(gids.begin(), gids.end()), gids.end());
Teuchos::ArrayView<GO> gidsView(&gids[0], gids.size());
Teuchos::ArrayView<GlobalOrdinal> gidsView(&gids[0], gids.size());
Teuchos::RCP<Xpetra::Map<LocalOrdinal, GlobalOrdinal, Node>> fullMap = Xpetra::MapFactory<LocalOrdinal, GlobalOrdinal, Node>::Build(subMaps[0]->lib(), INVALID, gidsView, subMaps[0]->getIndexBase(), subMaps[0]->getComm());
return fullMap;
}
Expand Down Expand Up @@ -346,15 +347,15 @@ void BlockedCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::fillComplete(c
// build full col map
fullcolmap_ = Teuchos::null; // delete old full column map

std::vector<GO> colmapentries;
std::vector<GlobalOrdinal> colmapentries;
for (size_t c = 0; c < Cols(); ++c) {
// copy all local column lids of all block rows to colset
std::set<GO> colset;
std::set<GlobalOrdinal> colset;
for (size_t r = 0; r < Rows(); ++r) {
Teuchos::RCP<CrsMatrix> Ablock = getMatrix(r,c);

if (Ablock != Teuchos::null) {
Teuchos::ArrayView<const GO> colElements = Ablock->getColMap()->getLocalElementList();
Teuchos::ArrayView<const GlobalOrdinal> colElements = Ablock->getColMap()->getLocalElementList();
Teuchos::RCP<const Map> colmap = Ablock->getColMap();
copy(colElements.getRawPtr(), colElements.getRawPtr() + colElements.size(), inserter(colset, colset.begin()));
}
Expand All @@ -364,7 +365,7 @@ void BlockedCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::fillComplete(c
colmapentries.reserve(colmapentries.size() + colset.size());
copy(colset.begin(), colset.end(), back_inserter(colmapentries));
sort(colmapentries.begin(), colmapentries.end());
typename std::vector<GO>::iterator gendLocation;
typename std::vector<GlobalOrdinal>::iterator gendLocation;
gendLocation = std::unique(colmapentries.begin(), colmapentries.end());
colmapentries.erase(gendLocation,colmapentries.end());
}
Expand All @@ -374,7 +375,7 @@ void BlockedCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::fillComplete(c
Teuchos::reduceAll(*(rangeMap->getComm()), Teuchos::REDUCE_SUM, colmapentries.size(), Teuchos::outArg(numGlobalElements));

// store global full column map
const Teuchos::ArrayView<const GO> aView = Teuchos::ArrayView<const GO>(colmapentries);
const Teuchos::ArrayView<const GlobalOrdinal> aView = Teuchos::ArrayView<const GlobalOrdinal>(colmapentries);
fullcolmap_ = MapFactory::Build(rangeMap->lib(), numGlobalElements, aView, 0, rangeMap->getComm());
#endif
}
Expand Down Expand Up @@ -1207,8 +1208,8 @@ Teuchos::RCP<Xpetra::Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>> BlockedC
size_t maxNumEntries = mat->getLocalMaxNumRowEntries();

size_t numEntries;
Array<GO> inds(maxNumEntries);
Array<GO> inds2(maxNumEntries);
Array<GlobalOrdinal> inds(maxNumEntries);
Array<GlobalOrdinal> inds2(maxNumEntries);
Array<SC> vals(maxNumEntries);

// loop over all rows and add entries
Expand Down Expand Up @@ -1263,7 +1264,7 @@ typename Xpetra::CrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::local_mat
template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
Teuchos::RCP<Thyra::BlockedLinearOpBase<Scalar>> BlockedCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::getThyraOperator() {
Teuchos::RCP<Thyra::LinearOpBase<Scalar>> thOp =
Xpetra::ThyraUtils<Scalar, LO, GO, Node>::toThyra(Teuchos::rcpFromRef(*this));
Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::toThyra(Teuchos::rcpFromRef(*this));
TEUCHOS_TEST_FOR_EXCEPT(Teuchos::is_null(thOp));

Teuchos::RCP<Thyra::BlockedLinearOpBase<Scalar>> thbOp =
Expand Down Expand Up @@ -1310,15 +1311,15 @@ void BlockedCrsMatrix<Scalar, LocalOrdinal, GlobalOrdinal, Node>::Add(const Matr
size_t maxNumEntries = crsA->getLocalMaxNumRowEntries();

size_t numEntries;
Array<GO> inds(maxNumEntries);
Array<GlobalOrdinal> inds(maxNumEntries);
Array<SC> vals(maxNumEntries);

RCP<const Map> rowMap = crsA->getRowMap();
RCP<const Map> colMap = crsA->getColMap();

ArrayView<const GO> rowGIDs = crsA->getRowMap()->getLocalElementList();
ArrayView<const GlobalOrdinal> rowGIDs = crsA->getRowMap()->getLocalElementList();
for (size_t i = 0; i < crsA->getLocalNumRows(); i++) {
GO row = rowGIDs[i];
GlobalOrdinal row = rowGIDs[i];
crsA->getGlobalRowCopy(row, inds(), vals(), numEntries);

if (scalarA != one)
Expand Down
4 changes: 2 additions & 2 deletions packages/xpetra/src/Utils/Xpetra_ThyraUtils_decl.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,13 +27,13 @@
#include "Xpetra_Map.hpp"
#include "Xpetra_BlockedMap.hpp"
#include "Xpetra_BlockedMultiVector.hpp"
#include "Xpetra_BlockedCrsMatrix.hpp"
#include "Xpetra_BlockedCrsMatrix_decl.hpp"
#include "Xpetra_MapUtils.hpp"
#include "Xpetra_StridedMap.hpp"
#include "Xpetra_StridedMapFactory.hpp"
#include "Xpetra_MapExtractor.hpp"
#include "Xpetra_Matrix.hpp"
#include "Xpetra_MatrixFactory.hpp"
#include "Xpetra_MatrixFactory_decl.hpp"
#include "Xpetra_CrsMatrixWrap.hpp"
#include "Xpetra_MultiVectorFactory.hpp"

Expand Down
4 changes: 0 additions & 4 deletions packages/xpetra/src/Utils/Xpetra_ThyraUtils_def.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,6 @@

#include "Xpetra_ThyraUtils_decl.hpp"

namespace Xpetra {

template <class Scalar, class LocalOrdinal, class GlobalOrdinal, class Node>
Teuchos::RCP<Xpetra::StridedMap<LocalOrdinal, GlobalOrdinal, Node>>
Xpetra::ThyraUtils<Scalar, LocalOrdinal, GlobalOrdinal, Node>::
Expand Down Expand Up @@ -880,8 +878,6 @@ ThyraUtils<double, int, long long, EpetraNode>::toThyra(const Teuchos::RCP<Xpetr

#endif

} // namespace Xpetra

#endif

#endif

0 comments on commit f322661

Please sign in to comment.