deal.II version GIT relicensing-6842-g793a97d2aa 2026-10-02 14:00:01+00:00
\(\newcommand{\dealvcentcolon}{\mathrel{\mathop{:}}}\) \(\newcommand{\dealcoloneq}{\dealvcentcolon\mathrel{\mkern-1.2mu}=}\) \(\newcommand{\jump}[1]{\left[\!\left[ #1 \right]\!\right]}\) \(\newcommand{\average}[1]{\left\{\!\left\{ #1 \right\}\!\right\}}\)
Loading...
Searching...
No Matches
block_sparse_matrix_ez.h
Go to the documentation of this file.
1// -----------------------------------------------------------------------------
2//
3// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception OR LGPL-2.1-or-later
4// Copyright (C) 2002 - 2026 by the deal.II authors
5//
6// This file is part of the deal.II library.
7//
8// Detailed license information governing the source code and contributions
9// can be found in LICENSE.md and CONTRIBUTING.md at the top level directory.
10//
11// -----------------------------------------------------------------------------
12
13#ifndef dealii_block_sparse_matrix_ez_h
14#define dealii_block_sparse_matrix_ez_h
15
16
17// TODO: Derive BlockSparseMatrixEZ from BlockMatrixBase, like all the
18// other block matrices as well; this would allow to instantiate a few
19// functions with this template argument as well (in particular
20// AffineConstraints::distribute_local_to_global)
21
22#include <deal.II/base/config.h>
23
27
29
30// Forward declaration
31#ifndef DOXYGEN
32template <typename Number>
33class BlockVector;
34#endif
35
53template <typename Number>
54class BlockSparseMatrixEZ : public BlockMatrixBase<SparseMatrixEZ<Number>>
55{
56public:
61
66
71
76 BlockSparseMatrixEZ(const unsigned int block_rows,
77 const unsigned int block_cols);
78
85
92
102 operator=(const double d);
103
107 void
109
117 void
118 reinit(const unsigned int n_block_rows, const unsigned int n_block_cols);
119
126 void
128
135 bool
136 empty() const;
137
146 template <typename block_number>
147 void
149 const BlockVector<block_number> &src) const;
150
155 template <typename block_number, typename nonblock_number>
156 void
158 const Vector<nonblock_number> &src) const;
159
164 template <typename block_number, typename nonblock_number>
165 void
167 const BlockVector<block_number> &src) const;
168
173 template <typename nonblock_number>
174 void
176
182 template <typename block_number>
183 void
185 const BlockVector<block_number> &src) const;
186
191 template <typename block_number, typename nonblock_number>
192 void
194 const Vector<nonblock_number> &src) const;
195
200 template <typename block_number, typename nonblock_number>
201 void
203 const BlockVector<block_number> &src) const;
204
209 template <typename nonblock_number>
210 void
212 const Vector<nonblock_number> &src) const;
220 template <typename StreamType>
221 void
222 print_statistics(StreamType &s, bool full = false);
223};
224
226/*----------------------------------------------------------------------*/
227
228
229
230template <typename number>
231template <typename block_number>
232inline void
234 const BlockVector<block_number> &src) const
235{
236 BaseClass::vmult_block_block(dst, src);
237}
238
239template <typename number>
240template <typename block_number, typename nonblock_number>
241inline void
243 const Vector<nonblock_number> &src) const
244{
245 BaseClass::vmult_block_nonblock(dst, src);
246}
247
248template <typename number>
249template <typename block_number, typename nonblock_number>
250inline void
252 const BlockVector<block_number> &src) const
253{
254 BaseClass::vmult_nonblock_block(dst, src);
255}
256
257template <typename number>
258template <typename nonblock_number>
259inline void
261 const Vector<nonblock_number> &src) const
262{
263 BaseClass::vmult_nonblock_nonblock(dst, src);
264}
265
266template <typename number>
267template <typename block_number>
268inline void
270 const BlockVector<block_number> &src) const
271{
272 BaseClass::Tvmult_block_block(dst, src);
273}
274
275template <typename number>
276template <typename block_number, typename nonblock_number>
277inline void
279 const Vector<nonblock_number> &src) const
280{
281 BaseClass::Tvmult_block_nonblock(dst, src);
282}
283
284template <typename number>
285template <typename block_number, typename nonblock_number>
286inline void
288 const BlockVector<block_number> &src) const
289{
290 BaseClass::Tvmult_nonblock_block(dst, src);
291}
292
293template <typename number>
294template <typename nonblock_number>
295inline void
297 const Vector<nonblock_number> &src) const
298{
299 BaseClass::Tvmult_nonblock_nonblock(dst, src);
300}
301
302
303
304template <typename number>
305template <typename StreamType>
306inline void
308{
309 size_type used_total = 0;
310 size_type allocated_total = 0;
311 size_type reserved_total = 0;
312 std::vector<size_type> used_by_line_total;
313
314 size_type used;
315 size_type allocated;
316 size_type reserved;
317 std::vector<size_type> used_by_line;
318
319 for (size_type i = 0; i < this->n_block_rows(); ++i)
320 for (size_type j = 0; j < this->n_block_cols(); ++j)
321 {
322 used_by_line.clear();
323 out << "block:\t" << i << '\t' << j << std::endl;
324 this->sub_objects(i, j)->compute_statistics(
325 used, allocated, reserved, used_by_line, full);
326
327 out << "used:" << used << std::endl
328 << "allocated:" << allocated << std::endl
329 << "reserved:" << reserved << std::endl;
330
331 used_total += used;
332 allocated_total += allocated;
333 reserved_total += reserved;
334
335 if (full)
336 {
337 used_by_line_total.resize(used_by_line.size());
338 for (size_type i = 0; i < used_by_line.size(); ++i)
339 if (used_by_line[i] != 0)
340 {
341 out << "row-entries\t" << i << "\trows\t" << used_by_line[i]
342 << std::endl;
343 used_by_line_total[i] += used_by_line[i];
344 }
345 }
346 }
347 out << "Total" << std::endl
348 << "used:" << used_total << std::endl
349 << "allocated:" << allocated_total << std::endl
350 << "reserved:" << reserved_total << std::endl;
351 for (size_type i = 0; i < used_by_line_total.size(); ++i)
352 if (used_by_line_total[i] != 0)
353 {
354 out << "row-entries\t" << i << "\trows\t" << used_by_line_total[i]
355 << std::endl;
356 }
357}
358
359
361
362#endif // dealii_block_sparse_matrix_ez_h
void vmult(BlockVector< block_number > &dst, const BlockVector< block_number > &src) const
void print_statistics(StreamType &s, bool full=false)
BlockSparseMatrixEZ()=default
void Tvmult(BlockVector< block_number > &dst, const BlockVector< block_number > &src) const
void reinit(const unsigned int n_block_rows, const unsigned int n_block_cols)
BlockSparseMatrixEZ & operator=(const BlockSparseMatrixEZ< Number > &)
BlockSparseMatrixEZ & operator=(const double d)
BlockSparseMatrixEZ(const unsigned int block_rows, const unsigned int block_cols)
bool empty() const
BlockSparseMatrixEZ(const BlockSparseMatrixEZ< Number > &)
#define DEAL_II_NAMESPACE_OPEN
Definition config.h:38
#define DEAL_II_NAMESPACE_CLOSE
Definition config.h:39
unsigned int global_dof_index
Definition types.h:92