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
sparse_vanka.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) 1999 - 2025 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_sparse_vanka_h
14#define dealii_sparse_vanka_h
15
16#include <deal.II/base/config.h>
17
20#include <deal.II/base/types.h>
21
22#include <vector>
23
25
26// Forward declarations
27#ifndef DOXYGEN
28template <typename number>
29class FullMatrix;
30template <typename number>
31class SparseMatrix;
32template <typename number>
33class Vector;
34
35template <typename number>
36class SparseVanka;
37template <typename number>
39#endif
40
132template <typename number>
134{
135public:
140
148
161 SparseVanka(const SparseMatrix<number> &M, const std::vector<bool> &selected);
162
167
172 {
173 public:
177 explicit AdditionalData(const std::vector<bool> &selected);
178
182 const std::vector<bool> &selected;
183 };
184
185
196 void
198 const AdditionalData &additional_data);
199
204 template <typename number2>
205 void
206 vmult(Vector<number2> &dst, const Vector<number2> &src) const;
207
212 template <typename number2>
213 void
214 Tvmult(Vector<number2> &dst, const Vector<number2> &src) const;
215
219 void
221
230 m() const;
231
240 n() const;
241
242protected:
267 template <typename number2>
268 void
270 const Vector<number2> &src,
271 const bool transpose = false,
272 const std::vector<bool> *const dof_mask = nullptr) const;
273
278 std::size_t
280
281private:
286
290 const std::vector<bool> *selected;
291
296 mutable std::vector<ObserverPointer<FullMatrix<float>, SparseVanka<number>>>
298
303
308
312 void
314
321 void
323
331 void
332 compute_inverse(const size_type row, std::vector<size_type> &local_indices);
333
334 // Make the derived class a friend. This seems silly, but is actually
335 // necessary, since derived classes can only access non-public members
336 // through their @p this pointer, but not access these members as member
337 // functions of other objects of the type of this base class (i.e. like
338 // <tt>x.f()</tt>, where @p x is an object of the base class, and @p f one
339 // of it's non-public member functions).
340 //
341 // Now, in the case of the @p SparseBlockVanka class, we would like to take
342 // the address of a function of the base class in order to call it through
343 // the multithreading framework, so the derived class has to be a friend.
344 template <typename T>
345 friend class SparseBlockVanka;
346};
347
348
349
481template <typename number>
482class SparseBlockVanka : public SparseVanka<number>
483{
484public:
489
505
510 const std::vector<bool> &selected,
511 const unsigned int n_blocks,
512 const BlockingStrategy blocking_strategy);
513
517 template <typename number2>
518 void
519 vmult(Vector<number2> &dst, const Vector<number2> &src) const;
520
521
525 template <typename number2>
526 void
527 Tvmult(Vector<number2> &dst, const Vector<number2> &src) const;
528
533 std::size_t
535
536private:
540 const unsigned int n_blocks;
541
549 std::vector<std::vector<bool>> dof_masks;
550
555 void
557 const std::vector<bool> &selected,
558 const BlockingStrategy blocking_strategy);
559};
560
562/* ---------------------------------- Inline functions ------------------- */
563
564#ifndef DOXYGEN
565
566template <typename number>
567inline typename SparseVanka<number>::size_type
569{
570 Assert(_m != 0, ExcNotInitialized());
571 return _m;
572}
573
574template <typename number>
575inline typename SparseVanka<number>::size_type
577{
578 Assert(_n != 0, ExcNotInitialized());
579 return _n;
580}
581
582#endif // DOXYGEN
583
585
586#endif
*  iterator end()
*  *  iterator begin()
void Tvmult(Vector< number2 > &dst, const Vector< number2 > &src) const
void compute_dof_masks(const SparseMatrix< number > &M, const std::vector< bool > &selected, const BlockingStrategy blocking_strategy)
std::size_t memory_consumption() const
SparseBlockVanka(const SparseMatrix< number > &M, const std::vector< bool > &selected, const unsigned int n_blocks, const BlockingStrategy blocking_strategy)
void vmult(Vector< number2 > &dst, const Vector< number2 > &src) const
std::vector< std::vector< bool > > dof_masks
const unsigned int n_blocks
AdditionalData(const std::vector< bool > &selected)
const std::vector< bool > & selected
size_type m() const
void apply_preconditioner(Vector< number2 > &dst, const Vector< number2 > &src, const bool transpose=false, const std::vector< bool > *const dof_mask=nullptr) const
size_type _n
size_type _m
void compute_inverses()
std::size_t memory_consumption() const
void compute_inverse(const size_type row, std::vector< size_type > &local_indices)
size_type n() const
void compute_inverses(const size_type begin, const size_type end)
void initialize(const SparseMatrix< number > &M, const AdditionalData &additional_data)
ObserverPointer< const SparseMatrix< number >, SparseVanka< number > > matrix
void vmult(Vector< number2 > &dst, const Vector< number2 > &src) const
void Tvmult(Vector< number2 > &dst, const Vector< number2 > &src) const
const std::vector< bool > * selected
std::vector< ObserverPointer< FullMatrix< float >, SparseVanka< number > > > inverses
SparseVanka(const SparseMatrix< number > &M, const std::vector< bool > &selected)
void clear()
#define DEAL_II_NAMESPACE_OPEN
Definition config.h:38
#define DEAL_II_NAMESPACE_CLOSE
Definition config.h:39
DerivativeForm< 1, spacedim, dim, Number > transpose(const DerivativeForm< 1, dim, spacedim, Number > &DF)
#define Assert(cond, exc)
static ::ExceptionBase & ExcNotInitialized()
unsigned int global_dof_index
Definition types.h:92