17 #include "libmesh/quadrature.h" 26 params.
addParam<
bool>(
"use_displaced_mesh",
28 "Whether or not this object should use the displaced mesh for computation. " 29 "Note that in the case this is true but no displacements are provided in " 30 "the Mesh block the undisplaced mesh will still be used.");
33 "drop_duplicate_points",
35 "By default points added to a DiracKernel are dropped if a point at the same location" 36 "has been added before. If this option is set to false duplicate points are retained" 37 "and contribute to residual and Jacobian.");
39 MooseEnum point_not_found_behavior(
"ERROR WARNING IGNORE",
"IGNORE");
41 "point_not_found_behavior",
42 point_not_found_behavior,
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(
75 _allow_moving_sources(getParam<bool>(
"allow_moving_sources"))
90 if (!elem || !
hasBlocks(elem->subdomain_id()))
92 std::stringstream msg;
142 const Elem * return_elem = NULL;
145 const Elem * cached_elem = NULL;
151 unsigned int i_found_it =
static_cast<unsigned int>(it !=
_point_cache.end());
152 unsigned int we_found_it = i_found_it;
170 points.push_back(std::make_pair(p,
id));
184 if (we_found_it && !i_found_it)
190 bool i_need_find_point =
false;
199 Point cached_point = (it->second).second;
201 if (cached_point.relative_fuzzy_equals(p))
204 cached_elem = (it->second).first;
219 bool active = cached_elem->active();
220 bool contains_point = cached_elem->contains_point(p);
225 if (active && contains_point)
228 return_elem = cached_elem;
234 else if (!active && contains_point)
237 std::vector<const Elem *> active_children;
238 cached_elem->active_family_tree(active_children);
241 for (
unsigned c = 0; c < active_children.size(); ++c)
242 if (active_children[c]->contains_point(p))
245 addPoint(active_children[c], p,
id);
246 return_elem = active_children[c];
256 mooseError(
"Error, Point not found in any of the active children!");
268 (active && !contains_point) ||
275 (!active && !contains_point))
277 i_need_find_point =
true;
287 " already exists with ID: ",
289 " and does not match point ",
291 "If Dirac sources are moving, please set 'allow_moving_sources' to true");
301 unsigned int we_need_find_point =
static_cast<unsigned int>(i_need_find_point);
302 comm().
max(we_need_find_point);
304 if (we_need_find_point)
352 if (new_elem && (new_elem->processor_id() ==
processor_id()))
361 reverse_cache_t::mapped_type & points = it->second;
363 reverse_cache_t::mapped_type::iterator points_it = points.begin(), points_end = points.end();
365 for (; points_it != points_end; ++points_it)
368 if (p.relative_fuzzy_equals(points_it->first))
374 points.erase(points_it);
386 if (new_elem && (new_elem->processor_id() ==
processor_id()))
389 points.push_back(std::make_pair(p,
id));
403 reverse_cache_t::mapped_type & points = it->second;
405 for (
const auto & points_it : points)
409 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.
const PointNotFoundBehavior _point_not_found_behavior
bool hasPoint(const Elem *elem, const Point &p)
Return true if we have Point 'p' in Element 'elem'.
const unsigned int invalid_uint
const Elem * findPoint(const Point &p, const MooseMesh &mesh, const std::set< SubdomainID > &blocks)
Used by client DiracKernel classes to determine the Elem in which the Point p resides.
virtual Elem * elemPtr(const dof_id_type i)
T * get(const std::unique_ptr< T > &u)
The MooseUtils::get() specializations are used to support making forwards-compatible code changes fro...
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
void addPoint(const Elem *elem, Point p, unsigned id=libMesh::invalid_uint)
Add the physical x,y,z point located in the element "elem" to the list of points this DiracKernel wil...
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.
void mooseWarning(Args &&... args) const
Emits a warning prefixed with object name and type.
static InputParameters validParams()
void addPoint(const Elem *elem, const Point &p)
Adds a point source.
virtual Real computeQpOffDiagJacobian(unsigned int jvar)
This gets called by computeOffDiagJacobian() at each quadrature point.
DiracKernelBase(const InputParameters ¶meters)
static InputParameters validParams()
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.
void clearPoints()
Remove all of the current points and elements.
std::string stringify(const T &t)
conversion to string
const Elem *const & _current_elem
reverse_cache_t _reverse_point_cache
void statefulPropertiesAllowed(bool)
Derived classes can declare whether or not they work with stateful material properties.
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
This is the common base class for objects that give residual contributions.
const std::set< SubdomainID > EMPTY_BLOCK_IDS
void max(const T &r, T &o, Request &req) const
An interface for accessing Materials.
const std::set< BoundaryID > EMPTY_BOUNDARY_IDS
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.
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.
processor_id_type processor_id() const
const Elem * addPointWithValidId(Point p, unsigned id)
A helper function for addPoint(Point, id) for when id != invalid_uint.
Point _current_point
The current point.