19#ifndef LIBMESH_SPARSITY_PATTERN_H
20#define LIBMESH_SPARSITY_PATTERN_H
23#include "libmesh/elem_range.h"
24#include "libmesh/threads_allocators.h"
25#include "libmesh/parallel_object.h"
29#include <unordered_set>
38class StaticCondensationDofMap;
50namespace SparsityPattern
52typedef std::vector<dof_id_type, Threads::scalable_allocator<dof_id_type>>
Row;
53class Graph :
public std::vector<Row> {};
66template<
typename B
idirectionalIterator>
67static void sort_row (
const BidirectionalIterator begin,
68 BidirectionalIterator middle,
69 const BidirectionalIterator end);
86 std::vector<dof_id_type> & n_nz,
87 std::vector<dof_id_type> & n_oz) = 0;
108 const std::vector<GhostingFunctor *> & coupling_functors_in,
109 const bool implicit_neighbor_dofs_in,
110 const bool need_full_sparsity_pattern_in,
111 const bool calculate_constrained_in =
false,
192 std::vector<dof_id_type> &
n_nz,
193 std::vector<dof_id_type> &
n_oz,
233 void handle_vi_vj(
const std::vector<dof_id_type> & element_dofs_i,
234 const std::vector<dof_id_type> & element_dofs_j);
237 std::vector<dof_id_type> & dofs_vi,
255template<
typename B
idirectionalIterator>
258 BidirectionalIterator middle,
259 const BidirectionalIterator end)
269 std::inplace_merge(begin, middle, end);
This class defines a coupling matrix.
This class handles the numbering of degrees of freedom on a mesh.
This is the base class from which all geometric element types are derived.
An object whose state is distributed along a set of processors.
Abstract base class to be used to add user-defined implicit degree of freedom couplings.
virtual void augment_sparsity_pattern(SparsityPattern::Graph &sparsity, std::vector< dof_id_type > &n_nz, std::vector< dof_id_type > &n_oz)=0
User-defined function to augment the sparsity pattern.
virtual ~AugmentSparsityPattern()=default
This helper class can be called on multiple threads to compute the sparsity pattern (or graph) of the...
SparsityPattern::Graph sparsity_pattern
void join(const Build &other)
Combine the sparsity pattern in other with this object's sparsity pattern.
Build & operator=(const Build &)=delete
const std::vector< dof_id_type > & get_n_oz() const
The number of off-processor nonzeros in my portion of the global matrix.
std::unordered_set< dof_id_type > hashed_dof_sets
If there are "spider" nodes in the mesh (i.e.
void apply_extra_sparsity_object(SparsityPattern::AugmentSparsityPattern &asp)
Let a user-provided AugmentSparsityPattern subclass modify our sparsity structure.
const bool implicit_neighbor_dofs
void apply_extra_sparsity_function(void(*func)(SparsityPattern::Graph &sparsity, std::vector< dof_id_type > &n_nz, std::vector< dof_id_type > &n_oz, void *context), void *context)
Let a user-provided function modify our sparsity structure.
const CouplingMatrix * dof_coupling
void parallel_sync()
Send sparsity pattern data relevant to other processors to those processors, and receive and incorpor...
const StaticCondensationDofMap *const sc
const bool calculate_constrained
const std::vector< GhostingFunctor * > & coupling_functors
void handle_vi_vj(const std::vector< dof_id_type > &element_dofs_i, const std::vector< dof_id_type > &element_dofs_j)
void clear_full_sparsity()
Clear the "full" details of our sparsity structure, leaving only the counts of non-zero entries.
Build(const Build &)=default
Special functions.
std::vector< dof_id_type > n_nz
void operator()(const ConstElemRange &range)
Add entries from a range of elements to this object's sparsity pattern.
std::size_t n_nonzeros() const
The total number of nonzeros in the global matrix.
const SparsityPattern::Graph & get_sparsity_pattern() const
Rows of sparse matrix indices, indexed by the offset from the first DoF on this processor.
SparsityPattern::NonlocalGraph nonlocal_pattern
const SparsityPattern::NonlocalGraph & get_nonlocal_pattern() const
Rows of sparse matrix indices, mapped from global DoF number, which belong on other processors.
std::vector< dof_id_type > dummy_vec
A dummy work vector to avoid repeated memory allocations.
const std::vector< dof_id_type > & get_n_nz() const
The number of on-processor nonzeros in my portion of the global matrix.
const bool need_full_sparsity_pattern
void sorted_connected_dofs(const Elem *elem, std::vector< dof_id_type > &dofs_vi, unsigned int vi)
std::vector< dof_id_type > n_oz
A class holding degree of freedom information pertinent to static condensation.
The StoredRange class defines a contiguous, divisible set of objects.
Dummy "splitting object" used to distinguish splitting constructors from copy constructors.
static void sort_row(const BidirectionalIterator begin, BidirectionalIterator middle, const BidirectionalIterator end)
Splices the two sorted ranges [begin,middle) and [middle,end) into one sorted range [begin,...
std::vector< dof_id_type, Threads::scalable_allocator< dof_id_type > > Row
The libMesh namespace provides an interface to certain functionality in the library.