49 #ifndef XPETRA_MATRIXFACTORY_HPP
50 #define XPETRA_MATRIXFACTORY_HPP
55 #include "Xpetra_CrsMatrixWrap.hpp"
57 #include "Xpetra_Map.hpp"
58 #include "Xpetra_BlockedMap.hpp"
60 #include "Xpetra_BlockedVector.hpp"
65 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node = Tpetra::KokkosClassic::DefaultNode::DefaultNodeType>
66 class MatrixFactory2 {
67 #undef XPETRA_MATRIXFACTORY2_SHORT
72 RCP<const CrsMatrixWrap> oldOp = Teuchos::rcp_dynamic_cast<
const CrsMatrixWrap>(A);
73 if (oldOp == Teuchos::null)
76 RCP<const CrsMatrix> oldCrsOp = oldOp->getCrsMatrix();
81 "Not Epetra or Tpetra matrix");
83 #ifdef HAVE_XPETRA_EPETRA
90 #ifdef HAVE_XPETRA_TPETRA
93 RCP<const TpetraCrsMatrix> oldTCrsOp = Teuchos::rcp_dynamic_cast<
const TpetraCrsMatrix>(oldCrsOp);
95 if (oldTCrsOp != Teuchos::null) {
97 RCP<CrsMatrixWrap> newOp(
new CrsMatrixWrap(Teuchos::as<RCP<CrsMatrix> >(newTCrsOp)));
98 if (setFixedBlockSize)
99 newOp->SetFixedBlockSize(A->GetFixedBlockSize());
108 return Teuchos::null;
111 #define XPETRA_MATRIXFACTORY2_SHORT
115 template <
class Node>
121 #undef XPETRA_MATRIXFACTORY2_SHORT
125 RCP<const CrsMatrixWrap> oldOp = Teuchos::rcp_dynamic_cast<
const CrsMatrixWrap>(A);
126 if (oldOp == Teuchos::null)
129 RCP<const CrsMatrix> oldCrsOp = oldOp->getCrsMatrix();
131 #ifdef HAVE_XPETRA_EPETRA
132 #ifndef XPETRA_EPETRA_NO_32BIT_GLOBAL_INDICES
134 if (oldECrsOp != Teuchos::null) {
138 if (setFixedBlockSize)
139 newOp->SetFixedBlockSize(A->GetFixedBlockSize());
145 #ifdef HAVE_XPETRA_TPETRA
147 RCP<const TpetraCrsMatrix> oldTCrsOp = Teuchos::rcp_dynamic_cast<
const TpetraCrsMatrix>(oldCrsOp);
148 if (oldTCrsOp != Teuchos::null) {
151 if (setFixedBlockSize)
152 newOp->SetFixedBlockSize(A->GetFixedBlockSize());
155 return Teuchos::null;
157 throw Exceptions::BadCast(
"Cast from Xpetra::Matrix to Xpetra::EpetraCrsMatrix or Xpetra::TpetraCrsMatrix failed");
158 TEUCHOS_UNREACHABLE_RETURN(Teuchos::null);
164 #define XPETRA_MATRIXFACTORY2_SHORT
166 #ifdef HAVE_XPETRA_INT_LONG_LONG
169 template <
class Node>
170 class MatrixFactory2<double, int, long long, Node> {
171 typedef double Scalar;
172 typedef int LocalOrdinal;
173 typedef long long GlobalOrdinal;
175 #undef XPETRA_MATRIXFACTORY2_SHORT
179 RCP<const CrsMatrixWrap> oldOp = Teuchos::rcp_dynamic_cast<
const CrsMatrixWrap>(A);
180 if (oldOp == Teuchos::null)
181 throw Exceptions::BadCast(
"Cast from Xpetra::Matrix to Xpetra::CrsMatrixWrap failed");
183 RCP<const CrsMatrix> oldCrsOp = oldOp->getCrsMatrix();
185 #ifdef HAVE_XPETRA_EPETRA
186 #ifndef XPETRA_EPETRA_NO_64BIT_GLOBAL_INDICES
187 RCP<const EpetraCrsMatrixT<GlobalOrdinal, Node> > oldECrsOp = Teuchos::rcp_dynamic_cast<
const EpetraCrsMatrixT<GlobalOrdinal, Node> >(oldCrsOp);
188 if (oldECrsOp != Teuchos::null) {
190 RCP<CrsMatrix> newECrsOp(
new EpetraCrsMatrixT<GlobalOrdinal, Node>(*oldECrsOp));
191 RCP<CrsMatrixWrap> newOp(
new CrsMatrixWrap(newECrsOp));
192 if (setFixedBlockSize)
193 newOp->SetFixedBlockSize(A->GetFixedBlockSize());
199 #ifdef HAVE_XPETRA_TPETRA
201 RCP<const TpetraCrsMatrix> oldTCrsOp = Teuchos::rcp_dynamic_cast<
const TpetraCrsMatrix>(oldCrsOp);
202 if (oldTCrsOp != Teuchos::null) {
203 RCP<CrsMatrix> newTCrsOp(
new TpetraCrsMatrix(*oldTCrsOp));
204 RCP<CrsMatrixWrap> newOp(
new CrsMatrixWrap(newTCrsOp));
205 if (setFixedBlockSize)
206 newOp->SetFixedBlockSize(A->GetFixedBlockSize());
210 throw Exceptions::BadCast(
"Cast from Xpetra::Matrix to Xpetra::EpetraCrsMatrix or Xpetra::TpetraCrsMatrix failed");
213 return Teuchos::null;
216 #endif // HAVE_XPETRA_INT_LONG_LONG
218 #define XPETRA_MATRIXFACTORY2_SHORT
220 template <
class Scalar,
224 class MatrixFactory {
225 #undef XPETRA_MATRIXFACTORY_SHORT
235 static RCP<Matrix>
Build(
const RCP<const Map>& rowMap) {
240 static RCP<Matrix>
Build(
const RCP<const Map>& rowMap,
size_t maxNumEntriesPerRow) {
245 static RCP<Matrix>
Build(
const RCP<const Map>& rowMap,
const RCP<const Map>& colMap,
size_t maxNumEntriesPerRow) {
246 return rcp(
new CrsMatrixWrap(rowMap, colMap, maxNumEntriesPerRow));
250 static RCP<Matrix>
Build(
const RCP<const Map>& rowMap,
const RCP<const Map>& colMap,
const ArrayRCP<const size_t>& NumEntriesPerRowToAlloc) {
251 return rcp(
new CrsMatrixWrap(rowMap, colMap, NumEntriesPerRowToAlloc));
256 const Teuchos::RCP<const Map>& rowMap,
257 const Teuchos::RCP<const Map>& colMap,
259 const Teuchos::RCP<Teuchos::ParameterList>& params = null) {
261 return rcp(
new CrsMatrixWrap(rowMap, colMap, lclMatrix, params));
266 const Teuchos::RCP<const Map>& rowMap,
267 const Teuchos::RCP<const Map>& colMap,
268 const Teuchos::RCP<const Map>& domainMap = Teuchos::null,
269 const Teuchos::RCP<const Map>& rangeMap = Teuchos::null,
270 const Teuchos::RCP<Teuchos::ParameterList>& params = null) {
272 return rcp(
new CrsMatrixWrap(lclMatrix, rowMap, colMap, domainMap, rangeMap, params));
276 static RCP<Matrix>
Build(
const RCP<const Map>& rowMap,
const ArrayRCP<const size_t>& NumEntriesPerRowToAlloc) {
277 return rcp(
new CrsMatrixWrap(rowMap, NumEntriesPerRowToAlloc));
281 static RCP<Matrix>
Build(
const RCP<const CrsGraph>& graph,
const RCP<ParameterList>& paramList = Teuchos::null) {
286 static RCP<Matrix>
Build(
const RCP<const CrsGraph>& graph,
288 const RCP<ParameterList>& paramList = Teuchos::null) {
293 static RCP<Matrix>
Build(
const RCP<const Vector>& diagonal) {
294 RCP<const BlockedVector> bdiagonal = Teuchos::rcp_dynamic_cast<
const BlockedVector>(diagonal);
295 Teuchos::RCP<Matrix> mtx = Teuchos::null;
297 if (bdiagonal == Teuchos::null) {
298 Teuchos::ArrayRCP<const Scalar> vals = diagonal->
getData(0);
299 LocalOrdinal numMyElements = diagonal->getMap()->getLocalNumElements();
300 Teuchos::ArrayView<const GlobalOrdinal> myGlobalElements = diagonal->getMap()->getLocalElementList();
302 mtx = Teuchos::rcp(
new CrsMatrixWrap(diagonal->getMap(), 1));
304 for (LocalOrdinal i = 0; i < numMyElements; ++i) {
305 mtx->insertGlobalValues(myGlobalElements[i],
306 Teuchos::tuple<GlobalOrdinal>(myGlobalElements[i]),
307 Teuchos::tuple<Scalar>(vals[i]));
311 RCP<BlockedCrsMatrix> bop = Teuchos::rcp(
new BlockedCrsMatrix(bdiagonal->getBlockedMap(), bdiagonal->getBlockedMap(), 1));
313 for (
size_t r = 0; r < bdiagonal->getBlockedMap()->getNumMaps(); ++r) {
314 if (!bdiagonal->getMultiVector(r).is_null()) {
315 const RCP<MultiVector> subvec = bdiagonal->getMultiVector(r);
316 bop->setMatrix(r, r,
Build(subvec->getVector(0)));
327 static RCP<Matrix>
Build(
const RCP<const Matrix>& sourceMatrix,
const Import& importer,
const RCP<const Map>& domainMap = Teuchos::null,
const RCP<const Map>& rangeMap = Teuchos::null,
const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null) {
328 RCP<const CrsMatrixWrap> crsOp = Teuchos::rcp_dynamic_cast<
const CrsMatrixWrap>(sourceMatrix);
329 if (crsOp == Teuchos::null)
332 RCP<CrsMatrix> originalCrs = crsOp->getCrsMatrix();
334 if (newCrs->hasMatrix())
337 return Teuchos::null;
341 static RCP<Matrix>
Build(
const RCP<const Matrix>& sourceMatrix,
const Export& exporter,
const RCP<const Map>& domainMap,
const RCP<const Map>& rangeMap,
const Teuchos::RCP<Teuchos::ParameterList>& params) {
342 RCP<const CrsMatrixWrap> crsOp = Teuchos::rcp_dynamic_cast<
const CrsMatrixWrap>(sourceMatrix);
343 if (crsOp == Teuchos::null)
346 RCP<CrsMatrix> originalCrs = crsOp->getCrsMatrix();
351 static RCP<Matrix>
Build(
const RCP<const Matrix>& sourceMatrix,
const Import& RowImporter,
const Import& DomainImporter,
const RCP<const Map>& domainMap,
const RCP<const Map>& rangeMap,
const Teuchos::RCP<Teuchos::ParameterList>& params) {
352 RCP<const CrsMatrixWrap> crsOp = Teuchos::rcp_dynamic_cast<
const CrsMatrixWrap>(sourceMatrix);
353 if (crsOp == Teuchos::null)
356 RCP<CrsMatrix> originalCrs = crsOp->getCrsMatrix();
357 RCP<CrsMatrix> newCrs =
CrsMatrixFactory::Build(originalCrs, RowImporter, Teuchos::rcpFromRef(DomainImporter), domainMap, rangeMap, params);
358 if (newCrs->hasMatrix())
361 return Teuchos::null;
365 static RCP<Matrix>
Build(
const RCP<const Matrix>& sourceMatrix,
const Export& RowExporter,
const Export& DomainExporter,
const RCP<const Map>& domainMap = Teuchos::null,
const RCP<const Map>& rangeMap = Teuchos::null,
const Teuchos::RCP<Teuchos::ParameterList>& params = Teuchos::null) {
366 RCP<const CrsMatrixWrap> crsOp = Teuchos::rcp_dynamic_cast<
const CrsMatrixWrap>(sourceMatrix);
367 if (crsOp == Teuchos::null)
370 RCP<CrsMatrix> originalCrs = crsOp->getCrsMatrix();
371 RCP<CrsMatrix> newCrs =
CrsMatrixFactory::Build(originalCrs, RowExporter, Teuchos::rcpFromRef(DomainExporter), domainMap, rangeMap, params);
372 if (newCrs->hasMatrix())
375 return Teuchos::null;
381 RCP<const BlockedCrsMatrix> input = Teuchos::rcp_dynamic_cast<
const BlockedCrsMatrix>(A);
382 if (input == Teuchos::null)
386 RCP<const MapExtractor> rgMapExt = Teuchos::rcp(
new MapExtractor(*(input->getRangeMapExtractor())));
387 RCP<const MapExtractor> doMapExt = Teuchos::rcp(
new MapExtractor(*(input->getDomainMapExtractor())));
390 RCP<BlockedCrsMatrix> bop = Teuchos::rcp(
new BlockedCrsMatrix(rgMapExt, doMapExt, input->getLocalMaxNumRowEntries()));
392 for (
size_t r = 0; r < input->Rows(); ++r) {
393 for (
size_t c = 0; c < input->Cols(); ++c)
394 if (input->getMatrix(r, c) != Teuchos::null) {
399 bop->setMatrix(r, c, mat);
403 if (input->isFillComplete())
408 #define XPETRA_MATRIXFACTORY_SHORT
412 #define XPETRA_MATRIXFACTORY_SHORT
413 #define XPETRA_MATRIXFACTORY2_SHORT
static RCP< Matrix > Build(const RCP< const Vector > &diagonal)
Constructor for creating a diagonal Xpetra::Matrix using the entries of a given vector for the diagon...
static RCP< Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > BuildCopy(const RCP< const Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > A, bool setFixedBlockSize=true)
static RCP< Matrix > Build(const RCP< const CrsGraph > &graph, typename Xpetra::CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node >::local_matrix_type::values_type &values, const RCP< ParameterList > ¶mList=Teuchos::null)
Constructor specifying graph and values array.
static RCP< Matrix > Build(const RCP< const Matrix > &sourceMatrix, const Import &importer, const RCP< const Map > &domainMap=Teuchos::null, const RCP< const Map > &rangeMap=Teuchos::null, const Teuchos::RCP< Teuchos::ParameterList > ¶ms=Teuchos::null)
Constructor to create a Matrix using a fusedImport-style construction. The originalMatrix must be a X...
static RCP< Matrix > Build(const RCP< const CrsGraph > &graph, const RCP< ParameterList > ¶mList=Teuchos::null)
Constructor specifying graph.
static RCP< Matrix > Build(const RCP< const Map > &rowMap, const RCP< const Map > &colMap, size_t maxNumEntriesPerRow)
Constructor specifying the max number of non-zeros per row and providing column map.
static RCP< CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > Build(const RCP< const Map< LocalOrdinal, GlobalOrdinal, Node >> &rowMap)
Constructor for empty matrix (intended use is an import/export target - can't insert entries directly...
static RCP< Matrix > Build(const RCP< const Map > &rowMap, size_t maxNumEntriesPerRow)
Constructor specifying the number of non-zeros for all rows.
static RCP< Matrix > Build(const RCP< const Map > &rowMap)
Exception throws to report errors in the internal logical of the program.
Exception indicating invalid cast attempted.
static RCP< Matrix > Build(const RCP< const Map > &rowMap, const ArrayRCP< const size_t > &NumEntriesPerRowToAlloc)
Constructor specifying (possibly different) number of entries in each row.
static RCP< Matrix > Build(const RCP< const Map > &rowMap, const RCP< const Map > &colMap, const ArrayRCP< const size_t > &NumEntriesPerRowToAlloc)
Constructor specifying the (possibly different) number of entries per row and providing column map...
static RCP< Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > BuildCopy(const RCP< const Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > A, bool setFixedBlockSize=true)
static RCP< Matrix > Build(const typename Xpetra::CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node >::local_matrix_type &lclMatrix, const Teuchos::RCP< const Map > &rowMap, const Teuchos::RCP< const Map > &colMap, const Teuchos::RCP< const Map > &domainMap=Teuchos::null, const Teuchos::RCP< const Map > &rangeMap=Teuchos::null, const Teuchos::RCP< Teuchos::ParameterList > ¶ms=null)
Constructor providing a local Kokkos::CrsMatrix together with all maps.
static RCP< Matrix > Build(const RCP< const Matrix > &sourceMatrix, const Export &exporter, const RCP< const Map > &domainMap, const RCP< const Map > &rangeMap, const Teuchos::RCP< Teuchos::ParameterList > ¶ms)
Constructor to create a Matrix using a fusedExport-style construction. The originalMatrix must be a X...
virtual Teuchos::ArrayRCP< const Scalar > getData(size_t j) const
Const view of the local values in a particular vector of this vector.
Concrete implementation of Xpetra::Matrix.
#define XPETRA_MONITOR(funcName)
static RCP< Matrix > Build(const RCP< const Matrix > &sourceMatrix, const Export &RowExporter, const Export &DomainExporter, const RCP< const Map > &domainMap=Teuchos::null, const RCP< const Map > &rangeMap=Teuchos::null, const Teuchos::RCP< Teuchos::ParameterList > ¶ms=Teuchos::null)
Constructor to create a Matrix using a fusedExport-style construction. The originalMatrix must be a X...
KokkosSparse::CrsMatrix< impl_scalar_type, LocalOrdinal, execution_space, void, typename local_graph_type::size_type > local_matrix_type
The specialization of Kokkos::CrsMatrix that represents the part of the sparse matrix on each MPI pro...
static RCP< Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > BuildCopy(const RCP< const Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > A, bool setFixedBlockSize=true)
Xpetra-specific matrix class.
static RCP< Matrix > Build(const Teuchos::RCP< const Map > &rowMap, const Teuchos::RCP< const Map > &colMap, const typename Xpetra::CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node >::local_matrix_type &lclMatrix, const Teuchos::RCP< Teuchos::ParameterList > ¶ms=null)
Constructor providing a local Kokkos::CrsMatrix together with a row and column map.
MatrixFactory()
Private constructor. This is a static class.
static RCP< Matrix > Build(const RCP< const Matrix > &sourceMatrix, const Import &RowImporter, const Import &DomainImporter, const RCP< const Map > &domainMap, const RCP< const Map > &rangeMap, const Teuchos::RCP< Teuchos::ParameterList > ¶ms)
Constructor to create a Matrix using a fusedImport-style construction. The originalMatrix must be a X...