80 const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks,
81 const std::vector<WorksetDescriptor> & wkstDesc,
83 const Teuchos::ParameterList& closure_models,
85 const Teuchos::ParameterList& user_data,
87 bool closureModelByEBlock)
92 PANZER_FUNC_TIME_MONITOR_DIFF(
"panzer::FieldManagerBuilder::setupVolumeFieldManagers",setup_field_managers);
94 TEUCHOS_TEST_FOR_EXCEPTION(getWorksetContainer()==Teuchos::null,std::logic_error,
95 "panzer::FMB::setupVolumeFieldManagers: method function getWorksetContainer() returns null. "
96 "Plase call setWorksetContainer() before calling this method");
97 TEUCHOS_TEST_FOR_EXCEPTION(physicsBlocks.size()!=wkstDesc.size(),std::runtime_error,
98 "panzer::FMB::setupVolumeFieldManagers: physics block count must match workset descriptor count.");
100 phx_volume_field_managers_.clear();
104 for (std::size_t blkInd=0;blkInd<physicsBlocks.size();++blkInd) {
105 RCP<panzer::PhysicsBlock> pb = physicsBlocks[blkInd];
110 PANZER_FUNC_TIME_MONITOR_DIFF(
"getWorksets()",get_worksets);
111 { setupData.
worksets_ = getWorksetContainer()->getWorksets(wd); }
114 PANZER_FUNC_TIME_MONITOR_DIFF(
"getOrientations()",get_orientations);
115 { setupData.
orientations_ = getWorksetContainer()->getOrientations(); }
124 Teuchos::RCP<PHX::FieldManager<panzer::Traits> > fm
128 pb->setActiveEvaluationTypes(active_evaluation_types_);
131 PANZER_FUNC_TIME_MONITOR_DIFF(
"pb->buildAndRegisterEquationSetEvaluators()",build_and_reg_eq_set_eval);
132 { pb->buildAndRegisterEquationSetEvaluators(*fm, user_data); }
135 if(!physicsBlockGatherDisabled()) {
136 PANZER_FUNC_TIME_MONITOR_DIFF(
"pb->buildAndRegisterGatherAndOrientationEvaluators()",build_and_reg_gath_and_orient_eval);
137 pb->buildAndRegisterGatherAndOrientationEvaluators(*fm,lo_factory,user_data);
141 PANZER_FUNC_TIME_MONITOR_DIFF(
"pb->buildAndRegisterDOFProjectionsToIPEvaluators()",build_and_reg_dof_proj_eval);
142 pb->buildAndRegisterDOFProjectionsToIPEvaluators(*fm,Teuchos::ptrFromRef(lo_factory),user_data);
145 if(!physicsBlockScatterDisabled()) {
146 PANZER_FUNC_TIME_MONITOR_DIFF(
"pb->buildAndRegisterScatterEvaluators()",build_and_reg_scatter_eval);
147 pb->buildAndRegisterScatterEvaluators(*fm,lo_factory,user_data);
150 if(closureModelByEBlock) {
151 PANZER_FUNC_TIME_MONITOR_DIFF(
"pb->buildAndRegisterClosureModelEvaluators(): closureModelByEBlock==true",build_and_reg_closure_model_eval_if);
152 pb->buildAndRegisterClosureModelEvaluators(*fm,cm_factory,pb->elementBlockID(),closure_models,user_data);
155 PANZER_FUNC_TIME_MONITOR_DIFF(
"pb->buildAndRegisterClosureModelEvaluators(): closureModelByEBlock==false",build_and_reg_closure_model_eval_else);
156 pb->buildAndRegisterClosureModelEvaluators(*fm,cm_factory,closure_models,user_data);
160 pb->activateAllEvaluationTypes();
166 setKokkosExtendedDataTypeDimensions(wd.
getElementBlock(),*globalIndexer,user_data,*fm);
169 Sacado::mpl::for_each_no_kokkos<panzer::Traits::EvalTypes>(PostRegistrationFunctor(active_evaluation_types_,*fm,setupData));
172 volume_workset_desc_.push_back(wd);
173 phx_volume_field_managers_.push_back(fm);
197 const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks,
198 const Teuchos::Ptr<const panzer::EquationSetFactory>& ,
201 const Teuchos::ParameterList& closure_models,
203 const Teuchos::ParameterList& user_data)
205 TEUCHOS_TEST_FOR_EXCEPTION(getWorksetContainer()==Teuchos::null,std::logic_error,
206 "panzer::FMB::setupBCFieldManagers: method function getWorksetContainer() returns null. "
207 "Plase call setWorksetContainer() before calling this method");
212 std::map<std::string,Teuchos::RCP<panzer::PhysicsBlock> > physicsBlocks_map;
214 std::vector<Teuchos::RCP<panzer::PhysicsBlock> >::const_iterator blkItr;
215 for(blkItr=physicsBlocks.begin();blkItr!=physicsBlocks.end();++blkItr) {
216 Teuchos::RCP<panzer::PhysicsBlock> pb = *blkItr;
217 std::string blockId = pb->elementBlockID();
220 physicsBlocks_map.insert(std::make_pair(blockId,pb));
227 std::vector<panzer::BC>::const_iterator bc;
228 for (bc=bcs.begin(); bc != bcs.end(); ++bc) {
230 const Teuchos::RCP<std::map<unsigned,panzer::Workset> >
231 currentWkst = getWorksetContainer()->getSideWorksets(wd);
233 if (currentWkst.is_null())
continue;
235 BCType bc_type = bc->bcType();
239 for (std::map<unsigned,panzer::Workset>::const_iterator wkst = currentWkst->begin();
240 wkst != currentWkst->end(); ++wkst) {
242 std::map<unsigned,PHX::FieldManager<panzer::Traits> >& field_managers =
243 bc_field_managers_[*bc];
248 for (
int block_id_index = 0; block_id_index < 2; ++block_id_index) {
249 const std::string element_block_id = block_id_index == 0 ? bc->elementBlockID() : bc->elementBlockID2();
251 std::map<std::string,Teuchos::RCP<panzer::PhysicsBlock> >::const_iterator
252 volume_pb_itr = physicsBlocks_map.find(element_block_id);
254 TEUCHOS_TEST_FOR_EXCEPTION(volume_pb_itr == physicsBlocks_map.end(), std::logic_error,
255 "panzer::FMB::setupBCFieldManagers: Cannot find physics block corresponding to element block \""
256 << element_block_id <<
"\"");
258 const Teuchos::RCP<const panzer::PhysicsBlock> volume_pb = physicsBlocks_map.find(element_block_id)->second;
259 const Teuchos::RCP<const shards::CellTopology> volume_cell_topology = volume_pb->cellData().getCellTopology();
263 wkst->second.details(block_id_index).subcell_index,
264 volume_cell_topology);
267 Teuchos::RCP<panzer::PhysicsBlock> side_pb = volume_pb->copyWithCellData(side_cell_data);
269 Teuchos::RCP<panzer::BCStrategy_TemplateManager<panzer::Traits> >
275 bcs_type = bcstm->begin(); bcs_type != bcstm->end(); ++bcs_type,++i) {
276 if (active_evaluation_types_[i]) {
277 bcs_type->setDetailsIndex(block_id_index);
278 side_pb->setDetailsIndex(block_id_index);
279 bcs_type->setup(*side_pb, user_data);
280 bcs_type->buildAndRegisterEvaluators(fm, *side_pb, cm_factory, closure_models, user_data);
281 bcs_type->buildAndRegisterGatherAndOrientationEvaluators(fm, *side_pb, lo_factory, user_data);
282 if ( ! physicsBlockScatterDisabled())
283 bcs_type->buildAndRegisterScatterEvaluators(fm, *side_pb, lo_factory, user_data);
287 gid_count += globalIndexer->getElementBlockGIDCount(element_block_id);
291 std::vector<PHX::index_size_type> derivative_dimensions;
292 derivative_dimensions.push_back(gid_count);
295 #ifdef Panzer_BUILD_HESSIAN_SUPPORT
299 derivative_dimensions[0] = 1;
300 if (user_data.isType<
int>(
"Tangent Dimension"))
301 derivative_dimensions[0] = user_data.get<
int>(
"Tangent Dimension");
307 Teuchos::RCP<std::vector<panzer::Workset> > worksets = Teuchos::rcp(
new std::vector<panzer::Workset>);
308 worksets->push_back(wkst->second);
310 setupData.
orientations_ = getWorksetContainer()->getOrientations();
312 Sacado::mpl::for_each_no_kokkos<panzer::Traits::EvalTypes>(PostRegistrationFunctor(active_evaluation_types_,fm,setupData));
316 const std::string element_block_id = bc->elementBlockID();
318 std::map<std::string,Teuchos::RCP<panzer::PhysicsBlock> >::const_iterator volume_pb_itr
319 = physicsBlocks_map.find(element_block_id);
321 TEUCHOS_TEST_FOR_EXCEPTION(volume_pb_itr==physicsBlocks_map.end(),std::logic_error,
322 "panzer::FMB::setupBCFieldManagers: Cannot find physics block corresponding to element block \"" << element_block_id <<
"\"");
324 Teuchos::RCP<const panzer::PhysicsBlock> volume_pb = physicsBlocks_map.find(element_block_id)->second;
325 Teuchos::RCP<const shards::CellTopology> volume_cell_topology = volume_pb->cellData().getCellTopology();
328 std::map<unsigned,PHX::FieldManager<panzer::Traits> >& field_managers =
329 bc_field_managers_[*bc];
332 for (std::map<unsigned,panzer::Workset>::const_iterator wkst =
333 currentWkst->begin(); wkst != currentWkst->end();
340 wkst->first,volume_cell_topology);
343 Teuchos::RCP<panzer::PhysicsBlock> side_pb = volume_pb->copyWithCellData(side_cell_data);
345 Teuchos::RCP<panzer::BCStrategy_TemplateManager<panzer::Traits> > bcstm =
351 bcs_type = bcstm->begin(); bcs_type != bcstm->end(); ++bcs_type,++i) {
352 if (active_evaluation_types_[i]) {
353 bcs_type->setup(*side_pb,user_data);
354 bcs_type->buildAndRegisterEvaluators(fm,*side_pb,cm_factory,closure_models,user_data);
355 bcs_type->buildAndRegisterGatherAndOrientationEvaluators(fm,*side_pb,lo_factory,user_data);
356 if(!physicsBlockScatterDisabled())
357 bcs_type->buildAndRegisterScatterEvaluators(fm,*side_pb,lo_factory,user_data);
363 Teuchos::RCP<std::vector<panzer::Workset> > worksets =
364 Teuchos::rcp(
new(std::vector<panzer::Workset>));
365 worksets->push_back(wkst->second);
367 setupData.
orientations_ = getWorksetContainer()->getOrientations();
370 setKokkosExtendedDataTypeDimensions(element_block_id,*globalIndexer,user_data,fm);
372 Sacado::mpl::for_each_no_kokkos<panzer::Traits::EvalTypes>(PostRegistrationFunctor(active_evaluation_types_,fm,setupData));