11#ifndef PANZER_ASSEMBLY_ENGINE_IMPL_HPP
12#define PANZER_ASSEMBLY_ENGINE_IMPL_HPP
14#include "Phalanx_FieldManager.hpp"
22template <
typename EvalT>
24AssemblyEngine(
const Teuchos::RCP<panzer::FieldManagerBuilder>& fmb,
26 : m_field_manager_builder(fmb), m_lin_obj_factory(lof), countersInitialized_(false)
33template <
typename EvalT>
44 if ( flags.
getValue() & EvaluationFlags::Initialize ) {
45 PANZER_FUNC_TIME_MONITOR_DIFF(
"panzer::AssemblyEngine::evaluate_gather("+PHX::print<EvalT>()+
")", eval_gather);
59 if ( flags.
getValue() & EvaluationFlags::VolumetricFill) {
60 PANZER_FUNC_TIME_MONITOR_DIFF(
"panzer::AssemblyEngine::evaluate_volume("+PHX::print<EvalT>()+
")", eval_vol);
61 this->evaluateVolume(in);
71 if ( flags.
getValue() & EvaluationFlags::BoundaryFill) {
73 PANZER_FUNC_TIME_MONITOR_DIFF(
"panzer::AssemblyEngine::evaluate_neumannbcs("+PHX::print<EvalT>()+
")",eval_neumannbcs);
74 this->evaluateNeumannBCs(in);
78 PANZER_FUNC_TIME_MONITOR_DIFF(
"panzer::AssemblyEngine::evaluate_interfacebcs("+PHX::print<EvalT>()+
")",eval_interfacebcs);
79 this->evaluateInterfaceBCs(in);
84 PANZER_FUNC_TIME_MONITOR_DIFF(
"panzer::AssemblyEngine::evaluate_dirichletbcs("+PHX::print<EvalT>()+
")",eval_dirichletbcs);
85 this->evaluateDirichletBCs(in);
89 if ( flags.
getValue() & EvaluationFlags::Scatter) {
90 PANZER_FUNC_TIME_MONITOR_DIFF(
"panzer::AssemblyEngine::evaluate_scatter("+PHX::print<EvalT>()+
")",eval_scatter);
92 PANZER_FUNC_TIME_MONITOR_DIFF(
"panzer::AssemblyEngine::lof->ghostToGlobalContainer("+PHX::print<EvalT>()+
")",lof_gtgc);
96 PANZER_FUNC_TIME_MONITOR_DIFF(
"panzer::AssemblyEngine::gedc.ghostToGlobal("+PHX::print<EvalT>()+
")",gedc_gtg);
109template <
typename EvalT>
128 Teuchos::RCP<LOC> counter = this->evaluateDirichletBCs(in);
143template <
typename EvalT>
147 const std::vector< Teuchos::RCP< PHX::FieldManager<panzer::Traits> > > &
148 volume_field_managers = m_field_manager_builder->getVolumeFieldManagers();
149 const std::vector<WorksetDescriptor> & wkstDesc = m_field_manager_builder->getVolumeWorksetDescriptors();
151 Teuchos::RCP<panzer::WorksetContainer> wkstContainer = m_field_manager_builder->getWorksetContainer();
161 for (std::size_t block = 0; block < volume_field_managers.size(); ++block) {
163 Teuchos::RCP< PHX::FieldManager<panzer::Traits> > fm = volume_field_managers[block];
164 std::vector<panzer::Workset>& w = *wkstContainer->getWorksets(wd);
166 fm->template preEvaluate<EvalT>(ped);
169 for (std::size_t i = 0; i < w.size(); ++i) {
181 fm->template evaluateFields<EvalT>(workset);
189 fm->template postEvaluate<EvalT>(NULL);
195template <
typename EvalT>
204template <
typename EvalT>
213template <
typename EvalT>
219 if(!countersInitialized_) {
220 localCounter_ = m_lin_obj_factory->buildPrimitiveGhostedLinearObjContainer();
221 globalCounter_ = m_lin_obj_factory->buildPrimitiveLinearObjContainer();
222 summedGhostedCounter_ = m_lin_obj_factory->buildPrimitiveGhostedLinearObjContainer();
223 countersInitialized_ =
true;
232 summedGhostedCounter_->initialize();
233 globalCounter_->initialize();
241 m_lin_obj_factory->ghostToGlobalContainer(*localCounter_,*globalCounter_,LOC::F);
245 m_lin_obj_factory->globalToGhostContainer(*globalCounter_,*summedGhostedCounter_,LOC::F);
258 if(itr->second->requiresDirichletAdjustment()) {
259 Teuchos::RCP<LinearObjContainer> loc = Teuchos::rcp_dynamic_cast<LinearObjContainer>(itr->second);
260 if(loc!=Teuchos::null) {
261 m_lin_obj_factory->adjustForDirichletConditions(*localCounter_,*summedGhostedCounter_,*loc);
265 Teuchos::RCP<GlobalEvaluationData_BCAdjustment> bc_adjust = Teuchos::rcp_dynamic_cast<GlobalEvaluationData_BCAdjustment>(itr->second,
true);
266 bc_adjust->adjustForDirichletConditions(*localCounter_,*summedGhostedCounter_);
271 return globalCounter_;
276template <
typename EvalT>
280 const Teuchos::RCP<LinearObjContainer> preEval_loc)
282 Teuchos::RCP<panzer::WorksetContainer> wkstContainer = m_field_manager_builder->getWorksetContainer();
285 ped.
gedc->addDataObject(
"Dirichlet Counter",preEval_loc);
296 double betaValue = in.
beta;
303 std::map<unsigned,PHX::FieldManager<panzer::Traits> >,
305 m_field_manager_builder->getBCFieldManagers();
310 std::map<unsigned,PHX::FieldManager<panzer::Traits> >,
314 for (bcfm_it_type bcfm_it = bc_field_managers.begin();
315 bcfm_it != bc_field_managers.end(); ++bcfm_it) {
318 const std::map<unsigned,PHX::FieldManager<panzer::Traits> > bc_fm =
322 Teuchos::RCP<const std::map<unsigned,panzer::Workset> > bc_wkst_ptr = wkstContainer->getSideWorksets(desc);
323 TEUCHOS_TEST_FOR_EXCEPTION(bc_wkst_ptr == Teuchos::null, std::logic_error,
324 "Failed to find corresponding bc workset!");
325 const std::map<unsigned,panzer::Workset>& bc_wkst = *bc_wkst_ptr;
328 if (bc.
bcType() == bc_type) {
329 std::ostringstream timerName;
330 timerName <<
"panzer::AssemblyEngine::evaluateBCs: " << bc.
identifier();
331#ifdef PANZER_TEUCHOS_TIME_MONITOR
332 auto timer1 = Teuchos::TimeMonitor::getNewTimer(timerName.str());
333 Teuchos::TimeMonitor tm1(*timer1);
338 std::ostringstream timerSideName;
339 timerSideName <<
"panzer::AssemblyEngine::evaluateBCs: " << bc.
identifier() <<
", side=" << side->first;
340#ifdef PANZER_TEUCHOS_TIME_MONITOR
341 auto timer2 = Teuchos::TimeMonitor::getNewTimer(timerSideName.str());
342 Teuchos::TimeMonitor tm2(*timer2);
346 unsigned local_side_index = side->first;
351 std::map<unsigned,panzer::Workset>::const_iterator wkst_it =
352 bc_wkst.find(local_side_index);
354 TEUCHOS_TEST_FOR_EXCEPTION(wkst_it == bc_wkst.end(), std::logic_error,
355 "Failed to find corresponding bc workset side!");
361 local_side_fm.template preEvaluate<EvalT>(ped);
365 workset.
beta = betaValue;
372 local_side_fm.template evaluateFields<EvalT>(workset);
375 local_side_fm.template postEvaluate<EvalT>(NULL);
std::vector< double > gather_seeds
Teuchos::RCP< panzer::LinearObjContainer > ghostedContainer_
bool apply_dirichlet_beta
std::string second_sensitivities_name
bool evaluate_transient_terms
Teuchos::RCP< panzer::LinearObjContainer > container_
std::string first_sensitivities_name
void fillGlobalEvaluationDataContainer(GlobalEvaluationDataContainer &gedc) const
Using internal map fill the global evaluation data container object.
Teuchos::RCP< LinearObjContainer > evaluateOnlyDirichletBCs(const panzer::AssemblyEngineInArgs &input_arguments)
void evaluate(const panzer::AssemblyEngineInArgs &input_arguments, const EvaluationFlags flags=EvaluationFlags(EvaluationFlags::All))
void evaluateVolume(const panzer::AssemblyEngineInArgs &input_arguments)
void evaluateNeumannBCs(const panzer::AssemblyEngineInArgs &input_arguments)
void evaluateInterfaceBCs(const panzer::AssemblyEngineInArgs &input_arguments)
AssemblyEngine(const Teuchos::RCP< panzer::FieldManagerBuilder > &fmb, const Teuchos::RCP< const panzer::LinearObjFactory< panzer::Traits > > &lof)
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)
Stores input information for a boundary condition.
BCType bcType() const
Returns the boundary condition type (Dirichlet or Neumann or Interface).
std::string identifier() const
A unique string identifier for this boundary condition.
void addDataObject(const std::string &key, const Teuchos::RCP< GlobalEvaluationData > &ged)
void initialize()
Call initialize on all containers.
void globalToGhost(int p)
Call global to ghost on all the containers.
void ghostToGlobal(int p)
Call ghost to global on all the containers.
const_iterator begin() const
std::unordered_map< std::string, Teuchos::RCP< GlobalEvaluationData > >::iterator iterator
const_iterator end() const
virtual void initialize()=0
bool evaluate_transient_terms
std::vector< double > gather_seeds
WorksetDescriptor bcDescriptor(const panzer::BC &bc)
BCType
Type of boundary condition.
Teuchos::RCP< GlobalEvaluationDataContainer > gedc
std::string second_sensitivities_name
std::string first_sensitivities_name