43 #ifndef PANZER_BLOCKED_EPETRA_LINEAR_OBJ_FACTORY_IMPL_HPP 44 #define PANZER_BLOCKED_EPETRA_LINEAR_OBJ_FACTORY_IMPL_HPP 50 #include "Epetra_MultiVector.h" 51 #include "Epetra_Vector.h" 52 #include "Epetra_CrsMatrix.h" 53 #include "Epetra_MpiComm.h" 55 #include "EpetraExt_VectorOut.h" 56 #include "EpetraExt_VectorIn.h" 58 #include "Thyra_EpetraThyraWrappers.hpp" 59 #include "Thyra_DefaultProductVectorSpace.hpp" 60 #include "Thyra_DefaultProductVector.hpp" 61 #include "Thyra_DefaultBlockedLinearOp.hpp" 62 #include "Thyra_EpetraLinearOp.hpp" 63 #include "Thyra_SpmdVectorBase.hpp" 64 #include "Thyra_get_Epetra_Operator.hpp" 65 #include "Thyra_VectorStdOps.hpp" 78 template <
typename Traits,
typename LocalOrdinalT>
82 bool useDiscreteAdjoint)
83 : useColGidProviders_(false), eComm_(
Teuchos::null)
84 , rawMpiComm_(
comm->getRawMpiComm())
85 , useDiscreteAdjoint_(useDiscreteAdjoint)
101 template <
typename Traits,
typename LocalOrdinalT>
106 bool useDiscreteAdjoint)
108 , rawMpiComm_(
comm->getRawMpiComm())
109 , useDiscreteAdjoint_(useDiscreteAdjoint)
127 template <
typename Traits,
typename LocalOrdinalT>
134 template <
typename Traits,
typename LocalOrdinalT>
140 using Teuchos::rcp_dynamic_cast;
163 int blockRows = this->getBlockRowCount();
167 for(
int i=0;i<blockRows;i++) {
172 std::stringstream ss;
173 ss << identifier <<
"-" << i <<
".mm";
177 TEUCHOS_ASSERT(0==EpetraExt::MatrixMarketFileToVector(ss.str().c_str(),*getMap(i),ptr_ex));
184 template <
typename Traits,
typename LocalOrdinalT>
190 using Teuchos::rcp_dynamic_cast;
213 int blockRows = this->getBlockRowCount();
217 for(
int i=0;i<blockRows;i++) {
222 std::stringstream ss;
223 ss << identifier <<
"-" << i <<
".mm";
226 TEUCHOS_ASSERT(0==EpetraExt::VectorToMatrixMarketFile(ss.str().c_str(),*ex));
230 template <
typename Traits,
typename LocalOrdinalT>
234 if(!rowDOFManagerContainer_->containsBlockedDOFManager() && !colDOFManagerContainer_->containsBlockedDOFManager()) {
240 std::vector<Teuchos::RCP<const Epetra_Map> > blockMaps;
241 std::size_t blockDim = getBlockRowCount();
242 for(std::size_t i=0;i<blockDim;i++)
243 blockMaps.push_back(getMap(i));
251 template <
typename Traits,
typename LocalOrdinalT>
255 if(!rowDOFManagerContainer_->containsBlockedDOFManager() && !colDOFManagerContainer_->containsBlockedDOFManager()) {
261 std::vector<Teuchos::RCP<const Epetra_Map> > blockMaps;
262 std::size_t blockDim = getBlockRowCount();
263 for(std::size_t i=0;i<blockDim;i++)
264 blockMaps.push_back(getGhostedMap(i));
272 template <
typename Traits,
typename LocalOrdinalT>
281 if( !rowDOFManagerContainer_->containsBlockedDOFManager()
282 && !colDOFManagerContainer_->containsBlockedDOFManager()) {
289 globalToGhostEpetraVector(0,*e_in.
get_x(),*e_out.get_x(),
true);
292 globalToGhostEpetraVector(0,*e_in.
get_dxdt(),*e_out.get_dxdt(),
true);
295 globalToGhostEpetraVector(0,*e_in.
get_f(),*e_out.get_f(),
false);
303 if ( !
is_null(b_in.get_x()) && !
is_null(b_out.get_x()) && ((mem & LOC::X)==LOC::X))
304 globalToGhostThyraVector(b_in.get_x(),b_out.get_x(),
true);
306 if ( !
is_null(b_in.get_dxdt()) && !
is_null(b_out.get_dxdt()) && ((mem & LOC::DxDt)==LOC::DxDt))
307 globalToGhostThyraVector(b_in.get_dxdt(),b_out.get_dxdt(),
true);
309 if ( !
is_null(b_in.get_f()) && !
is_null(b_out.get_f()) && ((mem & LOC::F)==LOC::F))
310 globalToGhostThyraVector(b_in.get_f(),b_out.get_f(),
false);
314 template <
typename Traits,
typename LocalOrdinalT>
323 if( !rowDOFManagerContainer_->containsBlockedDOFManager()
324 && !colDOFManagerContainer_->containsBlockedDOFManager()) {
331 ghostToGlobalEpetraVector(0,*e_in.
get_x(),*e_out.get_x(),
true);
334 ghostToGlobalEpetraVector(0,*e_in.
get_f(),*e_out.get_f(),
false);
337 ghostToGlobalEpetraMatrix(0,*e_in.
get_A(),*e_out.get_A());
345 if ( !
is_null(b_in.get_x()) && !
is_null(b_out.get_x()) && ((mem & LOC::X)==LOC::X))
346 ghostToGlobalThyraVector(b_in.get_x(),b_out.get_x(),
true);
348 if ( !
is_null(b_in.get_f()) && !
is_null(b_out.get_f()) && ((mem & LOC::F)==LOC::F))
349 ghostToGlobalThyraVector(b_in.get_f(),b_out.get_f(),
false);
351 if ( !
is_null(b_in.get_A()) && !
is_null(b_out.get_A()) && ((mem & LOC::Mat)==LOC::Mat))
352 ghostToGlobalThyraMatrix(*b_in.get_A(),*b_out.get_A());
356 template <
typename Traits,
typename LocalOrdinalT>
361 bool zeroVectorRows,
bool adjustX)
const 366 using Teuchos::rcp_dynamic_cast;
368 using Thyra::PhysicallyBlockedLinearOpBase;
371 using Thyra::get_Epetra_Vector;
372 using Thyra::get_Epetra_Operator;
374 int rBlockDim = getBlockRowCount();
375 int cBlockDim = getBlockColCount();
387 if(A==Teuchos::null && b_ghosted.get_A_th()!=Teuchos::null) {
389 A = rcp_dynamic_cast<PhysicallyBlockedLinearOpBase<double> >(Thyra::nonconstBlock1x1(b_ghosted.get_A_th()));
394 : Thyra::castOrCreateNonconstProductVectorBase(b_ghosted.get_f_th());
397 : Thyra::castOrCreateNonconstProductVectorBase(b_localBCRows.get_f_th());
400 : Thyra::castOrCreateNonconstProductVectorBase(b_globalBCRows.get_f_th());
402 if(adjustX) f = Thyra::castOrCreateNonconstProductVectorBase(b_ghosted.get_x_th());
405 if(A!=Teuchos::null)
TEUCHOS_ASSERT(A->productRange()->numBlocks()==rBlockDim);
406 if(A!=Teuchos::null)
TEUCHOS_ASSERT(A->productDomain()->numBlocks()==cBlockDim);
407 if(f!=Teuchos::null)
TEUCHOS_ASSERT(f->productSpace()->numBlocks()==rBlockDim);
408 TEUCHOS_ASSERT(local_bcs->productSpace()->numBlocks()==rBlockDim);
409 TEUCHOS_ASSERT(global_bcs->productSpace()->numBlocks()==rBlockDim);
411 for(
int i=0;i<rBlockDim;i++) {
419 if(th_f==Teuchos::null)
422 e_f = get_Epetra_Vector(*getGhostedMap(i),th_f);
424 for(
int j=0;j<cBlockDim;j++) {
431 if(th_A==Teuchos::null)
437 adjustForDirichletConditions(*e_local_bcs,*e_global_bcs,e_f.
ptr(),e_A.
ptr(),zeroVectorRows);
444 template <
typename Traits,
typename LocalOrdinalT>
450 bool zeroVectorRows)
const 452 if(f==Teuchos::null && A==Teuchos::null)
456 for(
int i=0;i<local_bcs.
MyLength();i++) {
457 if(global_bcs[i]==0.0)
464 if(local_bcs[i]==0.0 || zeroVectorRows) {
472 for(
int c=0;c<numEntries;c++)
479 double scaleFactor = global_bcs[i];
483 (*f)[i] /= scaleFactor;
486 for(
int c=0;c<numEntries;c++)
493 template <
typename Traits,
typename LocalOrdinalT>
499 using Teuchos::rcp_dynamic_cast;
509 RCP<PVector> f_out = Thyra::castOrCreateNonconstProductVectorBase(th_result.get_f_th());
511 int rBlockDim = getBlockRowCount();
512 for(
int i=0;i<rBlockDim;i++) {
517 rcp_dynamic_cast<
const Thyra::SpmdVectorBase<double> >(count->getVectorBlock(i),
true)->getLocalData(Teuchos::ptrFromRef(count_array));
518 rcp_dynamic_cast<
const Thyra::SpmdVectorBase<double> >(f_in->getVectorBlock(i),
true)->getLocalData(Teuchos::ptrFromRef(f_in_array));
519 rcp_dynamic_cast<Thyra::SpmdVectorBase<double> >(f_out->getNonconstVectorBlock(i),
true)->getNonconstLocalData(Teuchos::ptrFromRef(f_out_array));
525 if(count_array[i]!=0.0)
526 f_out_array[i] = f_in_array[i];
531 template <
typename Traits,
typename LocalOrdinalT>
540 if(!colDOFManagerContainer_->containsBlockedDOFManager()) {
542 ged->
initialize(getGhostedColImport(0),getGhostedColMap(0),getColMap(0));
547 std::vector<RCP<ReadOnlyVector_GlobalEvaluationData> > gedBlocks;
548 for(
int i=0;i<getBlockColCount();i++) {
550 vec_ged->
initialize(getGhostedColImport(i),getGhostedColMap(i),getColMap(i));
552 gedBlocks.push_back(vec_ged);
556 ged->
initialize(getGhostedThyraDomainSpace(),getThyraDomainSpace(),gedBlocks);
562 template <
typename Traits,
typename LocalOrdinalT>
569 template <
typename Traits,
typename LocalOrdinalT>
576 initializeContainer_internal(mem,toc);
579 template <
typename Traits,
typename LocalOrdinalT>
587 initializeGhostedContainer_internal(mem,toc);
589 if(rowDOFManagerContainer_->containsBlockedDOFManager()) {
594 if((mem & LOC::F) == LOC::F)
595 bloc.setRequiresDirichletAdjustment(
true);
597 if((mem & LOC::Mat) == LOC::Mat)
598 bloc.setRequiresDirichletAdjustment(
true);
603 if((mem & LOC::F) == LOC::F)
606 if((mem & LOC::Mat) == LOC::Mat)
614 template <
typename Traits,
typename LocalOrdinalT>
622 if((mem & LOC::X) == LOC::X)
623 loc.
set_x_th(getThyraDomainVector());
625 if((mem & LOC::DxDt) == LOC::DxDt)
628 if((mem & LOC::F) == LOC::F)
629 loc.
set_f_th(getThyraRangeVector());
631 if((mem & LOC::Mat) == LOC::Mat)
635 template <
typename Traits,
typename LocalOrdinalT>
643 if((mem & LOC::X) == LOC::X)
644 loc.
set_x_th(getGhostedThyraDomainVector());
646 if((mem & LOC::DxDt) == LOC::DxDt)
649 if((mem & LOC::F) == LOC::F)
650 loc.
set_f_th(getGhostedThyraRangeVector());
652 if((mem & LOC::Mat) == LOC::Mat)
653 loc.
set_A_th(getGhostedThyraMatrix());
656 template <
typename Traits,
typename LocalOrdinalT>
660 excludedPairs_.insert(std::make_pair(rowBlock,colBlock));
663 template <
typename Traits,
typename LocalOrdinalT>
667 for(std::size_t i=0;i<exPairs.size();i++)
668 excludedPairs_.insert(exPairs[i]);
671 template <
typename Traits,
typename LocalOrdinalT>
675 return rowDOFManagerContainer_->getFieldDOFManagers()[i];
678 template <
typename Traits,
typename LocalOrdinalT>
682 return colDOFManagerContainer_->getFieldDOFManagers()[i];
685 template <
typename Traits,
typename LocalOrdinalT>
689 maps_.resize(blockCnt);
690 ghostedMaps_.resize(blockCnt);
691 importers_.resize(blockCnt);
692 exporters_.resize(blockCnt);
695 colMaps_.resize(colBlockCnt);
696 colGhostedMaps_.resize(colBlockCnt);
697 colImporters_.resize(colBlockCnt);
698 colExporters_.resize(colBlockCnt);
705 template <
typename Traits,
typename LocalOrdinalT>
709 if(domainSpace_==Teuchos::null) {
710 if(colDOFManagerContainer_->containsBlockedDOFManager()) {
712 std::vector<Teuchos::RCP<const Thyra::VectorSpaceBase<double> > > vsArray;
713 for(
int i=0;i<getBlockColCount();i++)
714 vsArray.push_back(Thyra::create_VectorSpace(getColMap(i)));
716 domainSpace_ = Thyra::productVectorSpace<double>(vsArray);
721 domainSpace_ = Thyra::create_VectorSpace(getColMap(0));
728 template <
typename Traits,
typename LocalOrdinalT>
732 if(rangeSpace_==Teuchos::null) {
733 if(rowDOFManagerContainer_->containsBlockedDOFManager()) {
735 std::vector<Teuchos::RCP<const Thyra::VectorSpaceBase<double> > > vsArray;
736 for(
int i=0;i<getBlockRowCount();i++)
737 vsArray.push_back(Thyra::create_VectorSpace(getMap(i)));
739 rangeSpace_ = Thyra::productVectorSpace<double>(vsArray);
744 rangeSpace_ = Thyra::create_VectorSpace(getMap(0));
751 template <
typename Traits,
typename LocalOrdinalT>
756 Thyra::createMember<double>(*getThyraDomainSpace());
757 Thyra::assign(vec.
ptr(),0.0);
762 template <
typename Traits,
typename LocalOrdinalT>
767 Thyra::createMember<double>(*getThyraRangeSpace());
768 Thyra::assign(vec.
ptr(),0.0);
773 template <
typename Traits,
typename LocalOrdinalT>
778 if(!rowDOFManagerContainer_->containsBlockedDOFManager() &&
779 !colDOFManagerContainer_->containsBlockedDOFManager()) {
780 return Thyra::nonconstEpetraLinearOp(getEpetraMatrix(0,0));
786 std::size_t rBlockDim = getBlockRowCount();
787 std::size_t cBlockDim = getBlockColCount();
790 blockedOp->beginBlockFill(rBlockDim,cBlockDim);
793 for(std::size_t i=0;i<rBlockDim;i++) {
794 for(std::size_t j=0;j<cBlockDim;j++) {
795 if(excludedPairs_.find(std::make_pair(i,j))==excludedPairs_.end()) {
798 blockedOp->setNonconstBlock(i,j,block);
804 blockedOp->endBlockFill();
809 template <
typename Traits,
typename LocalOrdinalT>
813 if(ghostedDomainSpace_==Teuchos::null) {
814 if(colDOFManagerContainer_->containsBlockedDOFManager()) {
816 std::vector<Teuchos::RCP<const Thyra::VectorSpaceBase<double> > > vsArray;
817 for(
int i=0;i<getBlockColCount();i++)
818 vsArray.push_back(Thyra::create_VectorSpace(getGhostedColMap(i)));
820 ghostedDomainSpace_ = Thyra::productVectorSpace<double>(vsArray);
825 ghostedDomainSpace_ = Thyra::create_VectorSpace(getGhostedColMap(0));
829 return ghostedDomainSpace_;
832 template <
typename Traits,
typename LocalOrdinalT>
836 if(ghostedRangeSpace_==Teuchos::null) {
837 if(rowDOFManagerContainer_->containsBlockedDOFManager()) {
839 std::vector<Teuchos::RCP<const Thyra::VectorSpaceBase<double> > > vsArray;
840 for(
int i=0;i<getBlockRowCount();i++)
841 vsArray.push_back(Thyra::create_VectorSpace(getGhostedMap(i)));
843 ghostedRangeSpace_ = Thyra::productVectorSpace<double>(vsArray);
848 ghostedRangeSpace_ = Thyra::create_VectorSpace(getGhostedMap(0));
852 return ghostedRangeSpace_;
855 template <
typename Traits,
typename LocalOrdinalT>
860 Thyra::createMember<double>(*getGhostedThyraDomainSpace());
861 Thyra::assign(vec.
ptr(),0.0);
866 template <
typename Traits,
typename LocalOrdinalT>
871 Thyra::createMember<double>(*getGhostedThyraRangeSpace());
872 Thyra::assign(vec.
ptr(),0.0);
877 template <
typename Traits,
typename LocalOrdinalT>
882 if(!rowDOFManagerContainer_->containsBlockedDOFManager() &&
883 !colDOFManagerContainer_->containsBlockedDOFManager()) {
884 return Thyra::nonconstEpetraLinearOp(getGhostedEpetraMatrix(0,0));
890 std::size_t rBlockDim = getBlockRowCount();
891 std::size_t cBlockDim = getBlockColCount();
894 blockedOp->beginBlockFill(rBlockDim,cBlockDim);
897 for(std::size_t i=0;i<rBlockDim;i++) {
898 for(std::size_t j=0;j<cBlockDim;j++) {
899 if(excludedPairs_.find(std::make_pair(i,j))==excludedPairs_.end()) {
902 blockedOp->setNonconstBlock(i,j,block);
908 blockedOp->endBlockFill();
913 template <
typename Traits,
typename LocalOrdinalT>
919 using Teuchos::rcp_dynamic_cast;
921 using Thyra::get_Epetra_Vector;
923 std::size_t blockDim = col ? getBlockColCount() : getBlockRowCount();
929 TEUCHOS_ASSERT(prod_in->productSpace()->numBlocks()==(int) blockDim);
930 TEUCHOS_ASSERT(prod_out->productSpace()->numBlocks()==(int) blockDim);
932 for(std::size_t i=0;i<blockDim;i++) {
938 ep_in = get_Epetra_Vector(*getGhostedMap(i),prod_in->getVectorBlock(i));
939 ep_out = get_Epetra_Vector(*getMap(i),prod_out->getNonconstVectorBlock(i));
941 ep_in = get_Epetra_Vector(*getGhostedColMap(i),prod_in->getVectorBlock(i));
942 ep_out = get_Epetra_Vector(*getColMap(i),prod_out->getNonconstVectorBlock(i));
946 ghostToGlobalEpetraVector(i,*ep_in,*ep_out,col);
950 template <
typename Traits,
typename LocalOrdinalT>
955 using Teuchos::rcp_dynamic_cast;
958 using Thyra::PhysicallyBlockedLinearOpBase;
959 using Thyra::get_Epetra_Operator;
962 std::size_t rBlockDim = getBlockRowCount();
963 std::size_t cBlockDim = getBlockColCount();
966 const PhysicallyBlockedLinearOpBase<double> & prod_in =
dyn_cast<
const PhysicallyBlockedLinearOpBase<double> >(in);
967 PhysicallyBlockedLinearOpBase<double> & prod_out =
dyn_cast<PhysicallyBlockedLinearOpBase<double> >(out);
969 TEUCHOS_ASSERT(prod_in.productRange()->numBlocks()==(int) rBlockDim);
970 TEUCHOS_ASSERT(prod_in.productDomain()->numBlocks()==(int) cBlockDim);
971 TEUCHOS_ASSERT(prod_out.productRange()->numBlocks()==(int) rBlockDim);
972 TEUCHOS_ASSERT(prod_out.productDomain()->numBlocks()==(int) cBlockDim);
974 for(std::size_t i=0;i<rBlockDim;i++) {
975 for(std::size_t j=0;j<cBlockDim;j++) {
976 if(excludedPairs_.find(std::make_pair(i,j))==excludedPairs_.end()) {
990 ghostToGlobalEpetraMatrix(i,*ep_in,*ep_out);
996 template <
typename Traits,
typename LocalOrdinalT>
1002 using Teuchos::rcp_dynamic_cast;
1004 using Thyra::get_Epetra_Vector;
1006 std::size_t blockDim = col ? getBlockColCount() : getBlockRowCount();
1012 TEUCHOS_ASSERT(prod_in->productSpace()->numBlocks()==(int) blockDim);
1013 TEUCHOS_ASSERT(prod_out->productSpace()->numBlocks()==(int) blockDim);
1015 for(std::size_t i=0;i<blockDim;i++) {
1021 ep_in = get_Epetra_Vector(*getMap(i),prod_in->getVectorBlock(i));
1022 ep_out = get_Epetra_Vector(*getGhostedMap(i),prod_out->getNonconstVectorBlock(i));
1025 ep_in = get_Epetra_Vector(*getColMap(i),prod_in->getVectorBlock(i));
1026 ep_out = get_Epetra_Vector(*getGhostedColMap(i),prod_out->getNonconstVectorBlock(i));
1030 globalToGhostEpetraVector(i,*ep_in,*ep_out,col);
1037 template <
typename Traits,
typename LocalOrdinalT>
1050 template <
typename Traits,
typename LocalOrdinalT>
1063 template <
typename Traits,
typename LocalOrdinalT>
1077 template <
typename Traits,
typename LocalOrdinalT>
1081 if(maps_[i]==Teuchos::null)
1082 maps_[i] = buildMap(i);
1088 template <
typename Traits,
typename LocalOrdinalT>
1092 if(not useColGidProviders_)
1095 if(colMaps_[i]==Teuchos::null)
1096 colMaps_[i] = buildColMap(i);
1101 template <
typename Traits,
typename LocalOrdinalT>
1105 if(ghostedMaps_[i]==Teuchos::null)
1106 ghostedMaps_[i] = buildGhostedMap(i);
1108 return ghostedMaps_[i];
1111 template <
typename Traits,
typename LocalOrdinalT>
1115 if(not useColGidProviders_)
1116 return getGhostedMap(i);
1118 if(colGhostedMaps_[i]==Teuchos::null)
1119 colGhostedMaps_[i] = buildColGhostedMap(i);
1121 return colGhostedMaps_[i];
1125 template <
typename Traits,
typename LocalOrdinalT>
1131 GraphMap::const_iterator itr = graphs_.find(std::make_pair(i,j));
1133 if(itr==graphs_.end()) {
1134 graph = buildGraph(i,j);
1135 graphs_[std::make_pair(i,j)] = graph;
1138 graph = itr->second;
1144 template <
typename Traits,
typename LocalOrdinalT>
1150 GraphMap::const_iterator itr = ghostedGraphs_.find(std::make_pair(i,j));
1152 if(itr==ghostedGraphs_.end()) {
1153 ghostedGraph = buildGhostedGraph(i,j,
true);
1154 ghostedGraphs_[std::make_pair(i,j)] = ghostedGraph;
1157 ghostedGraph = itr->second;
1160 return ghostedGraph;
1163 template <
typename Traits,
typename LocalOrdinalT>
1167 if(importers_[i]==Teuchos::null)
1170 return importers_[i];
1173 template <
typename Traits,
typename LocalOrdinalT>
1177 if(not useColGidProviders_)
1178 return getGhostedImport(i);
1180 if(colImporters_[i]==Teuchos::null)
1183 return colImporters_[i];
1186 template <
typename Traits,
typename LocalOrdinalT>
1190 if(exporters_[i]==Teuchos::null)
1193 return exporters_[i];
1196 template <
typename Traits,
typename LocalOrdinalT>
1200 if(not useColGidProviders_)
1201 return getGhostedExport(i);
1203 if(colExporters_[i]==Teuchos::null)
1206 return colExporters_[i];
1209 template <
typename Traits,
typename LocalOrdinalT>
1213 std::vector<int> indices;
1216 getGlobalIndexer(i)->getOwnedIndices(indices);
1221 template <
typename Traits,
typename LocalOrdinalT>
1225 if(not useColGidProviders_)
1228 std::vector<int> indices;
1231 getColGlobalIndexer(i)->getOwnedIndices(indices);
1237 template <
typename Traits,
typename LocalOrdinalT>
1241 std::vector<int> indices;
1244 getGlobalIndexer(i)->getOwnedAndGhostedIndices(indices);
1250 template <
typename Traits,
typename LocalOrdinalT>
1254 if(not useColGidProviders_)
1255 return buildGhostedMap(i);
1257 std::vector<int> indices;
1260 getColGlobalIndexer(i)->getOwnedAndGhostedIndices(indices);
1266 template <
typename Traits,
typename LocalOrdinalT>
1296 template <
typename Traits,
typename LocalOrdinalT>
1305 std::vector<std::string> elementBlockIds;
1309 rowProvider = getGlobalIndexer(i);
1310 colProvider = getColGlobalIndexer(j);
1312 rowProvider->getElementBlockIds(elementBlockIds);
1316 const bool han = conn_mgr.
is_null() ? false : conn_mgr->hasAssociatedNeighbors();
1319 std::vector<std::string>::const_iterator blockItr;
1320 for(blockItr=elementBlockIds.begin();blockItr!=elementBlockIds.end();++blockItr) {
1321 std::string blockId = *blockItr;
1324 const std::vector<LocalOrdinalT> & elements = rowProvider->getElementBlock(blockId);
1328 std::vector<int> row_gids;
1329 std::vector<int> col_gids;
1332 for(std::size_t elmt=0;elmt<elements.size();elmt++) {
1334 rowProvider->getElementGIDs(elements[elmt],row_gids);
1335 colProvider->getElementGIDs(elements[elmt],col_gids);
1338 const std::vector<LocalOrdinalT>& aes = conn_mgr->getAssociatedNeighbors(elements[elmt]);
1339 for (
typename std::vector<LocalOrdinalT>::const_iterator eit = aes.begin();
1340 eit != aes.end(); ++eit) {
1341 std::vector<int> other_col_gids;
1342 colProvider->getElementGIDs(*eit, other_col_gids);
1343 col_gids.insert(col_gids.end(), other_col_gids.begin(), other_col_gids.end());
1347 for(std::size_t row=0;row<row_gids.size();row++)
1361 template <
typename Traits,
typename LocalOrdinalT>
1367 using Teuchos::rcp_dynamic_cast;
1374 if(filtered_ugi==Teuchos::null)
1375 return buildGhostedGraph(i,j,
true);
1378 std::vector<int> ghostedActive;
1379 filtered_ugi->getOwnedAndGhostedNotFilteredIndicator(ghostedActive);
1386 for(
int i=0;i<filteredGraph->
NumMyRows();i++) {
1387 std::vector<int> removedIndices;
1392 for(
int j=0;j<numIndices;j++) {
1393 if(ghostedActive[indices[j]]==0)
1394 removedIndices.push_back(indices[j]);
1407 return filteredGraph;
1410 template <
typename Traits,
typename LocalOrdinalT>
1420 template <
typename Traits,
typename LocalOrdinalT>
1430 template <
typename Traits,
typename LocalOrdinalT>
1437 template <
typename Traits,
typename LocalOrdinalT>
1441 return rowDOFManagerContainer_->getFieldBlocks();
1444 template <
typename Traits,
typename LocalOrdinalT>
1448 return colDOFManagerContainer_->getFieldBlocks();
Teuchos::RCP< Thyra::VectorBase< double > > getGhostedThyraRangeVector() const
Get a range vector.
void ghostToGlobalEpetraVector(int i, const Epetra_Vector &in, Epetra_Vector &out, bool col) const
virtual Teuchos::RCP< LinearObjContainer > buildGhostedLinearObjContainer() const
bool is_null(const boost::shared_ptr< T > &p)
virtual const Teuchos::RCP< Epetra_Map > buildMap(int i) const
Teuchos::RCP< Epetra_CrsMatrix > getGhostedEpetraMatrix(int i, int j) const
virtual const Teuchos::RCP< Epetra_Export > getGhostedExport(int j) const
get exporter for converting an overalapped object to a "normal" object
Teuchos::RCP< Thyra::LinearOpBase< double > > getThyraMatrix() const
Get a Thyra operator.
const Teuchos::RCP< Epetra_CrsMatrix > get_A() const
virtual void readVector(const std::string &identifier, LinearObjContainer &loc, int id) const
virtual void ghostToGlobalContainer(const LinearObjContainer &ghostContainer, LinearObjContainer &container, int) const
Teuchos::RCP< const Epetra_Comm > eComm_
Teuchos::RCP< Thyra::VectorBase< double > > getThyraDomainVector() const
Get a domain vector.
bool is_null(const std::shared_ptr< T > &p)
virtual const Teuchos::RCP< Epetra_Map > buildColMap(int i) const
void globalToGhostEpetraVector(int i, const Epetra_Vector &in, Epetra_Vector &out, bool col) const
void globalToGhostThyraVector(const Teuchos::RCP< const Thyra::VectorBase< double > > &in, const Teuchos::RCP< Thyra::VectorBase< double > > &out, bool col) const
Teuchos::RCP< const UniqueGlobalIndexer< LocalOrdinalT, int > > getColGlobalIndexer(int i) const
int PutScalar(double ScalarConstant)
int getBlockColCount() const
how many block columns
virtual void set_x_th(const Teuchos::RCP< Thyra::VectorBase< ScalarT > > &in)=0
T_To & dyn_cast(T_From &from)
virtual const Teuchos::RCP< Epetra_CrsGraph > buildGhostedGraph(int i, int j, bool optimizeStorage) const
virtual Teuchos::RCP< ReadOnlyVector_GlobalEvaluationData > buildDomainContainer() const
Teuchos::RCP< const Thyra::VectorSpaceBase< double > > getThyraRangeSpace() const
Get the range vector space (f)
Teuchos::RCP< const Thyra::VectorSpaceBase< double > > getGhostedThyraRangeSpace() const
Get the range vector space (f)
virtual Teuchos::RCP< Thyra::VectorBase< ScalarT > > get_f_th() const =0
virtual void set_dxdt_th(const Teuchos::RCP< Thyra::VectorBase< ScalarT > > &in)=0
virtual const Teuchos::RCP< Epetra_Map > getMap(int i) const
get the map from the matrix
Teuchos::RCP< Thyra::VectorBase< double > > getThyraRangeVector() const
Get a range vector.
void ghostToGlobalEpetraMatrix(int blockRow, const Epetra_CrsMatrix &in, Epetra_CrsMatrix &out) const
int ExtractMyRowView(int MyRow, int &NumEntries, double *&Values, int *&Indices) const
virtual const Teuchos::RCP< Epetra_Import > getGhostedImport(int i) const
get importer for converting an overalapped object to a "normal" object
PHX::MDField< ScalarT > vector
void ghostToGlobalThyraVector(const Teuchos::RCP< const Thyra::VectorBase< double > > &in, const Teuchos::RCP< Thyra::VectorBase< double > > &out, bool col) const
void ghostToGlobalThyraMatrix(const Thyra::LinearOpBase< double > &in, Thyra::LinearOpBase< double > &out) const
int PutScalar(double ScalarConstant)
virtual const Teuchos::RCP< Epetra_CrsGraph > getGhostedGraph(int i, int j) const
get the ghosted graph of the crs matrix
virtual const Teuchos::RCP< Epetra_CrsGraph > buildFilteredGhostedGraph(int i, int j) const
virtual const Teuchos::RCP< Epetra_Map > getColMap(int i) const
get the map from the matrix
virtual ~BlockedEpetraLinearObjFactory()
virtual void applyDirichletBCs(const LinearObjContainer &counter, LinearObjContainer &result) const
int Export(const Epetra_SrcDistObject &A, const Epetra_Import &Importer, Epetra_CombineMode CombineMode, const Epetra_OffsetIndex *Indexor=0)
virtual Teuchos::RCP< LinearObjContainer > buildLinearObjContainer() const
Teuchos::RCP< const DOFManagerContainer > colDOFManagerContainer_
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
Teuchos::RCP< const Teuchos::OpaqueWrapper< MPI_Comm > > rawMpiComm_
void initialize(const Teuchos::RCP< const Thyra::VectorSpaceBase< double > > &ghostedSpace, const Teuchos::RCP< const Thyra::VectorSpaceBase< double > > &ownedSpace, const std::vector< Teuchos::RCP< ReadOnlyVector_GlobalEvaluationData > > &gedBlocks)
void addExcludedPairs(const std::vector< std::pair< int, int > > &exPairs)
exclude a vector of pairs from the matrix
const Teuchos::RCP< Epetra_Vector > get_x() const
virtual void set_f_th(const Teuchos::RCP< Thyra::VectorBase< ScalarT > > &in)=0
void setRequiresDirichletAdjustment(bool b)
virtual void adjustForDirichletConditions(const LinearObjContainer &localBCRows, const LinearObjContainer &globalBCRows, LinearObjContainer &ghostedObjs, bool zeroVectorRows=false, bool adjustX=false) const
Teuchos::RCP< Thyra::VectorBase< double > > getGhostedThyraDomainVector() const
Get a domain vector.
std::vector< ScalarT > values
virtual const Teuchos::RCP< const Epetra_Comm > getEpetraComm() const
get exporter for converting an overalapped object to a "normal" object
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 Epetra data...
void addExcludedPair(int rowBlock, int colBlock)
exclude a block pair from the matrix
Teuchos::RCP< VectorType > get_dxdt() const
void initializeGhostedContainer(int, LinearObjContainer &loc) const
virtual Teuchos::MpiComm< int > getComm() const
virtual const Teuchos::RCP< Epetra_Map > getGhostedMap(int i) const
get the ghosted map from the matrix
Teuchos::RCP< Epetra_CrsMatrix > getEpetraMatrix(int i, int j) const
int InsertGlobalIndices(int GlobalRow, int NumIndices, int *Indices)
Teuchos::RCP< VectorType > get_f() const
virtual const Teuchos::RCP< Epetra_CrsGraph > buildGraph(int i, int j) const
void setMapsForBlocks(const std::vector< Teuchos::RCP< const Epetra_Map > > &blockMaps)
void initializeContainer(int, LinearObjContainer &loc) const
virtual const Teuchos::RCP< Epetra_Map > buildColGhostedMap(int i) const
virtual const Teuchos::RCP< Epetra_Map > buildGhostedMap(int i) const
int RemoveMyIndices(int LocalRow, int NumIndices, int *Indices)
Teuchos::RCP< const Thyra::VectorSpaceBase< double > > getThyraDomainSpace() const
Get the domain vector space (x and dxdt)
void initializeGhostedContainer_internal(int mem, ThyraObjContainer< double > &loc) const
virtual void set_A_th(const Teuchos::RCP< Thyra::LinearOpBase< ScalarT > > &in)=0
Teuchos::RCP< VectorType > get_x() const
Teuchos::RCP< const Teuchos::Comm< int > > comm
virtual const Teuchos::RCP< Epetra_Import > getGhostedColImport(int i) const
get importer for converting an overalapped object to a "normal" object
virtual const Teuchos::RCP< Epetra_CrsGraph > getGraph(int i, int j) const
get the graph of the crs matrix
virtual void writeVector(const std::string &identifier, const LinearObjContainer &loc, int id) const
virtual void globalToGhostContainer(const LinearObjContainer &container, LinearObjContainer &ghostContainer, int) const
int ExtractMyRowView(int LocalRow, int &NumIndices, int *&Indices) const
Teuchos::RCP< Thyra::LinearOpBase< double > > getGhostedThyraMatrix() const
Get a Thyra operator.
virtual const Teuchos::RCP< Epetra_Map > getGhostedColMap(int i) const
get the ghosted map from the matrix
Teuchos::RCP< const panzer::BlockedDOFManager< int, int > > getGlobalIndexer() const
void buildGatherScatterEvaluators(const BuilderT &builder)
#define TEUCHOS_ASSERT(assertion_test)
#define TEUCHOS_ASSERT_EQUALITY(val1, val2)
void initializeContainer_internal(int mem, ThyraObjContainer< double > &loc) const
int getBlockRowCount() const
how many block rows
RCP< const T > getConst() const
const Teuchos::RCP< Epetra_Vector > get_f() const
Teuchos::RCP< Teuchos::MpiComm< int > > tComm_
int Import(const Epetra_SrcDistObject &A, const Epetra_Import &Importer, Epetra_CombineMode CombineMode, const Epetra_OffsetIndex *Indexor=0)
Teuchos::RCP< const DOFManagerContainer > rowDOFManagerContainer_
virtual const Teuchos::RCP< Epetra_Export > getGhostedColExport(int j) const
get exporter for converting an overalapped object to a "normal" object
const Teuchos::RCP< Epetra_Vector > get_dxdt() const
BlockedEpetraLinearObjFactory(const Teuchos::RCP< const Teuchos::MpiComm< int > > &comm, const Teuchos::RCP< const UniqueGlobalIndexerBase > &gidProvider, bool useDiscreteAdjoint=false)
Teuchos::RCP< const Thyra::VectorSpaceBase< double > > getGhostedThyraDomainSpace() const
Get the domain vector space (x and dxdt)
void initialize(const Teuchos::RCP< const Epetra_Import > &importer, const Teuchos::RCP< const Epetra_Map > &ghostedMap, const Teuchos::RCP< const Epetra_Map > &ownedMap)