Loading [MathJax]/extensions/TeX/newcommand.js
 deal.II version GIT relicensing-3067-g24f3489fdc 2025-04-14 21:10:00+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\}}
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages Concepts
la_parallel_block_vector.h
Go to the documentation of this file.
1// ------------------------------------------------------------------------
2//
3// SPDX-License-Identifier: LGPL-2.1-or-later
4// Copyright (C) 2016 - 2024 by the deal.II authors
5//
6// This file is part of the deal.II library.
7//
8// Part of the source code is dual licensed under Apache-2.0 WITH
9// LLVM-exception OR LGPL-2.1-or-later. Detailed license information
10// governing the source code and code contributions can be found in
11// LICENSE.md and CONTRIBUTING.md at the top level directory of deal.II.
12//
13// ------------------------------------------------------------------------
14
15#ifndef dealii_la_parallel_block_vector_h
16#define dealii_la_parallel_block_vector_h
17
18
19#include <deal.II/base/config.h>
20
22
28
29#include <cstdio>
30#include <vector>
31
33
34
35// Forward declarations
36#ifndef DOXYGEN
37# ifdef DEAL_II_WITH_PETSC
38namespace PETScWrappers
39{
40 namespace MPI
41 {
42 class BlockVector;
43 }
44} // namespace PETScWrappers
45# endif
46
47# ifdef DEAL_II_WITH_TRILINOS
48namespace TrilinosWrappers
49{
50 namespace MPI
51 {
52 class BlockVector;
53 }
54} // namespace TrilinosWrappers
55# endif
56#endif
57
58namespace LinearAlgebra
59{
60 namespace distributed
61 {
83 template <typename Number, typename MemorySpace = MemorySpace::Host>
84 class BlockVector : public BlockVectorBase<Vector<Number, MemorySpace>>
85 {
86 public:
99 static constexpr unsigned int communication_block_size = 20;
100
105
110
116 using pointer = typename BaseClass::pointer;
123
139 explicit BlockVector(const size_type num_blocks = 0,
140 const size_type block_size = 0);
141
147
154 template <typename OtherNumber>
156
161 BlockVector(const std::vector<size_type> &block_sizes);
162
167 BlockVector(const std::vector<IndexSet> &local_ranges,
168 const std::vector<IndexSet> &ghost_indices,
169 const MPI_Comm communicator);
170
174 BlockVector(const std::vector<IndexSet> &local_ranges,
175 const MPI_Comm communicator);
176
189 const std::vector<std::shared_ptr<const Utilities::MPI::Partitioner>>
190 &partitioners,
191 const MPI_Comm &comm_sm = MPI_COMM_SELF);
192
201 ~BlockVector() = default;
202
209
222
233 template <class Number2>
236
242
243#ifdef DEAL_II_WITH_PETSC
253#endif
254
255#ifdef DEAL_II_WITH_TRILINOS
266#endif
267
281 void
282 reinit(const size_type num_blocks,
283 const size_type block_size = 0,
284 const bool omit_zeroing_entries = false);
285
305 void
306 reinit(const std::vector<size_type> &block_sizes,
307 const bool omit_zeroing_entries = false);
308
323 template <typename Number2>
324 void
326 const bool omit_zeroing_entries = false);
327
345 void
346 reinit(const std::vector<IndexSet> &local_ranges,
347 const std::vector<IndexSet> &ghost_indices,
348 const MPI_Comm communicator);
349
353 void
354 reinit(const std::vector<IndexSet> &local_ranges,
355 const MPI_Comm communicator);
356
370 void
372 const std::vector<std::shared_ptr<const Utilities::MPI::Partitioner>>
373 &partitioners,
374 const MPI_Comm &comm_sm = MPI_COMM_SELF);
375
382 void
384 const std::vector<std::shared_ptr<const Utilities::MPI::Partitioner>>
385 &partitioners,
386 const bool make_ghosted,
387 const MPI_Comm &comm_sm = MPI_COMM_SELF);
388
412 void
414
423 void
425
434 void
436
440 bool
442
446 void
447 set_ghost_state(const bool ghosted) const;
448
463 template <typename Number2>
464 void
467
472 template <typename OtherNumber>
473 void
474 add(const std::vector<size_type> &indices,
475 const ::Vector<OtherNumber> &values);
476
481 void
482 sadd(const Number s, const BlockVector<Number, MemorySpace> &V);
483
489 bool
490 all_zero() const;
491
495 Number
496 mean_value() const;
497
503 lp_norm(const real_type p) const;
504
522 void
535 operator*=(const Number factor);
536
541 operator/=(const Number factor);
542
548
554
563 void
566 const VectorOperation::values operation,
567 const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
568 &communication_pattern = {});
569
575 VectorOperation::values operation,
576 std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
577 communication_pattern = {})
578 {
579 import_elements(V, operation, communication_pattern);
580 }
581
585 Number
587
604 template <typename FullMatrixType>
605 void
606 multivector_inner_product(FullMatrixType &matrix,
608 const bool symmetric = false) const;
609
626 template <typename FullMatrixType>
627 Number
629 const FullMatrixType &matrix,
631 const bool symmetric = false) const;
632
642 template <typename FullMatrixType>
643 void
645 const FullMatrixType &matrix,
646 const Number s = Number(0.),
647 const Number b = Number(1.)) const;
648
652 void
653 add(const Number a);
654
658 void
659 add(const Number a, const BlockVector<Number, MemorySpace> &V);
660
664 void
665 add(const Number a,
667 const Number b,
669
674 void
675 add(const std::vector<size_type> &indices,
676 const std::vector<Number> &values);
677
682 void
683 sadd(const Number s,
684 const Number a,
686
692 void
694
698 void
699 equ(const Number a, const BlockVector<Number, MemorySpace> &V);
700
706 l1_norm() const;
707
713 l2_norm() const;
714
719 norm_sqr() const;
720
726 linfty_norm() const;
727
748 Number
749 add_and_dot(const Number a,
752
757 virtual size_type
758 size() const override;
759
773
777 void
778 print(std::ostream &out,
779 const unsigned int precision = 3,
780 const bool scientific = true,
781 const bool across = true) const;
782
786 std::size_t
801
807 };
808
811 } // end of namespace distributed
812
813} // end of namespace LinearAlgebra
814
815
823template <typename Number, typename MemorySpace>
824inline void
830
831
836template <typename Number, typename MemorySpace>
838 LinearAlgebra::distributed::BlockVector<Number, MemorySpace>>
839 : std::false_type
840{};
841
842
844
845#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
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_DEPRECATED
Definition config.h:280
#define DEAL_II_NAMESPACE_OPEN
Definition config.h:35
#define DEAL_II_NAMESPACE_CLOSE
Definition config.h:36
static ::ExceptionBase & ExcVectorTypeNotCompatible()
#define DeclException0(Exception0)
static ::ExceptionBase & ExcIteratorRangeDoesNotMatchVectorSize()