11#include "Teuchos_RCP.hpp"
12#include "Teuchos_ParameterList.hpp"
13#include "Teuchos_Assert.hpp"
15#include "Phalanx_FieldManager.hpp"
16#include "Phalanx_Evaluator_Factory.hpp"
22#include "Shards_CellTopology.hpp"
27 const std::map<std::string,Teuchos::RCP<const shards::CellTopology> > & block_ids_to_cell_topo,
28 const Teuchos::RCP<Teuchos::ParameterList>& physics_blocks_plist,
29 const int default_integration_order,
30 const std::size_t workset_size,
31 const Teuchos::RCP<const panzer::EquationSetFactory>& eqset_factory,
32 const Teuchos::RCP<panzer::GlobalData>& global_data,
33 const bool build_transient_support,
34 std::vector<Teuchos::RCP<panzer::PhysicsBlock> > & physicsBlocks,
35 const std::vector<std::string>& tangent_param_names)
42 TEUCHOS_ASSERT(nonnull(physics_blocks_plist));
45 map<string,string>::const_iterator itr;
46 for (itr = block_ids_to_physics_ids.begin(); itr!=block_ids_to_physics_ids.end();++itr) {
47 string element_block_id = itr->first;
48 string physics_block_id = itr->second;
50 map<string,RCP<const shards::CellTopology> >::const_iterator ct_itr =
51 block_ids_to_cell_topo.find(element_block_id);
52 TEUCHOS_TEST_FOR_EXCEPTION(ct_itr==block_ids_to_cell_topo.end(),
54 "Falied to find CellTopology for element block id: \""
55 << element_block_id <<
"\"!");
56 RCP<const shards::CellTopology> cellTopo = ct_itr->second;
61 TEUCHOS_TEST_FOR_EXCEPTION(!physics_blocks_plist->isSublist(physics_block_id),
63 "Failed to find physics id: \""
65 <<
"\" requested by element block: \""
66 << element_block_id <<
"\"!");
68 RCP<panzer::PhysicsBlock> pb = rcp(
new panzer::PhysicsBlock(Teuchos::sublist(physics_blocks_plist,physics_block_id,
true),
70 default_integration_order,
74 build_transient_support,
77 physicsBlocks.push_back(pb);
82 const Teuchos::RCP<Teuchos::ParameterList>& physics_blocks_plist,
83 std::vector<Teuchos::RCP<panzer::PhysicsBlock> > & physicsBlocks)
90 TEUCHOS_ASSERT(nonnull(physics_blocks_plist));
93 map<string,string>::const_iterator itr;
94 for (itr = block_ids_to_physics_ids.begin(); itr!=block_ids_to_physics_ids.end();++itr) {
95 string element_block_id = itr->first;
96 string physics_block_id = itr->second;
99 TEUCHOS_TEST_FOR_EXCEPTION(!physics_blocks_plist->isSublist(physics_block_id),
101 "Failed to find physics id: \""
103 <<
"\" requested by element block: \""
104 << element_block_id <<
"\"!");
106 RCP<panzer::PhysicsBlock> pb = rcp(
new panzer::PhysicsBlock(Teuchos::sublist(physics_blocks_plist,physics_block_id,
true),
108 physicsBlocks.push_back(pb);
114 const std::vector<Teuchos::RCP<panzer::PhysicsBlock> > & physics_blocks,
115 bool throw_on_failure)
117 std::vector<Teuchos::RCP<panzer::PhysicsBlock> >::const_iterator pb = physics_blocks.begin();
119 while (pb != physics_blocks.end()) {
120 if ((*pb)->elementBlockID() == element_block_id)
126 TEUCHOS_TEST_FOR_EXCEPTION(throw_on_failure,std::runtime_error,
"Error: panzer::findPhysicsBlock(): The requested physics block for element block\"" << element_block_id <<
"\" was not found in the vecotr of physics blocks!");
128 Teuchos::RCP<panzer::PhysicsBlock> null_pb;
134PhysicsBlock(
const Teuchos::RCP<Teuchos::ParameterList>& physics_block_plist,
135 const std::string & element_block_id,
136 const int default_integration_order,
138 const Teuchos::RCP<const panzer::EquationSetFactory>& factory,
139 const Teuchos::RCP<panzer::GlobalData>& global_data,
140 const bool build_transient_support,
141 const std::vector<std::string>& tangent_param_names) :
151 TEUCHOS_ASSERT(nonnull(physics_block_plist));
152 TEUCHOS_ASSERT(nonnull(factory));
153 TEUCHOS_ASSERT(nonnull(global_data));
161 build_transient_support,
162 tangent_param_names);
167PhysicsBlock(
const Teuchos::RCP<Teuchos::ParameterList>& physics_block_plist,
168 const std::string & element_block_id) :
180 const std::string & physics_block_id,
181 const int integration_order,
183 const Teuchos::RCP<panzer::GlobalData>& global_data,
184 const Teuchos::RCP<panzer::PureBasis> & basis) :
196 using Teuchos::ParameterList;
209 m_bases[basis->name()] = basis;
222 for(std::vector<StrPureBasisPair>::const_iterator itr=
m_provided_dofs.begin();
224 m_field_lib->addFieldAndBasis(itr->first,itr->second);
250 const bool build_transient_support,
252 const Teuchos::RCP<const panzer::EquationSetFactory>& eqset_factory,
253 const Teuchos::RCP<panzer::GlobalData>& global_data,
254 const std::vector<std::string>& tangent_param_names)
267 tangent_param_names);
272 const int& default_integration_order,
273 const std::string & element_block_id,
275 const bool build_transient_support,
276 const std::vector<std::string>& tangent_param_names)
279 using Teuchos::ParameterList;
281 TEUCHOS_TEST_FOR_EXCEPTION(input_parameters->numParams() < 1, std::runtime_error,
282 "The physics block \"" << input_parameters->name()
283 <<
"\" required by element block \"" << element_block_id
284 <<
"\" does not have any equation sets associated with it."
285 <<
" Please add at least one equation set to this physics block!");
290 typedef ParameterList::ConstIterator pl_iter;
291 for (pl_iter eq = input_parameters->begin(); eq != input_parameters->end(); ++eq) {
293 TEUCHOS_TEST_FOR_EXCEPTION( !(eq->second.isList()), std::logic_error,
295 <<
"\" must be an equation set sublist!" );
297 RCP<ParameterList> eq_set_pl = Teuchos::sublist(input_parameters,eq->first,
true);
299 RCP<panzer::EquationSet_TemplateManager<panzer::Traits> > eq_set
303 for (
auto eq_it = eq_set->begin(); eq_it != eq_set->end(); ++eq_it) {
304 eq_it->setTangentParamNames(tangent_param_names);
311 const std::vector<StrPureBasisPair> & sbNames = eq_set->begin()->getProvidedDOFs();
312 for(std::size_t j=0;j<sbNames.size();j++) {
321 m_bases[sbNames[j].second->name()] = sbNames[j].second;
324 for (std::size_t k=0; k<tangent_param_names.size(); ++k)
326 sbNames[j].second ) );
331 const std::vector<std::vector<std::string> > & coord_dofs = eq_set->begin()->getCoordinateDOFs();
341 const std::map<int,Teuchos::RCP<panzer::IntegrationRule> > & ir_map = eq_set->begin()->getIntegrationRules();
342 for(std::map<
int,Teuchos::RCP<panzer::IntegrationRule> >::const_iterator ir = ir_map.begin();
343 ir != ir_map.end(); ++ir)
350 for(std::vector<StrPureBasisPair>::const_iterator itr=
m_provided_dofs.begin();
352 m_field_lib->addFieldAndBasis(itr->first,itr->second);
356 RCP<panzer::EquationSet_TemplateManager<panzer::Traits> > eq_set =
m_equation_sets[eq_i];
358 itr!=eq_set->end();++itr) {
359 itr->setElementBlockId(element_block_id);
368 TEUCHOS_ASSERT(aet.size() == std::size_t(Sacado::mpl::size<panzer::Traits::EvalTypes>::value));
382 const Teuchos::ParameterList& user_data)
const
389 vector< RCP<EquationSet_TemplateManager<panzer::Traits> > >::const_iterator
398 for (; eval_type != eqstm.end(); ++eval_type,++idx) {
405 eval_type->buildAndRegisterEquationSetEvaluators(fm, *
m_field_lib, user_data);
406 eval_type->setDetailsIndex(di);
416 const Teuchos::ParameterList& user_data)
const
423 vector< RCP<EquationSet_TemplateManager<panzer::Traits> > >::const_iterator
432 for (; eval_type != eqstm.end(); ++eval_type,++idx) {
435 eval_type->buildAndRegisterGatherAndOrientationEvaluators(fm, *
m_field_lib, lof, user_data);
436 eval_type->setDetailsIndex(di);
446 const Teuchos::ParameterList& user_data)
const
453 vector< RCP<EquationSet_TemplateManager<panzer::Traits> > >::const_iterator
462 for (; eval_type != eqstm.end(); ++eval_type,++idx) {
466 for (std::map<
int,Teuchos::RCP<panzer::IntegrationRule> >::const_iterator ir_iter =
m_integration_rules.begin();
469 Teuchos::RCP<panzer::IntegrationRule> ir = ir_iter->second;
472 eval_type->buildAndRegisterDOFProjectionsToIPEvaluators(fm, *
m_field_lib->buildFieldLayoutLibrary(*ir), ir, lof, user_data);
473 eval_type->setDetailsIndex(di);
484 const Teuchos::ParameterList& user_data)
const
491 vector< RCP<EquationSet_TemplateManager<panzer::Traits> > >::const_iterator
500 for (; eval_type != eqstm.end(); ++eval_type,++idx) {
503 eval_type->buildAndRegisterScatterEvaluators(fm, *
m_field_lib, lof, user_data);
504 eval_type->setDetailsIndex(di);
514 const Teuchos::ParameterList& models,
515 const Teuchos::ParameterList& user_data)
const
522 vector< RCP<EquationSet_TemplateManager<panzer::Traits> > >::const_iterator
531 for (; eval_type != eqstm.end(); ++eval_type,++idx) {
535 for (std::map<
int,Teuchos::RCP<panzer::IntegrationRule> >::const_iterator ir_iter =
m_integration_rules.begin();
538 Teuchos::RCP<panzer::IntegrationRule> ir = ir_iter->second;
541 eval_type->buildAndRegisterClosureModelEvaluators(fm, *
m_field_lib->buildFieldLayoutLibrary(*ir), ir, factory, models, user_data);
542 eval_type->setDetailsIndex(di);
554 const std::string& model_name,
555 const Teuchos::ParameterList& models,
556 const Teuchos::ParameterList& user_data)
const
563 vector< RCP<EquationSet_TemplateManager<panzer::Traits> > >::const_iterator
572 for (; eval_type != eqstm.end(); ++eval_type,++idx) {
576 for (std::map<
int,Teuchos::RCP<panzer::IntegrationRule> >::const_iterator ir_iter =
m_integration_rules.begin();
579 Teuchos::RCP<panzer::IntegrationRule> ir = ir_iter->second;
581 eval_type->buildAndRegisterClosureModelEvaluators(fm, *
m_field_lib->buildFieldLayoutLibrary(*ir), ir, factory, model_name, models, user_data);
582 eval_type->setDetailsIndex(di);
592 for (;eval_type != factory.end(); ++eval_type,++idx) {
596 Teuchos::ParameterList plist;
599 for (std::map<
int,Teuchos::RCP<panzer::IntegrationRule> >::const_iterator ir_iter =
m_integration_rules.begin();
602 Teuchos::RCP<panzer::IntegrationRule> ir = ir_iter->second;
605 Teuchos::RCP< std::vector< Teuchos::RCP<PHX::Evaluator<panzer::Traits> > > > evaluators =
606 eval_type->buildClosureModels(model_name,
617 eval_type->registerEvaluators(*evaluators,fm);
618 eval_type->setDetailsIndex(di);
629 const std::string& model_name,
630 const Teuchos::ParameterList& models,
632 const Teuchos::ParameterList& user_data)
const
673 const std::map<int,Teuchos::RCP<panzer::IntegrationRule> >& int_rules = this->
getIntegrationRules();
674 for (std::map<
int,Teuchos::RCP<panzer::IntegrationRule> >::const_iterator ir_itr = int_rules.begin();
675 ir_itr != int_rules.end(); ++ir_itr)
676 needs.
int_rules.push_back(ir_itr->second);
678 const std::map<std::string,Teuchos::RCP<panzer::PureBasis> >& bases= this->
getBases();
680 for(std::map<std::string,Teuchos::RCP<panzer::PureBasis> >::const_iterator b_itr = bases.begin();
681 b_itr != bases.end(); ++b_itr) {
683 needs.
bases.push_back(b_itr->second);
686 for(std::size_t d=0;d<fieldToBasis.size();d++) {
687 if(fieldToBasis[d].second->name()==b_itr->second->name()) {
697 TEUCHOS_ASSERT(found);
704const std::map<std::string,Teuchos::RCP<panzer::PureBasis> >&
711const std::map<int,Teuchos::RCP<panzer::IntegrationRule> >&
720 TEUCHOS_TEST_FOR_EXCEPTION(
m_bases.size() == 0, std::runtime_error,
721 "Cannot return a basis since none exist in this physics block.");
722 return m_bases.begin()->second->getIntrepid2Basis()->getBaseCellTopology();
Data for determining cell topology and dimensionality.
A PHX::TemplateManager holding one panzer::ClosureModelFactory<EvalT> per evaluation type in Traits::...
A PHX::TemplateManager holding one panzer::EquationSet<EvalT> per evaluation type in Traits::EvalType...
int getDetailsIndex() const
Get the WorksetDetails index.
Object that contains information on the physics and discretization of a block of elements with the SA...
void initialize(const int default_integration_order, const bool build_transient_support, const panzer::CellData &cell_data, const Teuchos::RCP< const panzer::EquationSetFactory > &factory, const Teuchos::RCP< panzer::GlobalData > &global_data, const std::vector< std::string > &tangent_param_names=std::vector< std::string >())
const std::vector< StrPureBasisPair > & getTangentFields() const
Returns list of tangent fields from DOFs and tangent param names.
Teuchos::RCP< FieldLibrary > m_field_lib
const std::map< int, Teuchos::RCP< panzer::IntegrationRule > > & getIntegrationRules() const
Returns the unique set of point rules, key is the unique panzer::PointRule::name().
std::string elementBlockID() const
void buildAndRegisterEquationSetEvaluators(PHX::FieldManager< panzer::Traits > &fm, const Teuchos::ParameterList &user_data) const
std::vector< StrPureBasisPair > m_provided_dofs
bool m_build_transient_support
void buildAndRegisterGatherAndOrientationEvaluators(PHX::FieldManager< panzer::Traits > &fm, const panzer::LinearObjFactory< panzer::Traits > &lof, const Teuchos::ParameterList &user_data) const
std::vector< StrPureBasisPair > m_tangent_fields
int m_default_integration_order
panzer::CellData m_cell_data
std::vector< std::vector< std::string > > m_coordinate_dofs
void buildAndRegisterInitialConditionEvaluators(PHX::FieldManager< panzer::Traits > &fm, const panzer::ClosureModelFactory_TemplateManager< panzer::Traits > &factory, const std::string &model_name, const Teuchos::ParameterList &models, const panzer::LinearObjFactory< panzer::Traits > &lof, const Teuchos::ParameterList &user_data) const
std::vector< std::string > m_dof_names
std::vector< Teuchos::RCP< panzer::EquationSet_TemplateManager< panzer::Traits > > > m_equation_sets
void buildPhysicsBlocks(const std::map< std::string, std::string > &block_ids_to_physics_ids, const std::map< std::string, Teuchos::RCP< const shards::CellTopology > > &block_ids_to_cell_topo, const Teuchos::RCP< Teuchos::ParameterList > &physics_blocks_plist, const int default_integration_order, const std::size_t workset_size, const Teuchos::RCP< const panzer::EquationSetFactory > &eqset_factory, const Teuchos::RCP< panzer::GlobalData > &global_data, const bool build_transient_support, std::vector< Teuchos::RCP< panzer::PhysicsBlock > > &physicsBlocks, const std::vector< std::string > &tangent_param_names=std::vector< std::string >())
Nonmember function for building the physics blocks from a Teuchos::ParameterList for a given list of ...
Teuchos::RCP< PhysicsBlock > copyWithCellData(const panzer::CellData &cell_data) const
std::string m_element_block_id
Teuchos::RCP< panzer::GlobalData > m_global_data
Teuchos::RCP< panzer::PhysicsBlock > findPhysicsBlock(const std::string element_block_id, const std::vector< Teuchos::RCP< panzer::PhysicsBlock > > &physics_blocks, bool throw_on_failure=true)
Nonmember function for searching and returning a spcific physics block given an element block id....
WorksetNeeds getWorksetNeeds() const
const shards::CellTopology getBaseCellTopology() const
Teuchos::RCP< panzer::GlobalData > globalData() const
void buildAndRegisterScatterEvaluators(PHX::FieldManager< panzer::Traits > &fm, const panzer::LinearObjFactory< panzer::Traits > &lof, const Teuchos::ParameterList &user_data) const
const std::vector< std::string > & getDOFNames() const
Teuchos::RCP< Teuchos::ParameterList > m_input_parameters
store the input parameter list for copy ctors
void buildAndRegisterClosureModelEvaluators(PHX::FieldManager< panzer::Traits > &fm, const panzer::ClosureModelFactory_TemplateManager< panzer::Traits > &factory, const Teuchos::ParameterList &models, const Teuchos::ParameterList &user_data) const
void setActiveEvaluationTypes(const std::vector< bool > &aet)
Used to save memory by disabling unneeded evaluation types.
const std::map< std::string, Teuchos::RCP< panzer::PureBasis > > & getBases() const
Returns the unique set of bases, key is the unique panzer::PureBasis::name() of the basis.
void readPhysicsBlocks(const std::map< std::string, std::string > &block_ids_to_physics_ids, const Teuchos::RCP< Teuchos::ParameterList > &physics_blocks_plist, std::vector< Teuchos::RCP< panzer::PhysicsBlock > > &physicsBlocks)
Nonmember function for reading and constructing physics blocks from a Teuchos::ParameterList for a gi...
void activateAllEvaluationTypes()
Used to reactivate all evaluation types if some were temporarily disabled with a call to setActiveEva...
std::map< std::string, Teuchos::RCP< panzer::PureBasis > > m_bases
map of unique bases, key is the panzer::PureBasis::name() corresponding to its value
const panzer::CellData & cellData() const
std::vector< bool > m_active_evaluation_types
Returns true for evaluation types that are active.
void buildAndRegisterDOFProjectionsToIPEvaluators(PHX::FieldManager< panzer::Traits > &fm, const Teuchos::Ptr< const panzer::LinearObjFactory< panzer::Traits > > &lof, const Teuchos::ParameterList &user_data) const
const std::vector< StrPureBasisPair > & getProvidedDOFs() const
void buildAndRegisterInitialConditionEvaluatorsForType(PHX::FieldManager< panzer::Traits > &fm, const panzer::ClosureModelFactory_TemplateManager< panzer::Traits > &factory, const std::string &model_name, const Teuchos::ParameterList &models, const panzer::LinearObjFactory< panzer::Traits > &lof, const Teuchos::ParameterList &user_data) const
std::map< int, Teuchos::RCP< panzer::IntegrationRule > > m_integration_rules
map of unique integration rules, key is panzer::IntegrationRule::order() corresponding to its value
std::string physicsBlockID() const
const std::vector< std::vector< std::string > > & getCoordinateDOFs() const
Teuchos::RCP< const panzer::EquationSetFactory > m_eqset_factory
std::pair< std::string, Teuchos::RCP< panzer::PureBasis > > StrPureBasisPair
Panzer's specialization of the Phalanx traits class.
std::vector< Teuchos::RCP< const IntegrationRule > > int_rules
std::vector< std::string > rep_field_name
std::vector< Teuchos::RCP< const PureBasis > > bases