43 #ifndef __Panzer_BlockedTpetraLinearObjFactory_hpp__ 44 #define __Panzer_BlockedTpetraLinearObjFactory_hpp__ 49 #include "Tpetra_Map.hpp" 50 #include "Tpetra_CrsGraph.hpp" 51 #include "Tpetra_Import.hpp" 52 #include "Tpetra_Export.hpp" 54 #include "PanzerDiscFE_config.hpp" 64 #include "Panzer_GatherOrientation.hpp" 71 #include "Thyra_BlockedLinearOpBase.hpp" 72 #include "Thyra_ProductVectorBase.hpp" 74 #include "Teuchos_RCP.hpp" 75 #include "Teuchos_DefaultMpiComm.hpp" 76 #include "Teuchos_OpaqueWrapper.hpp" 80 template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT=panzer::TpetraNodeType>
85 typedef Tpetra::Vector<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT>
VectorType;
86 typedef Tpetra::CrsMatrix<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT>
CrsMatrixType;
87 typedef Tpetra::Operator<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT>
OperatorType;
88 typedef Tpetra::CrsGraph<LocalOrdinalT,GlobalOrdinalT,NodeT>
CrsGraphType;
89 typedef Tpetra::Map<LocalOrdinalT,GlobalOrdinalT,NodeT>
MapType;
90 typedef Tpetra::Import<LocalOrdinalT,GlobalOrdinalT,NodeT>
ImportType;
91 typedef Tpetra::Export<LocalOrdinalT,GlobalOrdinalT,NodeT>
ExportType;
93 typedef Thyra::TpetraVector<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT>
ThyraVector;
94 typedef Thyra::TpetraLinearOp<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT>
ThyraLinearOp;
98 const Teuchos::RCP<const BlockedDOFManager> & gidProvider);
105 const std::vector<Teuchos::RCP<const panzer::GlobalIndexer>> & gidProviders);
112 { TEUCHOS_ASSERT(
false); }
115 { TEUCHOS_ASSERT(
false); }
141 bool zeroVectorRows=
false,
bool adjustX =
false)
const;
164 template <
typename EvalT>
169 template <
typename EvalT>
174 template <
typename EvalT>
179 template <
typename EvalT>
184 template <
typename EvalT>
189 template <
typename EvalT>
235 Teuchos::RCP<const Thyra::VectorSpaceBase<ScalarT> >
getThyraRangeSpace(
int blk)
const;
244 Teuchos::RCP<Thyra::LinearOpBase<ScalarT> >
getThyraMatrix()
const;
266 virtual Teuchos::RCP<const MapType>
getMap(
int i)
const;
269 virtual Teuchos::RCP<const MapType>
getGhostedMap(
int i)
const;
272 virtual Teuchos::RCP<const CrsGraphType>
getGraph(
int i,
int j)
const;
275 virtual Teuchos::RCP<const CrsGraphType>
getGhostedGraph(
int i,
int j)
const;
342 mutable Teuchos::RCP<Thyra::ProductVectorSpaceBase<ScalarT> >
rangeSpace_;
343 mutable Teuchos::RCP<Thyra::ProductVectorSpaceBase<ScalarT> >
domainSpace_;
352 const Teuchos::Ptr<VectorType> & f,
353 const Teuchos::Ptr<CrsMatrixType> & A,
354 bool zeroVectorRows)
const;
365 virtual Teuchos::RCP<const CrsGraphType>
buildTpetraGraph(
int i,
int j)
const;
369 Teuchos::RCP<const Teuchos::MpiComm<int> >
comm_;
370 mutable std::vector<Teuchos::RCP<const MapType> >
maps_;
375 mutable std::vector<Teuchos::RCP<const ImportType> >
importers_;
376 mutable std::vector<Teuchos::RCP<const ExportType> >
exporters_;
BlockedTpetraLinearObjContainer< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > BTLOC
std::vector< Teuchos::RCP< const ImportType > > importers_
virtual void applyDirichletBCs(const LinearObjContainer &counter, LinearObjContainer &result) const
virtual Teuchos::RCP< ReadOnlyVector_GlobalEvaluationData > buildReadOnlyDomainContainer() const
Thyra::TpetraVector< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > ThyraVector
void ghostToGlobalTpetraMatrix(int blockRow, const CrsMatrixType &in, CrsMatrixType &out) const
Pushes residual values into the residual vector for a Newton-based solve.
Teuchos::RCP< VectorType > getTpetraDomainVector(int i) const
Teuchos::RCP< const panzer::GlobalIndexer > getDomainGlobalIndexer() const
Get the domain unique global indexer this factory was created with.
virtual ~BlockedTpetraLinearObjFactory()
virtual Teuchos::RCP< const MapType > buildTpetraMap(int i) const
Thyra::TpetraLinearOp< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > ThyraLinearOp
virtual Teuchos::RCP< const ExportType > getGhostedExport(int j) const
get exporter for converting an overalapped object to a "normal" object
Teuchos::RCP< const GlobalIndexer > blockProvider_
virtual Teuchos::RCP< WriteVector_GlobalEvaluationData > buildWriteDomainContainer() const
std::vector< Teuchos::RCP< const GlobalIndexer > > gidProviders_
Teuchos::RCP< const panzer::BlockedDOFManager > getGlobalIndexer() const
virtual Teuchos::RCP< const MapType > buildTpetraGhostedMap(int i) const
virtual Teuchos::RCP< const ImportType > getGhostedImport(int i) const
get importer for converting an overalapped object to a "normal" object
std::vector< Teuchos::RCP< const ExportType > > exporters_
Teuchos::RCP< const panzer::GlobalIndexer > getRangeGlobalIndexer() const
Get the range unique global indexer this factory was created with.
Tpetra::Import< LocalOrdinalT, GlobalOrdinalT, NodeT > ImportType
virtual Teuchos::RCP< const CrsGraphType > buildTpetraGraph(int i, int j) const
virtual Teuchos::RCP< LinearObjContainer > buildLinearObjContainer() const
Teuchos::RCP< Thyra::LinearOpBase< ScalarT > > getThyraMatrix() const
Get a Thyra operator.
virtual void adjustForDirichletConditions(const LinearObjContainer &localBCRows, const LinearObjContainer &globalBCRows, LinearObjContainer &ghostedObjs, bool zeroVectorRows=false, bool adjustX=false) const
Teuchos::MpiComm< int > getComm() const
std::vector< Teuchos::RCP< const MapType > > maps_
virtual void globalToGhostContainer(const LinearObjContainer &container, LinearObjContainer &ghostContainer, int) const
virtual Teuchos::RCP< LinearObjContainer > buildGhostedLinearObjContainer() const
Teuchos::RCP< const Teuchos::MpiComm< int > > comm_
Teuchos::RCP< Thyra::BlockedLinearOpBase< ScalarT > > getGhostedThyraMatrix() const
Get a Thyra operator.
Teuchos::RCP< const BlockedDOFManager > blockedDOFManager_
int getBlockColCount() const
how many block columns
void initializeGhostedContainer(int, LinearObjContainer &loc) const
Teuchos::RCP< panzer::CloneableEvaluator > buildScatter() const
Use preconstructed scatter evaluators.
Tpetra::CrsGraph< LocalOrdinalT, GlobalOrdinalT, NodeT > CrsGraphType
virtual Teuchos::RCP< const MapType > getMap(int i) const
get the map from the matrix
PHX::MDField< ScalarT, panzer::Cell, panzer::IP > result
A field that will be used to build up the result of the integral we're performing.
Gathers solution values from the Newton solution vector into the nodal fields of the field manager...
virtual Teuchos::RCP< const CrsGraphType > getGraph(int i, int j) const
get the graph of the crs matrix
Teuchos::RCP< Thyra::ProductVectorSpaceBase< ScalarT > > rangeSpace_
virtual Teuchos::RCP< LinearObjContainer > buildPrimitiveGhostedLinearObjContainer() const
std::unordered_map< std::pair< int, int >, Teuchos::RCP< const CrsGraphType >, panzer::pair_hash > ghostedGraphs_
void globalToGhostThyraVector(const Teuchos::RCP< const Thyra::VectorBase< ScalarT > > &in, const Teuchos::RCP< Thyra::VectorBase< ScalarT > > &out) const
Teuchos::RCP< Thyra::ProductVectorSpaceBase< ScalarT > > ghostedDomainSpace_
Tpetra::Export< LocalOrdinalT, GlobalOrdinalT, NodeT > ExportType
Teuchos::RCP< Thyra::VectorBase< ScalarT > > getGhostedThyraRangeVector() const
Get a range vector.
BlockedTpetraLinearObjFactory(const Teuchos::RCP< const Teuchos::MpiComm< int > > &comm, const Teuchos::RCP< const BlockedDOFManager > &gidProvider)
void ghostToGlobalTpetraVector(int i, const VectorType &in, VectorType &out) const
Teuchos::RCP< const Thyra::VectorSpaceBase< ScalarT > > getGhostedThyraDomainSpace() const
Get the domain vector space (x and dxdt)
std::unordered_map< std::pair< int, int >, Teuchos::RCP< const CrsGraphType >, panzer::pair_hash > graphs_
virtual void writeVector(const std::string &, const LinearObjContainer &, int) const
Teuchos::RCP< Thyra::VectorBase< ScalarT > > getThyraRangeVector() const
Get a range vector.
std::vector< Teuchos::RCP< const GlobalIndexer > > nc2c_vector(const std::vector< Teuchos::RCP< GlobalIndexer > > &ugis)
virtual Teuchos::RCP< const CrsGraphType > getGhostedGraph(int i, int j) const
get the ghosted graph of the crs matrix
std::unordered_set< std::pair< int, int >, panzer::pair_hash > excludedPairs_
void makeRoomForBlocks(std::size_t blockCnt)
Allocate the space in the std::vector objects so we can fill with appropriate Tpetra data...
Teuchos::RCP< VectorType > getGhostedTpetraRangeVector(int i) const
Tpetra::Vector< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > VectorType
Teuchos::RCP< Thyra::VectorBase< ScalarT > > getThyraDomainVector() const
Get a domain vector.
virtual void endFill(LinearObjContainer &loc) const
Tpetra::CrsMatrix< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > CrsMatrixType
Tpetra::Operator< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > OperatorType
Teuchos::RCP< VectorType > getTpetraRangeVector(int i) const
virtual Teuchos::RCP< LinearObjContainer > buildPrimitiveLinearObjContainer() const
Teuchos::RCP< Thyra::VectorBase< ScalarT > > getGhostedThyraDomainVector() const
Get a domain vector.
Teuchos::RCP< Thyra::ProductVectorSpaceBase< ScalarT > > domainSpace_
void addExcludedPairs(const std::vector< std::pair< int, int > > &exPairs)
exclude a vector of pairs from the matrix
virtual void ghostToGlobalContainer(const LinearObjContainer &ghostContainer, LinearObjContainer &container, int) const
Teuchos::RCP< const Thyra::VectorSpaceBase< ScalarT > > getThyraRangeSpace() const
Get the range vector space (f)
void addExcludedPair(int rowBlock, int colBlock)
exclude a block pair from the matrix
virtual Teuchos::RCP< const MapType > getGhostedMap(int i) const
get the ghosted map from the matrix
Teuchos::RCP< panzer::CloneableEvaluator > buildGatherTangent() const
Use preconstructed gather evaluators.
Teuchos::RCP< panzer::CloneableEvaluator > buildGatherOrientation() const
Use preconstructed gather evaluators.
virtual void readVector(const std::string &, LinearObjContainer &, int) const
void globalToGhostTpetraVector(int i, const VectorType &in, VectorType &out) const
int getBlockRowCount() const
how many block rows
Teuchos::RCP< panzer::CloneableEvaluator > buildGather() const
Use preconstructed gather evaluators.
Teuchos::RCP< Thyra::ProductVectorSpaceBase< ScalarT > > ghostedRangeSpace_
Teuchos::RCP< VectorType > getGhostedTpetraDomainVector(int i) const
Teuchos::RCP< const Thyra::VectorSpaceBase< ScalarT > > getThyraDomainSpace() const
Get the domain vector space (x and dxdt)
Pushes residual values into the residual vector for a Newton-based solve.
virtual void beginFill(LinearObjContainer &loc) const
Teuchos::RCP< const Thyra::VectorSpaceBase< ScalarT > > getGhostedThyraRangeSpace() const
Get the range vector space (f)
Gathers orientations per field from the global indexer and stores them in the field manager...
Gathers tangent vectors dx/dp for computing df/dx*dx/dp + df/dp into the nodal fields of the field ma...
Teuchos::RCP< panzer::CloneableEvaluator > buildGatherDomain() const
Use preconstructed gather evaluators.
void ghostToGlobalThyraVector(const Teuchos::RCP< const Thyra::VectorBase< ScalarT > > &in, const Teuchos::RCP< Thyra::VectorBase< ScalarT > > &out) const
void initializeContainer(int, LinearObjContainer &loc) const
std::vector< Teuchos::RCP< const MapType > > ghostedMaps_
void ghostToGlobalThyraMatrix(const Thyra::LinearOpBase< ScalarT > &in, Thyra::LinearOpBase< ScalarT > &out) const
Teuchos::RCP< CrsMatrixType > getGhostedTpetraMatrix(int i, int j) const
Tpetra::Map< LocalOrdinalT, GlobalOrdinalT, NodeT > MapType
virtual Teuchos::RCP< const CrsGraphType > buildTpetraGhostedGraph(int i, int j) const
Teuchos::RCP< panzer::CloneableEvaluator > buildScatterDirichlet() const
Use preconstructed dirichlet scatter evaluators.
Teuchos::RCP< CrsMatrixType > getTpetraMatrix(int i, int j) const