49 #ifndef XPETRA_MATRIXFACTORY_HPP 50 #define XPETRA_MATRIXFACTORY_HPP 69 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
70 class MatrixFactory2 {
71 #undef XPETRA_MATRIXFACTORY2_SHORT 76 RCP<const CrsMatrixWrap> oldOp = Teuchos::rcp_dynamic_cast<
const CrsMatrixWrap>(A);
77 if (oldOp == Teuchos::null)
80 RCP<const CrsMatrix> oldCrsOp = oldOp->getCrsMatrix();
85 "Not Epetra or Tpetra matrix");
87 #ifdef HAVE_XPETRA_EPETRA 94 #ifdef HAVE_XPETRA_TPETRA 97 RCP<const TpetraCrsMatrix> oldTCrsOp = Teuchos::rcp_dynamic_cast<
const TpetraCrsMatrix>(oldCrsOp);
99 if (oldTCrsOp != Teuchos::null) {
101 RCP<CrsMatrixWrap> newOp (
new CrsMatrixWrap(Teuchos::as<RCP<CrsMatrix> >(newTCrsOp)));
110 return Teuchos::null;
113 #define XPETRA_MATRIXFACTORY2_SHORT 123 #undef XPETRA_MATRIXFACTORY2_SHORT 127 RCP<const CrsMatrixWrap> oldOp = Teuchos::rcp_dynamic_cast<
const CrsMatrixWrap>(A);
128 if (oldOp == Teuchos::null)
131 RCP<const CrsMatrix> oldCrsOp = oldOp->getCrsMatrix();
133 #ifdef HAVE_XPETRA_EPETRA 134 #ifndef XPETRA_EPETRA_NO_32BIT_GLOBAL_INDICES 136 if (oldECrsOp != Teuchos::null) {
146 #ifdef HAVE_XPETRA_TPETRA 148 RCP<const TpetraCrsMatrix> oldTCrsOp = Teuchos::rcp_dynamic_cast<
const TpetraCrsMatrix>(oldCrsOp);
149 if (oldTCrsOp != Teuchos::null) {
156 throw Exceptions::BadCast(
"Cast from Xpetra::Matrix to Xpetra::EpetraCrsMatrix or Xpetra::TpetraCrsMatrix failed");
159 TEUCHOS_UNREACHABLE_RETURN(Teuchos::null);
163 #define XPETRA_MATRIXFACTORY2_SHORT 165 #ifdef HAVE_XPETRA_INT_LONG_LONG 169 class MatrixFactory2<double, int, long long, Node> {
170 typedef double Scalar;
171 typedef int LocalOrdinal;
172 typedef long long GlobalOrdinal;
174 #undef XPETRA_MATRIXFACTORY2_SHORT 178 RCP<const CrsMatrixWrap> oldOp = Teuchos::rcp_dynamic_cast<
const CrsMatrixWrap>(A);
179 if (oldOp == Teuchos::null)
180 throw Exceptions::BadCast(
"Cast from Xpetra::Matrix to Xpetra::CrsMatrixWrap failed");
182 RCP<const CrsMatrix> oldCrsOp = oldOp->getCrsMatrix();
184 #ifdef HAVE_XPETRA_EPETRA 185 #ifndef XPETRA_EPETRA_NO_64BIT_GLOBAL_INDICES 186 RCP<const EpetraCrsMatrixT<GlobalOrdinal,Node> > oldECrsOp = Teuchos::rcp_dynamic_cast<
const EpetraCrsMatrixT<GlobalOrdinal,Node> >(oldCrsOp);
187 if (oldECrsOp != Teuchos::null) {
189 RCP<CrsMatrix> newECrsOp(
new EpetraCrsMatrixT<GlobalOrdinal,Node>(*oldECrsOp));
190 RCP<CrsMatrixWrap> newOp (
new CrsMatrixWrap (newECrsOp));
197 #ifdef HAVE_XPETRA_TPETRA 199 RCP<const TpetraCrsMatrix> oldTCrsOp = Teuchos::rcp_dynamic_cast<
const TpetraCrsMatrix>(oldCrsOp);
200 if (oldTCrsOp != Teuchos::null) {
201 RCP<CrsMatrix> newTCrsOp(
new TpetraCrsMatrix(*oldTCrsOp));
202 RCP<CrsMatrixWrap> newOp (
new CrsMatrixWrap(newTCrsOp));
207 throw Exceptions::BadCast(
"Cast from Xpetra::Matrix to Xpetra::EpetraCrsMatrix or Xpetra::TpetraCrsMatrix failed");
210 return Teuchos::null;
213 #endif // HAVE_XPETRA_INT_LONG_LONG 215 #define XPETRA_MATRIXFACTORY2_SHORT 218 template <class Scalar = Matrix<>::scalar_type,
220 class GlobalOrdinal =
224 class MatrixFactory {
225 #undef XPETRA_MATRIXFACTORY_SHORT 236 return rcp(
new CrsMatrixWrap(rowMap, maxNumEntriesPerRow, pftype));
241 return rcp(
new CrsMatrixWrap(rowMap, colMap, maxNumEntriesPerRow, pftype));
246 return rcp(
new CrsMatrixWrap(rowMap, colMap, NumEntriesPerRowToAlloc, pftype));
249 #ifdef HAVE_XPETRA_KOKKOS_REFACTOR 250 static RCP<Matrix>
Build (
252 const Teuchos::RCP<const Map>& rowMap,
253 const Teuchos::RCP<const Map>& colMap,
255 const Teuchos::RCP<Teuchos::ParameterList>& params = null) {
257 return rcp(
new CrsMatrixWrap(rowMap, colMap, lclMatrix, params));
260 static RCP<Matrix>
Build (
262 const Teuchos::RCP<const Map>& rowMap,
263 const Teuchos::RCP<const Map>& colMap,
264 const Teuchos::RCP<const Map>& domainMap = Teuchos::null,
265 const Teuchos::RCP<const Map>& rangeMap = Teuchos::null,
266 const Teuchos::RCP<Teuchos::ParameterList>& params = null) {
268 return rcp(
new CrsMatrixWrap(lclMatrix, rowMap, colMap, domainMap, rangeMap, params));
274 return rcp(
new CrsMatrixWrap(rowMap, NumEntriesPerRowToAlloc, pftype) );
278 static RCP<Matrix>
Build(
const RCP<const CrsGraph>& graph,
const RCP<ParameterList>& paramList = Teuchos::null) {
283 static RCP<Matrix>
Build(
const RCP<const Vector>& diagonal) {
284 Teuchos::ArrayRCP<const Scalar> vals = diagonal->getData(0);
285 LocalOrdinal NumMyElements = diagonal->getMap()->getNodeNumElements();
286 Teuchos::ArrayView<const GlobalOrdinal> MyGlobalElements = diagonal->getMap()->getNodeElementList();
290 for (LocalOrdinal i = 0; i < NumMyElements; ++i) {
291 mtx->insertGlobalValues(MyGlobalElements[i],
292 Teuchos::tuple<GlobalOrdinal>(MyGlobalElements[i]),
293 Teuchos::tuple<Scalar>(vals[i]) );
300 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) {
301 RCP<const CrsMatrixWrap> crsOp = Teuchos::rcp_dynamic_cast<
const CrsMatrixWrap>(sourceMatrix);
302 if (crsOp == Teuchos::null)
305 RCP<CrsMatrix> originalCrs = crsOp->getCrsMatrix();
307 if (newCrs->hasMatrix())
310 return Teuchos::null;
314 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) {
315 RCP<const CrsMatrixWrap> crsOp = Teuchos::rcp_dynamic_cast<
const CrsMatrixWrap>(sourceMatrix);
316 if (crsOp == Teuchos::null)
319 RCP<CrsMatrix> originalCrs = crsOp->getCrsMatrix();
324 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) {
325 RCP<const CrsMatrixWrap> crsOp = Teuchos::rcp_dynamic_cast<
const CrsMatrixWrap>(sourceMatrix);
326 if (crsOp == Teuchos::null)
329 RCP<CrsMatrix> originalCrs = crsOp->getCrsMatrix();
330 RCP<CrsMatrix> newCrs =
CrsMatrixFactory::Build(originalCrs, RowImporter, Teuchos::rcpFromRef(DomainImporter), domainMap, rangeMap, params);
331 if (newCrs->hasMatrix())
334 return Teuchos::null;
338 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) {
339 RCP<const CrsMatrixWrap> crsOp = Teuchos::rcp_dynamic_cast<
const CrsMatrixWrap>(sourceMatrix);
340 if (crsOp == Teuchos::null)
343 RCP<CrsMatrix> originalCrs = crsOp->getCrsMatrix();
344 RCP<CrsMatrix> newCrs =
CrsMatrixFactory::Build(originalCrs, RowExporter, Teuchos::rcpFromRef(DomainExporter), domainMap, rangeMap, params);
345 if (newCrs->hasMatrix())
348 return Teuchos::null;
355 RCP<const BlockedCrsMatrix> input = Teuchos::rcp_dynamic_cast<
const BlockedCrsMatrix>(A);
356 if(input == Teuchos::null)
360 RCP<const MapExtractor> rgMapExt = Teuchos::rcp(
new MapExtractor(*(input->getRangeMapExtractor())));
361 RCP<const MapExtractor> doMapExt = Teuchos::rcp(
new MapExtractor(*(input->getDomainMapExtractor())));
364 RCP<BlockedCrsMatrix> bop = Teuchos::rcp(
new BlockedCrsMatrix(rgMapExt, doMapExt, input->getNodeMaxNumRowEntries()));
366 for (
size_t r = 0; r < input->Rows(); ++r) {
367 for (
size_t c = 0; c < input->Cols(); ++c)
368 if(input->getMatrix(r,c) != Teuchos::null) {
373 bop->setMatrix(r,c,mat);
377 if(input->isFillComplete())
382 #define XPETRA_MATRIXFACTORY_SHORT 386 #define XPETRA_MATRIXFACTORY_SHORT 387 #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< 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< CrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > Build(const RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &rowMap, size_t maxNumEntriesPerRow, Xpetra::ProfileType pftype=Xpetra::DynamicProfile, const Teuchos::RCP< Teuchos::ParameterList > &plist=Teuchos::null)
Constructor specifying fixed number of entries for each row.
LocalOrdinal local_ordinal_type
Exception throws to report errors in the internal logical of the program.
static RCP< Matrix > Build(const RCP< const Map > &rowMap, const RCP< const Map > &colMap, const ArrayRCP< const size_t > &NumEntriesPerRowToAlloc, Xpetra::ProfileType pftype=Xpetra::DynamicProfile)
Constructor specifying the (possibly different) number of entries per row and providing column map...
static RCP< Matrix > Build(const RCP< const Map > &rowMap, const ArrayRCP< const size_t > &NumEntriesPerRowToAlloc, ProfileType pftype=Xpetra::DynamicProfile)
Constructor specifying (possibly different) number of entries in each row.
Exception indicating invalid cast attempted.
static RCP< Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > BuildCopy(const RCP< const Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > A)
static RCP< Matrix > Build(const RCP< const Map > &rowMap, const RCP< const Map > &colMap, size_t maxNumEntriesPerRow, Xpetra::ProfileType pftype=Xpetra::DynamicProfile)
Constructor specifying the max number of non-zeros 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)
static RCP< Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > BuildCopy(const RCP< const Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > A)
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...
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...
static RCP< Matrix > Build(const RCP< const Map > &rowMap, size_t maxNumEntriesPerRow, Xpetra::ProfileType pftype=Xpetra::DynamicProfile)
Constructor specifying the number of non-zeros for all rows.
Xpetra-specific matrix class.
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...
GlobalOrdinal global_ordinal_type