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()))
100 libmesh_assert(
comm().verify(
id));
101 libmesh_assert(
comm().verify(value));
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)
207 addPoint(cached_elem, p,
id, value);
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))
225 addPoint(active_children[c], p,
id, value);
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;
An interface that restricts an object to subdomains via the 'blocks' input parameter.
bool hasBlocks(const SubdomainName &name) const
Test if the supplied block name is valid for this object.
virtual const std::set< SubdomainID > & blockIDs() const
Return the block subdomain ids for this object Note, if this is not block restricted,...
static InputParameters validParams()
DiracKernelBase(const InputParameters ¶meters)
const bool _allow_moving_sources
Whether Dirac sources can move during the simulation.
const Elem * addPointWithValidId(Point p, unsigned id, Real value)
A helper function for addPoint(Point, id) for when id != invalid_uint.
const Elem *const & _current_elem
Current element.
reverse_cache_t _reverse_point_cache
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...
DiracKernelInfo & _dirac_kernel_info
Place for storing Point/Elem information shared across all DiracKernel objects.
const DiracKernelInfo::PointNotFoundBehavior _point_not_found_behavior
What to do if the point is not found. See DiracKernelInfo for definition.
bool hasPointsOnElem(const Elem *elem)
Whether or not this DiracKernel has something to distribute on this element.
point_cache_t _point_cache
void clearPoints()
Remove all of the current points and elements.
bool isActiveAtPoint(const Elem *elem, const Point &p)
Whether or not this DiracKernel has something to distribute at this Point.
void clearPointsCaches()
Clear the cache of points because the points may have moved.
Point _current_point
The current point.
DiracKernelInfo _local_dirac_kernel_info
Place for storing Point/Elem information only for this DiracKernel.
static InputParameters validParams()
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.
unsigned currentPointCachedID()
Returns the user-assigned ID of the current Dirac point if it exits, and libMesh::invalid_uint otherw...
The DiracKernelInfo object is a place where all the Dirac points added by different DiracKernels are ...
bool hasPoint(const Elem *elem, const Point &p)
Return true if we have Point 'p' in Element 'elem'.
void clearPoints()
Remove all of the current points and elements.
std::set< const Elem * > & getElements()
Returns a writeable reference to the _elements container.
void addPoint(const Elem *elem, const Point &p, const Real &value=1)
Adds a point source.
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.
static InputParameters validParams()
An interface for accessing Materials.
void statefulPropertiesAllowed(bool)
Derived classes can declare whether or not they work with stateful material properties.
static InputParameters validParams()
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...
This is a "smart" enum class intended to replace many of the shortcomings in the C++ enum type It sho...
virtual Elem * elemPtr(const dof_id_type i)
This is the common base class for objects that give residual contributions.
static InputParameters validParams()
MooseMesh & _mesh
Reference to this Kernel's mesh object.
void max(const T &r, T &o, Request &req) const
processor_id_type processor_id() const
const Parallel::Communicator & comm() const
MOOSE now contains C++17 code, so give a reasonable error message stating what the user can do to add...
const unsigned int invalid_uint