112 const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks,
113 const std::vector<WorksetDescriptor> & wkstDesc,
115 const Teuchos::ParameterList& closure_models,
117 const Teuchos::ParameterList& user_data,
119 bool closureModelByEBlock)
124 TEUCHOS_TEST_FOR_EXCEPTION(getWorksetContainer()==Teuchos::null,std::logic_error,
125 "panzer::FMB::setupVolumeFieldManagers: method function getWorksetContainer() returns null. "
126 "Plase call setWorksetContainer() before calling this method");
127 TEUCHOS_TEST_FOR_EXCEPTION(physicsBlocks.size()!=wkstDesc.size(),std::runtime_error,
128 "panzer::FMB::setupVolumeFieldManagers: physics block count must match workset descriptor count.");
130 phx_volume_field_managers_.clear();
134 for (std::size_t blkInd=0;blkInd<physicsBlocks.size();++blkInd) {
135 RCP<panzer::PhysicsBlock> pb = physicsBlocks[blkInd];
139 setupData.
worksets_ = getWorksetContainer()->getWorksets(wd);
140 setupData.
orientations_ = getWorksetContainer()->getOrientations();
148 Teuchos::RCP<PHX::FieldManager<panzer::Traits> > fm
152 pb->setActiveEvaluationTypes(active_evaluation_types_);
153 pb->buildAndRegisterEquationSetEvaluators(*fm, user_data);
154 if(!physicsBlockGatherDisabled())
155 pb->buildAndRegisterGatherAndOrientationEvaluators(*fm,lo_factory,user_data);
156 pb->buildAndRegisterDOFProjectionsToIPEvaluators(*fm,Teuchos::ptrFromRef(lo_factory),user_data);
157 if(!physicsBlockScatterDisabled())
158 pb->buildAndRegisterScatterEvaluators(*fm,lo_factory,user_data);
160 if(closureModelByEBlock)
161 pb->buildAndRegisterClosureModelEvaluators(*fm,cm_factory,pb->elementBlockID(),closure_models,user_data);
163 pb->buildAndRegisterClosureModelEvaluators(*fm,cm_factory,closure_models,user_data);
166 pb->activateAllEvaluationTypes();
172 setKokkosExtendedDataTypeDimensions(wd.
getElementBlock(),*globalIndexer,user_data,*fm);
175 Sacado::mpl::for_each_no_kokkos<panzer::Traits::EvalTypes>(PostRegistrationFunctor(active_evaluation_types_,*fm,setupData));
178 volume_workset_desc_.push_back(wd);
179 phx_volume_field_managers_.push_back(fm);
203 const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks,
204 const Teuchos::Ptr<const panzer::EquationSetFactory>& ,
207 const Teuchos::ParameterList& closure_models,
209 const Teuchos::ParameterList& user_data)
211 TEUCHOS_TEST_FOR_EXCEPTION(getWorksetContainer()==Teuchos::null,std::logic_error,
212 "panzer::FMB::setupBCFieldManagers: method function getWorksetContainer() returns null. "
213 "Plase call setWorksetContainer() before calling this method");
218 std::map<std::string,Teuchos::RCP<panzer::PhysicsBlock> > physicsBlocks_map;
220 std::vector<Teuchos::RCP<panzer::PhysicsBlock> >::const_iterator blkItr;
221 for(blkItr=physicsBlocks.begin();blkItr!=physicsBlocks.end();++blkItr) {
222 Teuchos::RCP<panzer::PhysicsBlock> pb = *blkItr;
223 std::string blockId = pb->elementBlockID();
226 physicsBlocks_map.insert(std::make_pair(blockId,pb));
233 std::vector<panzer::BC>::const_iterator bc;
234 for (bc=bcs.begin(); bc != bcs.end(); ++bc) {
236 const Teuchos::RCP<std::map<unsigned,panzer::Workset> >
237 currentWkst = getWorksetContainer()->getSideWorksets(wd);
238 if (currentWkst.is_null())
continue;
240 BCType bc_type = bc->bcType();
244 for (std::map<unsigned,panzer::Workset>::const_iterator wkst = currentWkst->begin();
245 wkst != currentWkst->end(); ++wkst) {
247 std::map<unsigned,PHX::FieldManager<panzer::Traits> >& field_managers =
248 bc_field_managers_[*bc];
253 for (
int block_id_index = 0; block_id_index < 2; ++block_id_index) {
254 const std::string element_block_id = block_id_index == 0 ? bc->elementBlockID() : bc->elementBlockID2();
256 std::map<std::string,Teuchos::RCP<panzer::PhysicsBlock> >::const_iterator
257 volume_pb_itr = physicsBlocks_map.find(element_block_id);
259 TEUCHOS_TEST_FOR_EXCEPTION(volume_pb_itr == physicsBlocks_map.end(), std::logic_error,
260 "panzer::FMB::setupBCFieldManagers: Cannot find physics block corresponding to element block \""
261 << element_block_id <<
"\"");
263 const Teuchos::RCP<const panzer::PhysicsBlock> volume_pb = physicsBlocks_map.find(element_block_id)->second;
264 const Teuchos::RCP<const shards::CellTopology> volume_cell_topology = volume_pb->cellData().getCellTopology();
268 wkst->second.details(block_id_index).subcell_index,
269 volume_cell_topology);
272 Teuchos::RCP<panzer::PhysicsBlock> side_pb = volume_pb->copyWithCellData(side_cell_data);
274 Teuchos::RCP<panzer::BCStrategy_TemplateManager<panzer::Traits> >
280 bcs_type = bcstm->begin(); bcs_type != bcstm->end(); ++bcs_type,++i) {
281 if (active_evaluation_types_[i]) {
282 bcs_type->setDetailsIndex(block_id_index);
283 side_pb->setDetailsIndex(block_id_index);
284 bcs_type->setup(*side_pb, user_data);
285 bcs_type->buildAndRegisterEvaluators(fm, *side_pb, cm_factory, closure_models, user_data);
286 bcs_type->buildAndRegisterGatherAndOrientationEvaluators(fm, *side_pb, lo_factory, user_data);
287 if ( ! physicsBlockScatterDisabled())
288 bcs_type->buildAndRegisterScatterEvaluators(fm, *side_pb, lo_factory, user_data);
292 gid_count += globalIndexer->getElementBlockGIDCount(element_block_id);
296 std::vector<PHX::index_size_type> derivative_dimensions;
297 derivative_dimensions.push_back(gid_count);
300 #ifdef Panzer_BUILD_HESSIAN_SUPPORT
304 derivative_dimensions[0] = 1;
305 if (user_data.isType<
int>(
"Tangent Dimension"))
306 derivative_dimensions[0] = user_data.get<
int>(
"Tangent Dimension");
312 Teuchos::RCP<std::vector<panzer::Workset> > worksets = Teuchos::rcp(
new std::vector<panzer::Workset>);
313 worksets->push_back(wkst->second);
315 setupData.
orientations_ = getWorksetContainer()->getOrientations();
317 Sacado::mpl::for_each_no_kokkos<panzer::Traits::EvalTypes>(PostRegistrationFunctor(active_evaluation_types_,fm,setupData));
321 const std::string element_block_id = bc->elementBlockID();
323 std::map<std::string,Teuchos::RCP<panzer::PhysicsBlock> >::const_iterator volume_pb_itr
324 = physicsBlocks_map.find(element_block_id);
326 TEUCHOS_TEST_FOR_EXCEPTION(volume_pb_itr==physicsBlocks_map.end(),std::logic_error,
327 "panzer::FMB::setupBCFieldManagers: Cannot find physics block corresponding to element block \"" << element_block_id <<
"\"");
329 Teuchos::RCP<const panzer::PhysicsBlock> volume_pb = physicsBlocks_map.find(element_block_id)->second;
330 Teuchos::RCP<const shards::CellTopology> volume_cell_topology = volume_pb->cellData().getCellTopology();
333 std::map<unsigned,PHX::FieldManager<panzer::Traits> >& field_managers =
334 bc_field_managers_[*bc];
337 for (std::map<unsigned,panzer::Workset>::const_iterator wkst =
338 currentWkst->begin(); wkst != currentWkst->end();
345 wkst->first,volume_cell_topology);
348 Teuchos::RCP<panzer::PhysicsBlock> side_pb = volume_pb->copyWithCellData(side_cell_data);
350 Teuchos::RCP<panzer::BCStrategy_TemplateManager<panzer::Traits> > bcstm =
356 bcs_type = bcstm->begin(); bcs_type != bcstm->end(); ++bcs_type,++i) {
357 if (active_evaluation_types_[i]) {
358 bcs_type->setup(*side_pb,user_data);
359 bcs_type->buildAndRegisterEvaluators(fm,*side_pb,cm_factory,closure_models,user_data);
360 bcs_type->buildAndRegisterGatherAndOrientationEvaluators(fm,*side_pb,lo_factory,user_data);
361 if(!physicsBlockScatterDisabled())
362 bcs_type->buildAndRegisterScatterEvaluators(fm,*side_pb,lo_factory,user_data);
368 Teuchos::RCP<std::vector<panzer::Workset> > worksets =
369 Teuchos::rcp(
new(std::vector<panzer::Workset>));
370 worksets->push_back(wkst->second);
372 setupData.
orientations_ = getWorksetContainer()->getOrientations();
375 setKokkosExtendedDataTypeDimensions(element_block_id,*globalIndexer,user_data,fm);
377 Sacado::mpl::for_each_no_kokkos<panzer::Traits::EvalTypes>(PostRegistrationFunctor(active_evaluation_types_,fm,setupData));