43 #ifndef PANZER_ASSEMBLY_ENGINE_IMPL_HPP 44 #define PANZER_ASSEMBLY_ENGINE_IMPL_HPP 46 #include "Phalanx_FieldManager.hpp" 52 template <
typename EvalT>
56 : m_field_manager_builder(fmb), m_lin_obj_factory(lof), countersInitialized_(false)
63 template <
typename EvalT>
74 PANZER_FUNC_TIME_MONITOR(
"panzer::AssemblyEngine::evaluate_gather("+PHX::typeAsString<EvalT>()+
")");
89 PANZER_FUNC_TIME_MONITOR(
"panzer::AssemblyEngine::evaluate_volume("+PHX::typeAsString<EvalT>()+
")");
90 this->evaluateVolume(in);
101 PANZER_FUNC_TIME_MONITOR(
"panzer::AssemblyEngine::evaluate_neumannbcs("+PHX::typeAsString<EvalT>()+
")");
102 this->evaluateNeumannBCs(in);
106 PANZER_FUNC_TIME_MONITOR(
"panzer::AssemblyEngine::evaluate_interfacebcs("+PHX::typeAsString<EvalT>()+
")");
107 this->evaluateInterfaceBCs(in);
112 PANZER_FUNC_TIME_MONITOR(
"panzer::AssemblyEngine::evaluate_dirichletbcs("+PHX::typeAsString<EvalT>()+
")");
113 this->evaluateDirichletBCs(in);
117 PANZER_FUNC_TIME_MONITOR(
"panzer::AssemblyEngine::evaluate_scatter("+PHX::typeAsString<EvalT>()+
")");
132 template <
typename EvalT>
151 Teuchos::RCP<LOC> counter = this->evaluateDirichletBCs(in);
166 template <
typename EvalT>
170 const std::vector< Teuchos::RCP< PHX::FieldManager<panzer::Traits> > > &
171 volume_field_managers = m_field_manager_builder->getVolumeFieldManagers();
172 const std::vector<WorksetDescriptor> & wkstDesc = m_field_manager_builder->getVolumeWorksetDescriptors();
174 Teuchos::RCP<panzer::WorksetContainer> wkstContainer = m_field_manager_builder->getWorksetContainer();
184 for (std::size_t block = 0; block < volume_field_managers.size(); ++block) {
186 Teuchos::RCP< PHX::FieldManager<panzer::Traits> > fm = volume_field_managers[block];
187 std::vector<panzer::Workset>& w = *wkstContainer->getWorksets(wd);
189 fm->template preEvaluate<EvalT>(ped);
192 for (std::size_t i = 0; i < w.size(); ++i) {
204 fm->template evaluateFields<EvalT>(workset);
212 fm->template postEvaluate<EvalT>(NULL);
218 template <
typename EvalT>
227 template <
typename EvalT>
236 template <
typename EvalT>
242 if(!countersInitialized_) {
243 localCounter_ = m_lin_obj_factory->buildPrimitiveGhostedLinearObjContainer();
245 globalCounter_ = m_lin_obj_factory->buildPrimitiveLinearObjContainer();
246 summedGhostedCounter_ = m_lin_obj_factory->buildPrimitiveGhostedLinearObjContainer();
247 countersInitialized_ =
true;
251 Teuchos::RCP<LinearObjContainer> localCounter = localCounter_;
260 Teuchos::RCP<LinearObjContainer> summedGhostedCounter = summedGhostedCounter_;
262 summedGhostedCounter->initialize();
265 Teuchos::RCP<LinearObjContainer> globalCounter = globalCounter_;
268 globalCounter->initialize();
269 m_lin_obj_factory->ghostToGlobalContainer(*localCounter,*globalCounter,LOC::F);
273 m_lin_obj_factory->globalToGhostContainer(*globalCounter,*summedGhostedCounter,LOC::F);
285 if(itr->second->requiresDirichletAdjustment()) {
286 Teuchos::RCP<LinearObjContainer> loc = Teuchos::rcp_dynamic_cast<
LinearObjContainer>(itr->second);
287 if(loc!=Teuchos::null) {
288 m_lin_obj_factory->adjustForDirichletConditions(*localCounter,*summedGhostedCounter,*loc);
298 return globalCounter;
303 template <
typename EvalT>
307 const Teuchos::RCP<LinearObjContainer> preEval_loc)
309 Teuchos::RCP<panzer::WorksetContainer> wkstContainer = m_field_manager_builder->getWorksetContainer();
323 double betaValue = in.
beta;
330 std::map<unsigned,PHX::FieldManager<panzer::Traits> >,
332 m_field_manager_builder->getBCFieldManagers();
337 std::map<unsigned,PHX::FieldManager<panzer::Traits> >,
341 for (bcfm_it_type bcfm_it = bc_field_managers.begin();
342 bcfm_it != bc_field_managers.end(); ++bcfm_it) {
345 const std::map<unsigned,PHX::FieldManager<panzer::Traits> > bc_fm =
348 Teuchos::RCP<const std::map<unsigned,panzer::Workset> > bc_wkst_ptr = wkstContainer->getSideWorksets(bc);
349 TEUCHOS_TEST_FOR_EXCEPTION(bc_wkst_ptr == Teuchos::null, std::logic_error,
350 "Failed to find corresponding bc workset!");
351 const std::map<unsigned,panzer::Workset>& bc_wkst = *bc_wkst_ptr;
354 if (bc.
bcType() == bc_type) {
360 unsigned local_side_index = side->first;
365 std::map<unsigned,panzer::Workset>::const_iterator wkst_it =
366 bc_wkst.find(local_side_index);
368 TEUCHOS_TEST_FOR_EXCEPTION(wkst_it == bc_wkst.end(), std::logic_error,
369 "Failed to find corresponding bc workset side!");
375 local_side_fm.template preEvaluate<EvalT>(ped);
378 workset.alpha = in.
alpha;
379 workset.beta = betaValue;
380 workset.time = in.
time;
384 local_side_fm.template evaluateFields<EvalT>(workset);
387 local_side_fm.template postEvaluate<EvalT>(NULL);
const_iterator begin() const
bool evaluate_transient_terms
std::string first_sensitivities_name
void addDataObject(const std::string &key, const Teuchos::RCP< GlobalEvaluationData > &ged)
BCType
Type of boundary condition.
double alpha
If workset corresponds to a sub cell, what is the dimension?
std::unordered_map< std::string, Teuchos::RCP< GlobalEvaluationData > >::iterator iterator
virtual void adjustForDirichletConditions(const GlobalEvaluationData &localBCRows, const GlobalEvaluationData &globalBCRows)=0
BCType bcType() const
Returns the boundary condition type (Dirichlet or Neumann or Interface).
void initialize()
Call initialize on all containers.
Teuchos::RCP< panzer::LinearObjContainer > ghostedContainer_
std::vector< double > gather_seeds
std::vector< double > gather_seeds
void fillGlobalEvaluationDataContainer(GlobalEvaluationDataContainer &gedc) const
Using internal map fill the global evaluation data container object.
void globalToGhost(int p)
Call global to ghost on all the containers.
Teuchos::RCP< panzer::LinearObjContainer > container_
void evaluateInterfaceBCs(const panzer::AssemblyEngineInArgs &input_arguments)
void evaluateVolume(const panzer::AssemblyEngineInArgs &input_arguments)
void evaluate(const panzer::AssemblyEngineInArgs &input_arguments)
std::string second_sensitivities_name
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)
bool evaluate_transient_terms
void ghostToGlobal(int p)
Call ghost to global on all the containers.
std::string first_sensitivities_name
AssemblyEngine(const Teuchos::RCP< panzer::FieldManagerBuilder > &fmb, const Teuchos::RCP< const panzer::LinearObjFactory< panzer::Traits > > &lof)
GlobalEvaluationDataContainer gedc
bool apply_dirichlet_beta
virtual void initialize()=0
std::string second_sensitivities_name
Stores input information for a boundary condition.
const_iterator end() const
Teuchos::RCP< LinearObjContainer > evaluateOnlyDirichletBCs(const panzer::AssemblyEngineInArgs &input_arguments)
void evaluateNeumannBCs(const panzer::AssemblyEngineInArgs &input_arguments)