11#ifndef __Panzer_BlockedTpetraLinearObjFactory_impl_hpp__
12#define __Panzer_BlockedTpetraLinearObjFactory_impl_hpp__
17#ifdef PANZER_HAVE_EPETRA_STACK
23#include "KokkosSparse_SortCrs.hpp"
26#include "Thyra_DefaultBlockedLinearOp.hpp"
27#include "Thyra_DefaultProductVectorSpace.hpp"
28#include "Thyra_SpmdVectorBase.hpp"
29#include "Thyra_TpetraLinearOp.hpp"
30#include "Thyra_TpetraThyraWrappers.hpp"
33#include "Tpetra_CrsMatrix.hpp"
34#include "Tpetra_MultiVector.hpp"
35#include "Tpetra_Vector.hpp"
45template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
48 const Teuchos::RCP<const BlockedDOFManager> & gidProvider)
49 : blockProvider_(gidProvider), blockedDOFManager_(gidProvider), comm_(comm)
51 for(std::size_t i=0;i<gidProvider->getFieldDOFManagers().size();i++)
52 gidProviders_.push_back(gidProvider->getFieldDOFManagers()[i]);
61template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
64 const std::vector<Teuchos::RCP<const panzer::GlobalIndexer>> & gidProviders)
65 : gidProviders_(gidProviders), comm_(comm)
70template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
78template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
79Teuchos::RCP<LinearObjContainer>
83 std::vector<Teuchos::RCP<const MapType> > blockMaps;
84 std::size_t blockDim = gidProviders_.size();
85 for(std::size_t i=0;i<blockDim;i++)
86 blockMaps.push_back(getMap(i));
88 Teuchos::RCP<BTLOC> container = Teuchos::rcp(
new BTLOC);
89 container->setMapsForBlocks(blockMaps);
94template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
95Teuchos::RCP<LinearObjContainer>
99 std::vector<Teuchos::RCP<const MapType> > blockMaps;
100 std::size_t blockDim = gidProviders_.size();
101 for(std::size_t i=0;i<blockDim;i++)
102 blockMaps.push_back(getGhostedMap(i));
104 Teuchos::RCP<BTLOC> container = Teuchos::rcp(
new BTLOC);
105 container->setMapsForBlocks(blockMaps);
110template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
114 using Teuchos::is_null;
118 const BTLOC & b_in = Teuchos::dyn_cast<const BTLOC>(in);
119 BTLOC & b_out = Teuchos::dyn_cast<BTLOC>(out);
123 if ( !is_null(b_in.
get_x()) && !is_null(b_out.
get_x()) && ((mem & LOC::X)==LOC::X))
124 globalToGhostThyraVector(b_in.
get_x(),b_out.
get_x());
126 if ( !is_null(b_in.
get_dxdt()) && !is_null(b_out.
get_dxdt()) && ((mem & LOC::DxDt)==LOC::DxDt))
129 if ( !is_null(b_in.
get_f()) && !is_null(b_out.
get_f()) && ((mem & LOC::F)==LOC::F))
130 globalToGhostThyraVector(b_in.
get_f(),b_out.
get_f());
133template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
137 using Teuchos::is_null;
141 const BTLOC & b_in = Teuchos::dyn_cast<const BTLOC>(in);
142 BTLOC & b_out = Teuchos::dyn_cast<BTLOC>(out);
146 if ( !is_null(b_in.
get_x()) && !is_null(b_out.
get_x()) && ((mem & LOC::X)==LOC::X))
147 ghostToGlobalThyraVector(b_in.
get_x(),b_out.
get_x());
149 if ( !is_null(b_in.
get_f()) && !is_null(b_out.
get_f()) && ((mem & LOC::F)==LOC::F))
150 ghostToGlobalThyraVector(b_in.
get_f(),b_out.
get_f());
152 if ( !is_null(b_in.
get_A()) && !is_null(b_out.
get_A()) && ((mem & LOC::Mat)==LOC::Mat))
153 ghostToGlobalThyraMatrix(*b_in.
get_A(),*b_out.
get_A());
156template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
161 bool zeroVectorRows,
bool adjustX)
const
164 using Teuchos::rcp_dynamic_cast;
166 using Thyra::PhysicallyBlockedLinearOpBase;
170 std::size_t blockDim = gidProviders_.size();
173 const BTLOC & b_localBCRows = Teuchos::dyn_cast<const BTLOC>(localBCRows);
174 const BTLOC & b_globalBCRows = Teuchos::dyn_cast<const BTLOC>(globalBCRows);
175 BTLOC & b_ghosted = Teuchos::dyn_cast<BTLOC>(ghostedObjs);
177 TEUCHOS_ASSERT(b_localBCRows.
get_f()!=Teuchos::null);
178 TEUCHOS_ASSERT(b_globalBCRows.
get_f()!=Teuchos::null);
181 RCP<PhysicallyBlockedLinearOpBase<ScalarT> > A = rcp_dynamic_cast<PhysicallyBlockedLinearOpBase<ScalarT> >(b_ghosted.
get_A());
182 RCP<ProductVectorBase<ScalarT> > f = rcp_dynamic_cast<ProductVectorBase<ScalarT> >(b_ghosted.
get_f());
183 RCP<ProductVectorBase<ScalarT> > local_bcs = rcp_dynamic_cast<ProductVectorBase<ScalarT> >(b_localBCRows.
get_f(),
true);
184 RCP<ProductVectorBase<ScalarT> > global_bcs = rcp_dynamic_cast<ProductVectorBase<ScalarT> >(b_globalBCRows.
get_f(),
true);
186 if(adjustX) f = rcp_dynamic_cast<ProductVectorBase<ScalarT> >(b_ghosted.
get_x());
189 if(A!=Teuchos::null) TEUCHOS_ASSERT(A->productRange()->numBlocks()==(
int) blockDim);
190 if(A!=Teuchos::null) TEUCHOS_ASSERT(A->productDomain()->numBlocks()==(
int) blockDim);
191 if(f!=Teuchos::null) TEUCHOS_ASSERT(f->productSpace()->numBlocks()==(
int) blockDim);
192 TEUCHOS_ASSERT(local_bcs->productSpace()->numBlocks()==(
int) blockDim);
193 TEUCHOS_ASSERT(global_bcs->productSpace()->numBlocks()==(
int) blockDim);
195 for(std::size_t i=0;i<blockDim;i++) {
197 RCP<const VectorType> t_local_bcs = rcp_dynamic_cast<const ThyraVector>(local_bcs->getVectorBlock(i),
true)->getConstTpetraVector();
198 RCP<const VectorType> t_global_bcs = rcp_dynamic_cast<const ThyraVector>(global_bcs->getVectorBlock(i),
true)->getConstTpetraVector();
201 RCP<VectorBase<ScalarT> > th_f = (f==Teuchos::null) ? Teuchos::null : f->getNonconstVectorBlock(i);
203 if(th_f==Teuchos::null)
206 t_f = rcp_dynamic_cast<ThyraVector>(th_f,
true)->getTpetraVector();
208 for(std::size_t j=0;j<blockDim;j++) {
209 RCP<const MapType> map_i = getGhostedMap(i);
210 RCP<const MapType> map_j = getGhostedMap(j);
213 RCP<LinearOpBase<ScalarT> > th_A = (A== Teuchos::null)? Teuchos::null : A->getNonconstBlock(i,j);
216 RCP<CrsMatrixType> t_A;
217 if(th_A==Teuchos::null)
220 RCP<OperatorType> t_A_op = rcp_dynamic_cast<ThyraLinearOp>(th_A,
true)->getTpetraOperator();
221 t_A = rcp_dynamic_cast<CrsMatrixType>(t_A_op,
true);
225 if(t_A!=Teuchos::null) {
229 adjustForDirichletConditions(*t_local_bcs,*t_global_bcs,t_f.ptr(),t_A.ptr(),zeroVectorRows);
231 if(t_A!=Teuchos::null) {
240template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
244 const Teuchos::Ptr<VectorType> & f,
245 const Teuchos::Ptr<CrsMatrixType> & A,
246 bool zeroVectorRows)
const
248 if(f==Teuchos::null && A==Teuchos::null)
251 Teuchos::ArrayRCP<ScalarT> f_array = f!=Teuchos::null ? f->get1dViewNonConst() : Teuchos::null;
253 Teuchos::ArrayRCP<const ScalarT> local_bcs_array = local_bcs.get1dView();
254 Teuchos::ArrayRCP<const ScalarT> global_bcs_array = global_bcs.get1dView();
256 TEUCHOS_ASSERT(local_bcs.getLocalLength()==global_bcs.getLocalLength());
257 for(std::size_t i=0;i<local_bcs.getLocalLength();i++) {
258 if(global_bcs_array[i]==0.0)
261 if(local_bcs_array[i]==0.0 || zeroVectorRows) {
265 if(!Teuchos::is_null(f))
267 if(!Teuchos::is_null(A)) {
268 std::size_t numEntries = 0;
269 std::size_t sz = A->getNumEntriesInLocalRow(i);
270 typename CrsMatrixType::nonconst_local_inds_host_view_type indices(
"indices", sz);
271 typename CrsMatrixType::nonconst_values_host_view_type values(
"values", sz);
273 A->getLocalRowCopy(i,indices,values,numEntries);
275 for(std::size_t c=0;c<numEntries;c++)
278 A->replaceLocalValues(i,indices,values);
284 ScalarT scaleFactor = global_bcs_array[i];
287 if(!Teuchos::is_null(f))
288 f_array[i] /= scaleFactor;
289 if(!Teuchos::is_null(A)) {
290 std::size_t numEntries = 0;
291 std::size_t sz = A->getNumEntriesInLocalRow(i);
292 typename CrsMatrixType::nonconst_local_inds_host_view_type indices(
"indices", sz);
293 typename CrsMatrixType::nonconst_values_host_view_type values(
"values", sz);
295 A->getLocalRowCopy(i,indices,values,numEntries);
297 for(std::size_t c=0;c<numEntries;c++)
298 values(c) /= scaleFactor;
300 A->replaceLocalValues(i,indices,values);
306template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
311 TEUCHOS_ASSERT(
false);
319template<
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
320 typename GlobalOrdinalT,
typename NodeT>
321Teuchos::RCP<ReadOnlyVector_GlobalEvaluationData>
324buildReadOnlyDomainContainer()
const
331 LocalOrdinalT, GlobalOrdinalT, NodeT>;
332 vector<RCP<ReadOnlyVector_GlobalEvaluationData>> gedBlocks;
333 for (
int i(0); i < getBlockColCount(); ++i)
335 auto tvroged = rcp(
new TVROGED);
336 tvroged->initialize(getGhostedImport(i), getGhostedMap(i), getMap(i));
337 gedBlocks.push_back(tvroged);
339 auto ged = rcp(
new BVROGED);
340 ged->initialize(getGhostedThyraDomainSpace(), getThyraDomainSpace(),
345#ifdef PANZER_HAVE_EPETRA_STACK
351template<
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
352 typename GlobalOrdinalT,
typename NodeT>
353Teuchos::RCP<WriteVector_GlobalEvaluationData>
356buildWriteDomainContainer()
const
358 using std::logic_error;
361 auto ged = rcp(
new EVWGED);
362 TEUCHOS_TEST_FOR_EXCEPTION(
true, logic_error,
"NOT YET IMPLEMENTED")
367template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
374template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
378 BTLOC & bloc = Teuchos::dyn_cast<BTLOC>(loc);
379 initializeContainer(mem,bloc);
382template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
386 BTLOC & bloc = Teuchos::dyn_cast<BTLOC>(loc);
387 initializeGhostedContainer(mem,bloc);
393template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
401 if((mem & LOC::X) == LOC::X)
402 loc.
set_x(getThyraDomainVector());
404 if((mem & LOC::DxDt) == LOC::DxDt)
405 loc.
set_dxdt(getThyraDomainVector());
407 if((mem & LOC::F) == LOC::F)
408 loc.
set_f(getThyraRangeVector());
410 if((mem & LOC::Mat) == LOC::Mat)
411 loc.
set_A(getThyraMatrix());
414template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
422 if((mem & LOC::X) == LOC::X)
423 loc.
set_x(getGhostedThyraDomainVector());
425 if((mem & LOC::DxDt) == LOC::DxDt)
426 loc.
set_dxdt(getGhostedThyraDomainVector());
428 if((mem & LOC::F) == LOC::F) {
429 loc.
set_f(getGhostedThyraRangeVector());
433 if((mem & LOC::Mat) == LOC::Mat) {
434 loc.
set_A(getGhostedThyraMatrix());
439template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
443 excludedPairs_.insert(std::make_pair(rowBlock,colBlock));
446template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
450 for(std::size_t i=0;i<exPairs.size();i++)
451 excludedPairs_.insert(exPairs[i]);
454template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
455Teuchos::RCP<const GlobalIndexer>
459 return gidProviders_[i];
462template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
466 maps_.resize(blockCnt);
467 ghostedMaps_.resize(blockCnt);
468 importers_.resize(blockCnt);
469 exporters_.resize(blockCnt);
475template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
476Teuchos::RCP<const Thyra::VectorSpaceBase<ScalarT> >
480 if(domainSpace_==Teuchos::null) {
482 std::vector<Teuchos::RCP<const Thyra::VectorSpaceBase<ScalarT> > > vsArray;
483 for(std::size_t i=0;i<gidProviders_.size();i++)
484 vsArray.push_back(Thyra::createVectorSpace<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT>(getMap(i)));
486 domainSpace_ = Thyra::productVectorSpace<ScalarT>(vsArray);
492template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
493Teuchos::RCP<const Thyra::VectorSpaceBase<ScalarT> >
497 if(rangeSpace_==Teuchos::null) {
499 std::vector<Teuchos::RCP<const Thyra::VectorSpaceBase<ScalarT> > > vsArray;
500 for(std::size_t i=0;i<gidProviders_.size();i++)
501 vsArray.push_back(Thyra::createVectorSpace<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT>(getMap(i)));
503 rangeSpace_ = Thyra::productVectorSpace<ScalarT>(vsArray);
509template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
510Teuchos::RCP<const Thyra::VectorSpaceBase<ScalarT> >
514 if(domainSpace_==Teuchos::null) {
515 getThyraDomainSpace();
518 return domainSpace_->getBlock(blk);
521template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
522Teuchos::RCP<const Thyra::VectorSpaceBase<ScalarT> >
526 if(rangeSpace_==Teuchos::null) {
527 getThyraRangeSpace();
530 return rangeSpace_->getBlock(blk);
533template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
534Teuchos::RCP<Thyra::VectorBase<ScalarT> >
538 Teuchos::RCP<Thyra::VectorBase<ScalarT> > vec =
539 Thyra::createMember<ScalarT>(*getThyraDomainSpace());
540 Thyra::assign(vec.ptr(),0.0);
542 Teuchos::RCP<Thyra::ProductVectorBase<ScalarT> > p_vec = Teuchos::rcp_dynamic_cast<Thyra::ProductVectorBase<ScalarT> >(vec);
543 for(std::size_t i=0;i<gidProviders_.size();i++) {
544 TEUCHOS_ASSERT(Teuchos::rcp_dynamic_cast<Thyra::SpmdVectorBase<ScalarT> >(p_vec->getNonconstVectorBlock(i))->spmdSpace()->localSubDim()==
545 Teuchos::as<int>(getMap(i)->getLocalNumElements()));
551template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
552Teuchos::RCP<Thyra::VectorBase<ScalarT> >
556 Teuchos::RCP<Thyra::VectorBase<ScalarT> > vec =
557 Thyra::createMember<ScalarT>(*getThyraRangeSpace());
558 Thyra::assign(vec.ptr(),0.0);
563template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
564Teuchos::RCP<Thyra::LinearOpBase<ScalarT> >
568 Teuchos::RCP<Thyra::PhysicallyBlockedLinearOpBase<ScalarT> > blockedOp = Thyra::defaultBlockedLinearOp<ScalarT>();
571 std::size_t blockDim = gidProviders_.size();
574 blockedOp->beginBlockFill(blockDim,blockDim);
577 for(std::size_t i=0;i<blockDim;i++) {
578 for(std::size_t j=0;j<blockDim;j++) {
579 if(excludedPairs_.find(std::make_pair(i,j))==excludedPairs_.end()) {
581 Teuchos::RCP<Thyra::LinearOpBase<ScalarT> > block = Thyra::createLinearOp<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT>(getTpetraMatrix(i,j));
582 blockedOp->setNonconstBlock(i,j,block);
588 blockedOp->endBlockFill();
593template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
594Teuchos::RCP<const Thyra::VectorSpaceBase<ScalarT> >
598 if(ghostedDomainSpace_==Teuchos::null) {
600 std::vector<Teuchos::RCP<const Thyra::VectorSpaceBase<ScalarT> > > vsArray;
601 for(std::size_t i=0;i<gidProviders_.size();i++)
602 vsArray.push_back(Thyra::createVectorSpace<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT>(getGhostedMap(i)));
604 ghostedDomainSpace_ = Thyra::productVectorSpace<ScalarT>(vsArray);
607 return ghostedDomainSpace_;
610template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
611Teuchos::RCP<const Thyra::VectorSpaceBase<ScalarT> >
615 if(ghostedRangeSpace_==Teuchos::null) {
617 std::vector<Teuchos::RCP<const Thyra::VectorSpaceBase<ScalarT> > > vsArray;
618 for(std::size_t i=0;i<gidProviders_.size();i++)
619 vsArray.push_back(Thyra::createVectorSpace<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT>(getGhostedMap(i)));
621 ghostedRangeSpace_ = Thyra::productVectorSpace<ScalarT>(vsArray);
624 return ghostedRangeSpace_;
627template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
628Teuchos::RCP<Thyra::VectorBase<ScalarT> >
632 Teuchos::RCP<Thyra::VectorBase<ScalarT> > vec =
633 Thyra::createMember<ScalarT>(*getGhostedThyraDomainSpace());
634 Thyra::assign(vec.ptr(),0.0);
639template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
640Teuchos::RCP<Thyra::VectorBase<ScalarT> >
644 Teuchos::RCP<Thyra::VectorBase<ScalarT> > vec =
645 Thyra::createMember<ScalarT>(*getGhostedThyraRangeSpace());
646 Thyra::assign(vec.ptr(),0.0);
651template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
652Teuchos::RCP<Thyra::BlockedLinearOpBase<ScalarT> >
656 Teuchos::RCP<Thyra::PhysicallyBlockedLinearOpBase<ScalarT> > blockedOp = Thyra::defaultBlockedLinearOp<ScalarT>();
659 std::size_t blockDim = gidProviders_.size();
662 blockedOp->beginBlockFill(blockDim,blockDim);
665 for(std::size_t i=0;i<blockDim;i++) {
666 for(std::size_t j=0;j<blockDim;j++) {
667 if(excludedPairs_.find(std::make_pair(i,j))==excludedPairs_.end()) {
669 Teuchos::RCP<Thyra::LinearOpBase<ScalarT> > block = Thyra::createLinearOp<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT>(getGhostedTpetraMatrix(i,j));
670 blockedOp->setNonconstBlock(i,j,block);
676 blockedOp->endBlockFill();
681template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
687 using Teuchos::rcp_dynamic_cast;
690 std::size_t blockDim = gidProviders_.size();
693 RCP<const ProductVectorBase<ScalarT> > prod_in = rcp_dynamic_cast<const ProductVectorBase<ScalarT> >(in,
true);
694 RCP<ProductVectorBase<ScalarT> > prod_out = rcp_dynamic_cast<ProductVectorBase<ScalarT> >(out,
true);
696 TEUCHOS_ASSERT(prod_in->productSpace()->numBlocks()==(
int) blockDim);
697 TEUCHOS_ASSERT(prod_out->productSpace()->numBlocks()==(
int) blockDim);
699 for(std::size_t i=0;i<blockDim;i++) {
701 RCP<const VectorType> tp_in = rcp_dynamic_cast<const ThyraVector>(prod_in->getVectorBlock(i),
true)->getConstTpetraVector();
702 RCP<VectorType> tp_out = rcp_dynamic_cast<ThyraVector>(prod_out->getNonconstVectorBlock(i),
true)->getTpetraVector();
705 ghostToGlobalTpetraVector(i,*tp_in,*tp_out);
709template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
714 using Teuchos::rcp_dynamic_cast;
715 using Teuchos::dyn_cast;
717 using Thyra::PhysicallyBlockedLinearOpBase;
719 std::size_t blockDim = gidProviders_.size();
722 const PhysicallyBlockedLinearOpBase<ScalarT> & prod_in = dyn_cast<const PhysicallyBlockedLinearOpBase<ScalarT> >(in);
723 PhysicallyBlockedLinearOpBase<ScalarT> & prod_out = dyn_cast<PhysicallyBlockedLinearOpBase<ScalarT> >(out);
725 TEUCHOS_ASSERT(prod_in.productRange()->numBlocks()==(
int) blockDim);
726 TEUCHOS_ASSERT(prod_in.productDomain()->numBlocks()==(
int) blockDim);
727 TEUCHOS_ASSERT(prod_out.productRange()->numBlocks()==(
int) blockDim);
728 TEUCHOS_ASSERT(prod_out.productDomain()->numBlocks()==(
int) blockDim);
730 for(std::size_t i=0;i<blockDim;i++) {
731 for(std::size_t j=0;j<blockDim;j++) {
732 if(excludedPairs_.find(std::make_pair(i,j))==excludedPairs_.end()) {
734 RCP<const LinearOpBase<ScalarT> > th_in = prod_in.getBlock(i,j);
735 RCP<LinearOpBase<ScalarT> > th_out = prod_out.getNonconstBlock(i,j);
738 TEUCHOS_ASSERT(th_in!=Teuchos::null);
739 TEUCHOS_ASSERT(th_out!=Teuchos::null);
742 RCP<const OperatorType> tp_op_in = rcp_dynamic_cast<const ThyraLinearOp>(th_in,
true)->getConstTpetraOperator();
743 RCP<OperatorType> tp_op_out = rcp_dynamic_cast<ThyraLinearOp>(th_out,
true)->getTpetraOperator();
745 RCP<const CrsMatrixType> tp_in = rcp_dynamic_cast<const CrsMatrixType>(tp_op_in,
true);
746 RCP<CrsMatrixType> tp_out = rcp_dynamic_cast<CrsMatrixType>(tp_op_out,
true);
749 ghostToGlobalTpetraMatrix(i,*tp_in,*tp_out);
755template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
761 using Teuchos::rcp_dynamic_cast;
764 std::size_t blockDim = gidProviders_.size();
767 RCP<const ProductVectorBase<ScalarT> > prod_in = rcp_dynamic_cast<const ProductVectorBase<ScalarT> >(in,
true);
768 RCP<ProductVectorBase<ScalarT> > prod_out = rcp_dynamic_cast<ProductVectorBase<ScalarT> >(out,
true);
770 TEUCHOS_ASSERT(prod_in->productSpace()->numBlocks()==(
int) blockDim);
771 TEUCHOS_ASSERT(prod_out->productSpace()->numBlocks()==(
int) blockDim);
773 for(std::size_t i=0;i<blockDim;i++) {
775 RCP<const VectorType> tp_in = rcp_dynamic_cast<const ThyraVector>(prod_in->getVectorBlock(i),
true)->getConstTpetraVector();
776 RCP<VectorType> tp_out = rcp_dynamic_cast<ThyraVector>(prod_out->getNonconstVectorBlock(i),
true)->getTpetraVector();
779 globalToGhostTpetraVector(i,*tp_in,*tp_out);
786template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
793 RCP<const ExportType> exporter = getGhostedExport(i);
795 out.doExport(in,*exporter,Tpetra::ADD);
798template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
804 RCP<const MapType> map_i = out.getRangeMap();
805 RCP<const MapType> map_j = out.getDomainMap();
808 RCP<const ExportType> exporter = getGhostedExport(blockRow);
811 out.setAllToScalar(0.0);
812 out.doExport(in,*exporter,Tpetra::ADD);
813 out.fillComplete(map_j,map_i);
816template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
823 RCP<const ImportType> importer = getGhostedImport(i);
825 out.doImport(in,*importer,Tpetra::INSERT);
829template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
830Teuchos::RCP<const Tpetra::Map<LocalOrdinalT,GlobalOrdinalT,NodeT> >
834 if(maps_[i]==Teuchos::null)
835 maps_[i] = buildTpetraMap(i);
840template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
841Teuchos::RCP<const Tpetra::Map<LocalOrdinalT,GlobalOrdinalT,NodeT> >
845 if(ghostedMaps_[i]==Teuchos::null)
846 ghostedMaps_[i] = buildTpetraGhostedMap(i);
848 return ghostedMaps_[i];
852template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
853Teuchos::RCP<const Tpetra::CrsGraph<LocalOrdinalT,GlobalOrdinalT,NodeT> >
857 typedef std::unordered_map<std::pair<int,int>,Teuchos::RCP<const CrsGraphType>,
panzer::pair_hash> GraphMap;
859 typename GraphMap::const_iterator itr = graphs_.find(std::make_pair(i,j));
860 Teuchos::RCP<const CrsGraphType> graph;
861 if(itr==graphs_.end()) {
862 graph = buildTpetraGraph(i,j);
863 graphs_[std::make_pair(i,j)] = graph;
868 TEUCHOS_ASSERT(graph!=Teuchos::null);
872template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
873Teuchos::RCP<const Tpetra::CrsGraph<LocalOrdinalT,GlobalOrdinalT,NodeT> >
877 typedef std::unordered_map<std::pair<int,int>,Teuchos::RCP<const CrsGraphType>,
panzer::pair_hash> GraphMap;
879 typename GraphMap::const_iterator itr = ghostedGraphs_.find(std::make_pair(i,j));
880 Teuchos::RCP<const CrsGraphType> ghostedGraph;
881 if(itr==ghostedGraphs_.end()) {
882 ghostedGraph = buildTpetraGhostedGraph(i,j);
883 ghostedGraphs_[std::make_pair(i,j)] = ghostedGraph;
886 ghostedGraph = itr->second;
888 TEUCHOS_ASSERT(ghostedGraph!=Teuchos::null);
892template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
893Teuchos::RCP<const Tpetra::Import<LocalOrdinalT,GlobalOrdinalT,NodeT> >
897 if(importers_[i]==Teuchos::null)
898 importers_[i] = Teuchos::rcp(
new ImportType(getMap(i),getGhostedMap(i)));
900 return importers_[i];
903template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
904Teuchos::RCP<const Tpetra::Export<LocalOrdinalT,GlobalOrdinalT,NodeT> >
908 if(exporters_[i]==Teuchos::null)
909 exporters_[i] = Teuchos::rcp(
new ExportType(getGhostedMap(i),getMap(i)));
911 return exporters_[i];
914template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
915Teuchos::RCP<const Tpetra::Map<LocalOrdinalT,GlobalOrdinalT,NodeT> >
919 std::vector<GlobalOrdinalT> indices;
922 getGlobalIndexer(i)->getOwnedIndices(indices);
924 return Teuchos::rcp(
new MapType(Teuchos::OrdinalTraits<GlobalOrdinalT>::invalid(),indices,0,comm_));
928template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
929Teuchos::RCP<const Tpetra::Map<LocalOrdinalT,GlobalOrdinalT,NodeT> >
933 std::vector<GlobalOrdinalT> indices;
936 getGlobalIndexer(i)->getOwnedAndGhostedIndices(indices);
938 return Teuchos::rcp(
new MapType(Teuchos::OrdinalTraits<GlobalOrdinalT>::invalid(),indices,0,comm_));
942template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
943Teuchos::RCP<const Tpetra::CrsGraph<LocalOrdinalT,GlobalOrdinalT,NodeT> >
952 RCP<const MapType> map_i = getMap(i);
953 RCP<const MapType> map_j = getMap(j);
955 RCP<CrsGraphType> graph = rcp(
new CrsGraphType(map_i,0));
956 RCP<const CrsGraphType> oGraph = getGhostedGraph(i,j);
959 RCP<const ExportType> exporter = getGhostedExport(i);
960 graph->doExport( *oGraph, *exporter, Tpetra::INSERT );
961 graph->fillComplete(map_j,map_i);
966template <
class LocalOrdinalT>
972template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
973Teuchos::RCP<const Tpetra::CrsGraph<LocalOrdinalT,GlobalOrdinalT,NodeT> >
977 PANZER_FUNC_TIME_MONITOR_DIFF(
"panzer::BlockedTpetraLinearObjFactory::buildTpetraGhostedGraph",BTLOF);
981 using exec_space =
typename CrsGraphType::execution_space;
982 using memory_space =
typename NodeT::memory_space;
986 RCP<const MapType> map_i = getGhostedMap(i);
987 RCP<const MapType> map_j = getGhostedMap(j);
989 std::vector<std::string> elementBlockIds;
991 Teuchos::RCP<const GlobalIndexer> rowProvider, colProvider;
993 rowProvider = getGlobalIndexer(i);
994 colProvider = getGlobalIndexer(j);
996 gidProviders_[0]->getElementBlockIds(elementBlockIds);
999 RCP<CrsGraphType> graph;
1000 if constexpr (NodeT::is_gpu) {
1004 Kokkos::View<LocalOrdinalT *, memory_space> elementsFromBlocks;
1006 auto numElementBlocks = elementBlockIds.size();
1008 std::vector<size_t> elementBlockOffsets(numElementBlocks + 1);
1009 elementBlockOffsets[0] = 0;
1013 std::vector<std::string>::const_iterator blockItr;
1014 for (blockItr = elementBlockIds.begin();
1015 blockItr != elementBlockIds.end(); ++blockItr) {
1016 std::string blockId = *blockItr;
1017 const std::vector<LocalOrdinalT> &elements =
1018 gidProviders_[0]->getElementBlock(
1021 numElements += elements.size();
1023 elementBlockOffsets[blockNo] = numElements;
1025 elementsFromBlocks = Kokkos::View<LocalOrdinalT *, memory_space>(
1026 "elementsFromBlocks", numElements);
1028 for (blockItr = elementBlockIds.begin();
1029 blockItr != elementBlockIds.end(); ++blockItr) {
1030 std::string blockId = *blockItr;
1031 const std::vector<LocalOrdinalT> &elements =
1032 gidProviders_[0]->getElementBlock(
1035 Kokkos::View<
const LocalOrdinalT *, Kokkos::HostSpace,
1036 Kokkos::MemoryTraits<Kokkos::Unmanaged>>
1037 elements_h(elements.data(), elements.size());
1041 Kokkos::make_pair(elementBlockOffsets[blockNo],
1042 elementBlockOffsets[blockNo + 1])),
1050 using local_graph_type =
typename CrsGraphType::local_graph_device_type;
1052 typename local_graph_type::row_map_type::non_const_type;
1054 typename local_graph_type::entries_type::non_const_type;
1056 using entries_map_type =
1057 Kokkos::UnorderedMap<entry_type<LocalOrdinalT>, void, exec_space>;
1059 auto numRows = map_i->getLocalNumElements();
1063 rowptr_type rowptr(
"ghostedGraph_rowptr", numRows + 2);
1065 auto rowLIDs = rowProvider->getLIDs();
1066 auto colLIDs = colProvider->getLIDs();
1068 auto numDoFsPerElementRow = rowLIDs.extent(1);
1069 auto numDoFsPerElementCol = colLIDs.extent(1);
1072 numElements * numDoFsPerElementRow * numDoFsPerElementCol;
1073 entries_map_type entries(capacity);
1079 Kokkos::parallel_for(
1080 "collect_entries", Kokkos::RangePolicy<exec_space>(0, numElements),
1081 KOKKOS_LAMBDA(
const LocalOrdinalT k) {
1082 auto elementId = elementsFromBlocks(k);
1084 for (
size_t dofNoRow = 0; dofNoRow < numDoFsPerElementRow;
1086 entry.
row = rowLIDs(elementId, dofNoRow);
1087 for (
size_t dofNoCol = 0; dofNoCol < numDoFsPerElementCol;
1089 entry.
col = colLIDs(elementId, dofNoCol);
1090 auto result = entries.insert(entry);
1093 Kokkos::atomic_inc(&rowptr(entry.
row + 2));
1099 if (!entries.failed_insert()) {
1100 auto numEntries = entries.size();
1106 typename rowptr_type::value_type numEntries2;
1107 Kokkos::parallel_scan(
1108 "prefix_sum", Kokkos::RangePolicy<exec_space>(0, numRows + 2),
1109 KOKKOS_LAMBDA(
const size_t rlid,
1110 typename rowptr_type::value_type &nnz,
1111 const bool is_final) {
1112 nnz += rowptr(rlid);
1117 TEUCHOS_ASSERT_EQUALITY(numEntries, numEntries2);
1121 Kokkos::ViewAllocateWithoutInitializing(
"ghostedGraph_colidx"),
1127 Kokkos::parallel_for(
1128 "fill", Kokkos::RangePolicy<exec_space>(0, entries.capacity()),
1129 KOKKOS_LAMBDA(
const uint32_t c) {
1130 if (entries.valid_at(c)) {
1131 auto entry = entries.key_at(c);
1133 Kokkos::atomic_fetch_inc(&rowptr(entry.row + 1));
1134 colidx(offset) = entry.col;
1139 KokkosSparse::sort_crs_graph(rowptr, colidx);
1144 Kokkos::subview(rowptr, Kokkos::make_pair((
decltype(numRows))0,
1147 graph->fillComplete(getMap(j), getMap(i));
1153 std::cout <<
"Insufficient capacity: " << capacity << std::endl;
1155 Kokkos::deep_copy(rowptr, 0);
1156 entries = entries_map_type(capacity);
1163 std::vector<size_t> nEntriesPerRow(map_i->getLocalNumElements(), 0);
1164 std::vector<std::string>::const_iterator blockItr;
1165 for (blockItr = elementBlockIds.begin(); blockItr != elementBlockIds.end();
1167 std::string blockId = *blockItr;
1169 const std::vector<LocalOrdinalT> &elements =
1170 gidProviders_[0]->getElementBlock(
1175 std::vector<GlobalOrdinalT> row_gids;
1176 std::vector<GlobalOrdinalT> col_gids;
1179 for (std::size_t elmt = 0; elmt < elements.size(); elmt++) {
1181 rowProvider->getElementGIDs(elements[elmt], row_gids);
1182 colProvider->getElementGIDs(elements[elmt], col_gids);
1183 for (std::size_t row = 0; row < row_gids.size(); row++) {
1184 LocalOrdinalT lid = map_i->getLocalElement(row_gids[row]);
1185 nEntriesPerRow[lid] += col_gids.size();
1189 Teuchos::ArrayView<const size_t> nEntriesPerRowView(nEntriesPerRow);
1190 graph = rcp(
new CrsGraphType(map_i, map_j, nEntriesPerRowView));
1193 for (blockItr = elementBlockIds.begin(); blockItr != elementBlockIds.end();
1195 std::string blockId = *blockItr;
1198 const std::vector<LocalOrdinalT> &elements =
1199 gidProviders_[0]->getElementBlock(
1204 std::vector<GlobalOrdinalT> row_gids;
1205 std::vector<GlobalOrdinalT> col_gids;
1208 for (std::size_t elmt = 0; elmt < elements.size(); elmt++) {
1210 rowProvider->getElementGIDs(elements[elmt], row_gids);
1211 colProvider->getElementGIDs(elements[elmt], col_gids);
1212 for (std::size_t row = 0; row < row_gids.size(); row++)
1213 graph->insertGlobalIndices(row_gids[row], col_gids);
1219 graph->fillComplete(getMap(j), getMap(i));
1225template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
1226Teuchos::RCP<Tpetra::CrsMatrix<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT> >
1230 Teuchos::RCP<const MapType> map_i = getMap(i);
1231 Teuchos::RCP<const MapType> map_j = getMap(j);
1233 Teuchos::RCP<const CrsGraphType> tGraph = getGraph(i,j);
1234 Teuchos::RCP<CrsMatrixType> mat = Teuchos::rcp(
new CrsMatrixType(tGraph));
1235 mat->fillComplete(map_j,map_i);
1240template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
1241Teuchos::RCP<Tpetra::CrsMatrix<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT> >
1245 Teuchos::RCP<const MapType> map_i = getGhostedMap(i);
1246 Teuchos::RCP<const MapType> map_j = getGhostedMap(j);
1248 Teuchos::RCP<const CrsGraphType> tGraph = getGhostedGraph(i,j);
1249 Teuchos::RCP<CrsMatrixType> mat = Teuchos::rcp(
new CrsMatrixType(tGraph));
1250 mat->fillComplete(getMap(j),getMap(i));
1255template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
1256Teuchos::RCP<Tpetra::Vector<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT> >
1260 Teuchos::RCP<const MapType> tMap = getMap(i);
1264template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
1265Teuchos::RCP<Tpetra::Vector<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT> >
1269 Teuchos::RCP<const MapType> tMap = getGhostedMap(i);
1273template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
1274Teuchos::RCP<Tpetra::Vector<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT> >
1278 Teuchos::RCP<const MapType> tMap = getMap(i);
1282template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
1283Teuchos::RCP<Tpetra::Vector<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT> >
1287 Teuchos::RCP<const MapType> tMap = getGhostedMap(i);
1291template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
1296 return gidProviders_.size();
1299template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
1304 return gidProviders_.size();
1307template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
1311 BTLOC & tloc = Teuchos::dyn_cast<BTLOC>(loc);
1312 if(tloc.
get_A()!=Teuchos::null)
1316template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
1320 BTLOC & tloc = Teuchos::dyn_cast<BTLOC>(loc);
1321 if(tloc.
get_A()!=Teuchos::null)
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< CrsMatrixType > get_A() const
Teuchos::RCP< VectorType > get_f() const
void set_A(const Teuchos::RCP< CrsMatrixType > &in)
void set_f(const Teuchos::RCP< VectorType > &in)
void set_x(const Teuchos::RCP< VectorType > &in)
Teuchos::RCP< VectorType > get_x() const
Teuchos::RCP< VectorType > get_dxdt() const
void set_dxdt(const Teuchos::RCP< VectorType > &in)
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
virtual void applyDirichletBCs(const LinearObjContainer &counter, LinearObjContainer &result) const
void ghostToGlobalThyraVector(const Teuchos::RCP< const Thyra::VectorBase< ScalarT > > &in, const Teuchos::RCP< Thyra::VectorBase< ScalarT > > &out) 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< VectorType > getTpetraDomainVector(int i) const
virtual void endFill(LinearObjContainer &loc) const
void initializeContainer(int, LinearObjContainer &loc) const
Teuchos::RCP< const Thyra::VectorSpaceBase< ScalarT > > getGhostedThyraDomainSpace() const
Get the domain vector space (x and dxdt)
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
virtual void ghostToGlobalContainer(const LinearObjContainer &ghostContainer, LinearObjContainer &container, int) const
virtual void globalToGhostContainer(const LinearObjContainer &container, LinearObjContainer &ghostContainer, int) const
virtual Teuchos::RCP< const MapType > buildTpetraGhostedMap(int i) const
virtual Teuchos::RCP< const MapType > buildTpetraMap(int i) const
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)
void makeRoomForBlocks(std::size_t blockCnt)
Allocate the space in the std::vector objects so we can fill with appropriate Tpetra data.
Teuchos::RCP< Thyra::VectorBase< ScalarT > > getGhostedThyraRangeVector() const
Get a range vector.
Tpetra::CrsGraph< LocalOrdinalT, GlobalOrdinalT, NodeT > CrsGraphType
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
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)
virtual void beginFill(LinearObjContainer &loc) const
Teuchos::RCP< CrsMatrixType > getTpetraMatrix(int i, int j) const
virtual Teuchos::RCP< LinearObjContainer > buildGhostedLinearObjContainer() const
void globalToGhostThyraVector(const Teuchos::RCP< const Thyra::VectorBase< ScalarT > > &in, const Teuchos::RCP< Thyra::VectorBase< ScalarT > > &out) const
virtual Teuchos::RCP< LinearObjContainer > buildLinearObjContainer() const
int getBlockColCount() const
how many block columns
void globalToGhostTpetraVector(int i, const VectorType &in, VectorType &out) const
BlockedTpetraLinearObjFactory(const Teuchos::RCP< const Teuchos::MpiComm< int > > &comm, const Teuchos::RCP< const BlockedDOFManager > &gidProvider)
void addExcludedPair(int rowBlock, int colBlock)
exclude a block pair from the matrix
void ghostToGlobalTpetraVector(int i, const VectorType &in, VectorType &out) const
void ghostToGlobalThyraMatrix(const Thyra::LinearOpBase< ScalarT > &in, Thyra::LinearOpBase< ScalarT > &out) const
void ghostToGlobalTpetraMatrix(int blockRow, const CrsMatrixType &in, CrsMatrixType &out) const
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)
Teuchos::RCP< VectorType > getTpetraRangeVector(int i) const
Teuchos::RCP< CrsMatrixType > getGhostedTpetraMatrix(int i, int j) const
virtual Teuchos::RCP< const ImportType > getGhostedImport(int i) const
get importer for converting an overalapped object to a "normal" object
Tpetra::Import< LocalOrdinalT, GlobalOrdinalT, NodeT > ImportType
void addExcludedPairs(const std::vector< std::pair< int, int > > &exPairs)
exclude a vector of pairs from the matrix
virtual Teuchos::RCP< const ExportType > getGhostedExport(int j) const
get exporter for converting an overalapped object to a "normal" object
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< 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.
This class encapsulates the needs of a gather operation to do a halo exchange for blocked vectors.
This class provides a boundary exchange communication mechanism for vectors.
void setRequiresDirichletAdjustment(bool b)
void buildGatherScatterEvaluators(const BuilderT &builder)