11#ifndef __Panzer_BlockedTpetraLinearObjFactory_hpp__
12#define __Panzer_BlockedTpetraLinearObjFactory_hpp__
17#include "Tpetra_Map.hpp"
18#include "Tpetra_CrsGraph.hpp"
19#include "Tpetra_FECrsGraph.hpp"
20#include "Tpetra_FECrsMatrix.hpp"
21#include "Tpetra_Import.hpp"
22#include "Tpetra_Export.hpp"
24#include "PanzerDiscFE_config.hpp"
34#include "Panzer_GatherOrientation.hpp"
36#include "Panzer_GatherSolution_Tpetra.hpp"
42#include "Thyra_BlockedLinearOpBase.hpp"
43#include "Thyra_ProductVectorBase.hpp"
45#include "Teuchos_RCP.hpp"
46#include "Teuchos_DefaultMpiComm.hpp"
47#include "Teuchos_OpaqueWrapper.hpp"
51template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT=panzer::TpetraNodeType>
56 typedef Tpetra::Vector<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT>
VectorType;
57 typedef Tpetra::CrsMatrix<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT>
CrsMatrixType;
58 typedef Tpetra::Operator<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT>
OperatorType;
59 typedef Tpetra::CrsGraph<LocalOrdinalT,GlobalOrdinalT,NodeT>
CrsGraphType;
60 typedef Tpetra::Map<LocalOrdinalT,GlobalOrdinalT,NodeT>
MapType;
61 typedef Tpetra::Import<LocalOrdinalT,GlobalOrdinalT,NodeT>
ImportType;
62 typedef Tpetra::Export<LocalOrdinalT,GlobalOrdinalT,NodeT>
ExportType;
64 typedef Tpetra::FECrsGraph<LocalOrdinalT,GlobalOrdinalT,NodeT>
FECrsGraphType;
65 typedef Tpetra::FECrsMatrix<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT>
FECrsMatrixType;
67 typedef Thyra::TpetraVector<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT>
ThyraVector;
68 typedef Thyra::TpetraLinearOp<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT>
ThyraLinearOp;
77 const Teuchos::RCP<const BlockedDOFManager> & gidProvider,
85 const std::vector<Teuchos::RCP<const panzer::GlobalIndexer>> & gidProviders,
96 const Teuchos::RCP<const GlobalIndexer> & rowProvider,
97 const Teuchos::RCP<const GlobalIndexer> & colProvider,
105 { TEUCHOS_ASSERT(
false); }
108 { TEUCHOS_ASSERT(
false); }
134 bool zeroVectorRows=
false,
bool adjustX =
false)
const;
148#ifdef PANZER_HAVE_EPETRA_STACK
153 virtual Teuchos::RCP<WriteVector_GlobalEvaluationData> buildWriteDomainContainer()
const;
159 template <
typename EvalT>
171 template <
typename EvalT>
176 template <
typename EvalT>
181 template <
typename EvalT>
196 template <
typename EvalT>
201 template <
typename EvalT>
252 Teuchos::RCP<const Thyra::VectorSpaceBase<ScalarT> >
getThyraRangeSpace(
int blk)
const;
261 Teuchos::RCP<Thyra::LinearOpBase<ScalarT> >
getThyraMatrix()
const;
283 virtual Teuchos::RCP<const MapType>
getMap(
int i)
const;
286 virtual Teuchos::RCP<const MapType>
getGhostedMap(
int i)
const;
289 virtual Teuchos::RCP<const CrsGraphType>
getGraph(
int i,
int j)
const;
292 virtual Teuchos::RCP<const CrsGraphType>
getGhostedGraph(
int i,
int j)
const;
304 virtual Teuchos::RCP<const MapType>
getColMap(
int i)
const;
318 Teuchos::RCP<FECrsGraphType>
getFEGraph(
int i,
int j)
const;
327 Teuchos::RCP<FECrsMatrixType>
getFEMatrix(
int i,
int j)
const;
392 static void splitIntoBlocks(
const Teuchos::RCP<const GlobalIndexer> & ugi,
393 Teuchos::RCP<const BlockedDOFManager> & blocked,
394 std::vector<Teuchos::RCP<const GlobalIndexer> > & blocks);
421 mutable Teuchos::RCP<Thyra::ProductVectorSpaceBase<ScalarT> >
rangeSpace_;
428 mutable Teuchos::RCP<const Thyra::VectorSpaceBase<ScalarT> >
domainSpace_;
435 const Teuchos::Ptr<VectorType> & f,
436 const Teuchos::Ptr<CrsMatrixType> & A,
437 bool zeroVectorRows)
const;
450 virtual Teuchos::RCP<const CrsGraphType>
buildTpetraGraph(
int i,
int j)
const;
453 virtual Teuchos::RCP<FECrsGraphType>
buildFEGraph(
int i,
int j)
const;
461 Teuchos::RCP<const Teuchos::MpiComm<int> >
comm_;
462 mutable std::vector<Teuchos::RCP<const MapType> >
maps_;
467 mutable std::vector<Teuchos::RCP<const ImportType> >
importers_;
468 mutable std::vector<Teuchos::RCP<const ExportType> >
exporters_;
472 mutable std::vector<Teuchos::RCP<const MapType> >
colMaps_;
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.
Teuchos::RCP< const Thyra::VectorSpaceBase< ScalarT > > ghostedDomainSpace_
Teuchos::RCP< panzer::CloneableEvaluator > buildGatherDomain() const
Use preconstructed gather evaluators.
virtual Teuchos::RCP< const MapType > buildColTpetraGhostedMap(int i) const
Teuchos::RCP< const panzer::GlobalIndexer > getRangeGlobalIndexer() const
Get the range unique global indexer this factory was created with.
Teuchos::RCP< FECrsGraphType > getFEGraph(int i, int j) const
Get the (cached) FE graph for block (i,j), built via the Tpetra::FECrsGraph "V2" ctor.
Tpetra::Operator< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > OperatorType
Teuchos::RCP< FECrsMatrixType > getFEMatrix(int i, int j) const
Get the (cached) FECrsMatrix for block (i,j).
Teuchos::RCP< Thyra::VectorBase< ScalarT > > getThyraRangeVector() const
Get a range vector.
virtual void adjustForDirichletConditions(const LinearObjContainer &localBCRows, const LinearObjContainer &globalBCRows, LinearObjContainer &ghostedObjs, bool zeroVectorRows=false, bool adjustX=false) const
std::vector< Teuchos::RCP< const MapType > > ghostedColMaps_
Teuchos::RCP< panzer::CloneableEvaluator > buildGather() const
Use preconstructed gather evaluators.
virtual void applyDirichletBCs(const LinearObjContainer &counter, LinearObjContainer &result) const
Teuchos::RCP< const panzer::GlobalIndexer > getDomainGlobalIndexer() const
std::vector< Teuchos::RCP< const GlobalIndexer > > gidProviders_
void initializeGhostedContainer(int, LinearObjContainer &loc) const
Teuchos::RCP< Thyra::VectorBase< ScalarT > > getThyraDomainVector() const
Get a domain vector.
Teuchos::RCP< const GlobalIndexer > colBlockProvider_
std::vector< Teuchos::RCP< const ExportType > > colExporters_
Teuchos::RCP< const Teuchos::MpiComm< int > > comm_
Teuchos::RCP< VectorType > getTpetraDomainVector(int i) const
virtual void endFill(LinearObjContainer &loc) const
Close a container after filling. Takes either a ghosted or an owned container.
virtual Teuchos::RCP< FECrsGraphType > buildFEGraph(int i, int j) const
std::vector< Teuchos::RCP< const MapType > > ghostedMaps_
void initializeContainer(int, LinearObjContainer &loc) const
Teuchos::RCP< const Thyra::VectorSpaceBase< ScalarT > > getGhostedThyraDomainSpace() const
Get the domain vector space (x and dxdt)
std::vector< Teuchos::RCP< const GlobalIndexer > > colGidProviders_
Teuchos::RCP< const BlockedDOFManager > blockedDOFManager_
Teuchos::MpiComm< int > getComm() const
virtual Teuchos::RCP< const CrsGraphType > getGhostedGraph(int i, int j) const
get the ghosted graph of the crs matrix
virtual Teuchos::RCP< const MapType > getMap(int i) const
get the map from the matrix
Teuchos::RCP< const GlobalIndexer > getColGlobalIndexer(int i) const
virtual Teuchos::RCP< const ImportType > getGhostedColImport(int i) const
Teuchos::RCP< panzer::CloneableEvaluator > buildScatterDirichlet() const
Use preconstructed dirichlet scatter evaluators.
virtual void ghostToGlobalContainer(const LinearObjContainer &ghostContainer, LinearObjContainer &container, int) const
virtual void globalToGhostContainer(const LinearObjContainer &container, LinearObjContainer &ghostContainer, int) const
std::vector< Teuchos::RCP< const ExportType > > exporters_
virtual Teuchos::RCP< const MapType > buildTpetraGhostedMap(int i) const
void globalToGhostThyraVector(const Teuchos::RCP< const Thyra::VectorBase< ScalarT > > &in, const Teuchos::RCP< Thyra::VectorBase< ScalarT > > &out, bool col) const
virtual Teuchos::RCP< const MapType > buildTpetraMap(int i) const
Teuchos::RCP< const GlobalIndexer > blockProvider_
virtual Teuchos::RCP< const CrsGraphType > buildTpetraGraph(int i, int j) const
Teuchos::RCP< VectorType > getGhostedTpetraRangeVector(int i) const
Teuchos::RCP< const Thyra::VectorSpaceBase< ScalarT > > getThyraDomainSpace() const
Get the domain vector space (x and dxdt)
virtual Teuchos::RCP< const MapType > getColMap(int i) const
Teuchos::RCP< Thyra::VectorBase< ScalarT > > getGhostedThyraRangeVector() const
Get a range vector.
virtual Teuchos::RCP< ReadOnlyVector_GlobalEvaluationData > buildReadOnlyDomainContainer() const
std::unordered_map< std::pair< int, int >, Teuchos::RCP< const CrsGraphType >, panzer::pair_hash > graphs_
Tpetra::CrsGraph< LocalOrdinalT, GlobalOrdinalT, NodeT > CrsGraphType
Teuchos::RCP< panzer::CloneableEvaluator > buildScatter() const
Use preconstructed scatter evaluators.
Tpetra::Export< LocalOrdinalT, GlobalOrdinalT, NodeT > ExportType
virtual Teuchos::RCP< const CrsGraphType > buildTpetraGhostedGraph(int i, int j) const
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.
Tpetra::Vector< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > VectorType
Teuchos::RCP< VectorType > getGhostedTpetraDomainVector(int i) const
Teuchos::RCP< const Thyra::VectorSpaceBase< ScalarT > > getGhostedThyraRangeSpace() const
Get the range vector space (f)
void makeRoomForBlocks(std::size_t blockCnt, std::size_t colBlockCnt=0)
Allocate the space in the std::vector objects so we can fill with appropriate Tpetra data.
bool useFEAssembly() const
True if this factory was constructed with FE assembly enabled.
void ghostToGlobalTpetraVector(int i, const VectorType &in, VectorType &out, bool col) const
std::unordered_map< std::pair< int, int >, Teuchos::RCP< const CrsGraphType >, panzer::pair_hash > ghostedGraphs_
std::vector< Teuchos::RCP< const ImportType > > colImporters_
virtual void writeVector(const std::string &, const LinearObjContainer &, int) const
void globalToGhostTpetraVector(int i, const VectorType &in, VectorType &out, bool col) const
virtual void beginFill(LinearObjContainer &loc) const
Open a container for filling. Takes either a ghosted or an owned container.
Teuchos::RCP< panzer::CloneableEvaluator > buildGatherOrientation() const
Use preconstructed gather evaluators.
Teuchos::RCP< CrsMatrixType > getTpetraMatrix(int i, int j) const
virtual Teuchos::RCP< LinearObjContainer > buildGhostedLinearObjContainer() const
std::vector< Teuchos::RCP< const MapType > > maps_
virtual Teuchos::RCP< LinearObjContainer > buildLinearObjContainer() const
std::unordered_map< std::pair< int, int >, Teuchos::RCP< FECrsGraphType >, panzer::pair_hash > feGraphs_
int getBlockColCount() const
how many block columns
Tpetra::FECrsGraph< LocalOrdinalT, GlobalOrdinalT, NodeT > FECrsGraphType
std::vector< Teuchos::RCP< const MapType > > colMaps_
virtual void readVector(const std::string &, LinearObjContainer &, int) const
void addExcludedPair(int rowBlock, int colBlock)
exclude a block pair from the matrix
std::vector< Teuchos::RCP< const ImportType > > importers_
void ghostToGlobalThyraMatrix(const Thyra::LinearOpBase< ScalarT > &in, Thyra::LinearOpBase< ScalarT > &out) const
void ghostToGlobalTpetraMatrix(int blockRow, const CrsMatrixType &in, CrsMatrixType &out) const
std::unordered_set< std::pair< int, int >, panzer::pair_hash > excludedPairs_
Tpetra::CrsMatrix< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > CrsMatrixType
Tpetra::Map< LocalOrdinalT, GlobalOrdinalT, NodeT > MapType
Teuchos::RCP< const Thyra::VectorSpaceBase< ScalarT > > getThyraRangeSpace() const
Get the range vector space (f)
static void splitIntoBlocks(const Teuchos::RCP< const GlobalIndexer > &ugi, Teuchos::RCP< const BlockedDOFManager > &blocked, std::vector< Teuchos::RCP< const GlobalIndexer > > &blocks)
virtual Teuchos::RCP< const MapType > buildColTpetraMap(int i) const
Thyra::TpetraLinearOp< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > ThyraLinearOp
Teuchos::RCP< VectorType > getTpetraRangeVector(int i) const
Teuchos::RCP< CrsMatrixType > getGhostedTpetraMatrix(int i, int j) const
Teuchos::RCP< const Thyra::VectorSpaceBase< ScalarT > > domainSpace_
Teuchos::RCP< Thyra::ProductVectorSpaceBase< ScalarT > > ghostedRangeSpace_
virtual Teuchos::RCP< const ImportType > getGhostedImport(int i) const
get importer for converting an overalapped object to a "normal" object
Teuchos::RCP< Thyra::ProductVectorSpaceBase< ScalarT > > rangeSpace_
Tpetra::Import< LocalOrdinalT, GlobalOrdinalT, NodeT > ImportType
virtual Teuchos::RCP< LinearObjContainer > buildPrimitiveLinearObjContainer() const
Teuchos::RCP< const BlockedDOFManager > colBlockedDOFManager_
BlockedTpetraLinearObjContainer< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > BTLOC
std::unordered_map< std::pair< int, int >, const FECrsMatrixType *, panzer::pair_hash > feAssemblyOpenOn_
void addExcludedPairs(const std::vector< std::pair< int, int > > &exPairs)
exclude a vector of pairs from the matrix
virtual Teuchos::RCP< const MapType > getGhostedColMap(int i) const
virtual Teuchos::RCP< const ExportType > getGhostedColExport(int i) const
void ghostToGlobalThyraVector(const Teuchos::RCP< const Thyra::VectorBase< ScalarT > > &in, const Teuchos::RCP< Thyra::VectorBase< ScalarT > > &out, bool col) const
Tpetra::FECrsMatrix< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > FECrsMatrixType
virtual Teuchos::RCP< const ExportType > getGhostedExport(int j) const
get exporter for converting an overalapped object to a "normal" object
Thyra::TpetraVector< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > ThyraVector
Teuchos::RCP< Thyra::LinearOpBase< ScalarT > > getThyraMatrix() const
Get a Thyra operator.
Teuchos::RCP< Thyra::VectorBase< ScalarT > > getGhostedThyraDomainVector() const
Get a domain vector.
virtual Teuchos::RCP< LinearObjContainer > buildPrimitiveGhostedLinearObjContainer() const
virtual Teuchos::RCP< const CrsGraphType > getGraph(int i, int j) const
get the graph of the crs matrix
virtual ~BlockedTpetraLinearObjFactory()
Teuchos::RCP< const panzer::BlockedDOFManager > getGlobalIndexer() const
int getBlockRowCount() const
how many block rows
Teuchos::RCP< Thyra::BlockedLinearOpBase< ScalarT > > getGhostedThyraMatrix() const
Get a Thyra operator.
Gathers orientations per field from the global indexer and stores them in the field manager.
Gathers solution values from the Newton solution vector into the nodal fields of the field manager.
Gathers solution values from the Newton solution vector into the nodal fields of the field manager.
Gathers tangent vectors dx/dp for computing df/dx*dx/dp + df/dp into the nodal fields of the field ma...
Abstract, linear-algebra-library-agnostic container for the vectors and matrix used in a nonlinear/tr...
Pushes residual values into the residual vector for a Newton-based solve.
Pushes residual values into the residual vector for a Newton-based solve.
std::vector< Teuchos::RCP< const GlobalIndexer > > nc2c_vector(const std::vector< Teuchos::RCP< GlobalIndexer > > &ugis)
A hash functor for std::pair, combining the hashes of both elements via hash_combine()....