34template <
typename RangeType>
55 const Elem * lower_d_elem =
nullptr)
override;
64 const std::vector<const MaterialPropertyInterface *> & material_consumers,
67 std::deque<MaterialBase *> & required_face_materials,
68 std::deque<MaterialBase *> & required_boundary_materials)
const;
84 const bool print_header =
true,
85 const std::string & line_prefix =
"[DBG]")
const;
88 const bool print_header =
true,
89 const std::string & line_prefix =
"[DBG]")
const;
92template <
typename RangeType>
98template <
typename RangeType>
105template <
typename RangeType>
110template <
typename RangeType>
116 std::string what(e.
what());
117 _fe_problem.setException(what);
120template <
typename RangeType>
127template <
typename RangeType>
134template <
typename RangeType>
144template <
typename RangeType>
152template <
typename RangeType>
156 const bool print_header,
157 const std::string & line_prefix)
const
162 auto & console = _fe_problem.console();
164 std::vector<MooseObject *> moose_objs;
165 for (
auto obj_ptr : objs)
166 moose_objs.push_back(
dynamic_cast<MooseObject *
>(obj_ptr));
170 std::string message = print_header ?
"Executing " + objects_type +
" on " +
171 _fe_problem.getCurrentExecuteOnFlag().name() +
"\n"
173 message += (print_header ?
"Order of execution:\n" :
"") + names;
177template <
typename RangeType>
181 const std::vector<std::shared_ptr<T>> & objs_ptrs,
182 const bool print_header,
183 const std::string & line_prefix)
const
185 std::vector<T *> regular_ptrs;
186 for (
auto shared_ptr : objs_ptrs)
187 regular_ptrs.push_back(shared_ptr.get());
188 printExecutionOrdering<T>(regular_ptrs, print_header, line_prefix);
191template <
typename RangeType>
195 _fe_problem.prepare(elem, this->_tid);
196 _fe_problem.reinitElem(elem, this->_tid);
197 _fe_problem.reinitMaterials(this->_subdomain, this->_tid);
200template <
typename RangeType>
204 _fe_problem.clearActiveElementalMooseVariables(this->_tid);
205 _fe_problem.clearActiveMaterialProperties(this->_tid);
208template <
typename RangeType>
211 const std::vector<const MaterialPropertyInterface *> & material_consumers,
214 std::deque<MaterialBase *> & required_face_materials,
215 std::deque<MaterialBase *> & required_boundary_materials)
const
217 required_face_materials.clear();
218 required_boundary_materials.clear();
220 std::unordered_set<unsigned int> needed_face_props;
221 for (
const auto *
const consumer : material_consumers)
223 const auto & dependencies = consumer->getMatPropDependencies();
224 needed_face_props.insert(dependencies.begin(), dependencies.end());
227 const auto & materials = _fe_problem.getRegularMaterialsWarehouse();
231 if (!material_consumers.empty() && materials.hasActiveBoundaryObjects(bnd_id, this->_tid))
233 material_consumers, materials.getActiveBoundaryObjects(bnd_id, this->_tid),
true);
234 for (
const auto *
const material : required_boundary_materials)
236 const auto & dependencies = material->getMatPropDependencies();
237 needed_face_props.insert(dependencies.begin(), dependencies.end());
241 for (
const auto *
const material : required_boundary_materials)
242 for (
const auto supplied_prop : material->getSuppliedPropIDs())
243 needed_face_props.erase(supplied_prop);
245 struct MaterialDependencyConsumer
247 const std::unordered_set<unsigned int> & dependencies;
248 const std::unordered_set<unsigned int> & getMatPropDependencies()
const {
return dependencies; }
250 if (!needed_face_props.empty())
253 if (face_materials.hasActiveBlockObjects(subdomain_id, this->_tid))
255 const MaterialDependencyConsumer face_consumer{needed_face_props};
256 const std::vector<const MaterialDependencyConsumer *> face_consumers{&face_consumer};
258 face_consumers, face_materials.getActiveBlockObjects(subdomain_id, this->_tid),
true);
boundary_id_type BoundaryID
subdomain_id_type SubdomainID
static Threads::spin_mutex threaded_element_mutex
This mutex is used by all derived classes of the ThreadedElementLoop.
Specialization of SubProblem for solving nonlinear equations plus auxiliary equations.
virtual bool hasException()
Whether or not an exception has occurred.
static std::deque< MaterialBase * > buildRequiredMaterials(const Consumers &mat_consumers, const std::vector< std::shared_ptr< MaterialBase > > &mats, const bool allow_stateful)
Build the materials required by a set of consumer objects.
Provides a way for users to bail out of the current solve.
virtual const char * what() const
Get out the error message.
Every object that can be built by the factory should be derived from this class.
Base class for a system (of equations)
Base class for assembly-like calculations.
Base class for assembly-like calculations.
virtual void caughtMooseException(MooseException &e) override
Called if a MooseException is caught anywhere during the computation.
ThreadedElementLoop(ThreadedElementLoop &x, Threads::split split)
virtual void preInternalSide(const Elem *elem, unsigned int side) override
Called before evaluations on an element internal side.
virtual ~ThreadedElementLoop()
virtual void neighborSubdomainChanged() override
Called every time the neighbor subdomain changes (i.e.
void clearVarsAndMaterials()
ThreadedElementLoop(FEProblemBase &feproblem)
virtual bool keepGoing() override
Whether or not the loop should continue.
void printExecutionOrdering(const std::vector< std::shared_ptr< T > > &objs_ptrs, const bool print_header=true, const std::string &line_prefix="[DBG]") const
void prepareElement(const Elem *elem)
FEProblemBase & _fe_problem
virtual void preElement(const Elem *elem) override
Called before the element assembly.
void printExecutionOrdering(const std::vector< T * > &objs, const bool print_header=true, const std::string &line_prefix="[DBG]") const
Routine to output the ordering of objects within a vector of pointers to these objects.
void getRequiredBoundaryMaterials(const std::vector< const MaterialPropertyInterface * > &material_consumers, BoundaryID bnd_id, SubdomainID subdomain_id, std::deque< MaterialBase * > &required_face_materials, std::deque< MaterialBase * > &required_boundary_materials) const
Determine the face and boundary materials required by material property consumers.
virtual void preBoundary(const Elem *elem, unsigned int side, BoundaryID bnd_id, const Elem *lower_d_elem=nullptr) override
Called before the boundary assembly.
std::string formatString(std::string message, const std::string &prefix)
Add new lines and prefixes to a string for pretty display in output NOTE: This makes a copy of the st...
std::string mooseObjectVectorToString(const std::vector< MooseObject * > &objs, const std::string &sep=" ")
Routine to output the name of MooseObjects in a string.
std::string prettyCppType(const std::string &cpp_type)