16 #include "libmesh/libmesh_exceptions.h" 17 #include "libmesh/elem.h" 22 template <
typename RangeType>
32 virtual void operator()(
const RangeType & range,
bool bypass_threading =
false);
49 virtual void onElement(
const Elem * elem);
76 const Elem * lower_d_elem =
nullptr);
89 const Elem * lower_d_elem =
nullptr);
113 virtual void onInternalSide(
const Elem * elem,
unsigned int side);
121 virtual void onExternalSide(
const Elem * elem,
unsigned int side);
204 template <
typename RangeType>
209 template <
typename RangeType>
216 template <
typename RangeType>
221 template <
typename RangeType>
230 _tid = bypass_threading ? 0 : puid.
id;
233 printGeneralExecutionInformation();
237 typename RangeType::const_iterator el = range.begin();
238 for (el = range.begin(); el != range.end(); ++el)
243 const Elem * elem = *el;
247 _old_subdomain = _subdomain;
248 _subdomain = elem->subdomain_id();
249 if (_subdomain != _old_subdomain)
252 printBlockExecutionInformation();
257 if (_mesh.interiorLowerDBlocks().count(elem->subdomain_id()) > 0 ||
258 _mesh.boundaryLowerDBlocks().count(elem->subdomain_id()) > 0)
264 for (
unsigned int side = 0; side < elem->n_sides(); side++)
266 std::vector<BoundaryID> boundary_ids = _mesh.getBoundaryIDs(elem, side);
267 const Elem * lower_d_elem = _mesh.getLowerDElem(elem, side);
269 if (boundary_ids.size() > 0)
270 for (std::vector<BoundaryID>::iterator it = boundary_ids.begin();
271 it != boundary_ids.end();
274 preBoundary(elem, side, *it, lower_d_elem);
275 printBoundaryExecutionInformation(*it);
279 const Elem * neighbor = elem->neighbor_ptr(side);
282 preInternalSide(elem, side);
284 _old_neighbor_subdomain = _neighbor_subdomain;
285 _neighbor_subdomain = neighbor->subdomain_id();
286 if (_neighbor_subdomain != _old_neighbor_subdomain)
287 neighborSubdomainChanged();
289 if (shouldComputeInternalSide(*elem, *neighbor))
290 onInternalSide(elem, side);
292 if (boundary_ids.size() > 0)
293 for (std::vector<BoundaryID>::iterator it = boundary_ids.begin();
294 it != boundary_ids.end();
296 onInterface(elem, side, *it);
298 postInternalSide(elem, side);
301 onExternalSide(elem, side);
308 resetExecPrintedSets();
312 mooseException(
"We caught a libMesh error in ThreadedElementLoopBase:", e.what());
314 catch (MetaPhysicL::LogicError & e)
321 caughtMooseException(e);
325 template <
typename RangeType>
331 template <
typename RangeType>
337 template <
typename RangeType>
343 template <
typename RangeType>
349 template <
typename RangeType>
355 template <
typename RangeType>
364 template <
typename RangeType>
373 template <
typename RangeType>
379 template <
typename RangeType>
385 template <
typename RangeType>
391 template <
typename RangeType>
397 template <
typename RangeType>
405 template <
typename RangeType>
411 template <
typename RangeType>
417 template <
typename RangeType>
420 const Elem & neighbor)
const 422 auto level = [
this](
const auto & elem_arg)
424 if (_mesh.doingPRefinement())
425 return elem_arg.p_level();
427 return elem_arg.level();
429 const auto elem_id = elem.id(), neighbor_id = neighbor.id();
430 const auto elem_level = level(elem), neighbor_level = level(neighbor);
438 return (neighbor.active() && (neighbor_level == elem_level) && (elem_id < neighbor_id)) ||
439 (neighbor_level < elem_level);
442 template <
typename RangeType>
446 _blocks_exec_printed.clear();
447 _boundaries_exec_printed.clear();
virtual void onExternalSide(const Elem *elem, unsigned int side)
Called when iterating over external sides (no side neighbor)
virtual bool keepGoing()
Whether or not the loop should continue.
virtual ~ThreadedElementLoopBase()
void resetExecPrintedSets() const
Resets the set of blocks and boundaries visited.
virtual bool shouldComputeInternalSide(const Elem &elem, const Elem &neighbor) const
Whether to compute the internal side for the provided element-neighbor pair.
virtual void onElement(const Elem *elem)
Assembly of the element (not including surface assembly)
void translateMetaPhysicLError(const MetaPhysicL::LogicError &)
emit a relatively clear error message when we catch a MetaPhysicL logic error
virtual void printBoundaryExecutionInformation(const unsigned int) const
Print information about the particular ordering of objects on each boundary.
virtual void pre()
Called before the element range loop.
virtual void subdomainChanged()
Called every time the current subdomain changes (i.e.
virtual void neighborSubdomainChanged()
Called every time the neighbor subdomain changes (i.e.
virtual void preInternalSide(const Elem *elem, unsigned int side)
Called before evaluations on an element internal side.
virtual void postInternalSide(const Elem *elem, unsigned int side)
Called after evaluations on an element internal side.
const SubdomainID INVALID_BLOCK_ID
virtual void onBoundary(const Elem *elem, unsigned int side, BoundaryID bnd_id, const Elem *lower_d_elem=nullptr)
Called when doing boundary assembling.
virtual void postElement(const Elem *elem)
Called after the element assembly is done (including surface assembling)
virtual void printGeneralExecutionInformation() const
Print information about the loop ordering.
boundary_id_type BoundaryID
MooseMesh wraps a libMesh::Mesh object and enhances its capabilities by caching additional data and s...
virtual void onInterface(const Elem *elem, unsigned int side, BoundaryID bnd_id)
Called when doing interface assembling.
SubdomainID _old_neighbor_subdomain
The subdomain for the last neighbor.
virtual void operator()(const RangeType &range, bool bypass_threading=false)
virtual void onInternalSide(const Elem *elem, unsigned int side)
Called when doing internal edge assembling.
bool onBoundary(const SubdomainRestrictable &obj, const FaceInfo &fi)
Return whether the supplied face is on a boundary of the object's execution.
std::set< SubdomainID > _blocks_exec_printed
Keep track of which blocks were visited.
Provides a way for users to bail out of the current solve.
std::set< BoundaryID > _boundaries_exec_printed
Keep track of which boundaries were visited.
virtual void caughtMooseException(MooseException &)
Called if a MooseException is caught anywhere during the computation.
Base class for assembly-like calculations.
SubdomainID _subdomain
The subdomain for the current element.
SubdomainID _old_subdomain
The subdomain for the last element.
virtual void post()
Called after the element range loop.
virtual void printBlockExecutionInformation() const
Print information about the particular ordering of objects on each block.
virtual void preElement(const Elem *elem)
Called before the element assembly.
virtual void preBoundary(const Elem *elem, unsigned int side, BoundaryID bnd_id, const Elem *lower_d_elem=nullptr)
Called before the boundary assembly.
ThreadedElementLoopBase(MooseMesh &mesh)
SubdomainID _neighbor_subdomain
The subdomain for the current neighbor.