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,
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,
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>
86template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
87Teuchos::RCP<LinearObjContainer>
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))
116 if ( !is_null(t_in.
get_f_mv()) && !is_null(t_out.
get_f_mv()) && ((mem & LOC::F)==LOC::F))
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))
138 if ( !is_null(t_in.
get_f_mv()) && !is_null(t_out.
get_f_mv()) && ((mem & LOC::F)==LOC::F))
147 if ( !is_null(t_in.
get_A()) && !is_null(t_out.
get_A()) && ((mem & LOC::Mat)==LOC::Mat)
152template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
156 Tpetra::MultiVector<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT> & out,
bool col)
const
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
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
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);
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> >
339 domainSpace_ = Thyra::tpetraVectorSpace<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT>(
getMap());
348template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
349Teuchos::RCP<const Thyra::VectorSpaceBase<ScalarT> >
364template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
365Teuchos::RCP<const Thyra::VectorSpaceBase<ScalarT> >
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> >
387template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
392 ContainerType & tloc = Teuchos::dyn_cast<ContainerType>(loc);
396template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
405 if((mem & LOC::X) == LOC::X)
408 if((mem & LOC::DxDt) == LOC::DxDt)
411 if((mem & LOC::F) == LOC::F)
414 if((mem & LOC::Mat) == LOC::Mat)
418template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
423 ContainerType & tloc = Teuchos::dyn_cast<ContainerType>(loc);
427template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
436 if((mem & LOC::X) == LOC::X)
439 if((mem & LOC::DxDt) == LOC::DxDt)
442 if((mem & LOC::F) == LOC::F) {
447 if((mem & LOC::Mat) == LOC::Mat) {
460template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
461const Teuchos::RCP<Tpetra::Map<LocalOrdinalT,GlobalOrdinalT,NodeT> >
471template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
472const Teuchos::RCP<Tpetra::Map<LocalOrdinalT,GlobalOrdinalT,NodeT> >
481template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
482const Teuchos::RCP<Tpetra::Map<LocalOrdinalT,GlobalOrdinalT,NodeT> >
491template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
492const Teuchos::RCP<Tpetra::Map<LocalOrdinalT,GlobalOrdinalT,NodeT> >
502template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
503const Teuchos::RCP<Tpetra::CrsGraph<LocalOrdinalT,GlobalOrdinalT,NodeT> >
512template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
513const Teuchos::RCP<Tpetra::CrsGraph<LocalOrdinalT,GlobalOrdinalT,NodeT> >
522template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
523Teuchos::RCP<typename TpetraLinearObjFactory<Traits,ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT>::FECrsGraphType>
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.");
537template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
538const Teuchos::RCP<Tpetra::Import<LocalOrdinalT,GlobalOrdinalT,NodeT> >
548template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
549const Teuchos::RCP<Tpetra::Import<LocalOrdinalT,GlobalOrdinalT,NodeT> >
562template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
563const Teuchos::RCP<Tpetra::Export<LocalOrdinalT,GlobalOrdinalT,NodeT> >
573template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
574const Teuchos::RCP<Tpetra::Export<LocalOrdinalT,GlobalOrdinalT,NodeT> >
590template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
591const Teuchos::RCP<Tpetra::Map<LocalOrdinalT,GlobalOrdinalT,NodeT> >
595 std::vector<GlobalOrdinalT> 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;
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;
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> >
642 std::vector<GlobalOrdinalT> 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();
663 RCP<CrsGraphType> graph = rcp(
new CrsGraphType(rMap,0));
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> >
683 std::vector<std::string> elementBlockIds;
686 const Teuchos::RCP<const GlobalIndexer>
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++) {
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++) {
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();
798 std::vector<std::string> elementBlockIds;
801 const Teuchos::RCP<const GlobalIndexer>
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++) {
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++) {
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> >
903template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
904Teuchos::RCP<Tpetra::Vector<ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT> >
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> >
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> >
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.");
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>
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>
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.");
1011template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
1012Teuchos::RCP<typename TpetraLinearObjFactory<Traits,ScalarT,LocalOrdinalT,GlobalOrdinalT,NodeT>::FEMultiVectorType>
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.");
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>
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());
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) {
1075 feA->beginAssembly();
1086 feA->setAllToScalar(0.0);
1096template <
typename Traits,
typename ScalarT,
typename LocalOrdinalT,
typename GlobalOrdinalT,
typename NodeT>
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) {
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)
const Teuchos::RCP< MultiVectorType > get_f_mv() const
const Teuchos::RCP< MultiVectorType > get_dxdt_mv() const
const Teuchos::RCP< MultiVectorType > get_x_mv() const
void set_x(const Teuchos::RCP< MultiVectorType > &in)
const Teuchos::RCP< CrsMatrixType > get_A() const
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
Teuchos::RCP< const Thyra::VectorSpaceBase< double > > domainSpace_
void initializeContainer(int, LinearObjContainer &loc) const
bool useFEAssembly() const
True if this factory was constructed with FE assembly enabled.
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
Teuchos::RCP< ExportType > ghostedColExporter_
virtual const Teuchos::RCP< Tpetra::Map< LocalOrdinalT, GlobalOrdinalT, NodeT > > getColMap() const
Teuchos::RCP< ImportType > ghostedImporter_
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
const FECrsMatrixType * feAssemblyOpenOn_
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
Teuchos::RCP< FECrsGraphType > feGraph_
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.
Teuchos::RCP< Tpetra::Map< LocalOrdinalT, GlobalOrdinalT, NodeT > > cGhostedMap_
Teuchos::RCP< Tpetra::Map< LocalOrdinalT, GlobalOrdinalT, NodeT > > cMap_
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.
Teuchos::RCP< Tpetra::CrsGraph< LocalOrdinalT, GlobalOrdinalT, NodeT > > graph_
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< const Thyra::VectorSpaceBase< double > > rangeSpace_
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::Map< LocalOrdinalT, GlobalOrdinalT, NodeT > > map_
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
Teuchos::RCP< Tpetra::Map< LocalOrdinalT, GlobalOrdinalT, NodeT > > ghostedMap_
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
Teuchos::RCP< ImportType > ghostedColImporter_
virtual const Teuchos::RCP< Tpetra::Map< LocalOrdinalT, GlobalOrdinalT, NodeT > > getMap() const
get the map from the matrix
Teuchos::RCP< const Teuchos::Comm< int > > comm_
virtual const Teuchos::RCP< Tpetra::Map< LocalOrdinalT, GlobalOrdinalT, NodeT > > buildColMap() const
Teuchos::RCP< ExportType > ghostedExporter_
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
Teuchos::RCP< Tpetra::CrsGraph< LocalOrdinalT, GlobalOrdinalT, NodeT > > ghostedGraph_
Tpetra::Vector< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > VectorType
virtual const Teuchos::RCP< FECrsGraphType > buildFEGraph() const
Tpetra::Import< LocalOrdinalT, GlobalOrdinalT, NodeT > ImportType
Teuchos::RCP< const Thyra::VectorSpaceBase< double > > ghostedDomainSpace_
Teuchos::RCP< Tpetra::CrsMatrix< ScalarT, LocalOrdinalT, GlobalOrdinalT, NodeT > > getTpetraMatrix() const
Teuchos::RCP< const GlobalIndexer > gidProvider_
Panzer's specialization of the Phalanx traits class.