deal.II version 9.7.0
\(\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: LGPL-2.1-or-later
4// Copyright (C) 2015 - 2025 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_read_write_vector_h
16#define dealii_read_write_vector_h
17
18#include <deal.II/base/config.h>
19
27#include <deal.II/base/types.h>
28
31
32#include <cstdlib>
33#include <cstring>
34#include <iomanip>
35
36#ifdef DEAL_II_WITH_TRILINOS
41
43# include <Epetra_MultiVector.h>
45
46#endif
47
49
50// Forward declarations
51#ifndef DOXYGEN
52template <typename>
53class Vector;
54
55namespace LinearAlgebra
56{
57 template <typename>
58 class Vector;
59 namespace distributed
60 {
61 template <typename, typename>
62 class Vector;
63 } // namespace distributed
64} // namespace LinearAlgebra
65
66# ifdef DEAL_II_WITH_PETSC
67namespace PETScWrappers
68{
69 namespace MPI
70 {
71 class Vector;
72 }
73} // namespace PETScWrappers
74# endif
75
76# ifdef DEAL_II_WITH_TRILINOS
77namespace TrilinosWrappers
78{
79 namespace MPI
80 {
81 class Vector;
82 }
83} // namespace TrilinosWrappers
84# endif
85
86#endif
87
88namespace LinearAlgebra
89{
94
127 template <typename Number>
128 class ReadWriteVector : public ReadVector<Number>
129 {
130 public:
136 using value_type = Number;
138 using const_pointer = const value_type *;
140 using const_iterator = const value_type *;
145
154
159
165
170 explicit ReadWriteVector(const IndexSet &locally_stored_indices);
171
175 ~ReadWriteVector() override = default;
176
185 virtual void
186 reinit(const size_type size, const bool omit_zeroing_entries = false);
187
196 template <typename Number2>
197 void
199 const bool omit_zeroing_entries = false);
200
210 virtual void
211 reinit(const IndexSet &locally_stored_indices,
212 const bool omit_zeroing_entries = false);
213
214
215#ifdef DEAL_II_WITH_TRILINOS
227 void
229#endif
230
244 template <typename Functor>
245 void
246 apply(const Functor &func);
247
260 void
262
268
272 template <typename Number2>
275
281 operator=(const Number s);
282
292 void
294 const ::Vector<Number> &vec,
295 VectorOperation::values operation,
296 const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
297 &communication_pattern = {});
298
303 void
304 import(const ::Vector<Number> &V,
305 VectorOperation::values operation,
306 const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
307 &communication_pattern = {})
308 {
309 import_elements(V, operation, communication_pattern);
310 }
311
320 template <typename MemorySpace>
321 void
324 VectorOperation::values operation,
325 const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
326 &communication_pattern = {});
327
331 template <typename MemorySpace>
334 VectorOperation::values operation,
335 const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
336 &communication_pattern = {})
337 {
338 import_elements(V, operation, communication_pattern);
339 }
340
341
342#ifdef DEAL_II_WITH_PETSC
351 void
353 const PETScWrappers::MPI::Vector &petsc_vec,
354 VectorOperation::values operation,
355 const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
356 &communication_pattern = {});
357
362 void
364 VectorOperation::values operation,
365 const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
366 &communication_pattern = {})
367 {
368 import_elements(V, operation, communication_pattern);
369 }
370#endif
371
372#ifdef DEAL_II_WITH_TRILINOS
383 void
385 const TrilinosWrappers::MPI::Vector &trilinos_vec,
386 VectorOperation::values operation,
387 const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
388 &communication_pattern = {});
389
394 void
396 VectorOperation::values operation,
397 const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
398 &communication_pattern = {})
399 {
400 import_elements(V, operation, communication_pattern);
401 }
402
403# ifdef DEAL_II_TRILINOS_WITH_TPETRA
412 template <typename MemorySpace, typename Dummy = Number>
413 std::enable_if_t<std::is_same_v<Dummy, Number> &&
417 VectorOperation::values operation,
418 const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
419 &communication_pattern = {});
420
424 template <typename MemorySpace, typename Dummy = Number>
425 DEAL_II_DEPRECATED std::enable_if_t<std::is_same_v<Dummy, Number> &&
428 VectorOperation::values operation,
429 const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
430 &communication_pattern = {})
431 {
432 import_elements(V, operation, communication_pattern);
433 }
434# endif
435
444 void
446 const EpetraWrappers::Vector &epetra_vec,
447 VectorOperation::values operation,
448 const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
449 &communication_pattern = {});
450
455 void
456 import(const EpetraWrappers::Vector &V,
457 VectorOperation::values operation,
458 const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
459 &communication_pattern = {})
460 {
461 import_elements(V, operation, communication_pattern);
462 }
463#endif
464
474 size() const override;
475
482
486 const IndexSet &
488
496
502 begin() const;
503
510
516 end() const;
518
519
524
530 Number
531 operator()(const size_type global_index) const;
532
538 Number &
539 operator()(const size_type global_index);
540
548 Number
549 operator[](const size_type global_index) const;
550
558 Number &
559 operator[](const size_type global_index);
560
576 template <typename Number2>
577 void
578 extract_subvector_to(const std::vector<size_type> &indices,
579 std::vector<Number2> &values) const;
580
584 virtual void
587 const ArrayView<Number> &entries) const override;
588
616 template <typename ForwardIterator, typename OutputIterator>
617 void
618 extract_subvector_to(ForwardIterator indices_begin,
619 const ForwardIterator indices_end,
620 OutputIterator values_begin) const;
621
632 Number
633 local_element(const size_type local_index) const;
634
645 Number &
646 local_element(const size_type local_index);
648
649
654
659 template <typename Number2>
660 void
661 add(const std::vector<size_type> &indices,
662 const std::vector<Number2> &values);
663
668 template <typename Number2>
669 void
670 add(const std::vector<size_type> &indices,
672
678 template <typename Number2>
679 void
680 add(const size_type n_elements,
681 const size_type *indices,
682 const Number2 *values);
683
687 void
688 print(std::ostream &out,
689 const unsigned int precision = 3,
690 const bool scientific = true) const;
691
695 std::size_t
698
699 protected:
700#ifdef DEAL_II_WITH_TRILINOS
701# ifdef DEAL_II_TRILINOS_WITH_TPETRA
707 template <typename MemorySpace, typename Dummy = Number>
708 std::enable_if_t<std::is_same_v<Dummy, Number> &&
711 const Tpetra::
713 &tpetra_vector,
714 const IndexSet &locally_owned_elements,
715 VectorOperation::values operation,
716 const MPI_Comm mpi_comm,
717 const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
718 &communication_pattern);
719# endif
720
726 void
728 const Epetra_MultiVector &multivector,
729 const IndexSet &locally_owned_elements,
730 VectorOperation::values operation,
731 const MPI_Comm mpi_comm,
732 const std::shared_ptr<const Utilities::MPI::CommunicationPatternBase>
733 &communication_pattern);
734#endif
735
739 unsigned int
740 global_to_local(const types::global_dof_index global_index) const;
741
742#ifdef DEAL_II_WITH_TRILINOS
743# ifdef DEAL_II_TRILINOS_WITH_TPETRA
748 template <typename MemorySpace = ::MemorySpace::Host>
750 create_tpetra_comm_pattern(const IndexSet &source_index_set,
751 const MPI_Comm mpi_comm);
752# endif
753
759 create_epetra_comm_pattern(const IndexSet &source_index_set,
760 const MPI_Comm mpi_comm);
761#endif
762
767
772
777 std::shared_ptr<Utilities::MPI::CommunicationPatternBase> comm_pattern;
778
783
788 mutable std::shared_ptr<::parallel::internal::TBBPartitioner>
790
791 // Make all other ReadWriteVector types friends.
792 template <typename Number2>
793 friend class ReadWriteVector;
794
795 private:
801 template <typename Functor>
803 {
804 public:
809
813 virtual void
815
816 private:
821
825 const Functor &functor;
826 };
827 };
828
830
831
832 /*---------------------------- Inline functions ---------------------------*/
833
834#ifndef DOXYGEN
835
836
837 template <typename Number>
839 {
840 // virtual functions called in constructors and destructors never use the
841 // override in a derived class
842 // for clarity be explicit on which function is called
844 }
845
846
847
848 template <typename Number>
850 const ReadWriteVector<Number> &v)
851 {
852 this->operator=(v);
853 }
854
855
856
857 template <typename Number>
858 inline ReadWriteVector<Number>::ReadWriteVector(const size_type size)
859 {
860 // virtual functions called in constructors and destructors never use the
861 // override in a derived class
862 // for clarity be explicit on which function is called
864 }
865
866
867
868 template <typename Number>
870 const IndexSet &locally_stored_indices)
871 {
872 // virtual functions called in constructors and destructors never use the
873 // override in a derived class
874 // for clarity be explicit on which function is called
875 ReadWriteVector<Number>::reinit(locally_stored_indices);
876 }
877
878
879
880 template <typename Number>
883 {
884 return stored_elements.size();
885 }
886
887
888
889 template <typename Number>
892 {
893 return stored_elements.n_elements();
894 }
895
896
897
898 template <typename Number>
899 inline const IndexSet &
901 {
902 return stored_elements;
903 }
904
905
906
907 template <typename Number>
910 {
911 return values.begin();
912 }
913
914
915
916 template <typename Number>
919 {
920 return values.begin();
921 }
922
923
924
925 template <typename Number>
928 {
929 return values.end();
930 }
931
932
933
934 template <typename Number>
937 {
938 return values.end();
939 }
940
941
942
943 template <typename Number>
944 inline Number
945 ReadWriteVector<Number>::operator()(const size_type global_index) const
946 {
947 return values[global_to_local(global_index)];
948 }
949
950
951
952 template <typename Number>
953 inline Number &
954 ReadWriteVector<Number>::operator()(const size_type global_index)
955 {
956 return values[global_to_local(global_index)];
957 }
958
959
960
961 template <typename Number>
962 inline Number
963 ReadWriteVector<Number>::operator[](const size_type global_index) const
964 {
965 return operator()(global_index);
966 }
967
968
969
970 template <typename Number>
971 inline Number &
972 ReadWriteVector<Number>::operator[](const size_type global_index)
973 {
974 return operator()(global_index);
975 }
976
977
978
979 template <typename Number>
980 template <typename Number2>
981 inline void
983 const std::vector<size_type> &indices,
984 std::vector<Number2> &extracted_values) const
985 {
986 for (size_type i = 0; i < indices.size(); ++i)
987 extracted_values[i] = operator()(indices[i]);
988 }
989
990
991
992 template <typename Number>
993 void
995 const ArrayView<const types::global_dof_index> &indices,
996 const ArrayView<Number> &entries) const
997 {
998 AssertDimension(indices.size(), entries.size());
999 for (unsigned int i = 0; i < indices.size(); ++i)
1000 entries[i] = (*this)[indices[i]];
1001 }
1002
1003
1004
1005 template <typename Number>
1006 template <typename ForwardIterator, typename OutputIterator>
1007 inline void
1009 ForwardIterator indices_begin,
1010 const ForwardIterator indices_end,
1011 OutputIterator values_begin) const
1012 {
1013 while (indices_begin != indices_end)
1014 {
1015 *values_begin = operator()(*indices_begin);
1016 ++indices_begin;
1017 ++values_begin;
1018 }
1019 }
1020
1021
1022
1023 template <typename Number>
1024 inline Number
1025 ReadWriteVector<Number>::local_element(const size_type local_index) const
1026 {
1027 AssertIndexRange(local_index, this->locally_owned_size());
1028
1029 return values[local_index];
1030 }
1031
1032
1033
1034 template <typename Number>
1035 inline Number &
1036 ReadWriteVector<Number>::local_element(const size_type local_index)
1037 {
1038 AssertIndexRange(local_index, this->locally_owned_size());
1039
1040 return values[local_index];
1041 }
1042
1043
1044
1045 template <typename Number>
1046 template <typename Number2>
1047 inline void
1048 ReadWriteVector<Number>::add(const std::vector<size_type> &indices,
1049 const std::vector<Number2> &values)
1050 {
1051 AssertDimension(indices.size(), values.size());
1052 add(indices.size(), indices.data(), values.data());
1053 }
1054
1055
1056
1057 template <typename Number>
1058 template <typename Number2>
1059 inline void
1060 ReadWriteVector<Number>::add(const std::vector<size_type> &indices,
1061 const ReadWriteVector<Number2> &values)
1062 {
1063 const size_type size = indices.size();
1064 for (size_type i = 0; i < size; ++i)
1065 {
1066 Assert(
1067 numbers::is_finite(values[i]),
1068 ExcMessage(
1069 "The given value is not finite but either infinite or Not A Number (NaN)"));
1070 this->operator()(indices[i]) += values[indices[i]];
1071 }
1072 }
1073
1074
1075
1076 template <typename Number>
1077 template <typename Number2>
1078 inline void
1079 ReadWriteVector<Number>::add(const size_type n_indices,
1080 const size_type *indices,
1081 const Number2 *values_to_add)
1082 {
1083 for (size_type i = 0; i < n_indices; ++i)
1084 {
1085 Assert(
1086 numbers::is_finite(values[i]),
1087 ExcMessage(
1088 "The given value is not finite but either infinite or Not A Number (NaN)"));
1089 this->operator()(indices[i]) += values_to_add[i];
1090 }
1091 }
1092
1093
1094
1095 template <typename Number>
1096 inline unsigned int
1098 const types::global_dof_index global_index) const
1099 {
1100 // the following will throw an exception if the global_index is not
1101 // in the remaining_elements
1102 return static_cast<unsigned int>(
1103 stored_elements.index_within_set(global_index));
1104 }
1105
1106
1107
1108 template <typename Number>
1109 template <typename Functor>
1112 const Functor &functor)
1113 : parent(parent)
1114 , functor(functor)
1115 {}
1116
1117
1118
1119 template <typename Number>
1120 template <typename Functor>
1121 void
1123 const size_type begin,
1124 const size_type end)
1125 {
1126 for (size_type i = begin; i < end; ++i)
1127 functor(parent.values[i]);
1128 }
1129
1130#endif // ifndef DOXYGEN
1131
1132} // end of namespace LinearAlgebra
1133
1134
1135
1143template <typename Number>
1144inline void
1150
1151
1153
1154#endif
std::size_t size() const
Definition array_view.h:689
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)
std::enable_if_t< std::is_same_v< Dummy, Number > &&::is_tpetra_type< Number >::value > import_elements(const TpetraWrappers::Vector< Number, MemorySpace > &tpetra_vec, VectorOperation::values operation, const std::shared_ptr< const Utilities::MPI::CommunicationPatternBase > &communication_pattern={})
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
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
std::enable_if_t< std::is_same_v< Dummy, Number > &&::is_tpetra_type< Number >::value > import_elements(const Tpetra::Vector< Number, 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)
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 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
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
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)
void swap(LinearAlgebra::ReadWriteVector< Number > &u, LinearAlgebra::ReadWriteVector< Number > &v) noexcept
#define DEAL_II_DEPRECATED
Definition config.h:286
#define DEAL_II_NAMESPACE_OPEN
Definition config.h:40
#define DEAL_II_DISABLE_EXTRA_DIAGNOSTICS
Definition config.h:603
#define DEAL_II_NAMESPACE_CLOSE
Definition config.h:41
#define DEAL_II_ENABLE_EXTRA_DIAGNOSTICS
Definition config.h:647
#define Assert(cond, exc)
#define AssertDimension(dim1, dim2)
#define AssertIndexRange(index, range)
static ::ExceptionBase & ExcMessage(std::string arg1)
bool is_finite(const double x)
Definition numbers.h:507
unsigned int global_dof_index
Definition types.h:94