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
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
371# endif
372
373# if defined(DEAL_II_TRILINOS_WITH_EPETRA)
382 void
384 const EpetraWrappers::Vector &epetra_vec,
385 VectorOperation::values operation,
386 const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
387 &communication_pattern = {});
388# endif
389#endif
390
400 size() const override;
401
408
412 const IndexSet &
414
422
428 begin() const;
429
436
442 end() const;
456 Number
457 operator()(const size_type global_index) const;
458
464 Number &
465 operator()(const size_type global_index);
466
474 Number
475 operator[](const size_type global_index) const;
476
484 Number &
485 operator[](const size_type global_index);
486
502 template <typename Number2>
503 void
504 extract_subvector_to(const std::vector<size_type> &indices,
505 std::vector<Number2> &values) const;
506
510 virtual void
513 const ArrayView<Number> &entries) const override;
514
542 template <typename ForwardIterator, typename OutputIterator>
543 void
544 extract_subvector_to(ForwardIterator indices_begin,
545 const ForwardIterator indices_end,
546 OutputIterator values_begin) const;
547
558 Number
559 local_element(const size_type local_index) const;
560
571 Number &
572 local_element(const size_type local_index);
585 template <typename Number2>
586 void
587 add(const std::vector<size_type> &indices,
588 const std::vector<Number2> &values);
589
594 template <typename Number2>
595 void
596 add(const std::vector<size_type> &indices,
598
604 template <typename Number2>
605 void
606 add(const size_type n_elements,
607 const size_type *indices,
608 const Number2 *values);
609
613 void
614 print(std::ostream &out,
615 const unsigned int precision = 3,
616 const bool scientific = true) const;
617
621 std::size_t
625 protected:
626#ifdef DEAL_II_WITH_TRILINOS
627# ifdef DEAL_II_TRILINOS_WITH_TPETRA
633 template <typename MemorySpace, typename OtherNumber>
634 std::enable_if_t<::is_tpetra_type<OtherNumber>::value>
636 const Tpetra::
637 Vector<OtherNumber, int, types::signed_global_dof_index, MemorySpace>
638 &tpetra_vector,
639 const IndexSet &locally_owned_elements,
640 VectorOperation::values operation,
641 const MPI_Comm mpi_comm,
642 const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
643 &communication_pattern);
644# endif
645
646# ifdef DEAL_II_TRILINOS_WITH_EPETRA
652 void
654 const Epetra_MultiVector &multivector,
655 const IndexSet &locally_owned_elements,
656 VectorOperation::values operation,
657 const MPI_Comm mpi_comm,
658 const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
659 &communication_pattern);
660# endif
661#endif
662
666 unsigned int
667 global_to_local(const types::global_dof_index global_index) const;
668
669#ifdef DEAL_II_WITH_TRILINOS
670# ifdef DEAL_II_TRILINOS_WITH_TPETRA
675 template <typename MemorySpace = ::MemorySpace::Host>
677 create_tpetra_comm_pattern(const IndexSet &source_index_set,
678 const MPI_Comm mpi_comm);
679# endif
680
681# ifdef DEAL_II_TRILINOS_WITH_EPETRA
687 create_epetra_comm_pattern(const IndexSet &source_index_set,
688 const MPI_Comm mpi_comm);
689# endif
690#endif
691
696
701
706 std::shared_ptr<Utilities::MPI::CommunicationPatternBase> comm_pattern;
707
712
717 mutable std::shared_ptr<::parallel::internal::TBBPartitioner>
719
720 // Make all other ReadWriteVector types friends.
721 template <typename Number2>
722 friend class ReadWriteVector;
723
724 private:
730 template <typename Functor>
732 {
733 public:
738
742 virtual void
744
745 private:
750
754 const Functor &functor;
755 };
756 };
757
761 /*---------------------------- Inline functions ---------------------------*/
762
763#ifndef DOXYGEN
764
765
766 template <typename Number>
768 {
769 // virtual functions called in constructors and destructors never use the
770 // override in a derived class
771 // for clarity be explicit on which function is called
773 }
774
775
776
777 template <typename Number>
779 const ReadWriteVector<Number> &v)
780 {
781 this->operator=(v);
782 }
783
784
785
786 template <typename Number>
787 inline ReadWriteVector<Number>::ReadWriteVector(const size_type size)
788 {
789 // virtual functions called in constructors and destructors never use the
790 // override in a derived class
791 // for clarity be explicit on which function is called
793 }
794
795
796
797 template <typename Number>
799 const IndexSet &locally_stored_indices)
800 {
801 // virtual functions called in constructors and destructors never use the
802 // override in a derived class
803 // for clarity be explicit on which function is called
804 ReadWriteVector<Number>::reinit(locally_stored_indices);
805 }
806
807
808
809 template <typename Number>
812 {
813 return stored_elements.size();
814 }
815
816
817
818 template <typename Number>
821 {
822 return stored_elements.n_elements();
823 }
824
825
826
827 template <typename Number>
828 inline const IndexSet &
830 {
831 return stored_elements;
832 }
833
834
835
836 template <typename Number>
839 {
840 return values.begin();
841 }
842
843
844
845 template <typename Number>
848 {
849 return values.begin();
850 }
851
852
853
854 template <typename Number>
857 {
858 return values.end();
859 }
860
861
862
863 template <typename Number>
866 {
867 return values.end();
868 }
869
870
871
872 template <typename Number>
873 inline Number
874 ReadWriteVector<Number>::operator()(const size_type global_index) const
875 {
876 return values[global_to_local(global_index)];
877 }
878
879
880
881 template <typename Number>
882 inline Number &
883 ReadWriteVector<Number>::operator()(const size_type global_index)
884 {
885 return values[global_to_local(global_index)];
886 }
887
888
889
890 template <typename Number>
891 inline Number
892 ReadWriteVector<Number>::operator[](const size_type global_index) const
893 {
894 return operator()(global_index);
895 }
896
897
898
899 template <typename Number>
900 inline Number &
901 ReadWriteVector<Number>::operator[](const size_type global_index)
902 {
903 return operator()(global_index);
904 }
905
906
907
908 template <typename Number>
909 template <typename Number2>
910 inline void
912 const std::vector<size_type> &indices,
913 std::vector<Number2> &extracted_values) const
914 {
915 for (size_type i = 0; i < indices.size(); ++i)
916 extracted_values[i] = operator()(indices[i]);
917 }
918
919
920
921 template <typename Number>
922 void
925 const ArrayView<Number> &entries) const
926 {
927 AssertDimension(indices.size(), entries.size());
928 for (unsigned int i = 0; i < indices.size(); ++i)
929 entries[i] = (*this)[indices[i]];
930 }
931
932
933
934 template <typename Number>
935 template <typename ForwardIterator, typename OutputIterator>
936 inline void
938 ForwardIterator indices_begin,
939 const ForwardIterator indices_end,
940 OutputIterator values_begin) const
941 {
942 while (indices_begin != indices_end)
943 {
944 *values_begin = operator()(*indices_begin);
945 ++indices_begin;
946 ++values_begin;
947 }
948 }
949
950
951
952 template <typename Number>
953 inline Number
954 ReadWriteVector<Number>::local_element(const size_type local_index) const
955 {
956 AssertIndexRange(local_index, this->locally_owned_size());
957
958 return values[local_index];
959 }
960
961
962
963 template <typename Number>
964 inline Number &
965 ReadWriteVector<Number>::local_element(const size_type local_index)
966 {
967 AssertIndexRange(local_index, this->locally_owned_size());
968
969 return values[local_index];
970 }
971
972
973
974 template <typename Number>
975 template <typename Number2>
976 inline void
977 ReadWriteVector<Number>::add(const std::vector<size_type> &indices,
978 const std::vector<Number2> &values)
979 {
980 AssertDimension(indices.size(), values.size());
981 add(indices.size(), indices.data(), values.data());
982 }
983
984
985
986 template <typename Number>
987 template <typename Number2>
988 inline void
989 ReadWriteVector<Number>::add(const std::vector<size_type> &indices,
990 const ReadWriteVector<Number2> &values)
991 {
992 const size_type size = indices.size();
993 for (size_type i = 0; i < size; ++i)
994 {
995 Assert(
996 numbers::is_finite(values[i]),
998 "The given value is not finite but either infinite or Not A Number (NaN)"));
999 this->operator()(indices[i]) += values[indices[i]];
1000 }
1001 }
1002
1003
1004
1005 template <typename Number>
1006 template <typename Number2>
1007 inline void
1008 ReadWriteVector<Number>::add(const size_type n_indices,
1009 const size_type *indices,
1010 const Number2 *values_to_add)
1011 {
1012 for (size_type i = 0; i < n_indices; ++i)
1013 {
1014 Assert(
1015 numbers::is_finite(values[i]),
1016 ExcMessage(
1017 "The given value is not finite but either infinite or Not A Number (NaN)"));
1018 this->operator()(indices[i]) += values_to_add[i];
1019 }
1020 }
1021
1022
1023
1024 template <typename Number>
1025 inline unsigned int
1027 const types::global_dof_index global_index) const
1028 {
1029 // the following will throw an exception if the global_index is not
1030 // in the remaining_elements
1031 return static_cast<unsigned int>(
1032 stored_elements.index_within_set(global_index));
1033 }
1034
1035
1036
1037 template <typename Number>
1038 template <typename Functor>
1040 ReadWriteVector<Number> &parent,
1041 const Functor &functor)
1042 : parent(parent)
1043 , functor(functor)
1044 {}
1045
1046
1047
1048 template <typename Number>
1049 template <typename Functor>
1050 void
1052 const size_type begin,
1053 const size_type end)
1054 {
1055 for (size_type i = begin; i < end; ++i)
1056 functor(parent.values[i]);
1057 }
1058
1059#endif // ifndef DOXYGEN
1060
1061} // end of namespace LinearAlgebra
1062
1063
1064
1072template <typename Number>
1073inline void
1079
1080
1082
1083#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={})
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