43#include "Teuchos_RCP.hpp"
44#include "Teuchos_ParameterList.hpp"
45#include "Teuchos_Assert.hpp"
47#include "Phalanx_FieldManager.hpp"
48#include "Phalanx_Evaluator_Factory.hpp"
54#include "Shards_CellTopology.hpp"
59 const std::map<std::string,Teuchos::RCP<const shards::CellTopology> > & block_ids_to_cell_topo,
60 const Teuchos::RCP<Teuchos::ParameterList>& physics_blocks_plist,
61 const int default_integration_order,
62 const std::size_t workset_size,
63 const Teuchos::RCP<const panzer::EquationSetFactory>& eqset_factory,
64 const Teuchos::RCP<panzer::GlobalData>& global_data,
65 const bool build_transient_support,
66 std::vector<Teuchos::RCP<panzer::PhysicsBlock> > & physicsBlocks,
67 const std::vector<std::string>& tangent_param_names)
74 TEUCHOS_ASSERT(nonnull(physics_blocks_plist));
77 map<string,string>::const_iterator itr;
78 for (itr = block_ids_to_physics_ids.begin(); itr!=block_ids_to_physics_ids.end();++itr) {
79 string element_block_id = itr->first;
80 string physics_block_id = itr->second;
82 map<string,RCP<const shards::CellTopology> >::const_iterator ct_itr =
83 block_ids_to_cell_topo.find(element_block_id);
84 TEUCHOS_TEST_FOR_EXCEPTION(ct_itr==block_ids_to_cell_topo.end(),
86 "Falied to find CellTopology for element block id: \""
87 << element_block_id <<
"\"!");
88 RCP<const shards::CellTopology> cellTopo = ct_itr->second;
93 TEUCHOS_TEST_FOR_EXCEPTION(!physics_blocks_plist->isSublist(physics_block_id),
95 "Failed to find physics id: \""
97 <<
"\" requested by element block: \""
98 << element_block_id <<
"\"!");
100 RCP<panzer::PhysicsBlock> pb = rcp(
new panzer::PhysicsBlock(Teuchos::sublist(physics_blocks_plist,physics_block_id,
true),
102 default_integration_order,
106 build_transient_support,
109 physicsBlocks.push_back(pb);
114 const Teuchos::RCP<Teuchos::ParameterList>& physics_blocks_plist,
115 std::vector<Teuchos::RCP<panzer::PhysicsBlock> > & physicsBlocks)
122 TEUCHOS_ASSERT(nonnull(physics_blocks_plist));
125 map<string,string>::const_iterator itr;
126 for (itr = block_ids_to_physics_ids.begin(); itr!=block_ids_to_physics_ids.end();++itr) {
127 string element_block_id = itr->first;
128 string physics_block_id = itr->second;
131 TEUCHOS_TEST_FOR_EXCEPTION(!physics_blocks_plist->isSublist(physics_block_id),
133 "Failed to find physics id: \""
135 <<
"\" requested by element block: \""
136 << element_block_id <<
"\"!");
138 RCP<panzer::PhysicsBlock> pb = rcp(
new panzer::PhysicsBlock(Teuchos::sublist(physics_blocks_plist,physics_block_id,
true),
140 physicsBlocks.push_back(pb);
146 const std::vector<Teuchos::RCP<panzer::PhysicsBlock> > & physics_blocks,
147 bool throw_on_failure)
149 std::vector<Teuchos::RCP<panzer::PhysicsBlock> >::const_iterator pb = physics_blocks.begin();
151 while (pb != physics_blocks.end()) {
152 if ((*pb)->elementBlockID() == element_block_id)
158 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!");
160 Teuchos::RCP<panzer::PhysicsBlock> null_pb;
166PhysicsBlock(
const Teuchos::RCP<Teuchos::ParameterList>& physics_block_plist,
167 const std::string & element_block_id,
168 const int default_integration_order,
170 const Teuchos::RCP<const panzer::EquationSetFactory>& factory,
171 const Teuchos::RCP<panzer::GlobalData>& global_data,
172 const bool build_transient_support,
173 const std::vector<std::string>& tangent_param_names) :
183 TEUCHOS_ASSERT(nonnull(physics_block_plist));
184 TEUCHOS_ASSERT(nonnull(factory));
185 TEUCHOS_ASSERT(nonnull(global_data));
193 build_transient_support,
194 tangent_param_names);
199PhysicsBlock(
const Teuchos::RCP<Teuchos::ParameterList>& physics_block_plist,
200 const std::string & element_block_id) :
212 const std::string & physics_block_id,
213 const int integration_order,
215 const Teuchos::RCP<panzer::GlobalData>& global_data,
216 const Teuchos::RCP<panzer::PureBasis> & basis) :
228 using Teuchos::ParameterList;
241 m_bases[basis->name()] = basis;
254 for(std::vector<StrPureBasisPair>::const_iterator itr=
m_provided_dofs.begin();
256 m_field_lib->addFieldAndBasis(itr->first,itr->second);
282 const bool build_transient_support,
284 const Teuchos::RCP<const panzer::EquationSetFactory>& eqset_factory,
285 const Teuchos::RCP<panzer::GlobalData>& global_data,
286 const std::vector<std::string>& tangent_param_names)
299 tangent_param_names);
304 const int& default_integration_order,
305 const std::string & element_block_id,
307 const bool build_transient_support,
308 const std::vector<std::string>& tangent_param_names)
311 using Teuchos::ParameterList;
313 TEUCHOS_TEST_FOR_EXCEPTION(input_parameters->numParams() < 1, std::runtime_error,
314 "The physics block \"" << input_parameters->name()
315 <<
"\" required by element block \"" << element_block_id
316 <<
"\" does not have any equation sets associated with it."
317 <<
" Please add at least one equation set to this physics block!");
322 typedef ParameterList::ConstIterator pl_iter;
323 for (pl_iter eq = input_parameters->begin(); eq != input_parameters->end(); ++eq) {
325 TEUCHOS_TEST_FOR_EXCEPTION( !(eq->second.isList()), std::logic_error,
327 <<
"\" must be an equation set sublist!" );
329 RCP<ParameterList> eq_set_pl = Teuchos::sublist(input_parameters,eq->first,
true);
331 RCP<panzer::EquationSet_TemplateManager<panzer::Traits> > eq_set
335 for (
auto eq_it = eq_set->begin(); eq_it != eq_set->end(); ++eq_it) {
336 eq_it->setTangentParamNames(tangent_param_names);
343 const std::vector<StrPureBasisPair> & sbNames = eq_set->begin()->getProvidedDOFs();
344 for(std::size_t j=0;j<sbNames.size();j++) {
353 m_bases[sbNames[j].second->name()] = sbNames[j].second;
356 for (std::size_t k=0; k<tangent_param_names.size(); ++k)
358 sbNames[j].second ) );
363 const std::vector<std::vector<std::string> > & coord_dofs = eq_set->begin()->getCoordinateDOFs();
373 const std::map<int,Teuchos::RCP<panzer::IntegrationRule> > & ir_map = eq_set->begin()->getIntegrationRules();
374 for(std::map<
int,Teuchos::RCP<panzer::IntegrationRule> >::const_iterator ir = ir_map.begin();
375 ir != ir_map.end(); ++ir)
382 for(std::vector<StrPureBasisPair>::const_iterator itr=
m_provided_dofs.begin();
384 m_field_lib->addFieldAndBasis(itr->first,itr->second);
388 RCP<panzer::EquationSet_TemplateManager<panzer::Traits> > eq_set =
m_equation_sets[eq_i];
390 itr!=eq_set->end();++itr) {
391 itr->setElementBlockId(element_block_id);
400 TEUCHOS_ASSERT(aet.size() == std::size_t(Sacado::mpl::size<panzer::Traits::EvalTypes>::value));
414 const Teuchos::ParameterList& user_data)
const
421 vector< RCP<EquationSet_TemplateManager<panzer::Traits> > >::const_iterator
430 for (; eval_type != eqstm.end(); ++eval_type,++idx) {
437 eval_type->buildAndRegisterEquationSetEvaluators(fm, *
m_field_lib, user_data);
438 eval_type->setDetailsIndex(di);
448 const Teuchos::ParameterList& user_data)
const
455 vector< RCP<EquationSet_TemplateManager<panzer::Traits> > >::const_iterator
464 for (; eval_type != eqstm.end(); ++eval_type,++idx) {
467 eval_type->buildAndRegisterGatherAndOrientationEvaluators(fm, *
m_field_lib, lof, user_data);
468 eval_type->setDetailsIndex(di);
478 const Teuchos::ParameterList& user_data)
const
485 vector< RCP<EquationSet_TemplateManager<panzer::Traits> > >::const_iterator
494 for (; eval_type != eqstm.end(); ++eval_type,++idx) {
498 for (std::map<
int,Teuchos::RCP<panzer::IntegrationRule> >::const_iterator ir_iter =
m_integration_rules.begin();
501 Teuchos::RCP<panzer::IntegrationRule> ir = ir_iter->second;
504 eval_type->buildAndRegisterDOFProjectionsToIPEvaluators(fm, *
m_field_lib->buildFieldLayoutLibrary(*ir), ir, lof, user_data);
505 eval_type->setDetailsIndex(di);
516 const Teuchos::ParameterList& user_data)
const
523 vector< RCP<EquationSet_TemplateManager<panzer::Traits> > >::const_iterator
532 for (; eval_type != eqstm.end(); ++eval_type,++idx) {
535 eval_type->buildAndRegisterScatterEvaluators(fm, *
m_field_lib, lof, user_data);
536 eval_type->setDetailsIndex(di);
546 const Teuchos::ParameterList& models,
547 const Teuchos::ParameterList& user_data)
const
554 vector< RCP<EquationSet_TemplateManager<panzer::Traits> > >::const_iterator
563 for (; eval_type != eqstm.end(); ++eval_type,++idx) {
567 for (std::map<
int,Teuchos::RCP<panzer::IntegrationRule> >::const_iterator ir_iter =
m_integration_rules.begin();
570 Teuchos::RCP<panzer::IntegrationRule> ir = ir_iter->second;
573 eval_type->buildAndRegisterClosureModelEvaluators(fm, *
m_field_lib->buildFieldLayoutLibrary(*ir), ir, factory, models, user_data);
574 eval_type->setDetailsIndex(di);
586 const std::string& model_name,
587 const Teuchos::ParameterList& models,
588 const Teuchos::ParameterList& user_data)
const
595 vector< RCP<EquationSet_TemplateManager<panzer::Traits> > >::const_iterator
604 for (; eval_type != eqstm.end(); ++eval_type,++idx) {
608 for (std::map<
int,Teuchos::RCP<panzer::IntegrationRule> >::const_iterator ir_iter =
m_integration_rules.begin();
611 Teuchos::RCP<panzer::IntegrationRule> ir = ir_iter->second;
613 eval_type->buildAndRegisterClosureModelEvaluators(fm, *
m_field_lib->buildFieldLayoutLibrary(*ir), ir, factory, model_name, models, user_data);
614 eval_type->setDetailsIndex(di);
624 for (;eval_type != factory.end(); ++eval_type,++idx) {
628 Teuchos::ParameterList plist;
631 for (std::map<
int,Teuchos::RCP<panzer::IntegrationRule> >::const_iterator ir_iter =
m_integration_rules.begin();
634 Teuchos::RCP<panzer::IntegrationRule> ir = ir_iter->second;
637 Teuchos::RCP< std::vector< Teuchos::RCP<PHX::Evaluator<panzer::Traits> > > > evaluators =
638 eval_type->buildClosureModels(model_name,
649 eval_type->registerEvaluators(*evaluators,fm);
650 eval_type->setDetailsIndex(di);
661 const std::string& model_name,
662 const Teuchos::ParameterList& models,
664 const Teuchos::ParameterList& user_data)
const
705 const std::map<int,Teuchos::RCP<panzer::IntegrationRule> >& int_rules = this->
getIntegrationRules();
706 for (std::map<
int,Teuchos::RCP<panzer::IntegrationRule> >::const_iterator ir_itr = int_rules.begin();
707 ir_itr != int_rules.end(); ++ir_itr)
708 needs.
int_rules.push_back(ir_itr->second);
710 const std::map<std::string,Teuchos::RCP<panzer::PureBasis> >& bases= this->
getBases();
712 for(std::map<std::string,Teuchos::RCP<panzer::PureBasis> >::const_iterator b_itr = bases.begin();
713 b_itr != bases.end(); ++b_itr) {
715 needs.
bases.push_back(b_itr->second);
718 for(std::size_t d=0;d<fieldToBasis.size();d++) {
719 if(fieldToBasis[d].second->name()==b_itr->second->name()) {
729 TEUCHOS_ASSERT(found);
736const std::map<std::string,Teuchos::RCP<panzer::PureBasis> >&
743const std::map<int,Teuchos::RCP<panzer::IntegrationRule> >&
752 TEUCHOS_TEST_FOR_EXCEPTION(
m_bases.size() == 0, std::runtime_error,
753 "Cannot return a basis since none exist in this physics block.");
754 return m_bases.begin()->second->getIntrepid2Basis()->getBaseCellTopology();
Data for determining cell topology and dimensionality.
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
std::vector< Teuchos::RCP< const IntegrationRule > > int_rules
std::vector< std::string > rep_field_name
std::vector< Teuchos::RCP< const PureBasis > > bases