43 #ifndef PANZER_ASSEMBLY_ENGINE_IMPL_HPP
44 #define PANZER_ASSEMBLY_ENGINE_IMPL_HPP
46 #include "Phalanx_FieldManager.hpp"
54 template <
typename EvalT>
58 : m_field_manager_builder(fmb), m_lin_obj_factory(lof), countersInitialized_(false)
65 template <
typename EvalT>
76 if ( flags.
getValue() & EvaluationFlags::Initialize ) {
77 PANZER_FUNC_TIME_MONITOR_DIFF(
"panzer::AssemblyEngine::evaluate_gather("+PHX::print<EvalT>()+
")", eval_gather);
91 if ( flags.
getValue() & EvaluationFlags::VolumetricFill) {
92 PANZER_FUNC_TIME_MONITOR_DIFF(
"panzer::AssemblyEngine::evaluate_volume("+PHX::print<EvalT>()+
")", eval_vol);
93 this->evaluateVolume(in);
103 if ( flags.
getValue() & EvaluationFlags::BoundaryFill) {
105 PANZER_FUNC_TIME_MONITOR_DIFF(
"panzer::AssemblyEngine::evaluate_neumannbcs("+PHX::print<EvalT>()+
")",eval_neumannbcs);
106 this->evaluateNeumannBCs(in);
110 PANZER_FUNC_TIME_MONITOR_DIFF(
"panzer::AssemblyEngine::evaluate_interfacebcs("+PHX::print<EvalT>()+
")",eval_interfacebcs);
111 this->evaluateInterfaceBCs(in);
116 PANZER_FUNC_TIME_MONITOR_DIFF(
"panzer::AssemblyEngine::evaluate_dirichletbcs("+PHX::print<EvalT>()+
")",eval_dirichletbcs);
117 this->evaluateDirichletBCs(in);
121 if ( flags.
getValue() & EvaluationFlags::Scatter) {
122 PANZER_FUNC_TIME_MONITOR_DIFF(
"panzer::AssemblyEngine::evaluate_scatter("+PHX::print<EvalT>()+
")",eval_scatter);
124 PANZER_FUNC_TIME_MONITOR_DIFF(
"panzer::AssemblyEngine::lof->ghostToGlobalContainer("+PHX::print<EvalT>()+
")",lof_gtgc);
128 PANZER_FUNC_TIME_MONITOR_DIFF(
"panzer::AssemblyEngine::gedc.ghostToGlobal("+PHX::print<EvalT>()+
")",gedc_gtg);
141 template <
typename EvalT>
175 template <
typename EvalT>
179 const std::vector< Teuchos::RCP< PHX::FieldManager<panzer::Traits> > > &
180 volume_field_managers = m_field_manager_builder->getVolumeFieldManagers();
181 const std::vector<WorksetDescriptor> & wkstDesc = m_field_manager_builder->getVolumeWorksetDescriptors();
193 for (std::size_t block = 0; block < volume_field_managers.size(); ++block) {
196 std::vector<panzer::Workset>& w = *wkstContainer->
getWorksets(wd);
198 fm->template preEvaluate<EvalT>(ped);
201 for (std::size_t i = 0; i < w.size(); ++i) {
213 fm->template evaluateFields<EvalT>(workset);
221 fm->template postEvaluate<EvalT>(NULL);
227 template <
typename EvalT>
236 template <
typename EvalT>
245 template <
typename EvalT>
251 if(!countersInitialized_) {
252 localCounter_ = m_lin_obj_factory->buildPrimitiveGhostedLinearObjContainer();
253 globalCounter_ = m_lin_obj_factory->buildPrimitiveLinearObjContainer();
254 summedGhostedCounter_ = m_lin_obj_factory->buildPrimitiveGhostedLinearObjContainer();
255 countersInitialized_ =
true;
264 summedGhostedCounter_->initialize();
265 globalCounter_->initialize();
273 m_lin_obj_factory->ghostToGlobalContainer(*localCounter_,*globalCounter_,LOC::F);
277 m_lin_obj_factory->globalToGhostContainer(*globalCounter_,*summedGhostedCounter_,LOC::F);
290 if(itr->second->requiresDirichletAdjustment()) {
292 if(loc!=Teuchos::null) {
293 m_lin_obj_factory->adjustForDirichletConditions(*localCounter_,*summedGhostedCounter_,*loc);
303 return globalCounter_;
308 template <
typename EvalT>
317 ped.
gedc->addDataObject(
"Dirichlet Counter",preEval_loc);
328 double betaValue = in.
beta;
335 std::map<unsigned,PHX::FieldManager<panzer::Traits> >,
337 m_field_manager_builder->getBCFieldManagers();
341 typedef typename std::map<panzer::BC,
342 std::map<unsigned,PHX::FieldManager<panzer::Traits> >,
346 for (bcfm_it_type bcfm_it = bc_field_managers.begin();
347 bcfm_it != bc_field_managers.end(); ++bcfm_it) {
349 const panzer::BC& bc = bcfm_it->first;
350 const std::map<unsigned,PHX::FieldManager<panzer::Traits> > bc_fm =
356 "Failed to find corresponding bc workset!");
357 const std::map<unsigned,panzer::Workset>& bc_wkst = *bc_wkst_ptr;
360 if (bc.
bcType() == bc_type) {
361 std::ostringstream timerName;
362 timerName <<
"panzer::AssemblyEngine::evaluateBCs: " << bc.
identifier();
363 #ifdef PANZER_TEUCHOS_TIME_MONITOR
370 std::ostringstream timerSideName;
371 timerSideName <<
"panzer::AssemblyEngine::evaluateBCs: " << bc.
identifier() <<
", side=" << side->first;
372 #ifdef PANZER_TEUCHOS_TIME_MONITOR
378 unsigned local_side_index = side->first;
383 std::map<unsigned,panzer::Workset>::const_iterator wkst_it =
384 bc_wkst.find(local_side_index);
387 "Failed to find corresponding bc workset side!");
393 local_side_fm.template preEvaluate<EvalT>(ped);
396 workset.alpha = in.
alpha;
397 workset.beta = betaValue;
398 workset.time = in.
time;
402 local_side_fm.template evaluateFields<EvalT>(workset);
405 local_side_fm.template postEvaluate<EvalT>(NULL);
Teuchos::RCP< GlobalEvaluationDataContainer > gedc
bool evaluate_transient_terms
void addDataObject(const std::string &key, const Teuchos::RCP< GlobalEvaluationData > &ged)
BCType
Type of boundary condition.
std::unordered_map< std::string, Teuchos::RCP< GlobalEvaluationData > >::iterator iterator
const_iterator begin() const
FieldManager::iterator begin()
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
std::string second_sensitivities_name
bool evaluate_transient_terms
virtual void adjustForDirichletConditions(const GlobalEvaluationData &localBCRows, const GlobalEvaluationData &globalBCRows)=0
void initialize()
Call initialize on all containers.
Teuchos::RCP< panzer::LinearObjContainer > ghostedContainer_
std::vector< double > gather_seeds
void evaluate(const panzer::AssemblyEngineInArgs &input_arguments, const EvaluationFlags flags=EvaluationFlags(EvaluationFlags::All))
void globalToGhost(int p)
Call global to ghost on all the containers.
static RCP< Time > getNewTimer(const std::string &name)
Teuchos::RCP< panzer::LinearObjContainer > container_
std::string identifier() const
A unique string identifier for this boundary condition.
std::string first_sensitivities_name
Teuchos::RCP< std::map< unsigned, Workset > > getSideWorksets(const WorksetDescriptor &desc)
Access, and construction of side worksets.
void evaluateInterfaceBCs(const panzer::AssemblyEngineInArgs &input_arguments)
const_iterator end() const
void evaluateVolume(const panzer::AssemblyEngineInArgs &input_arguments)
void setRequiresDirichletAdjustment(bool b)
FieldManager::iterator end()
Teuchos::RCP< std::vector< Workset > > getWorksets(const WorksetDescriptor &wd)
Access to volume worksets.
std::vector< double > gather_seeds
BCType bcType() const
Returns the boundary condition type (Dirichlet or Neumann or Interface).
Teuchos::RCP< LinearObjContainer > evaluateDirichletBCs(const panzer::AssemblyEngineInArgs &input_arguments)
This method returns the global counter used to indicate which rows are boundary conditions.
void evaluateBCs(const panzer::BCType bc_type, const panzer::AssemblyEngineInArgs &input_arguments, const Teuchos::RCP< LinearObjContainer > preEval_loc=Teuchos::null)
void ghostToGlobal(int p)
Call ghost to global on all the containers.
void fillGlobalEvaluationDataContainer(GlobalEvaluationDataContainer &gedc) const
Using internal map fill the global evaluation data container object.
std::string first_sensitivities_name
AssemblyEngine(const Teuchos::RCP< panzer::FieldManagerBuilder > &fmb, const Teuchos::RCP< const panzer::LinearObjFactory< panzer::Traits > > &lof)
bool apply_dirichlet_beta
virtual void initialize()=0
std::string second_sensitivities_name
WorksetDescriptor bcDescriptor(const panzer::BC &bc)
Stores input information for a boundary condition.
Teuchos::RCP< LinearObjContainer > evaluateOnlyDirichletBCs(const panzer::AssemblyEngineInArgs &input_arguments)
void evaluateNeumannBCs(const panzer::AssemblyEngineInArgs &input_arguments)