43 #ifndef PANZER_DOF_MANAGER_FACTORY_IMPL_HPP 44 #define PANZER_DOF_MANAGER_FACTORY_IMPL_HPP 53 template <
typename LO,
typename GO>
54 Teuchos::RCP<panzer::UniqueGlobalIndexer<LO,GO> >
56 const std::vector<Teuchos::RCP<panzer::PhysicsBlock> > & physicsBlocks,
58 const std::string & fieldOrder)
const 61 #ifdef PANZER_HAVE_FEI 63 return buildUniqueGlobalIndexer<panzer::DOFManagerFEI<LO,GO> >(mpiComm,physicsBlocks,connMngr,fieldOrder);
65 return buildUniqueGlobalIndexer<panzer::DOFManager<LO,GO> >(mpiComm,physicsBlocks,connMngr,fieldOrder);
67 return buildUniqueGlobalIndexer<panzer::DOFManager<LO,GO> >(mpiComm,physicsBlocks,connMngr,fieldOrder);
71 template <
typename LO,
typename GO>
72 template <
typename DOFManagerT>
73 Teuchos::RCP<panzer::UniqueGlobalIndexer<LO,GO> >
75 const std::vector<Teuchos::RCP<panzer::PhysicsBlock> > & physicsBlocks,
77 const std::string & fieldOrder)
const 79 PANZER_FUNC_TIME_MONITOR(
"panzer::DOFManagerFactory::buildUnqueGlobalIndexer");
81 Teuchos::RCP<Teuchos::FancyOStream> pout = Teuchos::getFancyOStream(Teuchos::rcpFromRef(std::cout));
82 pout->setShowProcRank(
true);
83 pout->setOutputToRootOnly(0);
86 Teuchos::RCP<DOFManagerT> dofManager
87 = Teuchos::rcp(
new DOFManagerT(connMngr,*mpiComm));
93 Teuchos::RCP<panzer::DOFManager<LO,GO> > nativeDofMngr =
95 if (nativeDofMngr!=Teuchos::null) {
97 nativeDofMngr->useNeighbors(useNeighbors_);
99 TEUCHOS_TEST_FOR_EXCEPTION(useNeighbors_ && nativeDofMngr.is_null(), std::logic_error,
100 "The non-native DOF manager does not support the necessary ghosting.");
104 bool orientationsRequired =
false;
106 std::vector<Teuchos::RCP<panzer::PhysicsBlock> >::const_iterator physIter;
107 for(physIter=physicsBlocks.begin();physIter!=physicsBlocks.end();++physIter) {
108 Teuchos::RCP<const panzer::PhysicsBlock> pb = *physIter;
110 const std::vector<StrPureBasisPair> & blockFields = pb->getProvidedDOFs();
113 std::set<StrPureBasisPair,StrPureBasisComp> fieldNames;
114 fieldNames.insert(blockFields.begin(),blockFields.end());
117 std::set<StrPureBasisPair,StrPureBasisComp>::const_iterator fieldItr;
118 for (fieldItr=fieldNames.begin();fieldItr!=fieldNames.end();++fieldItr) {
122 orientationsRequired |= fieldItr->second->requiresOrientations();
124 Teuchos::RCP< Intrepid2::Basis<double,Kokkos::DynRankView<double,PHX::Device> > > intrepidBasis
125 = fieldItr->second->getIntrepid2Basis();
126 Teuchos::RCP<Intrepid2FieldPattern> fp = Teuchos::rcp(
new Intrepid2FieldPattern(intrepidBasis));
127 dofManager->addField(pb->elementBlockID(),fieldItr->first,fp);
135 dofManager->setOrientationsRequired(orientationsRequired);
138 std::vector<std::string> fieldOrderV;
140 buildFieldOrder(fieldOrder,fieldOrderV);
142 dofManager->setFieldOrder(fieldOrderV);
146 PANZER_FUNC_TIME_MONITOR(
"panzer::DOFManagerFactory::buildUnqueGlobalIndexer:buildGlobalUnknowns");
147 dofManager->buildGlobalUnknowns();
164 template <
typename LO,
typename GO>
167 buildFieldOrder(
const std::string & fieldOrderStr,std::vector<std::string> & fieldOrder)
171 std::stringstream ss;
181 fieldOrder.push_back(token);
PHX::MDField< ScalarT > vector
static void buildFieldOrder(const std::string &fieldOrderStr, std::vector< std::string > &fieldOrder)
void enableTieBreak(bool enable)
virtual Teuchos::RCP< panzer::UniqueGlobalIndexer< LO, GO > > buildUniqueGlobalIndexer(const Teuchos::RCP< const Teuchos::OpaqueWrapper< MPI_Comm > > &mpiComm, const std::vector< Teuchos::RCP< panzer::PhysicsBlock > > &physicsBlocks, const Teuchos::RCP< ConnManager< LO, GO > > &connMngr, const std::string &fieldOrder="") const