deal.II version GIT relicensing-6917-gb466a1809f 2026-10-16 06:30: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
read_write_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) 2015 - 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_read_write_vector_h
14#define dealii_read_write_vector_h
15
16#include <deal.II/base/config.h>
17
23#include <deal.II/base/types.h>
24
27
28#include <cstdlib>
29
30#ifdef DEAL_II_WITH_TRILINOS
36
38# ifdef DEAL_II_TRILINOS_WITH_EPETRA
39# include <Epetra_MultiVector.h>
40# endif
42
43#endif
44
46
47// Forward declarations
48#ifndef DOXYGEN
49template <typename>
50class Vector;
51
52namespace LinearAlgebra
53{
54 template <typename>
55 class Vector;
56 namespace distributed
57 {
58 template <typename, typename>
59 class Vector;
60 } // namespace distributed
61} // namespace LinearAlgebra
62
63# ifdef DEAL_II_WITH_PETSC
64namespace PETScWrappers
65{
66 namespace MPI
67 {
68 class Vector;
69 class BlockVector;
70 } // namespace MPI
71} // namespace PETScWrappers
72# endif
73
74#endif
75
76namespace LinearAlgebra
77{
115 template <typename Number>
116 class ReadWriteVector : public ReadVector<Number>
117 {
118 public:
124 using value_type = Number;
126 using const_pointer = const value_type *;
128 using const_iterator = const value_type *;
133
142
147
153
158 explicit ReadWriteVector(const IndexSet &locally_stored_indices);
159
163 ~ReadWriteVector() override = default;
164
173 virtual void
174 reinit(const size_type size, const bool omit_zeroing_entries = false);
175
184 template <typename Number2>
185 void
187 const bool omit_zeroing_entries = false);
188
198 virtual void
199 reinit(const IndexSet &locally_stored_indices,
200 const bool omit_zeroing_entries = false);
201
202
203#ifdef DEAL_II_TRILINOS_WITH_EPETRA
215 void
217#endif
218
232 template <typename Functor>
233 void
234 apply(const Functor &func);
235
248 void
250
256
260 template <typename Number2>
263
269 operator=(const Number s);
270
280 void
282 const ::Vector<Number> &vec,
283 VectorOperation::values operation,
284 const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
285 &communication_pattern = {});
286
295 template <typename MemorySpace>
296 void
299 VectorOperation::values operation,
300 const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
301 &communication_pattern = {});
302
303
304 template <typename MemorySpace>
305 void
307 const VectorOperation::values operation);
308
309#ifdef DEAL_II_WITH_PETSC
318 void
320 const PETScWrappers::MPI::Vector &petsc_vec,
321 VectorOperation::values operation,
322 const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
323 &communication_pattern = {});
324
325 void
327 const VectorOperation::values operation);
328#endif
329
330#if defined(DEAL_II_WITH_TRILINOS)
331# if defined(DEAL_II_TRILINOS_WITH_EPETRA)
342 void
344 const TrilinosWrappers::MPI::Vector &trilinos_vec,
345 VectorOperation::values operation,
346 const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
347 &communication_pattern = {});
348
349 void
351 const VectorOperation::values operation);
352# endif
353
354# ifdef DEAL_II_TRILINOS_WITH_TPETRA
363 template <typename MemorySpace, typename OtherNumber>
364 std::enable_if_t<::is_tpetra_type<OtherNumber>::value>
367 VectorOperation::values operation,
368 const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
369 &communication_pattern = {});
370
376 template <typename MemorySpace, typename OtherNumber>
377 std::enable_if_t<::is_tpetra_type<OtherNumber>::value>
380 const VectorOperation::values operation);
381
382# endif
383
384# if defined(DEAL_II_TRILINOS_WITH_EPETRA)
393 void
395 const EpetraWrappers::Vector &epetra_vec,
396 VectorOperation::values operation,
397 const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
398 &communication_pattern = {});
399# endif
400#endif
401
411 size() const override;
412
419
423 const IndexSet &
425
433
439 begin() const;
440
447
453 end() const;
467 Number
468 operator()(const size_type global_index) const;
469
475 Number &
476 operator()(const size_type global_index);
477
485 Number
486 operator[](const size_type global_index) const;
487
495 Number &
496 operator[](const size_type global_index);
497
513 template <typename Number2>
514 void
515 extract_subvector_to(const std::vector<size_type> &indices,
516 std::vector<Number2> &values) const;
517
521 virtual void
524 const ArrayView<Number> &entries) const override;
525
553 template <typename ForwardIterator, typename OutputIterator>
554 void
555 extract_subvector_to(ForwardIterator indices_begin,
556 const ForwardIterator indices_end,
557 OutputIterator values_begin) const;
558
569 Number
570 local_element(const size_type local_index) const;
571
582 Number &
583 local_element(const size_type local_index);
596 template <typename Number2>
597 void
598 add(const std::vector<size_type> &indices,
599 const std::vector<Number2> &values);
600
605 template <typename Number2>
606 void
607 add(const std::vector<size_type> &indices,
609
615 template <typename Number2>
616 void
617 add(const size_type n_elements,
618 const size_type *indices,
619 const Number2 *values);
620
624 void
625 print(std::ostream &out,
626 const unsigned int precision = 3,
627 const bool scientific = true) const;
628
632 std::size_t
636 protected:
637#ifdef DEAL_II_WITH_TRILINOS
638# ifdef DEAL_II_TRILINOS_WITH_TPETRA
644 template <typename MemorySpace, typename OtherNumber>
645 std::enable_if_t<::is_tpetra_type<OtherNumber>::value>
647 const Tpetra::
648 Vector<OtherNumber, int, types::signed_global_dof_index, MemorySpace>
649 &tpetra_vector,
650 const IndexSet &locally_owned_elements,
651 VectorOperation::values operation,
652 const MPI_Comm mpi_comm,
653 const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
654 &communication_pattern);
655# endif
656
657# ifdef DEAL_II_TRILINOS_WITH_EPETRA
663 void
665 const Epetra_MultiVector &multivector,
666 const IndexSet &locally_owned_elements,
667 VectorOperation::values operation,
668 const MPI_Comm mpi_comm,
669 const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
670 &communication_pattern);
671# endif
672#endif
673
677 unsigned int
678 global_to_local(const types::global_dof_index global_index) const;
679
680#ifdef DEAL_II_WITH_TRILINOS
681# ifdef DEAL_II_TRILINOS_WITH_TPETRA
686 template <typename MemorySpace = ::MemorySpace::Host>
688 create_tpetra_comm_pattern(const IndexSet &source_index_set,
689 const MPI_Comm mpi_comm);
690# endif
691
692# ifdef DEAL_II_TRILINOS_WITH_EPETRA
698 create_epetra_comm_pattern(const IndexSet &source_index_set,
699 const MPI_Comm mpi_comm);
700# endif
701#endif
702
707
712
717 std::shared_ptr<Utilities::MPI::CommunicationPatternBase> comm_pattern;
718
723
728 mutable std::shared_ptr<::parallel::internal::TBBPartitioner>
730
731 // Make all other ReadWriteVector types friends.
732 template <typename Number2>
733 friend class ReadWriteVector;
734
735 private:
741 template <typename Functor>
743 {
744 public:
749
753 virtual void
755
756 private:
761
765 const Functor &functor;
766 };
767 };
768
772 /*---------------------------- Inline functions ---------------------------*/
773
774#ifndef DOXYGEN
775
776
777 template <typename Number>
779 {
780 // virtual functions called in constructors and destructors never use the
781 // override in a derived class
782 // for clarity be explicit on which function is called
784 }
785
786
787
788 template <typename Number>
790 const ReadWriteVector<Number> &v)
791 {
792 this->operator=(v);
793 }
794
795
796
797 template <typename Number>
798 inline ReadWriteVector<Number>::ReadWriteVector(const size_type size)
799 {
800 // virtual functions called in constructors and destructors never use the
801 // override in a derived class
802 // for clarity be explicit on which function is called
804 }
805
806
807
808 template <typename Number>
810 const IndexSet &locally_stored_indices)
811 {
812 // virtual functions called in constructors and destructors never use the
813 // override in a derived class
814 // for clarity be explicit on which function is called
815 ReadWriteVector<Number>::reinit(locally_stored_indices);
816 }
817
818
819
820 template <typename Number>
823 {
824 return stored_elements.size();
825 }
826
827
828
829 template <typename Number>
832 {
833 return stored_elements.n_elements();
834 }
835
836
837
838 template <typename Number>
839 inline const IndexSet &
841 {
842 return stored_elements;
843 }
844
845
846
847 template <typename Number>
850 {
851 return values.begin();
852 }
853
854
855
856 template <typename Number>
859 {
860 return values.begin();
861 }
862
863
864
865 template <typename Number>
868 {
869 return values.end();
870 }
871
872
873
874 template <typename Number>
877 {
878 return values.end();
879 }
880
881
882
883 template <typename Number>
884 inline Number
885 ReadWriteVector<Number>::operator()(const size_type global_index) const
886 {
887 return values[global_to_local(global_index)];
888 }
889
890
891
892 template <typename Number>
893 inline Number &
894 ReadWriteVector<Number>::operator()(const size_type global_index)
895 {
896 return values[global_to_local(global_index)];
897 }
898
899
900
901 template <typename Number>
902 inline Number
903 ReadWriteVector<Number>::operator[](const size_type global_index) const
904 {
905 return operator()(global_index);
906 }
907
908
909
910 template <typename Number>
911 inline Number &
912 ReadWriteVector<Number>::operator[](const size_type global_index)
913 {
914 return operator()(global_index);
915 }
916
917
918
919 template <typename Number>
920 template <typename Number2>
921 inline void
923 const std::vector<size_type> &indices,
924 std::vector<Number2> &extracted_values) const
925 {
926 for (size_type i = 0; i < indices.size(); ++i)
927 extracted_values[i] = operator()(indices[i]);
928 }
929
930
931
932 template <typename Number>
933 void
936 const ArrayView<Number> &entries) const
937 {
938 AssertDimension(indices.size(), entries.size());
939 for (unsigned int i = 0; i < indices.size(); ++i)
940 entries[i] = (*this)[indices[i]];
941 }
942
943
944
945 template <typename Number>
946 template <typename ForwardIterator, typename OutputIterator>
947 inline void
949 ForwardIterator indices_begin,
950 const ForwardIterator indices_end,
951 OutputIterator values_begin) const
952 {
953 while (indices_begin != indices_end)
954 {
955 *values_begin = operator()(*indices_begin);
956 ++indices_begin;
957 ++values_begin;
958 }
959 }
960
961
962
963 template <typename Number>
964 inline Number
965 ReadWriteVector<Number>::local_element(const size_type local_index) const
966 {
967 AssertIndexRange(local_index, this->locally_owned_size());
968
969 return values[local_index];
970 }
971
972
973
974 template <typename Number>
975 inline Number &
976 ReadWriteVector<Number>::local_element(const size_type local_index)
977 {
978 AssertIndexRange(local_index, this->locally_owned_size());
979
980 return values[local_index];
981 }
982
983
984
985 template <typename Number>
986 template <typename Number2>
987 inline void
988 ReadWriteVector<Number>::add(const std::vector<size_type> &indices,
989 const std::vector<Number2> &values)
990 {
991 AssertDimension(indices.size(), values.size());
992 add(indices.size(), indices.data(), values.data());
993 }
994
995
996
997 template <typename Number>
998 template <typename Number2>
999 inline void
1000 ReadWriteVector<Number>::add(const std::vector<size_type> &indices,
1001 const ReadWriteVector<Number2> &values)
1002 {
1003 const size_type size = indices.size();
1004 for (size_type i = 0; i < size; ++i)
1005 {
1006 Assert(
1007 numbers::is_finite(values[i]),
1008 ExcMessage(
1009 "The given value is not finite but either infinite or Not A Number (NaN)"));
1010 this->operator()(indices[i]) += values[indices[i]];
1011 }
1012 }
1013
1014
1015
1016 template <typename Number>
1017 template <typename Number2>
1018 inline void
1019 ReadWriteVector<Number>::add(const size_type n_indices,
1020 const size_type *indices,
1021 const Number2 *values_to_add)
1022 {
1023 for (size_type i = 0; i < n_indices; ++i)
1024 {
1025 Assert(
1026 numbers::is_finite(values[i]),
1027 ExcMessage(
1028 "The given value is not finite but either infinite or Not A Number (NaN)"));
1029 this->operator()(indices[i]) += values_to_add[i];
1030 }
1031 }
1032
1033
1034
1035 template <typename Number>
1036 inline unsigned int
1038 const types::global_dof_index global_index) const
1039 {
1040 // the following will throw an exception if the global_index is not
1041 // in the remaining_elements
1042 return static_cast<unsigned int>(
1043 stored_elements.index_within_set(global_index));
1044 }
1045
1046
1047
1048 template <typename Number>
1049 template <typename Functor>
1051 ReadWriteVector<Number> &parent,
1052 const Functor &functor)
1053 : parent(parent)
1054 , functor(functor)
1055 {}
1056
1057
1058
1059 template <typename Number>
1060 template <typename Functor>
1061 void
1063 const size_type begin,
1064 const size_type end)
1065 {
1066 for (size_type i = begin; i < end; ++i)
1067 functor(parent.values[i]);
1068 }
1069
1070#endif // ifndef DOXYGEN
1071
1072} // end of namespace LinearAlgebra
1073
1074
1075
1083template <typename Number>
1084inline void
1090
1091
1093
1094#endif
*  *  Point< dim > operator()(const Point< dim > &p) const * 
std::size_t size() const
Definition array_view.h:737
FunctorTemplate(ReadWriteVector< Number > &parent, const Functor &functor)
virtual void operator()(const size_type begin, const size_type end)
void import_elements(const ::Vector< Number > &vec, VectorOperation::values operation, const std::shared_ptr< const Utilities::MPI::CommunicationPatternBase > &communication_pattern={})
void reinit(const ReadWriteVector< Number2 > &in_vector, const bool omit_zeroing_entries=false)
Number & operator()(const size_type global_index)
ReadWriteVector(const ReadWriteVector< Number > &in_vector)
ReadWriteVector(const size_type size)
void import_elements(const TrilinosWrappers::MPI::Vector &trilinos_vec, VectorOperation::values operation, const std::shared_ptr< const Utilities::MPI::CommunicationPatternBase > &communication_pattern={})
std::enable_if_t<::is_tpetra_type< OtherNumber >::value > import_elements(const TpetraWrappers::BlockVector< OtherNumber, MemorySpace > &src, const VectorOperation::values operation)
size_type size() const override
void add(const std::vector< size_type > &indices, const std::vector< Number2 > &values)
Number operator()(const size_type global_index) const
void apply(const Functor &func)
std::size_t memory_consumption() const
Number & operator[](const size_type global_index)
void print(std::ostream &out, const unsigned int precision=3, const bool scientific=true) const
void add(const std::vector< size_type > &indices, const ReadWriteVector< Number2 > &values)
Number & local_element(const size_type local_index)
void import_elements(const EpetraWrappers::Vector &epetra_vec, VectorOperation::values operation, const std::shared_ptr< const Utilities::MPI::CommunicationPatternBase > &communication_pattern={})
AlignedVector< Number > values
std::enable_if_t<::is_tpetra_type< OtherNumber >::value > import_elements(const Tpetra::Vector< OtherNumber, int, types::signed_global_dof_index, MemorySpace > &tpetra_vector, const IndexSet &locally_owned_elements, VectorOperation::values operation, const MPI_Comm mpi_comm, const std::shared_ptr< const Utilities::MPI::CommunicationPatternBase > &communication_pattern)
unsigned int global_to_local(const types::global_dof_index global_index) const
virtual void extract_subvector_to(const ArrayView< const types::global_dof_index > &indices, const ArrayView< Number > &entries) const override
Number operator[](const size_type global_index) const
Number local_element(const size_type local_index) const
void add(const size_type n_elements, const size_type *indices, const Number2 *values)
TpetraWrappers::CommunicationPattern< MemorySpace > create_tpetra_comm_pattern(const IndexSet &source_index_set, const MPI_Comm mpi_comm)
void import_elements(const PETScWrappers::MPI::Vector &petsc_vec, VectorOperation::values operation, const std::shared_ptr< const Utilities::MPI::CommunicationPatternBase > &communication_pattern={})
ReadWriteVector< Number > & operator=(const Number s)
void import_elements(const TrilinosWrappers::MPI::BlockVector &src, const VectorOperation::values operation)
void reinit(const TrilinosWrappers::MPI::Vector &trilinos_vec)
virtual void reinit(const IndexSet &locally_stored_indices, const bool omit_zeroing_entries=false)
void extract_subvector_to(ForwardIterator indices_begin, const ForwardIterator indices_end, OutputIterator values_begin) const
virtual void reinit(const size_type size, const bool omit_zeroing_entries=false)
size_type locally_owned_size() const
const_iterator end() const
ReadWriteVector< Number > & operator=(const ReadWriteVector< Number > &in_vector)
void extract_subvector_to(const std::vector< size_type > &indices, std::vector< Number2 > &values) const
void swap(ReadWriteVector< Number > &v) noexcept
const_iterator begin() const
~ReadWriteVector() override=default
ReadWriteVector(const IndexSet &locally_stored_indices)
EpetraWrappers::CommunicationPattern create_epetra_comm_pattern(const IndexSet &source_index_set, const MPI_Comm mpi_comm)
types::global_dof_index size_type
void import_elements(const PETScWrappers::MPI::BlockVector &src, const VectorOperation::values operation)
const IndexSet & get_stored_elements() const
ReadWriteVector< Number > & operator=(const ReadWriteVector< Number2 > &in_vector)
void import_elements(const distributed::Vector< Number, MemorySpace > &vec, VectorOperation::values operation, const std::shared_ptr< const Utilities::MPI::CommunicationPatternBase > &communication_pattern={})
std::shared_ptr< Utilities::MPI::CommunicationPatternBase > comm_pattern
void import_elements(const distributed::BlockVector< Number, MemorySpace > &src, const VectorOperation::values operation)
std::shared_ptr<::parallel::internal::TBBPartitioner > thread_loop_partitioner
typename numbers::NumberTraits< Number >::real_type real_type
void import_elements(const Epetra_MultiVector &multivector, const IndexSet &locally_owned_elements, VectorOperation::values operation, const MPI_Comm mpi_comm, const std::shared_ptr< const Utilities::MPI::CommunicationPatternBase > &communication_pattern)
std::enable_if_t<::is_tpetra_type< OtherNumber >::value > import_elements(const TpetraWrappers::Vector< OtherNumber, MemorySpace > &tpetra_vec, VectorOperation::values operation, const std::shared_ptr< const Utilities::MPI::CommunicationPatternBase > &communication_pattern={})
void swap(LinearAlgebra::ReadWriteVector< Number > &u, LinearAlgebra::ReadWriteVector< Number > &v) noexcept
#define DEAL_II_NAMESPACE_OPEN
Definition config.h:38
#define DEAL_II_DISABLE_EXTRA_DIAGNOSTICS
Definition config.h:636
#define DEAL_II_NAMESPACE_CLOSE
Definition config.h:39
#define DEAL_II_ENABLE_EXTRA_DIAGNOSTICS
Definition config.h:680
#define Assert(cond, exc)
#define AssertDimension(dim1, dim2)
#define AssertIndexRange(index, range)
static ::ExceptionBase & ExcMessage(std::string arg1)
std::size_t size
Definition mpi.cc:733
types::global_dof_index locally_owned_size
Definition mpi.cc:821
*  *  *  RotationFunction< dim, Number >::RotationFunction Number(dim)
bool is_finite(const double x)
Definition numbers.h:508
STL namespace.
Definition types.h:30
unsigned int global_dof_index
Definition types.h:92