20 #include "libmesh/threads.h" 21 #include "libmesh/elem.h" 22 #include "libmesh/mesh_base.h" 28 : _fe_problem(fe_problem),
29 _aux_sys(fe_problem.getAuxiliarySystem()),
30 _elem_aux(_aux_sys.elemAuxWarehouse()),
31 _elem_vec_aux(_aux_sys.elemVectorAuxWarehouse()),
32 _elem_array_aux(_aux_sys.elemArrayAuxWarehouse()),
40 : _fe_problem(x._fe_problem),
42 _elem_aux(x._elem_aux),
43 _elem_vec_aux(x._elem_vec_aux),
44 _elem_array_aux(x._elem_array_aux),
53 const auto tid = puid.
id;
55 for (
const auto & belem : range)
57 const Elem * elem = belem->_elem;
58 const auto boundary_id = belem->_bnd_id;
59 const auto side = belem->_side;
67 const auto & bnd_name =
mesh.getBoundaryName(boundary_id);
70 std::vector<SideUserObject *> objs;
76 for (
const auto & uo : objs)
77 if (uo->checkVariableBoundaryIntegrity())
79 auto leftover_vars = uo->checkAllVariables(*elem);
80 if (!leftover_vars.empty())
82 const auto neighbor = elem->neighbor_ptr(side);
83 const bool upwind_elem = !neighbor || elem->id() < neighbor->id();
84 const Elem * lower_d_elem =
85 upwind_elem ?
mesh.getLowerDElem(elem, side)
86 :
mesh.getLowerDElem(neighbor, neighbor->which_neighbor_am_i(elem));
88 leftover_vars = uo->checkVariables(*lower_d_elem, leftover_vars);
93 auto check = [elem, boundary_id, &bnd_name, tid, &
mesh, side](
const auto & warehouse)
95 if (!warehouse.hasBoundaryObjects(boundary_id, tid))
98 const auto & bnd_objects = warehouse.getBoundaryObjects(boundary_id, tid);
99 for (
const auto & bnd_object : bnd_objects)
102 if (!bnd_object->requiresGeometricSearch() && bnd_object->checkVariableBoundaryIntegrity())
105 auto leftover_vars = bnd_object->checkAllVariables(*elem);
106 if (!leftover_vars.empty())
108 const auto neighbor = elem->neighbor_ptr(side);
109 const bool upwind_elem = !neighbor || elem->id() < neighbor->id();
110 const Elem * lower_d_elem =
111 upwind_elem ?
mesh.getLowerDElem(elem, side)
112 :
mesh.getLowerDElem(neighbor, neighbor->which_neighbor_am_i(elem));
114 leftover_vars = bnd_object->checkVariables(*lower_d_elem, leftover_vars);
136 const std::set<MooseVariableFieldBase *> & variables,
137 const BoundaryName & boundary_name)
139 if (variables.empty())
142 std::vector<std::string> names;
143 names.reserve(variables.size());
144 for (
const auto *
const var : variables)
145 names.push_back(var->name());
151 "' depends on variable(s) '",
153 "'. However, that variable does not appear to be defined on (all of) boundary '",
std::string name(const ElemQuality q)
std::string join(Iterator begin, Iterator end, const std::string &delimiter)
Python-like join function for strings over an iterator range.
BoundaryElemIntegrityCheckThread(FEProblemBase &fe_problem, const TheWarehouse::Query &query)
void join(const BoundaryElemIntegrityCheckThread &)
QueryCache is a convenient way to construct and pass around (possible partially constructed) warehous...
void boundaryIntegrityCheckError(const MooseObject &object, const std::set< MooseVariableFieldBase *> &variables, const BoundaryName &boundary_name)
Compose boundary restricted error message for the provided object, variables, and boundary_name if th...
virtual std::size_t numNonlinearSystems() const override
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
const TheWarehouse::Query & _query
A warehouse query that we will use to obtain user objects for boundary variable dependency integrity ...
MooseObjectTagWarehouse< IntegratedBCBase > & getIntegratedBCWarehouse()
void operator()(const ConstBndElemRange &range)
Specialization of SubProblem for solving nonlinear equations plus auxiliary equations.
const ExecuteMooseObjectWarehouse< AuxKernel > & _elem_aux
Elemental auxiliary kernels acting on standard field variables.
Every object that can be built by the factory should be derived from this class.
AttribBoundaries tracks all boundary IDs associated with an object.
QueryCache clone() const
clone creates and returns an independent copy of the query in its current state.
NonlinearSystemBase & getNonlinearSystemBase(const unsigned int sys_num)
FEProblemBase & _fe_problem
the finite element (or volume) problem
const ExecuteMooseObjectWarehouse< VectorAuxKernel > & _elem_vec_aux
Elemental auxiliary kernels acting on vector field variables.
const ExecuteMooseObjectWarehouse< ArrayAuxKernel > & _elem_array_aux
Elemental auxiliary kernels acting on array field variables.
IntRange< T > make_range(T beg, T end)
virtual MooseMesh & mesh() override
QueryCache & condition(Args &&... args)
Adds a new condition to the query.
processor_id_type processor_id() const
Result check(std::string requirements, const Registry &capabilities)
Checks if a set of requirements is satisified by the given capability registry.