DiracKernelInfo Class Reference

The DiracKernelInfo object is a place where all the Dirac points added by different DiracKernels are collected. More...

#include <DiracKernelInfo.h>

## Public Types

typedef std::map< const Elem *, std::pair< std::vector< Point >, std::vector< unsigned int > > > MultiPointMap

## Public Member Functions

DiracKernelInfo ()

virtual ~DiracKernelInfo ()

void addPoint (const Elem *elem, Point p)

void clearPoints ()
Remove all of the current points and elements. More...

bool hasPoint (const Elem *elem, Point p)
Return true if we have Point 'p' in Element 'elem'. More...

std::set< const Elem * > & getElements ()
Returns a writeable reference to the _elements container. More...

MultiPointMapgetPoints ()
Returns a writeable reference to the _points container. More...

void updatePointLocator (const MooseMesh &mesh)
Called during FEProblemBase::meshChanged() to update the PointLocator object used by the DiracKernels. More...

const Elem * findPoint (Point p, const MooseMesh &mesh)
Used by client DiracKernel classes to determine the Elem in which the Point p resides. More...

## Protected Member Functions

bool pointsFuzzyEqual (const Point &, const Point &)
Check if two points are equal with respect to a tolerance. More...

## Protected Attributes

std::set< const Elem * > _elements
The list of elements that need distributions. More...

MultiPointMap _points
The list of physical xyz Points that need to be evaluated in each element. More...

std::unique_ptr< PointLocatorBase > _point_locator
The DiracKernelInfo object manages a PointLocator object which is used by all DiracKernels to find Points. More...

const Real _point_equal_distance_sq
threshold distance squared below which two points are considered identical More...

## Detailed Description

The DiracKernelInfo object is a place where all the Dirac points added by different DiracKernels are collected.

It is used, for example, by the FEProblemBase class to determine if finite element data needs to be recomputed on a given element.

Definition at line 35 of file DiracKernelInfo.h.

## ◆ MultiPointMap

 typedef std::map, std::vector > > DiracKernelInfo::MultiPointMap

Definition at line 65 of file DiracKernelInfo.h.

## ◆ DiracKernelInfo()

 DiracKernelInfo::DiracKernelInfo ( )

Definition at line 19 of file DiracKernelInfo.C.

20  : _point_locator(), _point_equal_distance_sq(libMesh::TOLERANCE * libMesh::TOLERANCE)
21 {
22 }
std::unique_ptr< PointLocatorBase > _point_locator
The DiracKernelInfo object manages a PointLocator object which is used by all DiracKernels to find Po...
const Real _point_equal_distance_sq
threshold distance squared below which two points are considered identical

## ◆ ~DiracKernelInfo()

 DiracKernelInfo::~DiracKernelInfo ( )
virtual

Definition at line 24 of file DiracKernelInfo.C.

24 {}

## Member Function Documentation

 void DiracKernelInfo::addPoint ( const Elem * elem, Point p )

Parameters
 elem Pointer to the geometric element in which the point is located p The (x,y,z) location of the Dirac point

Definition at line 27 of file DiracKernelInfo.C.

28 {
29  _elements.insert(elem);
30
31  std::pair<std::vector<Point>, std::vector<unsigned int>> & multi_point_list = _points[elem];
32
33  const unsigned int npoint = multi_point_list.first.size();
34  mooseAssert(npoint == multi_point_list.second.size(),
35  "Different sizes for location and multiplicity data");
36
37  for (unsigned int i = 0; i < npoint; ++i)
38  if (pointsFuzzyEqual(multi_point_list.first[i], p))
39  {
40  // a point at the same (within a tolerance) location as p exists, increase its multiplicity
41  multi_point_list.second[i]++;
42  return;
43  }
44
45  // no prior point found at this location, add it with a multiplicity of one
46  multi_point_list.first.push_back(p);
47  multi_point_list.second.push_back(1);
48 }
std::set< const Elem * > _elements
The list of elements that need distributions.
MultiPointMap _points
The list of physical xyz Points that need to be evaluated in each element.
bool pointsFuzzyEqual(const Point &, const Point &)
Check if two points are equal with respect to a tolerance.

## ◆ clearPoints()

 void DiracKernelInfo::clearPoints ( )

Remove all of the current points and elements.

Definition at line 51 of file DiracKernelInfo.C.

52 {
53  _elements.clear();
54  _points.clear();
55 }
std::set< const Elem * > _elements
The list of elements that need distributions.
MultiPointMap _points
The list of physical xyz Points that need to be evaluated in each element.

## ◆ findPoint()

 const Elem * DiracKernelInfo::findPoint ( Point p, const MooseMesh & mesh )

Used by client DiracKernel classes to determine the Elem in which the Point p resides.

Uses the PointLocator owned by this object.

Definition at line 111 of file DiracKernelInfo.C.

112 {
113  // If the PointLocator has never been created, do so now. NOTE - WE
114  // CAN'T DO THIS if findPoint() is only called on some processors,
115  // PointLocatorBase::build() is a 'parallel_only' method!
116  if (_point_locator.get() == NULL)
117  {
118  _point_locator = PointLocatorBase::build(TREE_LOCAL_ELEMENTS, mesh);
119  _point_locator->enable_out_of_mesh_mode();
120  }
121
122  // Check that the PointLocator is ready to start locating points.
123  // So far I do not have any tests that trip this...
124  if (_point_locator->initialized() == false)
125  mooseError("Error, PointLocator is not initialized!");
126
127  // Note: The PointLocator object returns NULL when the Point is not
128  // found within the Mesh. This is not considered to be an error as
129  // far as the DiracKernels are concerned: sometimes the Mesh moves
130  // out from the Dirac point entirely and in that case the Point just
131  // gets "deactivated".
132  const Elem * elem = (*_point_locator)(p);
133
134  // The processors may not agree on which Elem the point is in. This
135  // can happen if a Dirac point lies on the processor boundary, and
136  // two or more neighboring processors think the point is in the Elem
137  // on *their* side.
138  dof_id_type elem_id = elem ? elem->id() : DofObject::invalid_id;
139
140  // We are going to let the element with the smallest ID "win", all other
141  // procs will return NULL.
142  dof_id_type min_elem_id = elem_id;
143  mesh.comm().min(min_elem_id);
144
145  return min_elem_id == elem_id ? elem : NULL;
146 }
void mooseError(Args &&... args)
Emit an error message with the given stringified, concatenated args and terminate the application...
Definition: MooseError.h:208
std::unique_ptr< PointLocatorBase > _point_locator
The DiracKernelInfo object manages a PointLocator object which is used by all DiracKernels to find Po...

## ◆ getElements()

 std::set& DiracKernelInfo::getElements ( )
inline

Returns a writeable reference to the _elements container.

Definition at line 62 of file DiracKernelInfo.h.

62 { return _elements; }
std::set< const Elem * > _elements
The list of elements that need distributions.

## ◆ getPoints()

 MultiPointMap& DiracKernelInfo::getPoints ( )
inline

Returns a writeable reference to the _points container.

Definition at line 70 of file DiracKernelInfo.h.

70 { return _points; }
MultiPointMap _points
The list of physical xyz Points that need to be evaluated in each element.

## ◆ hasPoint()

 bool DiracKernelInfo::hasPoint ( const Elem * elem, Point p )

Return true if we have Point 'p' in Element 'elem'.

Definition at line 58 of file DiracKernelInfo.C.

Referenced by DiracKernel::isActiveAtPoint().

59 {
60  std::vector<Point> & point_list = _points[elem].first;
61
62  for (const auto & pt : point_list)
63  if (pointsFuzzyEqual(pt, p))
64  return true;
65
66  // If we haven't found it, we don't have it.
67  return false;
68 }
MultiPointMap _points
The list of physical xyz Points that need to be evaluated in each element.
bool pointsFuzzyEqual(const Point &, const Point &)
Check if two points are equal with respect to a tolerance.

## ◆ pointsFuzzyEqual()

 bool DiracKernelInfo::pointsFuzzyEqual ( const Point & a, const Point & b )
protected

Check if two points are equal with respect to a tolerance.

Definition at line 149 of file DiracKernelInfo.C.

150 {
151  const Real dist_sq = (a - b).norm_sq();
152  return dist_sq < _point_equal_distance_sq;
153 }
const Real _point_equal_distance_sq
threshold distance squared below which two points are considered identical

## ◆ updatePointLocator()

 void DiracKernelInfo::updatePointLocator ( const MooseMesh & mesh )

Called during FEProblemBase::meshChanged() to update the PointLocator object used by the DiracKernels.

Definition at line 71 of file DiracKernelInfo.C.

72 {
73  // Note: we could update the PointLocator *every* time we call this
74  // function, but that may introduce an unacceptable overhead in
75  // problems which don't need a PointLocator at all. This issue will
76  // most likely become a moot point when we eventually add a shared
77  // "CachingPointLocator" to MOOSE.
78  // _point_locator = PointLocatorBase::build(TREE_LOCAL_ELEMENTS, mesh);
79
80  // Construct the PointLocator object if *any* processors have Dirac
81  // points. Note: building a PointLocator object is a parallel_only()
82  // function, so this is an all-or-nothing thing.
83  unsigned pl_needs_rebuild = _elements.size();
84  mesh.comm().max(pl_needs_rebuild);
85
86  if (pl_needs_rebuild)
87  {
88  // PointLocatorBase::build() is a parallel_only function! So we
89  // can't skip building it just becuase our local _elements is
90  // empty, it might be non-empty on some other processor!
91  _point_locator = PointLocatorBase::build(TREE_LOCAL_ELEMENTS, mesh);
92
93  // We may be querying for points which are not in the semilocal
94  // part of a distributed mesh.
95  _point_locator->enable_out_of_mesh_mode();
96  }
97  else
98  {
99  // There are no elements with Dirac points, but we have been
100  // requested to update the PointLocator so we have to assume the
101  // old one is invalid. Therefore we reset it to NULL... however
102  // adding this line causes the code to hang because it triggers
103  // the PointLocator to be rebuilt in a non-parallel-only segment
104  // of the code later... so it's commented out for now even though
105  // it's probably the right behavior.
106  // _point_locator.reset(NULL);
107  }
108 }
std::set< const Elem * > _elements
The list of elements that need distributions.
std::unique_ptr< PointLocatorBase > _point_locator
The DiracKernelInfo object manages a PointLocator object which is used by all DiracKernels to find Po...

## ◆ _elements

 std::set DiracKernelInfo::_elements
protected

The list of elements that need distributions.

Definition at line 91 of file DiracKernelInfo.h.

Referenced by addPoint(), clearPoints(), getElements(), and updatePointLocator().

## ◆ _point_equal_distance_sq

 const Real DiracKernelInfo::_point_equal_distance_sq
protected

threshold distance squared below which two points are considered identical

Definition at line 103 of file DiracKernelInfo.h.

Referenced by pointsFuzzyEqual().

## ◆ _point_locator

 std::unique_ptr DiracKernelInfo::_point_locator
protected

The DiracKernelInfo object manages a PointLocator object which is used by all DiracKernels to find Points.

It needs to be centrally managed and it also needs to be rebuilt in FEProblemBase::meshChanged() to work with Mesh adaptivity.

Definition at line 100 of file DiracKernelInfo.h.

Referenced by findPoint(), and updatePointLocator().

## ◆ _points

 MultiPointMap DiracKernelInfo::_points
protected

The list of physical xyz Points that need to be evaluated in each element.

Definition at line 94 of file DiracKernelInfo.h.

Referenced by addPoint(), clearPoints(), getPoints(), and hasPoint().

The documentation for this class was generated from the following files: