27 #include "libmesh/numeric_vector.h" 33 _query_subdomain(_query),
34 _query_boundary(_query),
35 _aux_sys(problem.getAuxiliarySystem())
43 _query_subdomain(x._query_subdomain),
44 _query_boundary(x._query_boundary),
55 std::vector<UserObject *> objs;
65 std::vector<UserObject *> side_objs;
69 .queryInto(side_objs);
71 objs.insert(objs.begin(), side_objs.begin(), side_objs.end());
76 std::set<MooseVariableFEBase *> needed_moose_vars;
77 std::unordered_set<unsigned int> needed_mat_props;
78 std::set<TagID> needed_fe_var_vector_tags;
79 for (
const auto obj : objs)
85 needed_moose_vars.insert(v_deps.begin(), v_deps.end());
92 needed_mat_props.insert(m_deps.begin(), m_deps.end());
99 needed_fe_var_vector_tags.insert(tag_deps.begin(), tag_deps.end());
102 obj->subdomainSetup();
133 if (uo->hasWritableCoupledVariables())
134 for (
auto * var : uo->getWritableCoupledVariables())
140 uo->preExecuteOnElement();
141 uo->executeOnElement();
149 for (
const auto & jvar : jacobian_moose_vars)
151 unsigned int jvar_id = jvar->number();
152 auto && dof_indices = jvar->dofIndices();
156 uo->executeJacobianWrapper(jvar_id, dof_indices);
165 const Elem * lower_d_elem )
167 std::vector<UserObject *> userobjs;
184 for (
const auto & uo : userobjs)
189 uo->preExecuteOnBoundary();
190 uo->executeOnBoundary();
194 std::vector<ShapeSideUserObject *> shapers;
200 for (
const auto & jvar : jacobian_moose_vars)
202 unsigned int jvar_id = jvar->number();
203 auto && dof_indices = jvar->dofIndices();
207 for (
const auto & uo : shapers)
208 uo->executeJacobianWrapper(jvar_id, dof_indices);
217 const Elem * neighbor = elem->neighbor_ptr(side);
234 if (!uo->blockRestricted() || uo->hasBlocks(neighbor->subdomain_id()))
238 if (!uo->blockRestricted() || uo->hasBlocks(neighbor->subdomain_id()))
240 uo->preExecuteOnInternalSide();
241 uo->executeOnInternalSide();
252 uo->executeOnExternalSide(elem, side);
259 const Elem * neighbor = elem->neighbor_ptr(side);
260 if (!(neighbor->active()))
263 std::vector<UserObject *> interface_objs;
266 bool has_domain_objs =
false;
270 if (domain_uo->shouldExecuteOnInterface())
272 has_domain_objs =
true;
278 if (interface_objs.empty() && !has_domain_objs)
300 for (
const auto & uo : interface_objs)
304 if (uo->shouldExecuteOnInterface())
306 uo->preExecuteOnInterface();
307 uo->executeOnInterface();
330 console <<
"[DBG] Computing elemental user objects on " << execute_on << std::endl;
331 mooseDoOnce(console <<
"[DBG] Execution order of objects types on each element then its sides:" 334 console <<
"[DBG] - element user objects" << std::endl;
335 console <<
"[DBG] - domain user objects" << std::endl;
336 console <<
"[DBG] - element user objects contributing to the Jacobian" << std::endl;
339 console <<
"[DBG] - side user objects" << std::endl;
340 console <<
"[DBG] - domain user objects executing on sides" << std::endl;
341 console <<
"[DBG] - side user objects contributing to the Jacobian" << std::endl;
344 console <<
"[DBG] - internal side user objects" << std::endl;
345 console <<
"[DBG] - domain user objects executing on internal sides" << std::endl;
348 console <<
"[DBG] - interface user objects" << std::endl;
349 console <<
"[DBG] - domain user objects executing at interfaces" << std::endl;);
362 std::vector<ShapeSideUserObject *> shapers;
366 std::vector<SideUserObject *> side_uos;
370 std::vector<InterfaceUserObject *> interface_objs;
374 std::vector<const DomainUserObject *> domain_interface_uos;
376 if (domain_uo->shouldExecuteOnInterface())
377 domain_interface_uos.push_back(domain_uo);
382 interface_objs.size() + domain_interface_uos.size();
392 console <<
"[DBG] Ordering of User Objects on block " <<
_subdomain << std::endl;
394 printExecutionOrdering<ElementUserObject>(
_element_objs,
"element user objects");
395 printExecutionOrdering<DomainUserObject>(
_domain_objs,
"domain user objects");
397 printExecutionOrdering<ShapeElementUserObject>(
399 printExecutionOrdering<SideUserObject>(side_uos,
"side user objects");
401 printExecutionOrdering<ShapeSideUserObject>(shapers,
402 "side user objects contributing to the Jacobian");
404 "internal side user objects");
405 printExecutionOrdering<InterfaceUserObject>(interface_objs,
"interface user objects");
406 console <<
"[DBG] Only user objects active on local element/sides are executed" << std::endl;
409 console <<
"[DBG] No User Objects on block " <<
_subdomain <<
" on " << execute_on.name()
virtual const std::unordered_set< unsigned int > & getMatPropDependencies() const
Retrieve the set of material properties that this object depends on.
const std::set< MooseVariableFieldBase * > & getMooseVariableDependencies() const
Retrieve the set of MooseVariableFieldBase that this object depends on.
virtual void onBoundary(const Elem *elem, unsigned int side, BoundaryID bnd_id, const Elem *lower_d_elem=nullptr) override
Called when doing boundary assembling.
Base class for assembly-like calculations.
virtual void prepareFace(const Elem *elem, const THREAD_ID tid) override
virtual void post() override
Called after the element range loop.
std::vector< ElementUserObject * > _element_objs
std::vector< ShapeElementUserObject * > _shape_element_objs
void querySubdomain(Interfaces iface, std::vector< T > &results)
QueryCache is a convenient way to construct and pass around (possible partially constructed) warehous...
void printBlockExecutionInformation() const override
Print information about the loop, mostly order of execution of particular objects.
virtual void prepare(const Elem *elem, const THREAD_ID tid) override
NumericVector< Number > & solution()
void printGeneralExecutionInformation() const override
Print general information about the loop, like the ordering of class of objects.
void reinitMaterialsFaceOnBoundary(const BoundaryID boundary_id, const SubdomainID blk_id, const THREAD_ID tid, const bool swap_stateful=true, const std::deque< MaterialBase *> *const reinit_mats=nullptr)
reinit materials on element faces on a boundary (internal or external) This specific routine helps us...
const ExecFlagType & getCurrentExecuteOnFlag() const
Return/set the current execution flag.
FEProblemBase & _fe_problem
virtual void onElement(const Elem *elem) override
Assembly of the element (not including surface assembly)
void reinitMaterialsBoundary(BoundaryID boundary_id, const THREAD_ID tid, bool swap_stateful=true, const std::deque< MaterialBase *> *reinit_mats=nullptr)
reinit materials on a boundary
virtual void onInterface(const Elem *elem, unsigned int side, BoundaryID bnd_id) override
Called when doing interface assembling.
void queryBoundary(Interfaces iface, BoundaryID bnd, std::vector< T > &results)
void clearActiveMaterialProperties(const THREAD_ID tid)
Clear the active material properties.
virtual void subdomainChanged() override
Called every time the current subdomain changes (i.e.
const MaterialWarehouse & getMaterialWarehouse() const
Specialization of SubProblem for solving nonlinear equations plus auxiliary equations.
void reinitMaterialsFace(SubdomainID blk_id, const THREAD_ID tid, bool swap_stateful=true, const std::deque< MaterialBase *> *reinit_mats=nullptr)
reinit materials on element faces
ComputeUserObjectsThread(FEProblemBase &problem, const TheWarehouse::Query &query)
virtual void swapBackMaterialsFace(const THREAD_ID tid)
virtual void prepareFaceShapes(unsigned int var, const THREAD_ID tid) override
virtual void setActiveElementalMooseVariables(const std::set< MooseVariableFEBase *> &moose_vars, const THREAD_ID tid) override
Set the MOOSE variables to be reinited on each element.
const std::vector< const MooseVariableFEBase * > & getUserObjectJacobianVariables(const THREAD_ID tid) const
bool shouldPrintExecution(const THREAD_ID tid) const
Check whether the problem should output execution orders at this time.
AuxiliarySystem & _aux_sys
virtual void reinitElem(const Elem *elem, const THREAD_ID tid) override
void reinitMaterialsNeighbor(SubdomainID blk_id, const THREAD_ID tid, bool swap_stateful=true, const std::deque< MaterialBase *> *reinit_mats=nullptr)
reinit materials on the neighboring element face
boundary_id_type BoundaryID
virtual void onExternalSide(const Elem *elem, unsigned int side) override
Called when iterating over external sides (no side neighbor)
const TheWarehouse::Query _query
void join(const ComputeUserObjectsThread &)
QueryCache clone() const
clone creates and returns an independent copy of the query in its current state.
virtual void swapBackMaterialsNeighbor(const THREAD_ID tid)
virtual ~ComputeUserObjectsThread()
std::set< SubdomainID > _blocks_exec_printed
Keep track of which blocks were visited.
virtual void reinitLowerDElem(const Elem *lower_d_elem, const THREAD_ID tid, const std::vector< Point > *const pts=nullptr, const std::vector< Real > *const weights=nullptr) override
Interface for objects that needs coupling capabilities.
const ConsoleStream & console() const
Return console handle.
virtual void swapBackMaterials(const THREAD_ID tid)
void updateBlockFEVariableCoupledVectorTagDependency(SubdomainID id, std::set< TagID > &needed_fe_var_vector_tags, THREAD_ID tid=0) const
virtual void subdomainSetup(SubdomainID subdomain, const THREAD_ID tid)
An interface for accessing Materials.
void reinitMaterials(SubdomainID blk_id, const THREAD_ID tid, bool swap_stateful=true)
Class for threaded computation of UserObjects.
virtual void onInternalSide(const Elem *elem, unsigned int side) override
Called when doing internal edge assembling.
std::vector< InternalSideUserObject * > _internal_side_objs
void reinitElemFace(const Elem *elem, unsigned int side, BoundaryID, const THREAD_ID tid)
QueryCache & condition(Args &&... args)
Adds a new condition to the query.
SubdomainID _subdomain
The subdomain for the current element.
std::vector< DomainUserObject * > _domain_objs
virtual void reinitNeighbor(const Elem *elem, unsigned int side, const THREAD_ID tid) override
const bool & currentlyComputingJacobian() const
Returns true if the problem is in the process of computing the Jacobian.
virtual void setActiveFEVariableCoupleableVectorTags(std::set< TagID > &vtags, const THREAD_ID tid) override
virtual void prepareShapes(unsigned int var, const THREAD_ID tid) override
void reinitMaterialsInterface(BoundaryID boundary_id, const THREAD_ID tid, bool swap_stateful=true)
void prepareMaterials(const std::unordered_set< unsigned int > &consumer_needed_mat_props, const SubdomainID blk_id, const THREAD_ID tid)
Add the MooseVariables and the material properties that the current materials depend on to the depend...
std::set< TagID > & getFEVariableCoupleableVectorTags()
virtual void clearActiveElementalMooseVariables(const THREAD_ID tid) override
Clear the active elemental MooseVariableFEBase.
const BoundaryID ANY_BOUNDARY_ID
std::vector< DomainUserObject * > _all_domain_objs
The "SwapBackSentinel" class's destructor guarantees that FEProblemBase::swapBackMaterials{Face,Neighbor}() is called even when an exception is thrown from FEProblemBase::reinitMaterials{Face,Neighbor}.