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
la_parallel_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) 2016 - 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_la_parallel_block_vector_h
14#define dealii_la_parallel_block_vector_h
15
16
17#include <deal.II/base/config.h>
18
20
27
28#include <cstdio>
29#include <vector>
30
32
33
34// Forward declarations
35#ifndef DOXYGEN
36# ifdef DEAL_II_WITH_PETSC
37namespace PETScWrappers
38{
39 namespace MPI
40 {
41 class BlockVector;
42 }
43} // namespace PETScWrappers
44# endif
45#endif
46
47namespace LinearAlgebra
48{
49 namespace distributed
50 {
72 template <typename Number, typename MemorySpace = MemorySpace::Host>
73 class BlockVector : public BlockVectorBase<Vector<Number, MemorySpace>>
74 {
75 public:
88 static constexpr unsigned int communication_block_size = 20;
89
94
99
105 using pointer = typename BaseClass::pointer;
112
128 explicit BlockVector(const size_type num_blocks = 0,
129 const size_type block_size = 0);
130
136
143 template <typename OtherNumber>
145
150 BlockVector(const std::vector<size_type> &block_sizes);
151
156 BlockVector(const std::vector<IndexSet> &local_ranges,
157 const std::vector<IndexSet> &ghost_indices,
158 const MPI_Comm communicator);
159
163 BlockVector(const std::vector<IndexSet> &local_ranges,
164 const MPI_Comm communicator);
165
178 const std::vector<std::shared_ptr<const Utilities::MPI::Partitioner>>
179 &partitioners,
180 const MPI_Comm &comm_sm = MPI_COMM_SELF);
181
190 ~BlockVector() = default;
191
198
211
222 template <class Number2>
225
231
232#ifdef DEAL_II_WITH_PETSC
242#endif
243
244#ifdef DEAL_II_TRILINOS_WITH_EPETRA
255#endif
256
270 void
271 reinit(const size_type num_blocks,
272 const size_type block_size = 0,
273 const bool omit_zeroing_entries = false);
274
294 void
295 reinit(const std::vector<size_type> &block_sizes,
296 const bool omit_zeroing_entries = false);
297
312 template <typename Number2>
313 void
315 const bool omit_zeroing_entries = false);
316
334 void
335 reinit(const std::vector<IndexSet> &local_ranges,
336 const std::vector<IndexSet> &ghost_indices,
337 const MPI_Comm communicator);
338
342 void
343 reinit(const std::vector<IndexSet> &local_ranges,
344 const MPI_Comm communicator);
345
359 void
361 const std::vector<std::shared_ptr<const Utilities::MPI::Partitioner>>
362 &partitioners,
363 const MPI_Comm &comm_sm = MPI_COMM_SELF);
364
371 void
373 const std::vector<std::shared_ptr<const Utilities::MPI::Partitioner>>
374 &partitioners,
375 const bool make_ghosted,
376 const MPI_Comm &comm_sm = MPI_COMM_SELF);
377
401 void
403
412 void
414
430 void
432 const unsigned int communication_channel_start = 100) const;
433
441 void
443
452 void
454
458 bool
460
464 void
465 set_ghost_state(const bool ghosted) const;
466
481 template <typename Number2>
482 void
485
490 template <typename OtherNumber>
491 void
492 add(const std::vector<size_type> &indices,
493 const ::Vector<OtherNumber> &values);
494
499 void
500 sadd(const Number s, const BlockVector<Number, MemorySpace> &V);
501
507 bool
508 all_zero() const;
509
513 Number
514 mean_value() const;
515
521 lp_norm(const real_type p) const;
522
540 void
553 operator*=(const Number factor);
554
559 operator/=(const Number factor);
560
566
572
581 void
584 const VectorOperation::values operation,
585 const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
586 &communication_pattern = {});
587
591 Number
593
610 template <typename FullMatrixType>
611 void
612 multivector_inner_product(FullMatrixType &matrix,
614 const bool symmetric = false) const;
615
632 template <typename FullMatrixType>
633 Number
635 const FullMatrixType &matrix,
637 const bool symmetric = false) const;
638
648 template <typename FullMatrixType>
649 void
651 const FullMatrixType &matrix,
652 const Number s = Number(0.),
653 const Number b = Number(1.)) const;
654
658 void
659 add(const Number a);
660
664 void
665 add(const Number a, const BlockVector<Number, MemorySpace> &V);
666
670 void
671 add(const Number a,
673 const Number b,
675
680 void
681 add(const std::vector<size_type> &indices,
682 const std::vector<Number> &values);
683
688 void
689 sadd(const Number s,
690 const Number a,
692
698 void
700
704 void
705 equ(const Number a, const BlockVector<Number, MemorySpace> &V);
706
712 l1_norm() const;
713
719 l2_norm() const;
720
725 norm_sqr() const;
726
732 linfty_norm() const;
733
754 Number
755 add_and_dot(const Number a,
758
763 virtual size_type
764 size() const override;
765
779
783 void
784 print(std::ostream &out,
785 const unsigned int precision = 3,
786 const bool scientific = true,
787 const bool across = true) const;
788
792 std::size_t
807
813 };
814
817 } // end of namespace distributed
818
819} // end of namespace LinearAlgebra
820
821
829template <typename Number, typename MemorySpace>
830inline void
836
837
842template <typename Number, typename MemorySpace>
844 LinearAlgebra::distributed::BlockVector<Number, MemorySpace>>
845 : std::false_type
846{};
847
848
850
851#endif
::internal::BlockVectorIterators::Iterator< BlockVectorBase, false > iterator
const value_type * const_pointer
typename BlockType::const_reference const_reference
types::global_dof_index size_type
typename BlockType::value_type value_type
::internal::BlockVectorIterators::Iterator< BlockVectorBase, true > const_iterator
typename BlockType::reference reference
typename BlockType::real_type real_type
void swap(LinearAlgebra::distributed::BlockVector< Number, MemorySpace > &u, LinearAlgebra::distributed::BlockVector< Number, MemorySpace > &v) noexcept
void scale(const BlockVector< Number, MemorySpace > &scaling_factors)
Number multivector_inner_product_with_metric(const FullMatrixType &matrix, const BlockVector< Number, MemorySpace > &V, const bool symmetric=false) const
void mmult(BlockVector< Number, MemorySpace > &V, const FullMatrixType &matrix, const Number s=Number(0.), const Number b=Number(1.)) const
void update_ghost_values_start(const unsigned int communication_channel_start=100) const
BlockVector< Number, MemorySpace > & operator=(const TrilinosWrappers::MPI::BlockVector &trilinos_vec)
void add(const std::vector< size_type > &indices, const ::Vector< OtherNumber > &values)
void reinit(const BlockVector< Number2, MemorySpace > &V, const bool omit_zeroing_entries=false)
void add(const std::vector< size_type > &indices, const std::vector< Number > &values)
void import_elements(const LinearAlgebra::ReadWriteVector< Number > &V, const VectorOperation::values operation, const std::shared_ptr< const Utilities::MPI::CommunicationPatternBase > &communication_pattern={})
BlockVector(const std::vector< IndexSet > &local_ranges, const std::vector< IndexSet > &ghost_indices, const MPI_Comm communicator)
typename BaseClass::const_reference const_reference
void print(std::ostream &out, const unsigned int precision=3, const bool scientific=true, const bool across=true) const
void sadd(const Number s, const Number a, const BlockVector< Number, MemorySpace > &V)
Number operator*(const BlockVector< Number, MemorySpace > &V) const
BlockVector(const std::vector< IndexSet > &local_ranges, const MPI_Comm communicator)
BlockVector & operator=(const Vector< Number, MemorySpace > &V)
BlockVector< Number, MemorySpace > & operator*=(const Number factor)
BlockVector(const BlockVector< Number, MemorySpace > &V)
void reinit(const std::vector< IndexSet > &local_ranges, const std::vector< IndexSet > &ghost_indices, const MPI_Comm communicator)
BlockVector(const std::vector< size_type > &block_sizes)
typename BaseClass::const_pointer const_pointer
void reinit(const size_type num_blocks, const size_type block_size=0, const bool omit_zeroing_entries=false)
void reinit(const std::vector< std::shared_ptr< const Utilities::MPI::Partitioner > > &partitioners, const MPI_Comm &comm_sm=MPI_COMM_SELF)
void multivector_inner_product(FullMatrixType &matrix, const BlockVector< Number, MemorySpace > &V, const bool symmetric=false) const
BlockVector & operator=(const BlockVector &V)
void swap(BlockVector< Number, MemorySpace > &v) noexcept
void reinit(const std::vector< std::shared_ptr< const Utilities::MPI::Partitioner > > &partitioners, const bool make_ghosted, const MPI_Comm &comm_sm=MPI_COMM_SELF)
BlockVector< Number, MemorySpace > & operator/=(const Number factor)
BlockVector< Number, MemorySpace > & operator+=(const BlockVector< Number, MemorySpace > &V)
void copy_locally_owned_data_from(const BlockVector< Number2, MemorySpace > &src)
Number add_and_dot(const Number a, const BlockVector< Number, MemorySpace > &V, const BlockVector< Number, MemorySpace > &W)
BlockVector< Number, MemorySpace > & operator-=(const BlockVector< Number, MemorySpace > &V)
void reinit(const std::vector< size_type > &block_sizes, const bool omit_zeroing_entries=false)
void equ(const Number a, const BlockVector< Number, MemorySpace > &V)
BlockVector & operator=(const value_type s)
typename BaseClass::const_iterator const_iterator
virtual size_type size() const override
BlockVector(const std::vector< std::shared_ptr< const Utilities::MPI::Partitioner > > &partitioners, const MPI_Comm &comm_sm=MPI_COMM_SELF)
BlockVector(const size_type num_blocks=0, const size_type block_size=0)
static constexpr unsigned int communication_block_size
void sadd(const Number s, const BlockVector< Number, MemorySpace > &V)
void add(const Number a, const BlockVector< Number, MemorySpace > &V, const Number b, const BlockVector< Number, MemorySpace > &W)
void compress(VectorOperation::values operation)
real_type lp_norm(const real_type p) const
void set_ghost_state(const bool ghosted) const
BlockVector< Number, MemorySpace > & operator=(const PETScWrappers::MPI::BlockVector &petsc_vec)
BlockVector & operator=(const BlockVector< Number2, MemorySpace > &V)
void add(const Number a, const BlockVector< Number, MemorySpace > &V)
void reinit(const std::vector< IndexSet > &local_ranges, const MPI_Comm communicator)
BlockVector(const BlockVector< OtherNumber, MemorySpace > &v)
#define DEAL_II_NAMESPACE_OPEN
Definition config.h:38
#define DEAL_II_NAMESPACE_CLOSE
Definition config.h:39
static ::ExceptionBase & ExcVectorTypeNotCompatible()
#define DeclException0(Exception0)
static ::ExceptionBase & ExcIteratorRangeDoesNotMatchVectorSize()