43 #ifndef PANZER_DOF_MANAGER_FACTORY_IMPL_HPP
44 #define PANZER_DOF_MANAGER_FACTORY_IMPL_HPP
54 template <
typename LO,
typename GO>
55 Teuchos::RCP<panzer::UniqueGlobalIndexer<LO,GO> >
57 const std::vector<Teuchos::RCP<panzer::PhysicsBlock> > & physicsBlocks,
59 const std::string & fieldOrder)
const
61 return buildUniqueGlobalIndexer<panzer::DOFManager<LO,GO> >(mpiComm,physicsBlocks,connMngr,fieldOrder);
64 template <
typename LO,
typename GO>
65 template <
typename DOFManagerT>
66 Teuchos::RCP<panzer::UniqueGlobalIndexer<LO,GO> >
68 const std::vector<Teuchos::RCP<panzer::PhysicsBlock> > & physicsBlocks,
70 const std::string & fieldOrder)
const
72 PANZER_FUNC_TIME_MONITOR(
"panzer::DOFManagerFactory::buildUnqueGlobalIndexer");
74 Teuchos::RCP<Teuchos::FancyOStream> pout = Teuchos::getFancyOStream(Teuchos::rcpFromRef(std::cout));
75 pout->setShowProcRank(
true);
76 pout->setOutputToRootOnly(0);
79 Teuchos::RCP<DOFManagerT> dofManager
80 = Teuchos::rcp(
new DOFManagerT(connMngr,*mpiComm));
86 Teuchos::RCP<panzer::DOFManager<LO,GO> > nativeDofMngr =
87 Teuchos::rcp_dynamic_cast<panzer::DOFManager<LO,GO> >(dofManager);
88 if (nativeDofMngr!=Teuchos::null) {
89 nativeDofMngr->enableTieBreak(useTieBreak_);
90 nativeDofMngr->useNeighbors(useNeighbors_);
92 TEUCHOS_TEST_FOR_EXCEPTION(useNeighbors_ && nativeDofMngr.is_null(), std::logic_error,
93 "The non-native DOF manager does not support the necessary ghosting.");
97 bool orientationsRequired =
false;
99 std::vector<Teuchos::RCP<panzer::PhysicsBlock> >::const_iterator physIter;
100 for(physIter=physicsBlocks.begin();physIter!=physicsBlocks.end();++physIter) {
101 Teuchos::RCP<const panzer::PhysicsBlock> pb = *physIter;
103 const std::vector<StrPureBasisPair> & blockFields = pb->getProvidedDOFs();
106 std::set<StrPureBasisPair,StrPureBasisComp> fieldNames;
107 fieldNames.insert(blockFields.begin(),blockFields.end());
110 std::set<StrPureBasisPair,StrPureBasisComp>::const_iterator fieldItr;
111 for (fieldItr=fieldNames.begin();fieldItr!=fieldNames.end();++fieldItr) {
115 orientationsRequired |= fieldItr->second->requiresOrientations();
117 Teuchos::RCP< Intrepid2::Basis<PHX::Device::execution_space,double,double> > intrepidBasis
118 = fieldItr->second->getIntrepid2Basis();
119 Teuchos::RCP<Intrepid2FieldPattern> fp = Teuchos::rcp(
new Intrepid2FieldPattern(intrepidBasis));
120 dofManager->addField(pb->elementBlockID(),fieldItr->first,fp);
128 dofManager->setOrientationsRequired(orientationsRequired);
131 std::vector<std::string> fieldOrderV;
133 buildFieldOrder(fieldOrder,fieldOrderV);
135 dofManager->setFieldOrder(fieldOrderV);
139 PANZER_FUNC_TIME_MONITOR(
"panzer::DOFManagerFactory::buildUnqueGlobalIndexer:buildGlobalUnknowns");
140 dofManager->buildGlobalUnknowns();
157 template <
typename LO,
typename GO>
160 buildFieldOrder(
const std::string & fieldOrderStr,std::vector<std::string> & fieldOrder)
164 std::stringstream ss;
174 fieldOrder.push_back(token);