11#ifndef __Panzer_TpetraLinearObjFactory_impl_hpp__
12#define __Panzer_TpetraLinearObjFactory_impl_hpp__
16#ifdef PANZER_HAVE_EPETRA_STACK
23#include "Thyra_TpetraVectorSpace.hpp"
24#include "Thyra_TpetraLinearOp.hpp"
27#include "Tpetra_MultiVector.hpp"
28#include "Tpetra_Vector.hpp"
29#include "Tpetra_CrsMatrix.hpp"
39template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
42 const Teuchos::RCP<const GlobalIndexer> & gidProvider,
44 : comm_(comm), gidProvider_(gidProvider), useFEAssembly_(useFEAssembly)
53template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
56 const Teuchos::RCP<const GlobalIndexer> & gidProvider,
57 const Teuchos::RCP<const GlobalIndexer> & colGidProvider,
59 : comm_(comm), gidProvider_(gidProvider), colGidProvider_(colGidProvider), useFEAssembly_(useFEAssembly)
68template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
76template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
77Teuchos::RCP<LinearObjContainer>
81 Teuchos::RCP<ContainerType> container = Teuchos::rcp(
new ContainerType(getColMap(),getMap()));
86template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
87Teuchos::RCP<LinearObjContainer>
91 Teuchos::RCP<ContainerType> container = Teuchos::rcp(
new ContainerType(getGhostedMap(),getGhostedMap()));
96template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
102 using Teuchos::is_null;
105 const ContainerType & t_in = Teuchos::dyn_cast<const ContainerType>(in);
106 ContainerType & t_out = Teuchos::dyn_cast<ContainerType>(out);
110 if ( !is_null(t_in.get_x_mv()) && !is_null(t_out.get_x_mv()) && ((mem & LOC::X)==LOC::X))
111 globalToGhostTpetraVector(*t_in.get_x_mv(),*t_out.get_x_mv(),
true);
113 if ( !is_null(t_in.get_dxdt_mv()) && !is_null(t_out.get_dxdt_mv()) && ((mem & LOC::DxDt)==LOC::DxDt))
114 globalToGhostTpetraVector(*t_in.get_dxdt_mv(),*t_out.get_dxdt_mv(),
true);
116 if ( !is_null(t_in.get_f_mv()) && !is_null(t_out.get_f_mv()) && ((mem & LOC::F)==LOC::F))
117 globalToGhostTpetraVector(*t_in.get_f_mv(),*t_out.get_f_mv(),
false);
120template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
126 using Teuchos::is_null;
130 const ContainerType & t_in = Teuchos::dyn_cast<const ContainerType>(in);
131 ContainerType & t_out = Teuchos::dyn_cast<ContainerType>(out);
135 if ( !is_null(t_in.get_x_mv()) && !is_null(t_out.get_x_mv()) && ((mem & LOC::X)==LOC::X))
136 ghostToGlobalTpetraVector(*t_in.get_x_mv(),*t_out.get_x_mv(),
true);
138 if ( !is_null(t_in.get_f_mv()) && !is_null(t_out.get_f_mv()) && ((mem & LOC::F)==LOC::F))
139 ghostToGlobalTpetraVector(*t_in.get_f_mv(),*t_out.get_f_mv(),
false);
147 if ( !is_null(t_in.get_A()) && !is_null(t_out.get_A()) && ((mem & LOC::Mat)==LOC::Mat)
148 && t_in.get_A().get()!=t_out.get_A().get())
149 ghostToGlobalTpetraMatrix(*t_in.get_A(),*t_out.get_A());
152template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
156 Tpetra::MultiVector<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT> & out,
bool col)
const
161 RCP<ExportType> exporter = col ? getGhostedColExport() : getGhostedExport();
163 out.doExport(in,*exporter,Tpetra::ADD);
166template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
170 Tpetra::CrsMatrix<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT> & out)
const
175 RCP<ExportType> exporter = getGhostedExport();
178 out.setAllToScalar(0.0);
179 out.doExport(in,*exporter,Tpetra::ADD);
180 out.fillComplete(out.getDomainMap(),out.getRangeMap());
183template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
187 Tpetra::MultiVector<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT> & out,
bool col)
const
192 RCP<ImportType> importer = col ? getGhostedColImport() : getGhostedImport();
194 out.doImport(in,*importer,Tpetra::INSERT);
197template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
203 bool zeroVectorRows,
bool adjustX)
const
205 typedef Teuchos::ArrayRCP<const double>::Ordinal Ordinal;
207 const ContainerType & t_localBCRows = Teuchos::dyn_cast<const ContainerType>(localBCRows);
208 const ContainerType & t_globalBCRows = Teuchos::dyn_cast<const ContainerType>(globalBCRows);
209 ContainerType & t_ghosted = Teuchos::dyn_cast<ContainerType>(ghostedObjs);
211 TEUCHOS_ASSERT(!Teuchos::is_null(t_localBCRows.get_f_mv()));
212 TEUCHOS_ASSERT(!Teuchos::is_null(t_globalBCRows.get_f_mv()));
215 Teuchos::RCP<CrsMatrixType> A = t_ghosted.get_A();
216 Teuchos::RCP<MultiVectorType> f = t_ghosted.get_f_mv();
217 if(adjustX) f = t_ghosted.get_x_mv();
218 Teuchos::ArrayRCP<double> f_array = f!=Teuchos::null ? f->get1dViewNonConst() : Teuchos::null;
222 Teuchos::ArrayRCP<const double> local_bcs_array = local_bcs.get1dView();
223 Teuchos::ArrayRCP<const double> global_bcs_array = global_bcs.get1dView();
225 TEUCHOS_ASSERT(local_bcs_array.size()==global_bcs_array.size());
226 for(Ordinal i=0;i<local_bcs_array.size();i++) {
227 if(global_bcs_array[i]==0.0)
230 if(local_bcs_array[i]==0.0 || zeroVectorRows) {
234 if(!Teuchos::is_null(f))
236 if(!Teuchos::is_null(A)) {
237 std::size_t numEntries = 0;
238 std::size_t sz = A->getNumEntriesInLocalRow(i);
239 typename CrsMatrixType::nonconst_local_inds_host_view_type indices(
"indices", sz);
240 typename CrsMatrixType::nonconst_values_host_view_type values(
"values", sz);
242 A->getLocalRowCopy(i,indices,values,numEntries);
244 for(std::size_t c=0;c<numEntries;c++)
247 A->replaceLocalValues(i,indices,values);
253 double scaleFactor = global_bcs_array[i];
256 if(!Teuchos::is_null(f))
257 f_array[i] /= scaleFactor;
258 if(!Teuchos::is_null(A)) {
259 std::size_t numEntries = 0;
260 std::size_t sz = A->getNumEntriesInLocalRow(i);
261 typename CrsMatrixType::nonconst_local_inds_host_view_type indices(
"indices", sz);
262 typename CrsMatrixType::nonconst_values_host_view_type values(
"values", sz);
264 A->getLocalRowCopy(i,indices,values,numEntries);
266 for(std::size_t c=0;c<numEntries;c++)
267 values(c) /= scaleFactor;
269 A->replaceLocalValues(i,indices,values);
275template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
281 TEUCHOS_ASSERT(
false);
289template<
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
290 typename GlobalOrdinalT,
typename NodeT>
291Teuchos::RCP<ReadOnlyVector_GlobalEvaluationData>
297 LocalOrdinalT, GlobalOrdinalT, NodeT>;
298 auto ged = rcp(
new TVROGED);
299 ged->initialize(getGhostedColImport(), getGhostedColMap(), getColMap());
303#ifdef PANZER_HAVE_EPETRA_STACK
309template<
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
310 typename GlobalOrdinalT,
typename NodeT>
311Teuchos::RCP<WriteVector_GlobalEvaluationData>
315 using std::logic_error;
318 auto ged = rcp(
new EVWGED);
319 TEUCHOS_TEST_FOR_EXCEPTION(
true, logic_error,
"NOT IMPLEMENTED YET")
324template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
328 return *Teuchos::rcp_dynamic_cast<const Teuchos::MpiComm<int> >(getTeuchosComm());
332template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
333Teuchos::RCP<const Thyra::VectorSpaceBase<ScalarT> >
337 if(domainSpace_==Teuchos::null) {
339 domainSpace_ = Thyra::tpetraVectorSpace<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT>(getMap());
341 domainSpace_ = Thyra::tpetraVectorSpace<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT>(getColMap());
348template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
349Teuchos::RCP<const Thyra::VectorSpaceBase<ScalarT> >
353 if(ghostedDomainSpace_==Teuchos::null) {
355 ghostedDomainSpace_ = Thyra::tpetraVectorSpace<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT>(getGhostedMap());
357 ghostedDomainSpace_ = Thyra::tpetraVectorSpace<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT>(getGhostedColMap());
360 return ghostedDomainSpace_;
364template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
365Teuchos::RCP<const Thyra::VectorSpaceBase<ScalarT> >
369 if(rangeSpace_==Teuchos::null)
370 rangeSpace_ = Thyra::tpetraVectorSpace<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT>(getMap());
376template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
377Teuchos::RCP<Thyra::LinearOpBase<ScalarT> >
381 return Thyra::tpetraLinearOp<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT>(getThyraRangeSpace(),getThyraDomainSpace(),getTpetraMatrix());
387template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
392 ContainerType & tloc = Teuchos::dyn_cast<ContainerType>(loc);
393 initializeContainer(mem,tloc);
396template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
405 if((mem & LOC::X) == LOC::X)
406 loc.
set_x(getTpetraColVector());
408 if((mem & LOC::DxDt) == LOC::DxDt)
411 if((mem & LOC::F) == LOC::F)
412 loc.
set_f(getTpetraVector());
414 if((mem & LOC::Mat) == LOC::Mat)
415 loc.
set_A(getTpetraMatrix());
418template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
423 ContainerType & tloc = Teuchos::dyn_cast<ContainerType>(loc);
424 initializeGhostedContainer(mem,tloc);
427template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
436 if((mem & LOC::X) == LOC::X)
437 loc.
set_x(getGhostedTpetraColVector());
439 if((mem & LOC::DxDt) == LOC::DxDt)
440 loc.
set_dxdt(getGhostedTpetraColVector());
442 if((mem & LOC::F) == LOC::F) {
443 loc.
set_f(getGhostedTpetraVector());
447 if((mem & LOC::Mat) == LOC::Mat) {
451 loc.
set_A(getGhostedTpetraMatrix());
460template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
461const Teuchos::RCP<Tpetra::Map<LocalOrdinalT,GlobalOrdinalT,NodeT> >
465 if(map_==Teuchos::null) map_ = buildMap();
471template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
472const Teuchos::RCP<Tpetra::Map<LocalOrdinalT,GlobalOrdinalT,NodeT> >
476 if(cMap_==Teuchos::null) cMap_ = buildColMap();
481template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
482const Teuchos::RCP<Tpetra::Map<LocalOrdinalT,GlobalOrdinalT,NodeT> >
486 if(ghostedMap_==Teuchos::null) ghostedMap_ = buildGhostedMap();
491template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
492const Teuchos::RCP<Tpetra::Map<LocalOrdinalT,GlobalOrdinalT,NodeT> >
496 if(cGhostedMap_==Teuchos::null) cGhostedMap_ = buildGhostedColMap();
502template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
503const Teuchos::RCP<Tpetra::CrsGraph<LocalOrdinalT,GlobalOrdinalT,NodeT> >
507 if(graph_==Teuchos::null) graph_ = buildGraph();
512template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
513const Teuchos::RCP<Tpetra::CrsGraph<LocalOrdinalT,GlobalOrdinalT,NodeT> >
517 if(ghostedGraph_==Teuchos::null) ghostedGraph_ = buildGhostedGraph();
519 return ghostedGraph_;
522template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
523Teuchos::RCP<typename TpetraLinearObjFactory<Traits,ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT>::FECrsGraphType>
527 TEUCHOS_TEST_FOR_EXCEPTION(!useFEAssembly_,std::logic_error,
528 "TpetraLinearObjFactory::getFEGraph: This factory was not constructed with "
529 "useFEAssembly=true, so FE (Tpetra::FECrsGraph/FECrsMatrix/FEMultiVector) objects "
530 "are not available. Pass useFEAssembly=true to the constructor to opt in.");
532 if(feGraph_==Teuchos::null) feGraph_ = buildFEGraph();
537template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
538const Teuchos::RCP<Tpetra::Import<LocalOrdinalT,GlobalOrdinalT,NodeT> >
542 if(ghostedImporter_==Teuchos::null)
543 ghostedImporter_ = Teuchos::rcp(
new ImportType(getMap(),getGhostedMap()));
545 return ghostedImporter_;
548template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
549const Teuchos::RCP<Tpetra::Import<LocalOrdinalT,GlobalOrdinalT,NodeT> >
554 ghostedColImporter_ = getGhostedImport();
556 if(ghostedColImporter_==Teuchos::null)
557 ghostedColImporter_ = Teuchos::rcp(
new ImportType(getColMap(),getGhostedColMap()));
559 return ghostedColImporter_;
562template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
563const Teuchos::RCP<Tpetra::Export<LocalOrdinalT,GlobalOrdinalT,NodeT> >
567 if(ghostedExporter_==Teuchos::null)
568 ghostedExporter_ = Teuchos::rcp(
new ExportType(getGhostedMap(),getMap()));
570 return ghostedExporter_;
573template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
574const Teuchos::RCP<Tpetra::Export<LocalOrdinalT,GlobalOrdinalT,NodeT> >
579 ghostedColExporter_ = getGhostedExport();
581 if(ghostedColExporter_==Teuchos::null)
582 ghostedColExporter_ = Teuchos::rcp(
new ExportType(getGhostedColMap(),getColMap()));
584 return ghostedColExporter_;
590template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
591const Teuchos::RCP<Tpetra::Map<LocalOrdinalT,GlobalOrdinalT,NodeT> >
595 std::vector<GlobalOrdinalT> indices;
598 gidProvider_->getOwnedIndices(indices);
600 return Teuchos::rcp(
new MapType(Teuchos::OrdinalTraits<GlobalOrdinalT>::invalid(),indices,0,comm_));
603template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
604const Teuchos::RCP<Tpetra::Map<LocalOrdinalT,GlobalOrdinalT,NodeT> >
611 std::vector<GlobalOrdinalT> indices;
614 colGidProvider_->getOwnedIndices(indices);
616 return Teuchos::rcp(
new MapType(Teuchos::OrdinalTraits<GlobalOrdinalT>::invalid(),indices,0,comm_));
620template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
621const Teuchos::RCP<Tpetra::Map<LocalOrdinalT,GlobalOrdinalT,NodeT> >
625 std::vector<GlobalOrdinalT> indices;
628 gidProvider_->getOwnedAndGhostedIndices(indices);
630 return Teuchos::rcp(
new MapType(Teuchos::OrdinalTraits<GlobalOrdinalT>::invalid(),indices,0,comm_));
634template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
635const Teuchos::RCP<Tpetra::Map<LocalOrdinalT,GlobalOrdinalT,NodeT> >
640 return buildGhostedMap();
642 std::vector<GlobalOrdinalT> indices;
645 colGidProvider_->getOwnedAndGhostedIndices(indices);
647 return Teuchos::rcp(
new MapType(Teuchos::OrdinalTraits<GlobalOrdinalT>::invalid(),indices,0,comm_));
651template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
652const Teuchos::RCP<Tpetra::CrsGraph<LocalOrdinalT,GlobalOrdinalT,NodeT> >
661 RCP<MapType> rMap = getMap();
662 RCP<MapType> cMap = getColMap();
663 RCP<CrsGraphType> graph = rcp(
new CrsGraphType(rMap,0));
664 RCP<CrsGraphType> oGraph = getGhostedGraph();
667 RCP<ExportType> exporter = getGhostedExport();
668 graph->doExport( *oGraph, *exporter, Tpetra::INSERT );
669 graph->fillComplete(cMap,rMap);
674template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
675const Teuchos::RCP<Tpetra::CrsGraph<LocalOrdinalT,GlobalOrdinalT,NodeT> >
680 Teuchos::RCP<MapType> rMap = getGhostedMap();
681 Teuchos::RCP<MapType> cMap = getGhostedColMap();
683 std::vector<std::string> elementBlockIds;
684 gidProvider_->getElementBlockIds(elementBlockIds);
686 const Teuchos::RCP<const GlobalIndexer>
687 colGidProvider = hasColProvider_ ? colGidProvider_ : gidProvider_;
688 const Teuchos::RCP<const ConnManager> conn_mgr = colGidProvider->getConnManager();
689 const bool han = conn_mgr.is_null() ? false : conn_mgr->hasAssociatedNeighbors();
693 std::vector<size_t> nEntriesPerRow(rMap->getLocalNumElements(), 0);
695 std::vector<std::string>::const_iterator blockItr;
696 for(blockItr=elementBlockIds.begin();blockItr!=elementBlockIds.end();++blockItr) {
697 std::string blockId = *blockItr;
700 const std::vector<LocalOrdinalT> & elements = gidProvider_->getElementBlock(blockId);
703 std::vector<GlobalOrdinalT> gids;
704 std::vector<GlobalOrdinalT> col_gids;
707 for(std::size_t i=0;i<elements.size();i++) {
708 gidProvider_->getElementGIDs(elements[i],gids);
710 colGidProvider->getElementGIDs(elements[i],col_gids);
712 const std::vector<LocalOrdinalT>& aes = conn_mgr->getAssociatedNeighbors(elements[i]);
713 for (
typename std::vector<LocalOrdinalT>::const_iterator eit = aes.begin();
714 eit != aes.end(); ++eit) {
715 std::vector<GlobalOrdinalT> other_col_gids;
716 colGidProvider->getElementGIDs(*eit, other_col_gids);
717 col_gids.insert(col_gids.end(), other_col_gids.begin(), other_col_gids.end());
721 for(std::size_t j=0;j<gids.size();j++){
722 LocalOrdinalT lid = rMap->getLocalElement(gids[j]);
723 nEntriesPerRow[lid] += col_gids.size();
728 Teuchos::ArrayView<const size_t> nEntriesPerRowView(nEntriesPerRow);
729 Teuchos::RCP<CrsGraphType> graph = Teuchos::rcp(
new CrsGraphType(rMap,cMap,
730 nEntriesPerRowView));
733 for(blockItr=elementBlockIds.begin();blockItr!=elementBlockIds.end();++blockItr) {
734 std::string blockId = *blockItr;
737 const std::vector<LocalOrdinalT> & elements = gidProvider_->getElementBlock(blockId);
740 std::vector<GlobalOrdinalT> gids;
741 std::vector<GlobalOrdinalT> col_gids;
744 for(std::size_t i=0;i<elements.size();i++) {
745 gidProvider_->getElementGIDs(elements[i],gids);
747 colGidProvider->getElementGIDs(elements[i],col_gids);
749 const std::vector<LocalOrdinalT>& aes = conn_mgr->getAssociatedNeighbors(elements[i]);
750 for (
typename std::vector<LocalOrdinalT>::const_iterator eit = aes.begin();
751 eit != aes.end(); ++eit) {
752 std::vector<GlobalOrdinalT> other_col_gids;
753 colGidProvider->getElementGIDs(*eit, other_col_gids);
754 col_gids.insert(col_gids.end(), other_col_gids.begin(), other_col_gids.end());
758 for(std::size_t j=0;j<gids.size();j++)
759 graph->insertGlobalIndices(gids[j],col_gids);
764 graph->fillComplete(cMap,rMap);
778template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
779const Teuchos::RCP<typename TpetraLinearObjFactory<Traits,ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT>::FECrsGraphType>
793 Teuchos::RCP<const MapType> rMap = getMap();
794 Teuchos::RCP<const MapType> ownedAndGhostedRowMap = getGhostedMap();
795 Teuchos::RCP<const MapType> ownedDomainMap = getColMap();
796 Teuchos::RCP<const MapType> ownedAndGhostedDomainMap = getGhostedColMap();
798 std::vector<std::string> elementBlockIds;
799 gidProvider_->getElementBlockIds(elementBlockIds);
801 const Teuchos::RCP<const GlobalIndexer>
802 colGidProvider = hasColProvider_ ? colGidProvider_ : gidProvider_;
803 const Teuchos::RCP<const ConnManager> conn_mgr = colGidProvider->getConnManager();
804 const bool han = conn_mgr.is_null() ? false : conn_mgr->hasAssociatedNeighbors();
807 std::vector<size_t> nEntriesPerRow(ownedAndGhostedRowMap->getLocalNumElements(), 0);
809 std::vector<std::string>::const_iterator blockItr;
810 for(blockItr=elementBlockIds.begin();blockItr!=elementBlockIds.end();++blockItr) {
811 std::string blockId = *blockItr;
813 const std::vector<LocalOrdinalT> & elements = gidProvider_->getElementBlock(blockId);
815 std::vector<GlobalOrdinalT> gids;
816 std::vector<GlobalOrdinalT> col_gids;
818 for(std::size_t i=0;i<elements.size();i++) {
819 gidProvider_->getElementGIDs(elements[i],gids);
821 colGidProvider->getElementGIDs(elements[i],col_gids);
823 const std::vector<LocalOrdinalT>& aes = conn_mgr->getAssociatedNeighbors(elements[i]);
824 for (
typename std::vector<LocalOrdinalT>::const_iterator eit = aes.begin();
825 eit != aes.end(); ++eit) {
826 std::vector<GlobalOrdinalT> other_col_gids;
827 colGidProvider->getElementGIDs(*eit, other_col_gids);
828 col_gids.insert(col_gids.end(), other_col_gids.begin(), other_col_gids.end());
832 for(std::size_t j=0;j<gids.size();j++){
833 LocalOrdinalT lid = ownedAndGhostedRowMap->getLocalElement(gids[j]);
834 nEntriesPerRow[lid] += col_gids.size();
839 size_t maxNumRowEntries = 0;
840 for(std::size_t i=0;i<nEntriesPerRow.size();i++)
841 maxNumRowEntries = std::max(maxNumRowEntries,nEntriesPerRow[i]);
846 Teuchos::RCP<FECrsGraphType> feGraph = Teuchos::rcp(
new FECrsGraphType(
847 rMap, ownedAndGhostedRowMap, maxNumRowEntries,
848 ownedAndGhostedDomainMap,
856 Teuchos::RCP<Teuchos::ParameterList> feGraphParams = Teuchos::parameterList();
857 feGraphParams->set(
"Check Col GIDs In At Least One Owned Row",
false);
858 feGraph->setParameterList(feGraphParams);
862 feGraph->beginAssembly();
863 for(blockItr=elementBlockIds.begin();blockItr!=elementBlockIds.end();++blockItr) {
864 std::string blockId = *blockItr;
866 const std::vector<LocalOrdinalT> & elements = gidProvider_->getElementBlock(blockId);
868 std::vector<GlobalOrdinalT> gids;
869 std::vector<GlobalOrdinalT> col_gids;
871 for(std::size_t i=0;i<elements.size();i++) {
872 gidProvider_->getElementGIDs(elements[i],gids);
874 colGidProvider->getElementGIDs(elements[i],col_gids);
876 const std::vector<LocalOrdinalT>& aes = conn_mgr->getAssociatedNeighbors(elements[i]);
877 for (
typename std::vector<LocalOrdinalT>::const_iterator eit = aes.begin();
878 eit != aes.end(); ++eit) {
879 std::vector<GlobalOrdinalT> other_col_gids;
880 colGidProvider->getElementGIDs(*eit, other_col_gids);
881 col_gids.insert(col_gids.end(), other_col_gids.begin(), other_col_gids.end());
885 for(std::size_t j=0;j<gids.size();j++)
886 feGraph->insertGlobalIndices(gids[j],col_gids);
889 feGraph->endAssembly();
894template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
895Teuchos::RCP<Tpetra::Vector<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT> >
899 Teuchos::RCP<const MapType> tMap = getGhostedMap();
903template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
904Teuchos::RCP<Tpetra::Vector<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT> >
908 Teuchos::RCP<const MapType> tMap = getGhostedColMap();
912template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
913Teuchos::RCP<Tpetra::Vector<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT> >
917 Teuchos::RCP<const MapType> tMap = getMap();
921template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
922Teuchos::RCP<Tpetra::Vector<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT> >
926 Teuchos::RCP<const MapType> tMap = getColMap();
930template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
931Teuchos::RCP<Tpetra::CrsMatrix<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT> >
944 return getFEMatrix();
946 Teuchos::RCP<CrsGraphType> tGraph = getGraph();
947 Teuchos::RCP<CrsMatrixType> tMat = Teuchos::rcp(
new CrsMatrixType(tGraph));
948 tMat->fillComplete(tMat->getDomainMap(),tMat->getRangeMap());
953template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
954Teuchos::RCP<Tpetra::CrsMatrix<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT> >
962 TEUCHOS_TEST_FOR_EXCEPTION(useFEAssembly_,std::logic_error,
963 "TpetraLinearObjFactory::getGhostedTpetraMatrix: not available under FE assembly. "
964 "The ghosted container shares the owned container's Tpetra::FECrsMatrix, which is "
965 "connected by beginFill(ghosted,owned); use getFEMatrix() to allocate one.");
967 Teuchos::RCP<CrsGraphType> tGraph = getGhostedGraph();
968 Teuchos::RCP<CrsMatrixType> tMat = Teuchos::rcp(
new CrsMatrixType(tGraph));
969 tMat->fillComplete(tMat->getDomainMap(),tMat->getRangeMap());
974template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
975Teuchos::RCP<typename TpetraLinearObjFactory<Traits,ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT>::FECrsMatrixType>
979 TEUCHOS_TEST_FOR_EXCEPTION(!useFEAssembly_,std::logic_error,
980 "TpetraLinearObjFactory::getFEMatrix: This factory was not constructed with "
981 "useFEAssembly=true, so FE (Tpetra::FECrsGraph/FECrsMatrix/FEMultiVector) objects "
982 "are not available. Pass useFEAssembly=true to the constructor to opt in.");
989template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
990Teuchos::RCP<typename TpetraLinearObjFactory<Traits,ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT>::FEMultiVectorType>
994 TEUCHOS_TEST_FOR_EXCEPTION(!useFEAssembly_,std::logic_error,
995 "TpetraLinearObjFactory::getFEMultiVector: This factory was not constructed with "
996 "useFEAssembly=true, so FE (Tpetra::FECrsGraph/FECrsMatrix/FEMultiVector) objects "
997 "are not available. Pass useFEAssembly=true to the constructor to opt in.");
1008 return Teuchos::rcp(
new FEMultiVectorType(getMap(),getGhostedImport(),numVectors));
1011template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
1012Teuchos::RCP<typename TpetraLinearObjFactory<Traits,ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT>::FEMultiVectorType>
1016 TEUCHOS_TEST_FOR_EXCEPTION(!useFEAssembly_,std::logic_error,
1017 "TpetraLinearObjFactory::getFEColMultiVector: This factory was not constructed with "
1018 "useFEAssembly=true, so FE (Tpetra::FECrsGraph/FECrsMatrix/FEMultiVector) objects "
1019 "are not available. Pass useFEAssembly=true to the constructor to opt in.");
1024 return Teuchos::rcp(
new FEMultiVectorType(getColMap(),getGhostedColImport(),numVectors));
1027template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
1028const Teuchos::RCP<const Teuchos::Comm<int> >
1035template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
1045 if(useFEAssembly_) {
1046 const ContainerType & ownedLoc = Teuchos::dyn_cast<const ContainerType>(container);
1047 if(ownedLoc.get_A()!=Teuchos::null)
1048 Teuchos::dyn_cast<ContainerType>(ghostContainer).set_A(ownedLoc.get_A());
1051 beginFill(ghostContainer);
1054template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
1058 ContainerType & tloc = Teuchos::dyn_cast<ContainerType>(loc);
1059 Teuchos::RCP<CrsMatrixType> A = tloc.get_A();
1060 if(A!=Teuchos::null) {
1072 Teuchos::RCP<FECrsMatrixType> feA = Teuchos::rcp_dynamic_cast<FECrsMatrixType>(A);
1073 if(feA!=Teuchos::null) {
1074 if(feAssemblyOpenOn_!=feA.get()) {
1075 feA->beginAssembly();
1086 feA->setAllToScalar(0.0);
1088 feAssemblyOpenOn_ = feA.get();
1096template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
1100 endFill(ghostContainer);
1107 if(useFEAssembly_) {
1108 ContainerType & ghostedLoc = Teuchos::dyn_cast<ContainerType>(ghostContainer);
1109 const ContainerType & ownedLoc = Teuchos::dyn_cast<const ContainerType>(container);
1110 if(ghostedLoc.get_A()!=Teuchos::null && ghostedLoc.get_A().get()==ownedLoc.get_A().get())
1111 ghostedLoc.set_A(Teuchos::null);
1115template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
1119 ContainerType & tloc = Teuchos::dyn_cast<ContainerType>(loc);
1120 Teuchos::RCP<CrsMatrixType> A = tloc.get_A();
1121 if(A!=Teuchos::null) {
1130 Teuchos::RCP<FECrsMatrixType> feA = Teuchos::rcp_dynamic_cast<FECrsMatrixType>(A);
1131 if(feA!=Teuchos::null) {
1132 if(feAssemblyOpenOn_==feA.get()) {
1134 feAssemblyOpenOn_ =
nullptr;
1138 A->fillComplete(A->getDomainMap(),A->getRangeMap());
This class provides a boundary exchange communication mechanism for vectors.
void setRequiresDirichletAdjustment(bool b)
Abstract, linear-algebra-library-agnostic container for the vectors and matrix used in a nonlinear/tr...
void buildGatherScatterEvaluators(const BuilderT &builder)
Tpetra-backed implementation of LinearObjContainer.
void clear()
Wipe out stored data.
void set_dxdt(const Teuchos::RCP< MultiVectorType > &in)
void set_A(const Teuchos::RCP< CrsMatrixType > &in)
void set_f(const Teuchos::RCP< MultiVectorType > &in)
void set_x(const Teuchos::RCP< MultiVectorType > &in)
void ghostToGlobalTpetraMatrix(const Tpetra::CrsMatrix< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > &in, Tpetra::CrsMatrix< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > &out) const
virtual const Teuchos::RCP< Tpetra::Export< LocalOrdinalT, GlobalOrdinalT, NodeT > > getGhostedExport() const
get exporter for converting an overalapped object to a "normal" object
void initializeContainer(int, LinearObjContainer &loc) const
virtual void applyDirichletBCs(const LinearObjContainer &counter, LinearObjContainer &result) const
virtual Teuchos::RCP< LinearObjContainer > buildGhostedLinearObjContainer() const
Tpetra::FEMultiVector< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > FEMultiVectorType
virtual const Teuchos::RCP< const Teuchos::Comm< int > > getTeuchosComm() const
get exporter for converting an overalapped object to a "normal" object
Teuchos::RCP< Tpetra::Vector< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > > getGhostedTpetraColVector() const
virtual const Teuchos::RCP< Tpetra::Map< LocalOrdinalT, GlobalOrdinalT, NodeT > > getColMap() const
Teuchos::RCP< FEMultiVectorType > getFEColMultiVector(std::size_t numVectors=1) const
Build a domain-space (solution-side) FE multivector.
virtual const Teuchos::RCP< Tpetra::Map< LocalOrdinalT, GlobalOrdinalT, NodeT > > buildGhostedColMap() const
virtual const Teuchos::RCP< Tpetra::Map< LocalOrdinalT, GlobalOrdinalT, NodeT > > getGhostedColMap() const
Teuchos::RCP< FEMultiVectorType > getFEMultiVector(std::size_t numVectors=1) const
Build a new Tpetra::FEMultiVector compatible with the FE graph.
virtual const Teuchos::RCP< Tpetra::CrsGraph< LocalOrdinalT, GlobalOrdinalT, NodeT > > buildGraph() const
virtual const Teuchos::RCP< Tpetra::CrsGraph< LocalOrdinalT, GlobalOrdinalT, NodeT > > buildGhostedGraph() const
Tpetra::Map< LocalOrdinalT, GlobalOrdinalT, NodeT > MapType
Teuchos::RCP< Tpetra::Vector< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > > getTpetraVector() const
void globalToGhostTpetraVector(const Tpetra::MultiVector< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > &in, Tpetra::MultiVector< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > &out, bool col) const
virtual Teuchos::RCP< const Thyra::VectorSpaceBase< ScalarT > > getGhostedThyraDomainSpace() const
Get the domain space.
virtual const Teuchos::RCP< Tpetra::Export< LocalOrdinalT, GlobalOrdinalT, NodeT > > getGhostedColExport() const
virtual void beginFill(LinearObjContainer &loc) const
Open a container for filling. Takes either a ghosted or an owned container.
virtual ~TpetraLinearObjFactory()
virtual const Teuchos::RCP< Tpetra::Map< LocalOrdinalT, GlobalOrdinalT, NodeT > > getGhostedMap() const
get the ghosted map from the matrix
virtual void adjustForDirichletConditions(const LinearObjContainer &localBCRows, const LinearObjContainer &globalBCRows, LinearObjContainer &ghostedObjs, bool zeroVectorRows=false, bool adjustX=false) const
Tpetra::FECrsGraph< LocalOrdinalT, GlobalOrdinalT, NodeT > FECrsGraphType
TpetraLinearObjContainer< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > ContainerType
Tpetra::Export< LocalOrdinalT, GlobalOrdinalT, NodeT > ExportType
Teuchos::RCP< FECrsGraphType > getFEGraph() const
Get the (cached) FE graph, built via the Tpetra::FECrsGraph "V2" constructor.
virtual Teuchos::RCP< ReadOnlyVector_GlobalEvaluationData > buildReadOnlyDomainContainer() const
virtual Teuchos::RCP< Thyra::LinearOpBase< ScalarT > > getThyraMatrix() const
Get a matrix operator.
Tpetra::CrsGraph< LocalOrdinalT, GlobalOrdinalT, NodeT > CrsGraphType
Teuchos::RCP< Tpetra::CrsMatrix< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > > getGhostedTpetraMatrix() const
void initializeGhostedContainer(int, LinearObjContainer &loc) const
virtual const Teuchos::RCP< Tpetra::Map< LocalOrdinalT, GlobalOrdinalT, NodeT > > buildGhostedMap() const
Teuchos::RCP< Tpetra::Vector< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > > getGhostedTpetraVector() const
virtual const Teuchos::RCP< Tpetra::CrsGraph< LocalOrdinalT, GlobalOrdinalT, NodeT > > getGraph() const
get the graph of the crs matrix
Tpetra::FECrsMatrix< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > FECrsMatrixType
virtual const Teuchos::RCP< Tpetra::Map< LocalOrdinalT, GlobalOrdinalT, NodeT > > buildMap() const
virtual void ghostToGlobalContainer(const LinearObjContainer &ghostContainer, LinearObjContainer &container, int) const
virtual void endFill(LinearObjContainer &loc) const
Close a container after filling. Takes either a ghosted or an owned container.
Tpetra::MultiVector< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > MultiVectorType
virtual Teuchos::RCP< const Thyra::VectorSpaceBase< ScalarT > > getThyraDomainSpace() const
Get the domain space.
virtual Teuchos::RCP< LinearObjContainer > buildLinearObjContainer() const
Teuchos::RCP< const GlobalIndexer > colGidProvider_
Teuchos::RCP< Tpetra::Vector< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > > getTpetraColVector() const
virtual const Teuchos::RCP< Tpetra::CrsGraph< LocalOrdinalT, GlobalOrdinalT, NodeT > > getGhostedGraph() const
get the ghosted graph of the crs matrix
Tpetra::CrsMatrix< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > CrsMatrixType
Teuchos::RCP< FECrsMatrixType > getFEMatrix() const
Build a new Tpetra::FECrsMatrix over the (cached) FE graph. Fresh object per call.
void ghostToGlobalTpetraVector(const Tpetra::MultiVector< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > &in, Tpetra::MultiVector< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > &out, bool col) const
virtual const Teuchos::RCP< Tpetra::Import< LocalOrdinalT, GlobalOrdinalT, NodeT > > getGhostedColImport() const
virtual Teuchos::RCP< const Thyra::VectorSpaceBase< ScalarT > > getThyraRangeSpace() const
Get the range space.
virtual Teuchos::MpiComm< int > getComm() 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 > > buildColMap() const
TpetraLinearObjFactory(const Teuchos::RCP< const Teuchos::Comm< int > > &comm, const Teuchos::RCP< const GlobalIndexer > &gidProvider, bool useFEAssembly=false)
virtual void globalToGhostContainer(const LinearObjContainer &container, LinearObjContainer &ghostContainer, int) const
virtual const Teuchos::RCP< Tpetra::Import< LocalOrdinalT, GlobalOrdinalT, NodeT > > getGhostedImport() const
get importer for converting an overalapped object to a "normal" object
Tpetra::Vector< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > VectorType
virtual const Teuchos::RCP< FECrsGraphType > buildFEGraph() const
Tpetra::Import< LocalOrdinalT, GlobalOrdinalT, NodeT > ImportType
Teuchos::RCP< Tpetra::CrsMatrix< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > > getTpetraMatrix() const
Panzer's specialization of the Phalanx traits class.