43 #ifndef PANZER_TPETRA_LINEAR_OBJ_FACTORY_IMPL_HPP 44 #define PANZER_TPETRA_LINEAR_OBJ_FACTORY_IMPL_HPP 50 #include "Tpetra_MultiVector.hpp" 51 #include "Tpetra_Vector.hpp" 52 #include "Tpetra_CrsMatrix.hpp" 54 #include "Thyra_TpetraVectorSpace.hpp" 55 #include "Thyra_TpetraLinearOp.hpp" 65 template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
69 : comm_(
comm), gidProvider_(gidProvider)
78 template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
83 : comm_(
comm), gidProvider_(gidProvider), colGidProvider_(colGidProvider)
92 template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
100 template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
110 template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
120 template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
135 globalToGhostTpetraVector(*t_in.
get_x(),*t_out.get_x(),
true);
138 globalToGhostTpetraVector(*t_in.
get_dxdt(),*t_out.get_dxdt(),
true);
141 globalToGhostTpetraVector(*t_in.
get_f(),*t_out.get_f(),
false);
144 template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
160 ghostToGlobalTpetraVector(*t_in.
get_x(),*t_out.get_x(),
true);
163 ghostToGlobalTpetraVector(*t_in.
get_f(),*t_out.get_f(),
false);
166 ghostToGlobalTpetraMatrix(*t_in.
get_A(),*t_out.get_A());
169 template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
173 Tpetra::Vector<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT> & out,
bool col)
const 178 RCP<ExportType> exporter = col ? getGhostedColExport() : getGhostedExport();
180 out.doExport(in,*exporter,Tpetra::ADD);
183 template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
187 Tpetra::CrsMatrix<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT> & out)
const 195 out.setAllToScalar(0.0);
196 out.doExport(in,*exporter,Tpetra::ADD);
197 out.fillComplete(out.getDomainMap(),out.getRangeMap());
200 template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
204 Tpetra::Vector<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT> & out,
bool col)
const 209 RCP<ImportType> importer = col ? getGhostedColImport() : getGhostedImport();
211 out.doImport(in,*importer,Tpetra::INSERT);
214 template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
220 bool zeroVectorRows,
bool adjustX)
const 234 if(adjustX) f = t_ghosted.get_x();
238 const VectorType & global_bcs = *(t_globalBCRows.get_f());
243 for(Ordinal i=0;i<local_bcs_array.
size();i++) {
244 if(global_bcs_array[i]==0.0)
247 if(local_bcs_array[i]==0.0 || zeroVectorRows) {
254 std::size_t numEntries = 0;
255 std::size_t sz = A->getNumEntriesInLocalRow(i);
259 A->getLocalRowCopy(i,indices,
values,numEntries);
261 for(std::size_t c=0;c<numEntries;c++)
264 A->replaceLocalValues(i,indices,
values);
270 double scaleFactor = global_bcs_array[i];
274 f_array[i] /= scaleFactor;
276 std::size_t numEntries = 0;
277 std::size_t sz = A->getNumEntriesInLocalRow(i);
281 A->getLocalRowCopy(i,indices,
values,numEntries);
283 for(std::size_t c=0;c<numEntries;c++)
286 A->replaceLocalValues(i,indices,
values);
292 template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
301 template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
310 vec_ged->initialize(getGhostedImport(),getGhostedColMap(),getColMap());
316 template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
320 return *Teuchos::rcp_dynamic_cast<
const Teuchos::MpiComm<int> >(getTeuchosComm());
324 template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
329 if(domainSpace_==Teuchos::null) {
331 domainSpace_ = Thyra::tpetraVectorSpace<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT>(getMap());
333 domainSpace_ = Thyra::tpetraVectorSpace<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT>(getColMap());
340 template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
345 if(rangeSpace_==Teuchos::null)
346 rangeSpace_ = Thyra::tpetraVectorSpace<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT>(getMap());
352 template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
357 return Thyra::tpetraLinearOp<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT>(getThyraRangeSpace(),getThyraDomainSpace(),getTpetraMatrix());
363 template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
369 initializeContainer(mem,tloc);
372 template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
381 if((mem & LOC::X) == LOC::X)
382 loc.
set_x(getTpetraColVector());
384 if((mem & LOC::DxDt) == LOC::DxDt)
387 if((mem & LOC::F) == LOC::F)
388 loc.
set_f(getTpetraVector());
390 if((mem & LOC::Mat) == LOC::Mat)
391 loc.
set_A(getTpetraMatrix());
394 template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
400 initializeGhostedContainer(mem,tloc);
403 template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
412 if((mem & LOC::X) == LOC::X)
413 loc.
set_x(getGhostedTpetraColVector());
415 if((mem & LOC::DxDt) == LOC::DxDt)
416 loc.
set_dxdt(getGhostedTpetraColVector());
418 if((mem & LOC::F) == LOC::F) {
419 loc.
set_f(getGhostedTpetraVector());
423 if((mem & LOC::Mat) == LOC::Mat) {
424 loc.
set_A(getGhostedTpetraMatrix());
433 template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
438 if(map_==Teuchos::null) map_ = buildMap();
444 template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
449 if(cMap_==Teuchos::null) cMap_ = buildColMap();
454 template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
459 if(ghostedMap_==Teuchos::null) ghostedMap_ = buildGhostedMap();
464 template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
469 if(cGhostedMap_==Teuchos::null) cGhostedMap_ = buildGhostedColMap();
475 template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
480 if(graph_==Teuchos::null) graph_ = buildGraph();
485 template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
490 if(ghostedGraph_==Teuchos::null) ghostedGraph_ = buildGhostedGraph();
492 return ghostedGraph_;
495 template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
500 if(ghostedImporter_==Teuchos::null)
503 return ghostedImporter_;
506 template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
512 ghostedColImporter_ = getGhostedImport();
514 if(ghostedColImporter_==Teuchos::null)
517 return ghostedColImporter_;
520 template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
525 if(ghostedExporter_==Teuchos::null)
528 return ghostedExporter_;
531 template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
537 ghostedColExporter_ = getGhostedExport();
539 if(ghostedColExporter_==Teuchos::null)
542 return ghostedColExporter_;
548 template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
553 std::vector<GlobalOrdinalT> indices;
556 gidProvider_->getOwnedIndices(indices);
561 template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
569 std::vector<GlobalOrdinalT> indices;
572 colGidProvider_->getOwnedIndices(indices);
578 template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
583 std::vector<GlobalOrdinalT> indices;
586 gidProvider_->getOwnedAndGhostedIndices(indices);
592 template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
598 return buildGhostedMap();
600 std::vector<GlobalOrdinalT> indices;
603 colGidProvider_->getOwnedAndGhostedIndices(indices);
609 template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
626 graph->doExport( *oGraph, *exporter, Tpetra::INSERT );
627 graph->fillComplete(cMap,rMap);
632 template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
642 std::vector<std::string> elementBlockIds;
643 gidProvider_->getElementBlockIds(elementBlockIds);
646 colGidProvider = hasColProvider_ ? colGidProvider_ : gidProvider_;
648 const bool han = conn_mgr.
is_null() ? false : conn_mgr->hasAssociatedNeighbors();
651 std::vector<std::string>::const_iterator blockItr;
652 for(blockItr=elementBlockIds.begin();blockItr!=elementBlockIds.end();++blockItr) {
653 std::string blockId = *blockItr;
656 const std::vector<LocalOrdinalT> & elements = gidProvider_->getElementBlock(blockId);
659 std::vector<GlobalOrdinalT> gids;
660 std::vector<GlobalOrdinalT> col_gids;
663 for(std::size_t i=0;i<elements.size();i++) {
664 gidProvider_->getElementGIDs(elements[i],gids);
666 colGidProvider->getElementGIDs(elements[i],col_gids);
668 const std::vector<LocalOrdinalT>& aes = conn_mgr->getAssociatedNeighbors(elements[i]);
669 for (
typename std::vector<LocalOrdinalT>::const_iterator eit = aes.begin();
670 eit != aes.end(); ++eit) {
671 std::vector<GlobalOrdinalT> other_col_gids;
672 colGidProvider->getElementGIDs(*eit, other_col_gids);
673 col_gids.insert(col_gids.end(), other_col_gids.begin(), other_col_gids.end());
677 for(std::size_t j=0;j<gids.size();j++)
678 graph->insertGlobalIndices(gids[j],col_gids);
683 graph->fillComplete(cMap,rMap);
688 template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
697 template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
706 template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
715 template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
724 template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
731 tMat->fillComplete(tMat->getDomainMap(),tMat->getRangeMap());
736 template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
743 tMat->fillComplete(tMat->getDomainMap(),tMat->getRangeMap());
748 template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
756 template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
766 template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
773 A->fillComplete(A->getDomainMap(),A->getRangeMap());
virtual const Teuchos::RCP< const Teuchos::Comm< int > > getTeuchosComm() const
get exporter for converting an overalapped object to a "normal" object
virtual void applyDirichletBCs(const LinearObjContainer &counter, LinearObjContainer &result) const
void globalToGhostTpetraVector(const Tpetra::Vector< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > &in, Tpetra::Vector< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > &out, bool col) const
void initializeContainer(int, LinearObjContainer &loc) const
bool is_null(const boost::shared_ptr< T > &p)
virtual Teuchos::RCP< const Thyra::VectorSpaceBase< ScalarT > > getThyraRangeSpace() const
Get the range space.
void ghostToGlobalTpetraMatrix(const Tpetra::CrsMatrix< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > &in, Tpetra::CrsMatrix< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > &out) const
virtual const Teuchos::RCP< Tpetra::Map< LocalOrdinalT, GlobalOrdinalT, NodeT > > getGhostedMap() const
get the ghosted map from the matrix
void clear()
Wipe out stored data.
bool is_null(const std::shared_ptr< T > &p)
T_To & dyn_cast(T_From &from)
Tpetra::Map< LocalOrdinalT, GlobalOrdinalT, NodeT > MapType
virtual void beginFill(LinearObjContainer &loc) const
virtual const Teuchos::RCP< Tpetra::Map< LocalOrdinalT, GlobalOrdinalT, NodeT > > getMap() const
get the map from the matrix
virtual const Teuchos::RCP< Tpetra::Map< LocalOrdinalT, GlobalOrdinalT, NodeT > > buildGhostedMap() const
virtual const Teuchos::RCP< Tpetra::CrsGraph< LocalOrdinalT, GlobalOrdinalT, NodeT > > getGhostedGraph() const
get the ghosted graph of the crs matrix
Tpetra::Import< LocalOrdinalT, GlobalOrdinalT, NodeT > ImportType
virtual const Teuchos::RCP< Tpetra::CrsGraph< LocalOrdinalT, GlobalOrdinalT, NodeT > > buildGhostedGraph() const
void set_x(const Teuchos::RCP< VectorType > &in)
virtual const Teuchos::RCP< Tpetra::Export< LocalOrdinalT, GlobalOrdinalT, NodeT > > getGhostedColExport() const
Tpetra::Export< LocalOrdinalT, GlobalOrdinalT, NodeT > ExportType
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
Tpetra::CrsMatrix< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > CrsMatrixType
virtual const Teuchos::RCP< Tpetra::Import< LocalOrdinalT, GlobalOrdinalT, NodeT > > getGhostedColImport() const
void setRequiresDirichletAdjustment(bool b)
virtual void globalToGhostContainer(const LinearObjContainer &container, LinearObjContainer &ghostContainer, int) const
virtual const Teuchos::RCP< Tpetra::Map< LocalOrdinalT, GlobalOrdinalT, NodeT > > buildMap() const
TpetraLinearObjFactory(const Teuchos::RCP< const Teuchos::Comm< int > > &comm, const Teuchos::RCP< const UniqueGlobalIndexer< LocalOrdinalT, GlobalOrdinalT > > &gidProvider)
std::vector< ScalarT > values
void ghostToGlobalTpetraVector(const Tpetra::Vector< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > &in, Tpetra::Vector< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > &out, bool col) const
Teuchos::RCP< Tpetra::Vector< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > > getGhostedTpetraColVector() const
virtual const Teuchos::RCP< Tpetra::Import< LocalOrdinalT, GlobalOrdinalT, NodeT > > getGhostedImport() const
get importer for converting an overalapped object to a "normal" object
Teuchos::RCP< const UniqueGlobalIndexer< LocalOrdinalT, GlobalOrdinalT > > colGidProvider_
void set_dxdt(const Teuchos::RCP< VectorType > &in)
virtual ~TpetraLinearObjFactory()
const Teuchos::RCP< CrsMatrixType > get_A() const
Teuchos::RCP< Tpetra::CrsMatrix< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > > getTpetraMatrix() const
const Teuchos::RCP< VectorType > get_x() const
Teuchos::RCP< Tpetra::CrsMatrix< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > > getGhostedTpetraMatrix() const
virtual const Teuchos::RCP< Tpetra::Map< LocalOrdinalT, GlobalOrdinalT, NodeT > > buildGhostedColMap() const
virtual const Teuchos::RCP< Tpetra::CrsGraph< LocalOrdinalT, GlobalOrdinalT, NodeT > > buildGraph() const
virtual Teuchos::RCP< LinearObjContainer > buildLinearObjContainer() const
virtual Teuchos::RCP< Thyra::LinearOpBase< ScalarT > > getThyraMatrix() const
Get a matrix operator.
Teuchos::RCP< Tpetra::Vector< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > > getGhostedTpetraVector() const
Teuchos::RCP< Tpetra::Vector< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > > getTpetraVector() const
void set_A(const Teuchos::RCP< CrsMatrixType > &in)
const Teuchos::RCP< VectorType > get_dxdt() const
void set_f(const Teuchos::RCP< VectorType > &in)
virtual const Teuchos::RCP< Tpetra::Map< LocalOrdinalT, GlobalOrdinalT, NodeT > > getGhostedColMap() const
virtual void endFill(LinearObjContainer &loc) const
Teuchos::RCP< const Teuchos::Comm< int > > comm
virtual Teuchos::RCP< ReadOnlyVector_GlobalEvaluationData > buildDomainContainer() const
virtual Teuchos::MpiComm< int > getComm() const
const Teuchos::RCP< VectorType > get_f() const
virtual void ghostToGlobalContainer(const LinearObjContainer &ghostContainer, LinearObjContainer &container, int) const
virtual const Teuchos::RCP< Tpetra::Export< LocalOrdinalT, GlobalOrdinalT, NodeT > > getGhostedExport() const
get exporter for converting an overalapped object to a "normal" object
virtual Teuchos::RCP< const Thyra::VectorSpaceBase< ScalarT > > getThyraDomainSpace() const
Get the domain space.
void buildGatherScatterEvaluators(const BuilderT &builder)
virtual const Teuchos::RCP< Tpetra::CrsGraph< LocalOrdinalT, GlobalOrdinalT, NodeT > > getGraph() const
get the graph of the crs matrix
virtual const Teuchos::RCP< Tpetra::Map< LocalOrdinalT, GlobalOrdinalT, NodeT > > getColMap() const
#define TEUCHOS_ASSERT(assertion_test)
Tpetra::CrsGraph< LocalOrdinalT, GlobalOrdinalT, NodeT > CrsGraphType
virtual const Teuchos::RCP< Tpetra::Map< LocalOrdinalT, GlobalOrdinalT, NodeT > > buildColMap() const
virtual void adjustForDirichletConditions(const LinearObjContainer &localBCRows, const LinearObjContainer &globalBCRows, LinearObjContainer &ghostedObjs, bool zeroVectorRows=false, bool adjustX=false) const
Tpetra::Vector< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > VectorType
void initializeGhostedContainer(int, LinearObjContainer &loc) const
Teuchos::RCP< Tpetra::Vector< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > > getTpetraColVector() const
virtual Teuchos::RCP< LinearObjContainer > buildGhostedLinearObjContainer() const