3 #include "Teuchos_RCP.hpp" 7 #include "Panzer_EpetraLinearObjFactory.hpp" 8 #include "Panzer_TpetraLinearObjFactory.hpp" 15 const Teuchos::RCP<const UniqueGlobalIndexerBase> & dUgi)
22 const Teuchos::RCP<const UniqueGlobalIndexerBase> & rUgi)
30 const Teuchos::RCP<const UniqueGlobalIndexerBase> & rUgi,
31 const Teuchos::RCP<const UniqueGlobalIndexerBase> & dUgi)
36 using Teuchos::rcp_dynamic_cast;
38 using Teuchos::ptr_dynamic_cast;
39 using Teuchos::ptrFromRef;
67 Ptr<const TpetraLOF> tpetra_lof = ptr_dynamic_cast<
const TpetraLOF>(ptrFromRef(lof));
68 if(tpetra_lof!=null) {
69 TEUCHOS_TEST_FOR_EXCEPTION(
true,std::logic_error,
70 "panzer::cloneWithNewRangeAndDomain: Tpetra LOF does not yet support " 71 "different range and domain indexers!");
74 Ptr<const BlockedEpetraLOF> blk_epetra_lof = ptr_dynamic_cast<
const BlockedEpetraLOF>(ptrFromRef(lof));
75 if(blk_epetra_lof!=null) {
76 auto rangeUGI = (rUgi==null ? blk_epetra_lof->getRangeGlobalIndexer() : rUgi);
77 auto domainUGI = (dUgi==null ? blk_epetra_lof->getDomainGlobalIndexer() : dUgi);
78 RCP<Teuchos::MpiComm<int> > mpiComm = rcp(
new Teuchos::MpiComm<int>(blk_epetra_lof->getComm()));
79 return rcp(
new BlockedEpetraLOF(mpiComm,rangeUGI,domainUGI));
82 Ptr<const BlockedTpetraLOF> blk_tpetra_lof = ptr_dynamic_cast<
const BlockedTpetraLOF>(ptrFromRef(lof));
83 if(blk_tpetra_lof!=null) {
84 TEUCHOS_TEST_FOR_EXCEPTION(
true,std::logic_error,
85 "panzer::cloneWithNewRangeAndDomain: Blocked Tpetra LOF does not yet support " 86 "different range and domain indexers!");
89 TEUCHOS_TEST_FOR_EXCEPTION(
true,std::logic_error,
90 "panzer::cloneWithNewRangeAndDomain: Could not determine the type of LOF, clone not support!");
Teuchos::RCP< const LinearObjFactory< panzer::Traits > > cloneWithNewRangeAndDomain(const LinearObjFactory< panzer::Traits > &lof, const Teuchos::RCP< const UniqueGlobalIndexerBase > &rUgi, const Teuchos::RCP< const UniqueGlobalIndexerBase > &dUgi)
Clone a linear object factory, but using a different range and domain.
Teuchos::RCP< const LinearObjFactory< panzer::Traits > > cloneWithNewDomain(const LinearObjFactory< panzer::Traits > &lof, const Teuchos::RCP< const UniqueGlobalIndexerBase > &dUgi)
Clone a linear object factory, but using a different domain.
Teuchos::RCP< const LinearObjFactory< panzer::Traits > > cloneWithNewRange(const LinearObjFactory< panzer::Traits > &lof, const Teuchos::RCP< const UniqueGlobalIndexerBase > &rUgi)
Clone a linear object factory, but using a different range.