deal.II version GIT relicensing-6809-ge913b9bb34 2026-09-25 17:20: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_vector.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 - 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_vector_h
14#define dealii_block_vector_h
15
16
17#include <deal.II/base/config.h>
18
20
26
27#include <cstdio>
28#include <vector>
29
31
53template <typename Number>
54class BlockVector : public BlockVectorBase<Vector<Number>>
55{
56public:
61
66
72 using pointer = typename BaseClass::pointer;
77 using iterator = typename BaseClass::iterator;
79
90 explicit BlockVector(const unsigned int n_blocks = 0,
91 const size_type block_size = 0);
92
98
99
104 BlockVector(BlockVector<Number> && /*v*/) noexcept = default;
105
112 template <typename OtherNumber>
113 explicit BlockVector(const BlockVector<OtherNumber> &v);
114
115#ifdef DEAL_II_TRILINOS_WITH_EPETRA
121
122#endif
127 BlockVector(const std::vector<size_type> &block_sizes);
128
134
144 template <typename InputIterator>
145 BlockVector(const std::vector<size_type> &block_sizes,
146 const InputIterator first,
147 const InputIterator end);
148
152 ~BlockVector() override = default;
153
164 void
166
173 bool
175
182
191
197 operator=(BlockVector<Number> && /*v*/) = default; // NOLINT
198
203 template <class Number2>
206
212
213#ifdef DEAL_II_TRILINOS_WITH_EPETRA
220#endif
221
234 void
235 reinit(const unsigned int n_blocks,
236 const size_type block_size = 0,
237 const bool omit_zeroing_entries = false);
238
255 void
256 reinit(const std::vector<size_type> &block_sizes,
257 const bool omit_zeroing_entries = false);
258
268 void
270 const bool omit_zeroing_entries = false);
271
285 template <typename Number2>
286 void
288 const bool omit_zeroing_entries = false);
289
294 template <class BlockVector2>
295 void
296 scale(const BlockVector2 &v);
297
309 void
311
315 void
316 print(std::ostream &out,
317 const unsigned int precision = 3,
318 const bool scientific = true,
319 const bool across = true) const;
320
326 void
327 block_write(std::ostream &out) const;
328
340 void
341 block_read(std::istream &in);
342
353};
354
357#ifndef DOXYGEN
358/*----------------------- Inline functions ----------------------------------*/
359
360
361
362template <typename Number>
363template <typename InputIterator>
364BlockVector<Number>::BlockVector(const std::vector<size_type> &block_sizes,
365 const InputIterator first,
366 const InputIterator end)
367{
368 // first set sizes of blocks, but
369 // don't initialize them as we will
370 // copy elements soon
371 reinit(block_sizes, true);
372 InputIterator start = first;
373 for (size_type b = 0; b < block_sizes.size(); ++b)
374 {
375 InputIterator end = start;
376 std::advance(end, static_cast<signed int>(block_sizes[b]));
377 std::copy(start, end, this->block(b).begin());
378 start = end;
379 };
380 Assert(start == end, ExcIteratorRangeDoesNotMatchVectorSize());
381}
382
383
384
385template <typename Number>
386inline BlockVector<Number> &
388{
390
391 BaseClass::operator=(s);
392 return *this;
393}
394
395
396
397template <typename Number>
398inline BlockVector<Number> &
400{
401 reinit(v, true);
402 BaseClass::operator=(v);
403 return *this;
404}
405
406
407
408template <typename Number>
409inline BlockVector<Number> &
411{
412 BaseClass::operator=(v);
413 return *this;
414}
415
416
417
418template <typename Number>
419template <typename Number2>
420inline BlockVector<Number> &
422{
423 reinit(v, true);
424 BaseClass::operator=(v);
425 return *this;
426}
427
428template <typename Number>
429inline void
431{
432 for (size_type i = 0; i < this->n_blocks(); ++i)
433 this->components[i].compress(operation);
434}
435
436
437
438template <typename Number>
439inline bool
441{
442 return false;
443}
444
445
446
447template <typename Number>
448template <class BlockVector2>
449void
450BlockVector<Number>::scale(const BlockVector2 &v)
451{
452 BaseClass::scale(v);
453}
454
455#endif // DOXYGEN
456
457
465template <typename Number>
466inline void
468{
469 u.swap(v);
470}
471
472
473namespace internal
474{
475 namespace LinearOperatorImplementation
476 {
477 template <typename>
478 class ReinitHelper;
479
484 template <typename number>
486 {
487 public:
488 template <typename Matrix>
489 static void
490 reinit_range_vector(const Matrix &matrix,
492 bool omit_zeroing_entries)
493 {
494 v.reinit(matrix.get_row_indices(), omit_zeroing_entries);
495 }
496
497 template <typename Matrix>
498 static void
499 reinit_domain_vector(const Matrix &matrix,
501 bool omit_zeroing_entries)
502 {
503 v.reinit(matrix.get_column_indices(), omit_zeroing_entries);
504 }
505 };
506
507 } // namespace LinearOperatorImplementation
508} /* namespace internal */
509
510
514template <typename Number>
515struct is_serial_vector<BlockVector<Number>> : std::true_type
516{};
517
519
520#endif
*  iterator end()
*  *  iterator begin()
::internal::BlockVectorIterators::Iterator< BlockVectorBase, false > iterator
typename BlockType::const_reference const_reference
typename BlockType::value_type value_type
::internal::BlockVectorIterators::Iterator< BlockVectorBase, true > const_iterator
typename BlockType::reference reference
typename BlockType::real_type real_type
BlockVector(const std::vector< size_type > &block_sizes)
typename BaseClass::const_reference const_reference
void reinit(const BlockIndices &block_indices, const bool omit_zeroing_entries=false)
typename BaseClass::reference reference
void print(std::ostream &out, const unsigned int precision=3, const bool scientific=true, const bool across=true) const
void swap(BlockVector< Number > &u, BlockVector< Number > &v) noexcept
void compress(VectorOperation::values operation=VectorOperation::unknown)
bool has_ghost_elements() const
BlockVector(const TrilinosWrappers::MPI::BlockVector &v)
BlockVector< Number > & operator=(const TrilinosWrappers::MPI::BlockVector &V)
BlockVector< Number > & operator=(const BlockVector< Number2 > &V)
BlockVector(const BlockIndices &block_indices)
BlockVector< Number > & operator=(BlockVector< Number > &&)=default
typename BaseClass::value_type value_type
typename BaseClass::const_pointer const_pointer
BlockVector(const BlockVector< Number > &V)
void block_write(std::ostream &out) const
typename BaseClass::pointer pointer
~BlockVector() override=default
typename BaseClass::BlockType BlockType
BlockVector(const unsigned int n_blocks=0, const size_type block_size=0)
void scale(const BlockVector2 &v)
void swap(BlockVector< Number > &v) noexcept
BlockVector(BlockVector< Number > &&) noexcept=default
void reinit(const std::vector< size_type > &block_sizes, const bool omit_zeroing_entries=false)
typename BaseClass::iterator iterator
void block_read(std::istream &in)
BlockVector & operator=(const value_type s)
typename BaseClass::size_type size_type
BlockVector< Number > & operator=(const Vector< Number > &V)
BlockVector< Number > & operator=(const BlockVector< Number > &v)
BlockVector(const std::vector< size_type > &block_sizes, const InputIterator first, const InputIterator end)
void reinit(const unsigned int n_blocks, const size_type block_size=0, const bool omit_zeroing_entries=false)
typename BaseClass::const_iterator const_iterator
void reinit(const BlockVector< Number2 > &V, const bool omit_zeroing_entries=false)
typename BaseClass::real_type real_type
static void reinit_range_vector(const Matrix &matrix, BlockVector< number > &v, bool omit_zeroing_entries)
static void reinit_domain_vector(const Matrix &matrix, BlockVector< number > &v, bool omit_zeroing_entries)
#define DEAL_II_NAMESPACE_OPEN
Definition config.h:38
#define DEAL_II_NAMESPACE_CLOSE
Definition config.h:39
Point< 2 > first
Definition grid_out.cc:4639
#define DeclException0(Exception0)
#define Assert(cond, exc)
#define AssertIsFinite(number)
static ::ExceptionBase & ExcIteratorRangeDoesNotMatchVectorSize()
std::enable_if_t< IsBlockVector< VectorType >::value, unsigned int > n_blocks(const VectorType &vector)
Definition operators.h:47
std::string compress(const std::string &input)
Definition utilities.cc:381
void reinit(MatrixBlock< MatrixType > &v, const BlockSparsityPattern &p)