dune-assembler 2.12
Loading...
Searching...
No Matches
petscvectorbackend.hh
Go to the documentation of this file.
1// SPDX-FileCopyrightText: Copyright © DUNE Project contributors, see file AUTHORS.md
2// SPDX-License-Identifier: LicenseRef-GPL-2.0-only-with-DUNE-exception OR LGPL-3.0-or-later
3
4#ifndef DUNE_ASSEMBLER_BACKENDS_PETSCVECTORBACKEND_HH
5#define DUNE_ASSEMBLER_BACKENDS_PETSCVECTORBACKEND_HH
6
7#include <cassert>
8#include <vector>
9
12
13#include <petscvec.h>
14
15namespace Dune::Assembler {
16
18{
19public:
20 using Vector = ::Vec;
24
25public:
27 : vector_(&vector)
28 {}
29
30 template <class Basis>
31 void resize (const Basis& basis)
32 {
33 assert(vector_);
34
35 if (*vector_ == nullptr)
36 VecCreate(PETSC_COMM_SELF, vector_);
37
38 size_type n = basis.dimension();
39 VecSetSizes(*vector_, n, n);
40 VecSetType(*vector_, VECSEQ);
41 }
42
43 void setZero ()
44 {
45 VecZeroEntries(*vector_);
46 }
47
48 void finish ()
49 {
50 assert(vector_);
51 VecAssemblyBegin(*vector_);
52 VecAssemblyEnd(*vector_);
53 }
54
55 template <class LocalView>
56 void scatter (const LocalView& localView, const LocalVector& localVector)
57 {
58 assert(vector_);
59
60 indices_.resize(localView.size());
61 for (std::size_t i = 0; i < localView.size(); ++i)
62 indices_[i] = localView.index(i);
63
64 VecSetValues(*vector_, indices_.size(), indices_.data(),
65 localVector.container_data(), ADD_VALUES);
66 }
67
68
69 struct Setter
70 {
71 operator value_type() const
72 {
73 value_type value{};
74 VecGetValues(vector, 1, &idx, &value);
75 return value;
76 }
77
79 {
81 return *this;
82 }
83
85 {
87 return *this;
88 }
89
91 {
93 return *this;
94 }
95
98 };
99
101 {
102 assert(vector_);
103 return Setter{*vector_, idx};
104 }
105
107 {
108 value_type value{};
109 VecGetValues(*vector_, 1, &idx, &value);
110 return value;
111 }
112
114 {
115 assert(vector_);
116 VecSet(*vector_, value);
117 return *this;
118 }
119
120private:
121 Vector* vector_ = nullptr;
122
123 std::vector<size_type> indices_{};
124};
125
126} // end namespace Dune::Assembler
127
128template <>
133
134#endif // DUNE_ASSEMBLER_BACKENDS_PETSCVECTORBACKEND_HH
Definition localboundaryintersectionmatrixassembler.hh:9
Definition petscvectorbackend.hh:18
PetscScalar value_type
Definition petscvectorbackend.hh:21
::Vec Vector
Definition petscvectorbackend.hh:20
Setter operator[](size_type idx)
Definition petscvectorbackend.hh:100
void finish()
Definition petscvectorbackend.hh:48
PetscInt size_type
Definition petscvectorbackend.hh:22
void scatter(const LocalView &localView, const LocalVector &localVector)
Definition petscvectorbackend.hh:56
void setZero()
Definition petscvectorbackend.hh:43
void resize(const Basis &basis)
Definition petscvectorbackend.hh:31
PETScVectorBackend & operator=(value_type value)
Definition petscvectorbackend.hh:113
PETScVectorBackend(Vector &vector) noexcept
Definition petscvectorbackend.hh:26
Definition petscvectorbackend.hh:70
Setter & operator+=(value_type value)
Definition petscvectorbackend.hh:84
Setter & operator=(value_type value)
Definition petscvectorbackend.hh:78
size_type idx
Definition petscvectorbackend.hh:97
Vector & vector
Definition petscvectorbackend.hh:96
Setter & operator-=(value_type value)
Definition petscvectorbackend.hh:90
typename Dune::Assembler::PETScVectorBackend::value_type type
Definition petscvectorbackend.hh:131
T data(T... args)
T resize(T... args)
T size(T... args)