libMesh
Public Types | Public Member Functions | Static Public Member Functions | Protected Types | Protected Member Functions | Static Protected Attributes | Private Attributes | List of all members
AugmentSparsityOnInterface Class Referenceabstract

#include <augment_sparsity_on_interface.h>

Inheritance diagram for AugmentSparsityOnInterface:
[legend]

Public Types

typedef std::unordered_map< const Elem *, const CouplingMatrix * > map_type
 What elements do we care about and what variables do we care about on each element? More...
 

Public Member Functions

 AugmentSparsityOnInterface (MeshBase &mesh, boundary_id_type crack_boundary_lower, boundary_id_type crack_boundary_upper)
 Constructor. More...
 
const ElementSideMapget_lower_to_upper () const
 
virtual void operator() (const MeshBase::const_element_iterator &range_begin, const MeshBase::const_element_iterator &range_end, processor_id_type p, map_type &coupled_elements) override
 User-defined function to augment the sparsity pattern. More...
 
virtual void mesh_reinit () override
 Rebuild the cached _lower_to_upper map whenever our Mesh has changed. More...
 
virtual void redistribute () override
 Update the cached _lower_to_upper map whenever our Mesh has been redistributed. More...
 
virtual void operator() (const MeshBase::const_element_iterator &range_begin, const MeshBase::const_element_iterator &range_end, processor_id_type p, map_type &coupled_elements)=0
 For the specified range of active elements, what other elements currently living (whether local or ghosted) on this processor need to be coupled/ghosted to accommodate them? Don't bother to return any results which already have processor_id p. More...
 
virtual void dofmap_reinit ()
 For algebraic ghosting or coupling functors we also call dofmap_reinit() later, after dofs have been distributed on the new mesh but before the functors have been queried for send_list or sparsity pattern calculations. More...
 
virtual void delete_remote_elements ()
 GhostingFunctor subclasses with relatively long-lasting caches may want to delete the no-longer-relevant parts of those caches after a redistribution is complete. More...
 

Static Public Member Functions

static std::string get_info ()
 Gets a string containing the reference information. More...
 
static void print_info (std::ostream &out=libMesh::out)
 Prints the reference information, by default to libMesh::out. More...
 
static unsigned int n_objects ()
 Prints the number of outstanding (created, but not yet destroyed) objects. More...
 
static void enable_print_counter_info ()
 Methods to enable/disable the reference counter output from print_info() More...
 
static void disable_print_counter_info ()
 

Protected Types

typedef std::map< std::string, std::pair< unsigned int, unsigned int > > Counts
 Data structure to log the information. More...
 

Protected Member Functions

void increment_constructor_count (const std::string &name)
 Increments the construction counter. More...
 
void increment_destructor_count (const std::string &name)
 Increments the destruction counter. More...
 

Static Protected Attributes

static Counts _counts
 Actually holds the data. More...
 
static Threads::atomic< unsigned int_n_objects
 The number of objects. More...
 
static Threads::spin_mutex _mutex
 Mutual exclusion object to enable thread-safe reference counting. More...
 
static bool _enable_print_counter = true
 Flag to control whether reference count information is printed when print_info is called. More...
 

Private Attributes

MeshBase_mesh
 The Mesh we're calculating on. More...
 
ElementSideMap _lower_to_upper
 A map from (lower element ID, side ID) to matching upper element ID. More...
 
ElementMap _upper_to_lower
 The inverse (ignoring sides) of the above map. More...
 
boundary_id_type _crack_boundary_lower
 Boundary IDs for the lower and upper faces of the "crack" in the mesh. More...
 
boundary_id_type _crack_boundary_upper
 
bool _initialized
 Make sure we've been initialized before use. More...
 

Detailed Description

Definition at line 19 of file augment_sparsity_on_interface.h.

Member Typedef Documentation

◆ Counts

typedef std::map<std::string, std::pair<unsigned int, unsigned int> > libMesh::ReferenceCounter::Counts
protectedinherited

Data structure to log the information.

The log is identified by the class name.

Definition at line 117 of file reference_counter.h.

◆ map_type

typedef std::unordered_map<const Elem*, const CouplingMatrix*> libMesh::GhostingFunctor::map_type
inherited

What elements do we care about and what variables do we care about on each element?

Definition at line 171 of file ghosting_functor.h.

Constructor & Destructor Documentation

◆ AugmentSparsityOnInterface()

AugmentSparsityOnInterface::AugmentSparsityOnInterface ( MeshBase mesh,
boundary_id_type  crack_boundary_lower,
boundary_id_type  crack_boundary_upper 
)

Constructor.

Definition at line 9 of file augment_sparsity_on_interface.C.

11  :
12  _mesh(mesh),
13  _crack_boundary_lower(crack_boundary_lower),
14  _crack_boundary_upper(crack_boundary_upper),
15  _initialized(false)
16 {
17  this->mesh_reinit();
18 }

References mesh_reinit().

Member Function Documentation

◆ delete_remote_elements()

virtual void libMesh::GhostingFunctor::delete_remote_elements ( )
inlinevirtualinherited

GhostingFunctor subclasses with relatively long-lasting caches may want to delete the no-longer-relevant parts of those caches after a redistribution is complete.

Reimplemented in libMesh::PointNeighborCoupling, and libMesh::DefaultCoupling.

Definition at line 221 of file ghosting_functor.h.

221 {};

◆ disable_print_counter_info()

void libMesh::ReferenceCounter::disable_print_counter_info ( )
staticinherited

Definition at line 106 of file reference_counter.C.

107 {
108  _enable_print_counter = false;
109  return;
110 }

References libMesh::ReferenceCounter::_enable_print_counter.

Referenced by libMesh::LibMeshInit::LibMeshInit().

◆ dofmap_reinit()

virtual void libMesh::GhostingFunctor::dofmap_reinit ( )
inlinevirtualinherited

For algebraic ghosting or coupling functors we also call dofmap_reinit() later, after dofs have been distributed on the new mesh but before the functors have been queried for send_list or sparsity pattern calculations.

Definition at line 202 of file ghosting_functor.h.

202 {};

◆ enable_print_counter_info()

void libMesh::ReferenceCounter::enable_print_counter_info ( )
staticinherited

Methods to enable/disable the reference counter output from print_info()

Definition at line 100 of file reference_counter.C.

101 {
102  _enable_print_counter = true;
103  return;
104 }

References libMesh::ReferenceCounter::_enable_print_counter.

◆ get_info()

std::string libMesh::ReferenceCounter::get_info ( )
staticinherited

Gets a string containing the reference information.

Definition at line 47 of file reference_counter.C.

48 {
49 #if defined(LIBMESH_ENABLE_REFERENCE_COUNTING) && defined(DEBUG)
50 
51  std::ostringstream oss;
52 
53  oss << '\n'
54  << " ---------------------------------------------------------------------------- \n"
55  << "| Reference count information |\n"
56  << " ---------------------------------------------------------------------------- \n";
57 
58  for (const auto & pr : _counts)
59  {
60  const std::string name(pr.first);
61  const unsigned int creations = pr.second.first;
62  const unsigned int destructions = pr.second.second;
63 
64  oss << "| " << name << " reference count information:\n"
65  << "| Creations: " << creations << '\n'
66  << "| Destructions: " << destructions << '\n';
67  }
68 
69  oss << " ---------------------------------------------------------------------------- \n";
70 
71  return oss.str();
72 
73 #else
74 
75  return "";
76 
77 #endif
78 }

References libMesh::ReferenceCounter::_counts, and libMesh::Quality::name().

Referenced by libMesh::ReferenceCounter::print_info().

◆ get_lower_to_upper()

const ElementSideMap & AugmentSparsityOnInterface::get_lower_to_upper ( ) const
Returns
a const reference to the lower-to-upper element ID map.

Definition at line 20 of file augment_sparsity_on_interface.C.

21 {
23  return _lower_to_upper;
24 }

References _initialized, _lower_to_upper, and libMesh::libmesh_assert().

Referenced by main().

◆ increment_constructor_count()

void libMesh::ReferenceCounter::increment_constructor_count ( const std::string &  name)
inlineprotectedinherited

Increments the construction counter.

Should be called in the constructor of any derived class that will be reference counted.

Definition at line 181 of file reference_counter.h.

182 {
183  Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
184  std::pair<unsigned int, unsigned int> & p = _counts[name];
185 
186  p.first++;
187 }

References libMesh::ReferenceCounter::_counts, libMesh::Quality::name(), and libMesh::Threads::spin_mtx.

Referenced by libMesh::ReferenceCountedObject< RBParametrized >::ReferenceCountedObject().

◆ increment_destructor_count()

void libMesh::ReferenceCounter::increment_destructor_count ( const std::string &  name)
inlineprotectedinherited

Increments the destruction counter.

Should be called in the destructor of any derived class that will be reference counted.

Definition at line 194 of file reference_counter.h.

195 {
196  Threads::spin_mutex::scoped_lock lock(Threads::spin_mtx);
197  std::pair<unsigned int, unsigned int> & p = _counts[name];
198 
199  p.second++;
200 }

References libMesh::ReferenceCounter::_counts, libMesh::Quality::name(), and libMesh::Threads::spin_mtx.

Referenced by libMesh::ReferenceCountedObject< RBParametrized >::~ReferenceCountedObject().

◆ mesh_reinit()

void AugmentSparsityOnInterface::mesh_reinit ( )
overridevirtual

Rebuild the cached _lower_to_upper map whenever our Mesh has changed.

Reimplemented from libMesh::GhostingFunctor.

Definition at line 26 of file augment_sparsity_on_interface.C.

27 {
28  this->_initialized = true;
29 
30  // Loop over all elements (not just local elements) to make sure we find
31  // "neighbor" elements on opposite sides of the crack.
32 
33  // Map from (elem, side) to centroid
34  std::map<std::pair<const Elem *, unsigned char>, Point> lower_centroids;
35  std::map<std::pair<const Elem *, unsigned char>, Point> upper_centroids;
36 
37  for (const auto & elem : _mesh.active_element_ptr_range())
38  for (auto side : elem->side_index_range())
39  if (elem->neighbor_ptr(side) == nullptr)
40  {
42  {
43  std::unique_ptr<const Elem> side_elem = elem->build_side_ptr(side);
44 
45  lower_centroids[std::make_pair(elem, side)] = side_elem->centroid();
46  }
47 
49  {
50  std::unique_ptr<const Elem> side_elem = elem->build_side_ptr(side);
51 
52  upper_centroids[std::make_pair(elem, side)] = side_elem->centroid();
53  }
54  }
55 
56  // If we're doing a reinit on a distributed mesh then we may not see
57  // all the centroids, or even a matching number of centroids.
58  // std::size_t n_lower_centroids = lower_centroids.size();
59  // std::size_t n_upper_centroids = upper_centroids.size();
60  // libmesh_assert(n_lower_centroids == n_upper_centroids);
61 
62  // Clear _lower_to_upper. This map will be used for matrix assembly later on.
63  _lower_to_upper.clear();
64 
65  // Clear _upper_to_lower. This map will be used for element ghosting
66  // on distributed meshes, communication send_list construction in
67  // parallel, and sparsity calculations
68  _upper_to_lower.clear();
69 
70  // We do an N^2 search to find elements with matching centroids. This could be optimized,
71  // e.g. by first sorting the centroids based on their (x,y,z) location.
72  {
73  std::map<std::pair<const Elem *, unsigned char>, Point>::iterator it = lower_centroids.begin();
74  std::map<std::pair<const Elem *, unsigned char>, Point>::iterator it_end = lower_centroids.end();
75  for ( ; it != it_end; ++it)
76  {
77  Point lower_centroid = it->second;
78 
79  // find closest centroid in upper_centroids
80  Real min_distance = std::numeric_limits<Real>::max();
81 
82  std::map<std::pair<const Elem *, unsigned char>, Point>::iterator inner_it = upper_centroids.begin();
83  std::map<std::pair<const Elem *, unsigned char>, Point>::iterator inner_it_end = upper_centroids.end();
84 
85  for ( ; inner_it != inner_it_end; ++inner_it)
86  {
87  Point upper_centroid = inner_it->second;
88 
89  Real distance = (upper_centroid - lower_centroid).norm();
90  if (distance < min_distance)
91  {
92  min_distance = distance;
93  _lower_to_upper[it->first] = inner_it->first.first;
94  }
95  }
96 
97  // For pairs with local elements, we should have found a
98  // matching pair by now.
99  const Elem * elem = it->first.first;
100  const Elem * neighbor = _lower_to_upper[it->first];
101  if (min_distance < TOLERANCE)
102  {
103  // fill up the inverse map
104  _upper_to_lower[neighbor] = elem;
105  }
106  else
107  {
108  libmesh_assert_not_equal_to(elem->processor_id(), _mesh.processor_id());
109  // This must have a false positive; a remote element would
110  // have been closer.
111  _lower_to_upper.erase(it->first);
112  }
113  }
114 
115  // Let's make sure we didn't miss any upper elements either
116 #ifndef NDEBUG
117  std::map<std::pair<const Elem *, unsigned char>, Point>::iterator inner_it = upper_centroids.begin();
118  std::map<std::pair<const Elem *, unsigned char>, Point>::iterator inner_it_end = upper_centroids.end();
119 
120  for ( ; inner_it != inner_it_end; ++inner_it)
121  {
122  const Elem * neighbor = inner_it->first.first;
123  if (neighbor->processor_id() != _mesh.processor_id())
124  continue;
125  ElementMap::const_iterator utl_it =
126  _upper_to_lower.find(neighbor);
127  libmesh_assert(utl_it != _upper_to_lower.end());
128  }
129 #endif
130  }
131 }

References _crack_boundary_lower, _crack_boundary_upper, _initialized, _lower_to_upper, _mesh, _upper_to_lower, libMesh::MeshBase::active_element_ptr_range(), distance(), libMesh::MeshBase::get_boundary_info(), libMesh::BoundaryInfo::has_boundary_id(), libMesh::libmesh_assert(), std::norm(), libMesh::ParallelObject::processor_id(), libMesh::DofObject::processor_id(), libMesh::Real, and libMesh::TOLERANCE.

Referenced by AugmentSparsityOnInterface(), and redistribute().

◆ n_objects()

static unsigned int libMesh::ReferenceCounter::n_objects ( )
inlinestaticinherited

Prints the number of outstanding (created, but not yet destroyed) objects.

Definition at line 83 of file reference_counter.h.

84  { return _n_objects; }

References libMesh::ReferenceCounter::_n_objects.

◆ operator()() [1/2]

void AugmentSparsityOnInterface::operator() ( const MeshBase::const_element_iterator range_begin,
const MeshBase::const_element_iterator range_end,
processor_id_type  p,
map_type coupled_elements 
)
overridevirtual

User-defined function to augment the sparsity pattern.

Definition at line 134 of file augment_sparsity_on_interface.C.

138 {
140 
141  const CouplingMatrix * const null_mat = nullptr;
142 
143  for (const auto & elem : as_range(range_begin, range_end))
144  {
145  if (elem->processor_id() != p)
146  coupled_elements.insert (std::make_pair(elem, null_mat));
147 
148  for (auto side : elem->side_index_range())
149  if (elem->neighbor_ptr(side) == nullptr)
150  {
151  ElementSideMap::const_iterator ltu_it =
152  _lower_to_upper.find(std::make_pair(elem, side));
153  if (ltu_it != _lower_to_upper.end())
154  {
155  const Elem * neighbor = ltu_it->second;
156  if (neighbor->processor_id() != p)
157  coupled_elements.insert (std::make_pair(neighbor, null_mat));
158  }
159  }
160 
161  ElementMap::const_iterator utl_it =
162  _upper_to_lower.find(elem);
163  if (utl_it != _upper_to_lower.end())
164  {
165  const Elem * neighbor = utl_it->second;
166  if (neighbor->processor_id() != p)
167  coupled_elements.insert (std::make_pair(neighbor, null_mat));
168  }
169 
170  }
171 }

References libMesh::as_range(), libMesh::libmesh_assert(), and libMesh::DofObject::processor_id().

◆ operator()() [2/2]

virtual void libMesh::GhostingFunctor::operator() ( const MeshBase::const_element_iterator range_begin,
const MeshBase::const_element_iterator range_end,
processor_id_type  p,
map_type coupled_elements 
)
pure virtualinherited

For the specified range of active elements, what other elements currently living (whether local or ghosted) on this processor need to be coupled/ghosted to accommodate them? Don't bother to return any results which already have processor_id p.

This API is new, and we should replace "ignoring those on processor p" with "ignoring those which match a predicate functor" eventually.

Implemented in libMesh::DefaultCoupling, libMesh::PointNeighborCoupling, AugmentSparsityOnNodes, libMesh::SiblingCoupling, and libMesh::GhostPointNeighbors.

◆ print_info()

void libMesh::ReferenceCounter::print_info ( std::ostream &  out = libMesh::out)
staticinherited

Prints the reference information, by default to libMesh::out.

Definition at line 87 of file reference_counter.C.

88 {
90  out_stream << ReferenceCounter::get_info();
91 }

References libMesh::ReferenceCounter::_enable_print_counter, and libMesh::ReferenceCounter::get_info().

◆ redistribute()

virtual void AugmentSparsityOnInterface::redistribute ( )
inlineoverridevirtual

Update the cached _lower_to_upper map whenever our Mesh has been redistributed.

We'll be lazy and just recalculate from scratch.

Reimplemented from libMesh::GhostingFunctor.

Definition at line 82 of file augment_sparsity_on_interface.h.

83  { this->mesh_reinit(); }

References mesh_reinit().

Member Data Documentation

◆ _counts

ReferenceCounter::Counts libMesh::ReferenceCounter::_counts
staticprotectedinherited

◆ _crack_boundary_lower

boundary_id_type AugmentSparsityOnInterface::_crack_boundary_lower
private

Boundary IDs for the lower and upper faces of the "crack" in the mesh.

Definition at line 43 of file augment_sparsity_on_interface.h.

Referenced by mesh_reinit().

◆ _crack_boundary_upper

boundary_id_type AugmentSparsityOnInterface::_crack_boundary_upper
private

Definition at line 43 of file augment_sparsity_on_interface.h.

Referenced by mesh_reinit().

◆ _enable_print_counter

bool libMesh::ReferenceCounter::_enable_print_counter = true
staticprotectedinherited

Flag to control whether reference count information is printed when print_info is called.

Definition at line 141 of file reference_counter.h.

Referenced by libMesh::ReferenceCounter::disable_print_counter_info(), libMesh::ReferenceCounter::enable_print_counter_info(), and libMesh::ReferenceCounter::print_info().

◆ _initialized

bool AugmentSparsityOnInterface::_initialized
private

Make sure we've been initialized before use.

Definition at line 48 of file augment_sparsity_on_interface.h.

Referenced by get_lower_to_upper(), and mesh_reinit().

◆ _lower_to_upper

ElementSideMap AugmentSparsityOnInterface::_lower_to_upper
private

A map from (lower element ID, side ID) to matching upper element ID.

Here "lower" and "upper" refer to the lower and upper (wrt +z direction) sides of the crack in our mesh.

Definition at line 33 of file augment_sparsity_on_interface.h.

Referenced by get_lower_to_upper(), and mesh_reinit().

◆ _mesh

MeshBase& AugmentSparsityOnInterface::_mesh
private

The Mesh we're calculating on.

Definition at line 26 of file augment_sparsity_on_interface.h.

Referenced by mesh_reinit().

◆ _mutex

Threads::spin_mutex libMesh::ReferenceCounter::_mutex
staticprotectedinherited

Mutual exclusion object to enable thread-safe reference counting.

Definition at line 135 of file reference_counter.h.

◆ _n_objects

Threads::atomic< unsigned int > libMesh::ReferenceCounter::_n_objects
staticprotectedinherited

The number of objects.

Print the reference count information when the number returns to 0.

Definition at line 130 of file reference_counter.h.

Referenced by libMesh::ReferenceCounter::n_objects(), libMesh::ReferenceCounter::ReferenceCounter(), and libMesh::ReferenceCounter::~ReferenceCounter().

◆ _upper_to_lower

ElementMap AugmentSparsityOnInterface::_upper_to_lower
private

The inverse (ignoring sides) of the above map.

Definition at line 38 of file augment_sparsity_on_interface.h.

Referenced by mesh_reinit().


The documentation for this class was generated from the following files:
AugmentSparsityOnInterface::_upper_to_lower
ElementMap _upper_to_lower
The inverse (ignoring sides) of the above map.
Definition: augment_sparsity_on_interface.h:38
libMesh::MeshBase::get_boundary_info
const BoundaryInfo & get_boundary_info() const
The information about boundary ids on the mesh.
Definition: mesh_base.h:132
libMesh::MeshBase::active_element_ptr_range
virtual SimpleRange< element_iterator > active_element_ptr_range()=0
libMesh::ReferenceCounter::_counts
static Counts _counts
Actually holds the data.
Definition: reference_counter.h:122
libMesh::TOLERANCE
static const Real TOLERANCE
Definition: libmesh_common.h:128
libMesh::ReferenceCounter::_n_objects
static Threads::atomic< unsigned int > _n_objects
The number of objects.
Definition: reference_counter.h:130
mesh
MeshBase & mesh
Definition: mesh_communication.C:1257
AugmentSparsityOnInterface::_initialized
bool _initialized
Make sure we've been initialized before use.
Definition: augment_sparsity_on_interface.h:48
libMesh::ReferenceCounter::get_info
static std::string get_info()
Gets a string containing the reference information.
Definition: reference_counter.C:47
libMesh::DofObject::processor_id
processor_id_type processor_id() const
Definition: dof_object.h:829
AugmentSparsityOnInterface::_lower_to_upper
ElementSideMap _lower_to_upper
A map from (lower element ID, side ID) to matching upper element ID.
Definition: augment_sparsity_on_interface.h:33
libMesh::libmesh_assert
libmesh_assert(ctx)
libMesh::Threads::spin_mtx
spin_mutex spin_mtx
A convenient spin mutex object which can be used for obtaining locks.
Definition: threads.C:29
libMesh::ParallelObject::processor_id
processor_id_type processor_id() const
Definition: parallel_object.h:106
libMesh::Point
A Point defines a location in LIBMESH_DIM dimensional Real space.
Definition: point.h:38
AugmentSparsityOnInterface::_mesh
MeshBase & _mesh
The Mesh we're calculating on.
Definition: augment_sparsity_on_interface.h:26
libMesh::as_range
SimpleRange< IndexType > as_range(const std::pair< IndexType, IndexType > &p)
Helper function that allows us to treat a homogenous pair as a range.
Definition: simple_range.h:57
distance
Real distance(const Point &p)
Definition: subdomains_ex3.C:50
AugmentSparsityOnInterface::mesh_reinit
virtual void mesh_reinit() override
Rebuild the cached _lower_to_upper map whenever our Mesh has changed.
Definition: augment_sparsity_on_interface.C:26
libMesh::Elem
This is the base class from which all geometric element types are derived.
Definition: elem.h:100
std::norm
MetaPhysicL::DualNumber< T, D > norm(const MetaPhysicL::DualNumber< T, D > &in)
AugmentSparsityOnInterface::_crack_boundary_lower
boundary_id_type _crack_boundary_lower
Boundary IDs for the lower and upper faces of the "crack" in the mesh.
Definition: augment_sparsity_on_interface.h:43
AugmentSparsityOnInterface::_crack_boundary_upper
boundary_id_type _crack_boundary_upper
Definition: augment_sparsity_on_interface.h:43
libMesh::CouplingMatrix
This class defines a coupling matrix.
Definition: coupling_matrix.h:54
libMesh::Real
DIE A HORRIBLE DEATH HERE typedef LIBMESH_DEFAULT_SCALAR_TYPE Real
Definition: libmesh_common.h:121
libMesh::ReferenceCounter::_enable_print_counter
static bool _enable_print_counter
Flag to control whether reference count information is printed when print_info is called.
Definition: reference_counter.h:141
libMesh::BoundaryInfo::has_boundary_id
bool has_boundary_id(const Node *const node, const boundary_id_type id) const
Definition: boundary_info.C:972
libMesh::Quality::name
std::string name(const ElemQuality q)
This function returns a string containing some name for q.
Definition: elem_quality.C:42