DOLFIN-X
DOLFIN-X C++ interface
SparsityPattern.h
1 // Copyright (C) 2007-2020 Garth N. Wells
2 //
3 // This file is part of DOLFINX (https://www.fenicsproject.org)
4 //
5 // SPDX-License-Identifier: LGPL-3.0-or-later
6 
7 #pragma once
8 
9 #include <Eigen/Dense>
10 #include <dolfinx/common/MPI.h>
11 #include <memory>
12 #include <string>
13 #include <utility>
14 #include <vector>
15 
16 namespace dolfinx
17 {
18 
19 namespace graph
20 {
21 template <typename T>
22 class AdjacencyList;
23 }
24 
25 namespace common
26 {
27 class IndexMap;
28 }
29 
30 namespace la
31 {
32 
35 
37 {
38 
39 public:
42  MPI_Comm comm,
43  const std::array<std::shared_ptr<const common::IndexMap>, 2>& index_maps);
44 
49  MPI_Comm comm,
50  const std::vector<std::vector<const SparsityPattern*>>& patterns);
51 
52  SparsityPattern(const SparsityPattern& pattern) = delete;
53 
55  SparsityPattern(SparsityPattern&& pattern) = default;
56 
58  ~SparsityPattern() = default;
59 
61  SparsityPattern& operator=(SparsityPattern&& pattern) = default;
62 
64  std::array<std::int64_t, 2> local_range(int dim) const;
65 
67  std::shared_ptr<const common::IndexMap> index_map(int dim) const;
68 
70  void
71  insert(const Eigen::Ref<const Eigen::Array<std::int32_t, Eigen::Dynamic, 1>>&
72  rows,
73  const Eigen::Ref<const Eigen::Array<std::int32_t, Eigen::Dynamic, 1>>&
74  cols);
75 
79  void insert_diagonal(
80  const Eigen::Ref<const Eigen::Array<std::int32_t, Eigen::Dynamic, 1>>&
81  rows);
82 
84  void assemble();
85 
87  std::int64_t num_nonzeros() const;
88 
91  Eigen::Array<std::int32_t, Eigen::Dynamic, 1> num_nonzeros_diagonal() const;
92 
96  Eigen::Array<std::int32_t, Eigen::Dynamic, 1>
98 
101  Eigen::Array<std::int32_t, Eigen::Dynamic, 1> num_local_nonzeros() const;
102 
106 
110 
112  MPI_Comm mpi_comm() const;
113 
115  std::string str() const;
116 
117 private:
118  // MPI communicator
119  dolfinx::MPI::Comm _mpi_comm;
120 
121  // common::IndexMaps for each dimension
122  std::array<std::shared_ptr<const common::IndexMap>, 2> _index_maps;
123 
124  // Caches for diagonal and off-diagonal blocks
125  std::vector<std::vector<std::int32_t>> _diagonal_cache;
126  std::vector<std::vector<std::int64_t>> _off_diagonal_cache;
127 
128  std::shared_ptr<graph::AdjacencyList<std::int32_t>> _diagonal;
129  std::shared_ptr<graph::AdjacencyList<std::int64_t>> _off_diagonal;
130 };
131 } // namespace la
132 } // namespace dolfinx
dolfinx::la::SparsityPattern::SparsityPattern
SparsityPattern(MPI_Comm comm, const std::array< std::shared_ptr< const common::IndexMap >, 2 > &index_maps)
Create an empty sparsity pattern with specified dimensions.
Definition: SparsityPattern.cpp:32
dolfinx::la::SparsityPattern::local_range
std::array< std::int64_t, 2 > local_range(int dim) const
Return local range for dimension dim.
Definition: SparsityPattern.cpp:189
dolfinx::la::SparsityPattern::insert
void insert(const Eigen::Ref< const Eigen::Array< std::int32_t, Eigen::Dynamic, 1 >> &rows, const Eigen::Ref< const Eigen::Array< std::int32_t, Eigen::Dynamic, 1 >> &cols)
Insert non-zero locations using local (process-wise) indices.
Definition: SparsityPattern.cpp:202
dolfinx::la::SparsityPattern::num_nonzeros_off_diagonal
Eigen::Array< std::int32_t, Eigen::Dynamic, 1 > num_nonzeros_off_diagonal() const
Fill array with number of nonzeros for off-diagonal block in local_range for dimension 0....
Definition: SparsityPattern.cpp:424
dolfinx::la::SparsityPattern
This class provides a sparsity pattern data structure that can be used to initialize sparse matrices.
Definition: SparsityPattern.h:36
dolfinx::la::SparsityPattern::mpi_comm
MPI_Comm mpi_comm() const
Return MPI communicator.
Definition: SparsityPattern.cpp:459
dolfinx::la::SparsityPattern::insert_diagonal
void insert_diagonal(const Eigen::Ref< const Eigen::Array< std::int32_t, Eigen::Dynamic, 1 >> &rows)
Insert non-zero locations on the diagonal.
Definition: SparsityPattern.cpp:244
dolfinx::graph::AdjacencyList
This class provides a static adjacency list data structure. It is commonly used to store directed gra...
Definition: assemble_matrix_impl.h:26
dolfinx::la::SparsityPattern::~SparsityPattern
~SparsityPattern()=default
Destructor.
dolfinx::la::SparsityPattern::assemble
void assemble()
Finalize sparsity pattern and communicate off-process entries.
Definition: SparsityPattern.cpp:270
dolfinx::la::SparsityPattern::diagonal_pattern
const graph::AdjacencyList< std::int32_t > & diagonal_pattern() const
Sparsity pattern for the owned (diagonal) block. Uses local indices for the columns.
Definition: SparsityPattern.cpp:444
dolfinx::MPI::Comm
A duplicate MPI communicator and manage lifetime of the communicator.
Definition: MPI.h:34
dolfinx::la::SparsityPattern::operator=
SparsityPattern & operator=(SparsityPattern &&pattern)=default
Move assignment.
dolfinx::la::SparsityPattern::index_map
std::shared_ptr< const common::IndexMap > index_map(int dim) const
Return index map for dimension dim.
Definition: SparsityPattern.cpp:197
dolfinx::la::SparsityPattern::num_nonzeros_diagonal
Eigen::Array< std::int32_t, Eigen::Dynamic, 1 > num_nonzeros_diagonal() const
Fill array with number of nonzeros per row for diagonal block in local_range for dimension 0.
Definition: SparsityPattern.cpp:410
dolfinx::la::SparsityPattern::num_nonzeros
std::int64_t num_nonzeros() const
Return number of local nonzeros.
Definition: SparsityPattern.cpp:401
dolfinx::la::SparsityPattern::str
std::string str() const
Return informal string representation (pretty-print)
Definition: SparsityPattern.cpp:461
dolfinx::la::SparsityPattern::num_local_nonzeros
Eigen::Array< std::int32_t, Eigen::Dynamic, 1 > num_local_nonzeros() const
Fill vector with number of nonzeros in local_range for dimension 0.
Definition: SparsityPattern.cpp:438
dolfinx::la::SparsityPattern::off_diagonal_pattern
const graph::AdjacencyList< std::int64_t > & off_diagonal_pattern() const
Sparsity pattern for the un-owned (off-diagonal) columns. Uses global indices for the columns.
Definition: SparsityPattern.cpp:452