17 #include "libmesh/quadrature.h" 27 params.
addParam<
bool>(
"use_displaced_mesh",
29 "Whether or not this object should use the displaced mesh for computation. " 30 "Note that in the case this is true but no displacements are provided in " 31 "the Mesh block the undisplaced mesh will still be used.");
34 "drop_duplicate_points",
36 "By default points added to a DiracKernel are dropped if a point at the same location" 37 "has been added before. If this option is set to false duplicate points are retained" 38 "and contribute to residual and Jacobian.");
41 "point_not_found_behavior",
42 MooseEnum(DiracKernelInfo::getPointNotFoundBehaviorOptions(),
"IGNORE"),
43 "By default (IGNORE), it is ignored if an added point cannot be located in the " 44 "specified subdomains. If this option is set to ERROR, this situation will result in an " 45 "error. If this option is set to WARNING, then a warning will be issued.");
47 params.
addParam<
bool>(
"allow_moving_sources",
49 "If true, allow Dirac sources to move, even if the mesh does not move, " 50 "during the simulation.");
65 _current_elem(_assembly.elem()),
66 _coord_sys(_assembly.coordSystem()),
67 _dirac_kernel_info(_subproblem.diracKernelInfo()),
68 _q_point(_assembly.qPoints()),
69 _physical_point(_assembly.physicalPoints()),
70 _qrule(_assembly.qRule()),
71 _JxW(_assembly.JxW()),
72 _drop_duplicate_points(parameters.
get<bool>(
"drop_duplicate_points")),
73 _point_not_found_behavior(parameters.
get<
MooseEnum>(
"point_not_found_behavior")
75 _allow_moving_sources(getParam<bool>(
"allow_moving_sources"))
84 if (!elem || !
hasBlocks(elem->subdomain_id()))
121 const Elem * return_elem = NULL;
124 const Elem * cached_elem = NULL;
130 unsigned int i_found_it =
static_cast<unsigned int>(it !=
_point_cache.end());
131 unsigned int we_found_it = i_found_it;
150 points.push_back(std::make_pair(p,
id));
164 if (we_found_it && !i_found_it)
170 bool i_need_find_point =
false;
179 Point cached_point = (it->second).second;
181 if (cached_point.relative_fuzzy_equals(p))
184 cached_elem = (it->second).first;
199 bool active = cached_elem->active();
200 bool contains_point = cached_elem->contains_point(p);
205 if (active && contains_point)
208 return_elem = cached_elem;
214 else if (!active && contains_point)
217 std::vector<const Elem *> active_children;
218 cached_elem->active_family_tree(active_children);
221 for (
unsigned c = 0; c < active_children.size(); ++c)
222 if (active_children[c]->contains_point(p))
226 return_elem = active_children[c];
236 mooseError(
"Error, Point not found in any of the active children!");
248 (active && !contains_point) ||
255 (!active && !contains_point))
257 i_need_find_point =
true;
267 " already exists with ID: ",
269 " and does not match point ",
271 "If Dirac sources are moving, please set 'allow_moving_sources' to true");
281 unsigned int we_need_find_point =
static_cast<unsigned int>(i_need_find_point);
282 comm().
max(we_need_find_point);
284 if (we_need_find_point)
333 if (new_elem && (new_elem->processor_id() ==
processor_id()))
342 reverse_cache_t::mapped_type & points = it->second;
344 reverse_cache_t::mapped_type::iterator points_it = points.begin(), points_end = points.end();
346 for (; points_it != points_end; ++points_it)
349 if (p.relative_fuzzy_equals(points_it->first))
355 points.erase(points_it);
367 if (new_elem && (new_elem->processor_id() ==
processor_id()))
370 points.push_back(std::make_pair(p,
id));
384 reverse_cache_t::mapped_type & points = it->second;
386 for (
const auto & points_it : points)
390 return points_it.second;
MooseMesh & _mesh
Reference to this Kernel's mesh object.
const bool _allow_moving_sources
Whether Dirac sources can move during the simulation.
bool hasPointsOnElem(const Elem *elem)
Whether or not this DiracKernel has something to distribute on this element.
bool hasPoint(const Elem *elem, const Point &p)
Return true if we have Point 'p' in Element 'elem'.
The DiracKernelInfo object is a place where all the Dirac points added by different DiracKernels are ...
void addPoint(const Elem *elem, const Point &p, const Real &value=1)
Adds a point source.
const unsigned int invalid_uint
virtual Elem * elemPtr(const dof_id_type i)
void clearPoints()
Remove all of the current points and elements.
DiracKernelInfo & _dirac_kernel_info
Place for storing Point/Elem information shared across all DiracKernel objects.
point_cache_t _point_cache
const Parallel::Communicator & comm() const
unsigned currentPointCachedID()
Returns the user-assigned ID of the current Dirac point if it exits, and libMesh::invalid_uint otherw...
static InputParameters validParams()
virtual const std::set< SubdomainID > & blockIDs() const
Return the block subdomain ids for this object Note, if this is not block restricted, this function returns all mesh subdomain ids.
static InputParameters validParams()
DiracKernelBase(const InputParameters ¶meters)
Real value(unsigned n, unsigned alpha, unsigned beta, Real x)
static InputParameters validParams()
void addPoint(const Elem *elem, Point p, unsigned id=libMesh::invalid_uint, Real value=1.0)
Add the physical x,y,z point located in the element "elem" to the list of points this DiracKernel wil...
bool isActiveAtPoint(const Elem *elem, const Point &p)
Whether or not this DiracKernel has something to distribute at this Point.
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type It sho...
static InputParameters validParams()
DiracKernelInfo _local_dirac_kernel_info
Place for storing Point/Elem information only for this DiracKernel.
const Elem * addPointWithValidId(Point p, unsigned id, Real value)
A helper function for addPoint(Point, id) for when id != invalid_uint.
void clearPoints()
Remove all of the current points and elements.
const Elem *const & _current_elem
Current element.
reverse_cache_t _reverse_point_cache
void statefulPropertiesAllowed(bool)
Derived classes can declare whether or not they work with stateful material properties.
This is the common base class for objects that give residual contributions.
const std::set< SubdomainID > EMPTY_BLOCK_IDS
const Elem * findPoint(const Point &p, const MooseMesh &mesh, const std::set< SubdomainID > &blocks, const PointNotFoundBehavior point_not_found_behavior, const MooseBase &consumer)
Used by client DiracKernel classes to determine the Elem in which the Point p resides.
void max(const T &r, T &o, Request &req) const
An interface for accessing Materials.
const std::set< BoundaryID > EMPTY_BOUNDARY_IDS
const DiracKernelInfo::PointNotFoundBehavior _point_not_found_behavior
What to do if the point is not found. See DiracKernelInfo for definition.
void clearPointsCaches()
Clear the cache of points because the points may have moved.
An interface that restricts an object to subdomains via the 'blocks' input parameter.
void mooseError(Args &&... args) const
Emits an error prefixed with object name and type and optionally a file path to the top-level block p...
void updateCaches(const Elem *old_elem, const Elem *new_elem, Point p, unsigned id)
This function is used internally when the Elem for a locally-cached point needs to be updated...
std::set< const Elem * > & getElements()
Returns a writeable reference to the _elements container.
MOOSE now contains C++17 code, so give a reasonable error message stating what the user can do to add...
bool hasBlocks(const SubdomainName &name) const
Test if the supplied block name is valid for this object.
static InputParameters validParams()
processor_id_type processor_id() const
const Elem & get(const ElemType type_in)
Point _current_point
The current point.