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(
"panzer::AssemblyEngine::evaluate_gather("+PHX::typeAsString<EvalT>()+
")");
91 if ( flags.
getValue() & EvaluationFlags::VolumetricFill) {
92 PANZER_FUNC_TIME_MONITOR(
"panzer::AssemblyEngine::evaluate_volume("+PHX::typeAsString<EvalT>()+
")");
93 this->evaluateVolume(in);
103 if ( flags.
getValue() & EvaluationFlags::BoundaryFill) {
105 PANZER_FUNC_TIME_MONITOR(
"panzer::AssemblyEngine::evaluate_neumannbcs("+PHX::typeAsString<EvalT>()+
")");
106 this->evaluateNeumannBCs(in);
110 PANZER_FUNC_TIME_MONITOR(
"panzer::AssemblyEngine::evaluate_interfacebcs("+PHX::typeAsString<EvalT>()+
")");
111 this->evaluateInterfaceBCs(in);
116 PANZER_FUNC_TIME_MONITOR(
"panzer::AssemblyEngine::evaluate_dirichletbcs("+PHX::typeAsString<EvalT>()+
")");
117 this->evaluateDirichletBCs(in);
121 if ( flags.
getValue() & EvaluationFlags::Scatter) {
122 PANZER_FUNC_TIME_MONITOR(
"panzer::AssemblyEngine::evaluate_scatter("+PHX::typeAsString<EvalT>()+
")");
137 template <
typename EvalT>
171 template <
typename EvalT>
175 const std::vector< Teuchos::RCP< PHX::FieldManager<panzer::Traits> > > &
176 volume_field_managers = m_field_manager_builder->getVolumeFieldManagers();
177 const std::vector<WorksetDescriptor> & wkstDesc = m_field_manager_builder->getVolumeWorksetDescriptors();
189 for (std::size_t block = 0; block < volume_field_managers.size(); ++block) {
192 std::vector<panzer::Workset>& w = *wkstContainer->
getWorksets(wd);
194 fm->template preEvaluate<EvalT>(ped);
197 for (std::size_t i = 0; i < w.size(); ++i) {
209 fm->template evaluateFields<EvalT>(workset);
217 fm->template postEvaluate<EvalT>(NULL);
223 template <
typename EvalT>
232 template <
typename EvalT>
241 template <
typename EvalT>
247 if(!countersInitialized_) {
248 localCounter_ = m_lin_obj_factory->buildPrimitiveGhostedLinearObjContainer();
249 globalCounter_ = m_lin_obj_factory->buildPrimitiveLinearObjContainer();
250 summedGhostedCounter_ = m_lin_obj_factory->buildPrimitiveGhostedLinearObjContainer();
251 countersInitialized_ =
true;
260 summedGhostedCounter_->initialize();
261 globalCounter_->initialize();
269 m_lin_obj_factory->ghostToGlobalContainer(*localCounter_,*globalCounter_,LOC::F);
273 m_lin_obj_factory->globalToGhostContainer(*globalCounter_,*summedGhostedCounter_,LOC::F);
286 if(itr->second->requiresDirichletAdjustment()) {
288 if(loc!=Teuchos::null) {
289 m_lin_obj_factory->adjustForDirichletConditions(*localCounter_,*summedGhostedCounter_,*loc);
299 return globalCounter_;
304 template <
typename EvalT>
313 ped.
gedc->addDataObject(
"Dirichlet Counter",preEval_loc);
324 double betaValue = in.
beta;
331 std::map<unsigned,PHX::FieldManager<panzer::Traits> >,
333 m_field_manager_builder->getBCFieldManagers();
338 std::map<unsigned,PHX::FieldManager<panzer::Traits> >,
342 for (bcfm_it_type bcfm_it = bc_field_managers.begin();
343 bcfm_it != bc_field_managers.end(); ++bcfm_it) {
346 const std::map<unsigned,PHX::FieldManager<panzer::Traits> > bc_fm =
352 "Failed to find corresponding bc workset!");
353 const std::map<unsigned,panzer::Workset>& bc_wkst = *bc_wkst_ptr;
356 if (bc.
bcType() == bc_type) {
357 std::ostringstream timerName;
358 timerName <<
"panzer::AssemblyEngine::evaluateBCs: " << bc.
identifier();
359 PANZER_FUNC_TIME_MONITOR(timerName.str());
363 std::ostringstream timerSideName;
364 timerSideName <<
"panzer::AssemblyEngine::evaluateBCs: " << bc.
identifier() <<
", side=" << side->first;
365 PANZER_FUNC_TIME_MONITOR(timerSideName.str());
368 unsigned local_side_index = side->first;
373 std::map<unsigned,panzer::Workset>::const_iterator wkst_it =
374 bc_wkst.find(local_side_index);
377 "Failed to find corresponding bc workset side!");
380 const_cast<panzer::Workset&>(wkst_it->second);
383 local_side_fm.template preEvaluate<EvalT>(ped);
386 workset.alpha = in.
alpha;
387 workset.beta = betaValue;
388 workset.time = in.
time;
392 local_side_fm.template evaluateFields<EvalT>(workset);
395 local_side_fm.template postEvaluate<EvalT>(NULL);