void ComputeIndicatorThread::onElement(const Elem * elem) { for (const auto & it : _aux_sys._elem_vars[_tid]) { MooseVariable * var = it.second; var->prepareAux(); } _fe_problem.prepare(elem, _tid); _fe_problem.reinitElem(elem, _tid); // Set up Sentinel class so that, even if reinitMaterials() throws, we // still remember to swap back during stack unwinding. SwapBackSentinel sentinel(_fe_problem, &FEProblemBase::swapBackMaterials, _tid); _fe_problem.reinitMaterials(_subdomain, _tid); // Compute if (!_finalize) { if (_indicator_whs.hasActiveBlockObjects(_subdomain, _tid)) { const std::vector<std::shared_ptr<Indicator>> & indicators = _indicator_whs.getActiveBlockObjects(_subdomain, _tid); for (const auto & indicator : indicators) indicator->computeIndicator(); } } // Finalize else { if (_indicator_whs.hasActiveBlockObjects(_subdomain, _tid)) { const std::vector<std::shared_ptr<Indicator>> & indicators = _indicator_whs.getActiveBlockObjects(_subdomain, _tid); for (const auto & indicator : indicators) indicator->finalize(); } if (_internal_side_indicators.hasActiveBlockObjects(_subdomain, _tid)) { const std::vector<std::shared_ptr<InternalSideIndicator>> & internal_indicators = _internal_side_indicators.getActiveBlockObjects(_subdomain, _tid); for (const auto & internal_indicator : internal_indicators) internal_indicator->finalize(); } } if (!_finalize) // During finalize the Indicators should be setting values in the vectors manually { Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx); for (const auto & it : _aux_sys._elem_vars[_tid]) { MooseVariable * var = it.second; var->add(_aux_sys.solution()); } } }
void ComputeIndicatorThread::onElement(const Elem *elem) { for (std::map<std::string, MooseVariable *>::iterator it = _aux_sys._elem_vars[_tid].begin(); it != _aux_sys._elem_vars[_tid].end(); ++it) { MooseVariable * var = it->second; var->prepareAux(); } _fe_problem.prepare(elem, _tid); _fe_problem.reinitElem(elem, _tid); _fe_problem.reinitMaterials(_subdomain, _tid); const std::vector<Indicator *> & indicators = _indicator_whs[_tid].active(); if (!_finalize) for (std::vector<Indicator *>::const_iterator it = indicators.begin(); it != indicators.end(); ++it) (*it)->computeIndicator(); else { for (std::vector<Indicator *>::const_iterator it = indicators.begin(); it != indicators.end(); ++it) (*it)->finalize(); // Now finalize the side integral side_indicators as well { const std::vector<Indicator *> & side_indicators = _indicator_whs[_tid].activeInternalSideIndicators(); for (std::vector<Indicator *>::const_iterator it = side_indicators.begin(); it != side_indicators.end(); ++it) (*it)->finalize(); } } _fe_problem.swapBackMaterials(_tid); if (!_finalize) // During finalize the Indicators should be setting values in the vectors manually { Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx); for (std::map<std::string, MooseVariable *>::iterator it = _aux_sys._elem_vars[_tid].begin(); it != _aux_sys._elem_vars[_tid].end(); ++it) { MooseVariable * var = it->second; var->add(_aux_sys.solution()); } } }