50 #include "Phalanx_DataLayout_MDALayout.hpp" 51 #include "Phalanx_FieldManager.hpp" 53 #include "Teuchos_FancyOStream.hpp" 55 #include "Shards_CellTopology.hpp" 59 #include "Panzer_Workset_Builder.hpp" 76 os <<
"panzer::FieldManagerBuilder output: Not implemented yet!";
81 const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks,
82 const std::vector<WorksetDescriptor> & wkstDesc,
84 const Teuchos::ParameterList& closure_models,
86 const Teuchos::ParameterList& user_data,
88 bool closureModelByEBlock)
93 TEUCHOS_TEST_FOR_EXCEPTION(getWorksetContainer()==Teuchos::null,std::logic_error,
94 "panzer::FMB::setupVolumeFieldManagers: method function getWorksetContainer() returns null. " 95 "Plase call setWorksetContainer() before calling this method");
96 TEUCHOS_TEST_FOR_EXCEPTION(physicsBlocks.size()!=wkstDesc.size(),std::runtime_error,
97 "panzer::FMB::setupVolumeFieldManagers: physics block count must match workset descriptor count.");
99 phx_volume_field_managers_.clear();
101 Teuchos::RCP<const panzer::UniqueGlobalIndexerBase> globalIndexer = lo_factory.
getRangeGlobalIndexer();
103 for (std::size_t blkInd=0;blkInd<physicsBlocks.size();++blkInd) {
104 RCP<panzer::PhysicsBlock> pb = physicsBlocks[blkInd];
108 setupData.
worksets_ = getWorksetContainer()->getWorksets(wd);
116 Teuchos::RCP<PHX::FieldManager<panzer::Traits> > fm
120 pb->buildAndRegisterEquationSetEvaluators(*fm, user_data);
121 if(!physicsBlockGatherDisabled())
122 pb->buildAndRegisterGatherAndOrientationEvaluators(*fm,lo_factory,user_data);
123 pb->buildAndRegisterDOFProjectionsToIPEvaluators(*fm,Teuchos::ptrFromRef(lo_factory),user_data);
124 if(!physicsBlockScatterDisabled())
125 pb->buildAndRegisterScatterEvaluators(*fm,lo_factory,user_data);
127 if(closureModelByEBlock)
128 pb->buildAndRegisterClosureModelEvaluators(*fm,cm_factory,pb->elementBlockID(),closure_models,user_data);
130 pb->buildAndRegisterClosureModelEvaluators(*fm,cm_factory,closure_models,user_data);
136 setKokkosExtendedDataTypeDimensions(wd.
getElementBlock(),*globalIndexer,user_data,*fm);
139 fm->postRegistrationSetup(setupData);
142 volume_workset_desc_.push_back(wd);
143 phx_volume_field_managers_.push_back(fm);
149 const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks,
151 const Teuchos::ParameterList& closure_models,
153 const Teuchos::ParameterList& user_data)
155 std::vector<WorksetDescriptor> wkstDesc;
156 for(std::size_t i=0;i<physicsBlocks.size();i++)
157 wkstDesc.push_back(
blockDescriptor(physicsBlocks[i]->elementBlockID()));
160 setupVolumeFieldManagers(physicsBlocks,wkstDesc,cm_factory,closure_models,lo_factory,user_data,eef);
167 const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks,
168 const Teuchos::Ptr<const panzer::EquationSetFactory> & eqset_factory,
171 const Teuchos::ParameterList& closure_models,
173 const Teuchos::ParameterList& user_data)
175 TEUCHOS_TEST_FOR_EXCEPTION(getWorksetContainer()==Teuchos::null,std::logic_error,
176 "panzer::FMB::setupBCFieldManagers: method function getWorksetContainer() returns null. " 177 "Plase call setWorksetContainer() before calling this method");
179 Teuchos::RCP<const panzer::UniqueGlobalIndexerBase> globalIndexer = lo_factory.
getRangeGlobalIndexer();
182 std::map<std::string,Teuchos::RCP<panzer::PhysicsBlock> > physicsBlocks_map;
184 std::vector<Teuchos::RCP<panzer::PhysicsBlock> >::const_iterator blkItr;
185 for(blkItr=physicsBlocks.begin();blkItr!=physicsBlocks.end();++blkItr) {
186 Teuchos::RCP<panzer::PhysicsBlock> pb = *blkItr;
187 std::string blockId = pb->elementBlockID();
190 physicsBlocks_map.insert(std::make_pair(blockId,pb));
197 std::vector<panzer::BC>::const_iterator bc;
198 for (bc=bcs.begin(); bc != bcs.end(); ++bc) {
199 const Teuchos::RCP<std::map<unsigned,panzer::Workset> >
200 currentWkst = getWorksetContainer()->getSideWorksets(*bc);
201 if (currentWkst.is_null())
continue;
203 BCType bc_type = bc->bcType();
207 for (std::map<unsigned,panzer::Workset>::const_iterator wkst = currentWkst->begin();
208 wkst != currentWkst->end(); ++wkst) {
210 std::map<unsigned,PHX::FieldManager<panzer::Traits> >& field_managers =
211 bc_field_managers_[*bc];
216 for (
int block_id_index = 0; block_id_index < 2; ++block_id_index) {
217 const std::string element_block_id = block_id_index == 0 ? bc->elementBlockID() : bc->elementBlockID2();
219 std::map<std::string,Teuchos::RCP<panzer::PhysicsBlock> >::const_iterator
220 volume_pb_itr = physicsBlocks_map.find(element_block_id);
222 TEUCHOS_TEST_FOR_EXCEPTION(volume_pb_itr == physicsBlocks_map.end(), std::logic_error,
223 "panzer::FMB::setupBCFieldManagers: Cannot find physics block corresponding to element block \"" 224 << element_block_id <<
"\"");
226 const Teuchos::RCP<const panzer::PhysicsBlock> volume_pb = physicsBlocks_map.find(element_block_id)->second;
227 const Teuchos::RCP<const shards::CellTopology> volume_cell_topology = volume_pb->cellData().getCellTopology();
231 wkst->second.details(block_id_index).subcell_index,
232 volume_cell_topology);
235 Teuchos::RCP<panzer::PhysicsBlock> side_pb = volume_pb->copyWithCellData(side_cell_data);
237 Teuchos::RCP<panzer::BCStrategy_TemplateManager<panzer::Traits> >
242 bcs_type = bcs->begin(); bcs_type != bcs->end(); ++bcs_type) {
243 bcs_type->setDetailsIndex(block_id_index);
244 side_pb->setDetailsIndex(block_id_index);
245 bcs_type->setup(*side_pb, user_data);
246 bcs_type->buildAndRegisterEvaluators(fm, *side_pb, cm_factory, closure_models, user_data);
247 bcs_type->buildAndRegisterGatherAndOrientationEvaluators(fm, *side_pb, lo_factory, user_data);
248 if ( ! physicsBlockScatterDisabled())
249 bcs_type->buildAndRegisterScatterEvaluators(fm, *side_pb, lo_factory, user_data);
252 gid_count += globalIndexer->getElementBlockGIDCount(element_block_id);
256 std::vector<PHX::index_size_type> derivative_dimensions;
257 derivative_dimensions.push_back(gid_count);
260 #ifdef Panzer_BUILD_HESSIAN_SUPPORT 261 fm.setKokkosExtendedDataTypeDimensions<panzer::Traits::Hessian>(derivative_dimensions);
264 derivative_dimensions[0] = 1;
265 if (user_data.isType<
int>(
"Tangent Dimension"))
266 derivative_dimensions[0] = user_data.get<
int>(
"Tangent Dimension");
272 Teuchos::RCP<std::vector<panzer::Workset> > worksets = Teuchos::rcp(
new std::vector<panzer::Workset>);
273 worksets->push_back(wkst->second);
276 fm.postRegistrationSetup(setupData);
279 const std::string element_block_id = bc->elementBlockID();
281 std::map<std::string,Teuchos::RCP<panzer::PhysicsBlock> >::const_iterator volume_pb_itr
282 = physicsBlocks_map.find(element_block_id);
284 TEUCHOS_TEST_FOR_EXCEPTION(volume_pb_itr==physicsBlocks_map.end(),std::logic_error,
285 "panzer::FMB::setupBCFieldManagers: Cannot find physics block corresponding to element block \"" << element_block_id <<
"\"");
287 Teuchos::RCP<const panzer::PhysicsBlock> volume_pb = physicsBlocks_map.find(element_block_id)->second;
288 Teuchos::RCP<const shards::CellTopology> volume_cell_topology = volume_pb->cellData().getCellTopology();
291 std::map<unsigned,PHX::FieldManager<panzer::Traits> >& field_managers =
292 bc_field_managers_[*bc];
295 for (std::map<unsigned,panzer::Workset>::const_iterator wkst =
296 currentWkst->begin(); wkst != currentWkst->end();
303 wkst->first,volume_cell_topology);
306 Teuchos::RCP<panzer::PhysicsBlock> side_pb = volume_pb->copyWithCellData(side_cell_data);
308 Teuchos::RCP<panzer::BCStrategy_TemplateManager<panzer::Traits> > bcs =
313 bcs_type = bcs->begin(); bcs_type != bcs->end(); ++bcs_type) {
314 bcs_type->setup(*side_pb,user_data);
315 bcs_type->buildAndRegisterEvaluators(fm,*side_pb,cm_factory,closure_models,user_data);
316 bcs_type->buildAndRegisterGatherAndOrientationEvaluators(fm,*side_pb,lo_factory,user_data);
317 if(!physicsBlockScatterDisabled())
318 bcs_type->buildAndRegisterScatterEvaluators(fm,*side_pb,lo_factory,user_data);
323 Teuchos::RCP<std::vector<panzer::Workset> > worksets =
324 Teuchos::rcp(
new(std::vector<panzer::Workset>));
325 worksets->push_back(wkst->second);
329 setKokkosExtendedDataTypeDimensions(element_block_id,*globalIndexer,user_data,fm);
331 fm.postRegistrationSetup(setupData);
341 const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks)
const 343 if(phx_volume_field_managers_.size()<1)
346 TEUCHOS_ASSERT(phx_volume_field_managers_.size()==physicsBlocks.size());
348 std::vector<Teuchos::RCP<panzer::PhysicsBlock> >::const_iterator blkItr;
350 for (blkItr=physicsBlocks.begin();blkItr!=physicsBlocks.end();++blkItr,++index) {
351 std::string blockId = (*blkItr)->elementBlockID();
352 phx_volume_field_managers_[index]->writeGraphvizFile(filename_prefix+
"_VOLUME_"+blockId);
362 typedef std::map<panzer::BC,std::map<unsigned,PHX::FieldManager<panzer::Traits> >,
panzer::LessBC> FMMap;
364 FMMap::const_iterator blkItr;
366 for (blkItr=bc_field_managers_.begin();blkItr!=bc_field_managers_.end();++blkItr,++bc_index) {
373 type =
"_Dirichlet_";
377 type =
"_Interface_";
379 TEUCHOS_ASSERT(
false);
383 fm.writeGraphvizFile(filename_prefix+
"_BC_"+std::to_string(bc_index)+type+sideId+
"_"+blockId);
392 const std::vector<Teuchos::RCP<panzer::PhysicsBlock> >& physicsBlocks)
const 394 if(phx_volume_field_managers_.size()<1)
397 TEUCHOS_ASSERT(phx_volume_field_managers_.size()==physicsBlocks.size());
399 std::vector<Teuchos::RCP<panzer::PhysicsBlock> >::const_iterator blkItr;
401 for (blkItr=physicsBlocks.begin();blkItr!=physicsBlocks.end();++blkItr,++index) {
403 std::string blockId = (*blkItr)->elementBlockID();
405 std::string filename = filename_prefix+
"_VOLUME_"+blockId+
".txt";
407 ofs.open(filename.c_str());
409 ofs << *(phx_volume_field_managers_[index]) << std::endl;
421 typedef std::map<panzer::BC,std::map<unsigned,PHX::FieldManager<panzer::Traits> >,
panzer::LessBC> FMMap;
423 FMMap::const_iterator blkItr;
425 for (blkItr=bc_field_managers_.begin();blkItr!=bc_field_managers_.end();++blkItr,++bc_index) {
432 type =
"_Dirichlet_";
436 type =
"_Interface_";
438 TEUCHOS_ASSERT(
false);
443 std::string filename = filename_prefix+
"_BC_"+std::to_string(bc_index)+type+sideId+
"_"+blockId+
".txt";
445 ofs.open(filename.c_str());
447 ofs << fm << std::endl;
459 const Teuchos::ParameterList& user_data,
464 std::vector<PHX::index_size_type> derivative_dimensions;
471 #ifdef Panzer_BUILD_HESSIAN_SUPPORT 473 std::vector<PHX::index_size_type> derivative_dimensions;
476 fm.setKokkosExtendedDataTypeDimensions<panzer::Traits::Hessian>(derivative_dimensions);
481 std::vector<PHX::index_size_type> derivative_dimensions;
482 derivative_dimensions.push_back(1);
483 if (user_data.isType<
int>(
"Tangent Dimension"))
484 derivative_dimensions[0] = user_data.get<
int>(
"Tangent Dimension");
void writeVolumeTextDependencyFiles(std::string filename_prefix, const std::vector< Teuchos::RCP< panzer::PhysicsBlock > > &physicsBlocks) const
Interface for constructing a BCStrategy_TemplateManager.
virtual int getElementBlockGIDCount(const std::string &blockId) const =0
How any GIDs are associate with a particular element block.
void setupVolumeFieldManagers(const std::vector< Teuchos::RCP< panzer::PhysicsBlock > > &physicsBlocks, const panzer::ClosureModelFactory_TemplateManager< panzer::Traits > &cm_factory, const Teuchos::ParameterList &closure_models, const LinearObjFactory< panzer::Traits > &lo_factory, const Teuchos::ParameterList &user_data)
Teuchos::RCP< std::vector< panzer::Workset > > worksets_
BCType
Type of boundary condition.
void writeVolumeGraphvizDependencyFiles(std::string filename_prefix, const std::vector< Teuchos::RCP< panzer::PhysicsBlock > > &physicsBlocks) const
BCType bcType() const
Returns the boundary condition type (Dirichlet or Neumann or Interface).
PHX::MDField< ScalarT > vector
virtual Teuchos::RCP< panzer::BCStrategy_TemplateManager< panzer::Traits > > buildBCStrategy(const panzer::BC &bc, const Teuchos::RCP< panzer::GlobalData > &global_data) const =0
void writeBCTextDependencyFiles(std::string filename_prefix) const
void writeBCGraphvizDependencyFiles(std::string filename_prefix) const
Data for determining cell topology and dimensionality.
void print(std::ostream &os) const
void setKokkosExtendedDataTypeDimensions(const std::string &eblock, const panzer::UniqueGlobalIndexerBase &globalIndexer, const Teuchos::ParameterList &user_data, PHX::FieldManager< panzer::Traits > &fm) const
std::string getElementBlock() const
Get element block.
virtual Teuchos::RCP< const panzer::UniqueGlobalIndexerBase > getRangeGlobalIndexer() const =0
Get the range global indexer object associated with this factory.
virtual bool registerEvaluators(PHX::FieldManager< panzer::Traits > &fm, const WorksetDescriptor &wd, const PhysicsBlock &pb) const =0
std::string elementBlockID() const
Returns the element block id associated with this sideset.
std::ostream & operator<<(std::ostream &os, const AssemblyEngineInArgs &in)
WorksetDescriptor blockDescriptor(const std::string &eBlock)
Stores input information for a boundary condition.
void setupBCFieldManagers(const std::vector< panzer::BC > &bcs, const std::vector< Teuchos::RCP< panzer::PhysicsBlock > > &physicsBlocks, const panzer::EquationSetFactory &eqset_factory, const panzer::ClosureModelFactory_TemplateManager< panzer::Traits > &cm_factory, const panzer::BCStrategyFactory &bc_factory, const Teuchos::ParameterList &closure_models, const LinearObjFactory< panzer::Traits > &lo_factory, const Teuchos::ParameterList &user_data)
std::string sidesetID() const
Returns the set id.