Panzer  Version of the Day
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
Panzer_BlockedTpetraLinearObjFactory.hpp
Go to the documentation of this file.
1 // @HEADER
2 // *****************************************************************************
3 // Panzer: A partial differential equation assembly
4 // engine for strongly coupled complex multiphysics systems
5 //
6 // Copyright 2011 NTESS and the Panzer contributors.
7 // SPDX-License-Identifier: BSD-3-Clause
8 // *****************************************************************************
9 // @HEADER
10 
11 #ifndef __Panzer_BlockedTpetraLinearObjFactory_hpp__
12 #define __Panzer_BlockedTpetraLinearObjFactory_hpp__
13 
14 #include <map>
15 
16 // Tpetra includes
17 #include "Tpetra_Map.hpp"
18 #include "Tpetra_CrsGraph.hpp"
19 #include "Tpetra_Import.hpp"
20 #include "Tpetra_Export.hpp"
21 
22 #include "PanzerDiscFE_config.hpp"
23 #include "Panzer_GlobalIndexer.hpp"
30 #include "Panzer_HashUtils.hpp" // for pair_hash
31 
32 #include "Panzer_GatherOrientation.hpp"
38 
39 #include "Thyra_BlockedLinearOpBase.hpp"
40 #include "Thyra_ProductVectorBase.hpp"
41 
42 #include "Teuchos_RCP.hpp"
44 #include "Teuchos_OpaqueWrapper.hpp"
45 
46 namespace panzer {
47 
48 template <typename Traits,typename ScalarT,typename LocalOrdinalT,typename GlobalOrdinalT,typename NodeT=panzer::TpetraNodeType>
50  , public ThyraObjFactory<double> {
51 public:
53  typedef Tpetra::Vector<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT> VectorType;
54  typedef Tpetra::CrsMatrix<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT> CrsMatrixType;
55  typedef Tpetra::Operator<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT> OperatorType;
56  typedef Tpetra::CrsGraph<LocalOrdinalT,GlobalOrdinalT,NodeT> CrsGraphType;
57  typedef Tpetra::Map<LocalOrdinalT,GlobalOrdinalT,NodeT> MapType;
58  typedef Tpetra::Import<LocalOrdinalT,GlobalOrdinalT,NodeT> ImportType;
59  typedef Tpetra::Export<LocalOrdinalT,GlobalOrdinalT,NodeT> ExportType;
60 
61  typedef Thyra::TpetraVector<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT> ThyraVector;
62  typedef Thyra::TpetraLinearOp<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT> ThyraLinearOp;
63 
64 
66  const Teuchos::RCP<const BlockedDOFManager> & gidProvider);
67 
73  const std::vector<Teuchos::RCP<const panzer::GlobalIndexer>> & gidProviders);
74 
76 
77 /*************** Linear object factory methods *******************/
78 
79  virtual void readVector(const std::string & /* identifier */, LinearObjContainer & /* loc */, int /* id */) const
80  { TEUCHOS_ASSERT(false); }
81 
82  virtual void writeVector(const std::string & /* identifier */, const LinearObjContainer & /* loc */, int /* id */) const
83  { TEUCHOS_ASSERT(false); }
84 
86 
88  { return buildLinearObjContainer(); }
89 
91 
93  { return buildGhostedLinearObjContainer(); }
94 
95  virtual void globalToGhostContainer(const LinearObjContainer & container,
96  LinearObjContainer & ghostContainer,int) const;
97  virtual void ghostToGlobalContainer(const LinearObjContainer & ghostContainer,
98  LinearObjContainer & container,int) const;
99 
106  virtual void adjustForDirichletConditions(const LinearObjContainer & localBCRows,
107  const LinearObjContainer & globalBCRows,
108  LinearObjContainer & ghostedObjs,
109  bool zeroVectorRows=false, bool adjustX = false) const;
110 
114  virtual void applyDirichletBCs(const LinearObjContainer & counter,
115  LinearObjContainer & result) const;
116 
122 
123 #ifdef PANZER_HAVE_EPETRA_STACK
124 
128  virtual Teuchos::RCP<WriteVector_GlobalEvaluationData> buildWriteDomainContainer() const;
129 #endif
130 
132 
134  template <typename EvalT>
137 
139  template <typename EvalT>
142 
144  template <typename EvalT>
147 
149  template <typename EvalT>
152 
154  template <typename EvalT>
157 
159  template <typename EvalT>
162 
163 /*************** Generic helper functions for container setup *******************/
164 
170  void initializeContainer(int,LinearObjContainer & loc) const;
171 
177  void initializeContainer(int mem,BTLOC & loc) const;
178 
184  void initializeGhostedContainer(int,LinearObjContainer & loc) const;
185 
191  void initializeGhostedContainer(int mem,BTLOC & loc) const;
192 
193 /*************** Thyra based methods *******************/
194 
197 
200 
203 
206 
209 
212 
215 
216  // and now the ghosted versions
217 
220 
223 
226 
229 
232 
233 /*************** Tpetra based methods *******************/
234 
236  virtual Teuchos::RCP<const MapType> getMap(int i) const;
237 
239  virtual Teuchos::RCP<const MapType> getGhostedMap(int i) const;
240 
242  virtual Teuchos::RCP<const CrsGraphType> getGraph(int i,int j) const;
243 
245  virtual Teuchos::RCP<const CrsGraphType> getGhostedGraph(int i,int j) const;
246 
249 
252 
253  Teuchos::RCP<CrsMatrixType> getTpetraMatrix(int i,int j) const;
255 
258 
261 
263  int getBlockRowCount() const;
264 
266  int getBlockColCount() const;
267 
269  void addExcludedPair(int rowBlock,int colBlock);
270 
272  void addExcludedPairs(const std::vector<std::pair<int,int> > & exPairs);
273 
274  virtual void beginFill(LinearObjContainer & loc) const;
275  virtual void endFill(LinearObjContainer & loc) const;
276 
278  { return blockedDOFManager_; }
279 
282  { return blockProvider_; }
283 
286  { return blockProvider_; }
287 
288 protected:
289 /*************** Generic methods/members *******************/
290 
291  // Get the global indexer associated with a particular block
293 
295  void makeRoomForBlocks(std::size_t blockCnt);
296 
299  std::vector<Teuchos::RCP<const GlobalIndexer> > gidProviders_;
300 
301  // which block entries are ignored
302  std::unordered_set<std::pair<int,int>,panzer::pair_hash> excludedPairs_;
303 
304 /*************** Thyra based methods/members *******************/
305 
307  const Teuchos::RCP<Thyra::VectorBase<ScalarT> > & out) const;
310  const Teuchos::RCP<Thyra::VectorBase<ScalarT> > & out) const;
311 
314 
317 
318 /*************** Tpetra based methods/members *******************/
319 
320  void adjustForDirichletConditions(const VectorType & local_bcs,
321  const VectorType & global_bcs,
322  const Teuchos::Ptr<VectorType> & f,
323  const Teuchos::Ptr<CrsMatrixType> & A,
324  bool zeroVectorRows) const;
325 
326  void ghostToGlobalTpetraVector(int i,const VectorType & in,VectorType & out) const;
327  void ghostToGlobalTpetraMatrix(int blockRow,const CrsMatrixType & in,CrsMatrixType & out) const;
328  void globalToGhostTpetraVector(int i,const VectorType & in,VectorType & out) const;
329 
330  // get the map from the matrix
331  virtual Teuchos::RCP<const MapType> buildTpetraMap(int i) const;
333 
334  // get the graph of the crs matrix
335  virtual Teuchos::RCP<const CrsGraphType> buildTpetraGraph(int i,int j) const;
337 
338  // storage for Tpetra graphs and maps
340  mutable std::vector<Teuchos::RCP<const MapType> > maps_;
341  mutable std::vector<Teuchos::RCP<const MapType> > ghostedMaps_;
342  mutable std::unordered_map<std::pair<int,int>,Teuchos::RCP<const CrsGraphType>,panzer::pair_hash> graphs_ ;
343  mutable std::unordered_map<std::pair<int,int>,Teuchos::RCP<const CrsGraphType>,panzer::pair_hash> ghostedGraphs_;
344 
345  mutable std::vector<Teuchos::RCP<const ImportType> > importers_;
346  mutable std::vector<Teuchos::RCP<const ExportType> > exporters_;
347 };
348 
349 }
350 
351 #endif
BlockedTpetraLinearObjContainer< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > BTLOC
void initializeContainer(int, LinearObjContainer &loc) const
std::vector< Teuchos::RCP< const ImportType > > importers_
Teuchos::RCP< CrsMatrixType > getTpetraMatrix(int i, int j) const
Thyra::TpetraVector< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > ThyraVector
Pushes residual values into the residual vector for a Newton-based solve.
Teuchos::RCP< const panzer::GlobalIndexer > getRangeGlobalIndexer() const
Get the range unique global indexer this factory was created with.
virtual Teuchos::RCP< LinearObjContainer > buildPrimitiveLinearObjContainer() const
virtual Teuchos::RCP< const ExportType > getGhostedExport(int j) const
get exporter for converting an overalapped object to a &quot;normal&quot; object
Thyra::TpetraLinearOp< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > ThyraLinearOp
virtual void adjustForDirichletConditions(const LinearObjContainer &localBCRows, const LinearObjContainer &globalBCRows, LinearObjContainer &ghostedObjs, bool zeroVectorRows=false, bool adjustX=false) const
Teuchos::RCP< VectorType > getTpetraDomainVector(int i) const
void initializeGhostedContainer(int, LinearObjContainer &loc) const
virtual void readVector(const std::string &, LinearObjContainer &, int) const
virtual void ghostToGlobalContainer(const LinearObjContainer &ghostContainer, LinearObjContainer &container, int) const
Teuchos::RCP< Thyra::VectorBase< ScalarT > > getThyraDomainVector() const
Get a domain vector.
std::vector< Teuchos::RCP< const GlobalIndexer > > gidProviders_
Teuchos::RCP< Thyra::VectorBase< ScalarT > > getGhostedThyraDomainVector() const
Get a domain vector.
std::vector< Teuchos::RCP< const ExportType > > exporters_
Tpetra::Import< LocalOrdinalT, GlobalOrdinalT, NodeT > ImportType
Teuchos::RCP< VectorType > getGhostedTpetraRangeVector(int i) const
virtual Teuchos::RCP< LinearObjContainer > buildLinearObjContainer() const
Teuchos::RCP< const panzer::BlockedDOFManager > getGlobalIndexer() const
Teuchos::RCP< Thyra::VectorBase< ScalarT > > getGhostedThyraRangeVector() const
Get a range vector.
void globalToGhostThyraVector(const Teuchos::RCP< const Thyra::VectorBase< ScalarT > > &in, const Teuchos::RCP< Thyra::VectorBase< ScalarT > > &out) const
virtual void applyDirichletBCs(const LinearObjContainer &counter, LinearObjContainer &result) const
virtual Teuchos::RCP< const ImportType > getGhostedImport(int i) const
get importer for converting an overalapped object to a &quot;normal&quot; object
std::vector< Teuchos::RCP< const MapType > > maps_
Teuchos::RCP< const Thyra::VectorSpaceBase< ScalarT > > getThyraRangeSpace() const
Get the range vector space (f)
Teuchos::RCP< panzer::CloneableEvaluator > buildScatter() const
Use preconstructed scatter evaluators.
Teuchos::RCP< const Teuchos::MpiComm< int > > comm_
Teuchos::RCP< const BlockedDOFManager > blockedDOFManager_
Teuchos::RCP< const panzer::GlobalIndexer > getDomainGlobalIndexer() const
Get the domain unique global indexer this factory was created with.
Tpetra::CrsGraph< LocalOrdinalT, GlobalOrdinalT, NodeT > CrsGraphType
PHX::MDField< ScalarT, panzer::Cell, panzer::IP > result
A field that will be used to build up the result of the integral we&#39;re performing.
Gathers solution values from the Newton solution vector into the nodal fields of the field manager...
Teuchos::RCP< Thyra::ProductVectorSpaceBase< ScalarT > > rangeSpace_
Teuchos::RCP< panzer::CloneableEvaluator > buildGatherDomain() const
Use preconstructed gather evaluators.
Teuchos::RCP< panzer::CloneableEvaluator > buildGather() const
Use preconstructed gather evaluators.
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 > ghostedGraphs_
void ghostToGlobalTpetraMatrix(int blockRow, const CrsMatrixType &in, CrsMatrixType &out) const
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
Teuchos::RCP< Thyra::ProductVectorSpaceBase< ScalarT > > ghostedDomainSpace_
Tpetra::Export< LocalOrdinalT, GlobalOrdinalT, NodeT > ExportType
virtual Teuchos::RCP< const MapType > buildTpetraMap(int i) const
void globalToGhostTpetraVector(int i, const VectorType &in, VectorType &out) const
virtual Teuchos::RCP< const MapType > buildTpetraGhostedMap(int i) const
BlockedTpetraLinearObjFactory(const Teuchos::RCP< const Teuchos::MpiComm< int > > &comm, const Teuchos::RCP< const BlockedDOFManager > &gidProvider)
std::unordered_map< std::pair< int, int >, Teuchos::RCP< const CrsGraphType >, panzer::pair_hash > graphs_
void ghostToGlobalThyraMatrix(const Thyra::LinearOpBase< ScalarT > &in, Thyra::LinearOpBase< ScalarT > &out) const
virtual Teuchos::RCP< LinearObjContainer > buildGhostedLinearObjContainer() const
std::vector< Teuchos::RCP< const GlobalIndexer > > nc2c_vector(const std::vector< Teuchos::RCP< GlobalIndexer > > &ugis)
Teuchos::RCP< panzer::CloneableEvaluator > buildGatherOrientation() const
Use preconstructed gather evaluators.
Teuchos::RCP< Thyra::BlockedLinearOpBase< ScalarT > > getGhostedThyraMatrix() const
Get a Thyra operator.
Teuchos::RCP< panzer::CloneableEvaluator > buildScatterDirichlet() const
Use preconstructed dirichlet scatter evaluators.
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...
virtual Teuchos::RCP< const MapType > getGhostedMap(int i) const
get the ghosted map from the matrix
Teuchos::RCP< VectorType > getGhostedTpetraDomainVector(int i) const
virtual Teuchos::RCP< LinearObjContainer > buildPrimitiveGhostedLinearObjContainer() const
Tpetra::Vector< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > VectorType
Teuchos::RCP< VectorType > getTpetraRangeVector(int i) const
void ghostToGlobalThyraVector(const Teuchos::RCP< const Thyra::VectorBase< ScalarT > > &in, const Teuchos::RCP< Thyra::VectorBase< ScalarT > > &out) const
virtual Teuchos::RCP< const MapType > getMap(int i) const
get the map from the matrix
Tpetra::CrsMatrix< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > CrsMatrixType
Tpetra::Operator< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > OperatorType
Teuchos::RCP< Thyra::ProductVectorSpaceBase< ScalarT > > domainSpace_
virtual void endFill(LinearObjContainer &loc) const
void addExcludedPairs(const std::vector< std::pair< int, int > > &exPairs)
exclude a vector of pairs from the matrix
Teuchos::RCP< const Thyra::VectorSpaceBase< ScalarT > > getGhostedThyraRangeSpace() const
Get the range vector space (f)
virtual Teuchos::RCP< const CrsGraphType > getGraph(int i, int j) const
get the graph of the crs matrix
virtual Teuchos::RCP< const CrsGraphType > getGhostedGraph(int i, int j) const
get the ghosted graph of the crs matrix
void addExcludedPair(int rowBlock, int colBlock)
exclude a block pair from the matrix
virtual Teuchos::RCP< const CrsGraphType > buildTpetraGraph(int i, int j) const
virtual void writeVector(const std::string &, const LinearObjContainer &, int) const
virtual void beginFill(LinearObjContainer &loc) const
virtual Teuchos::RCP< const CrsGraphType > buildTpetraGhostedGraph(int i, int j) const
virtual void globalToGhostContainer(const LinearObjContainer &container, LinearObjContainer &ghostContainer, int) const
Teuchos::RCP< Thyra::ProductVectorSpaceBase< ScalarT > > ghostedRangeSpace_
Teuchos::RCP< panzer::CloneableEvaluator > buildGatherTangent() const
Use preconstructed gather evaluators.
Teuchos::RCP< CrsMatrixType > getGhostedTpetraMatrix(int i, int j) const
Pushes residual values into the residual vector for a Newton-based solve.
void ghostToGlobalTpetraVector(int i, const VectorType &in, VectorType &out) const
Teuchos::RCP< Thyra::VectorBase< ScalarT > > getThyraRangeVector() const
Get a range vector.
virtual Teuchos::RCP< ReadOnlyVector_GlobalEvaluationData > buildReadOnlyDomainContainer() const
Gathers orientations per field from the global indexer and stores them in the field manager...
#define TEUCHOS_ASSERT(assertion_test)
Gathers tangent vectors dx/dp for computing df/dx*dx/dp + df/dp into the nodal fields of the field ma...
std::vector< Teuchos::RCP< const MapType > > ghostedMaps_
Tpetra::Map< LocalOrdinalT, GlobalOrdinalT, NodeT > MapType
Teuchos::RCP< const Thyra::VectorSpaceBase< ScalarT > > getThyraDomainSpace() const
Get the domain vector space (x and dxdt)
Teuchos::RCP< Thyra::LinearOpBase< ScalarT > > getThyraMatrix() const
Get a Thyra operator.