5 #include <dune/common/ftraits.hh> 6 #include <dune/common/rangeutilities.hh> 7 #include <dune/common/shared_ptr.hh> 8 #include <dune/functions/functionspacebases/flatmultiindex.hh> 10 #include <amdis/Output.hpp> 11 #include <amdis/algorithm/ForEach.hpp> 12 #include <amdis/algorithm/InnerProduct.hpp> 13 #include <amdis/algorithm/Transform.hpp> 14 #include <amdis/common/FakeContainer.hpp> 15 #include <amdis/operations/Assigner.hpp> 16 #include <amdis/typetree/MultiIndex.hpp> 21 template <
class DofMap>
25 using AssignMode = std::conditional_t<std::is_same_v<A,Assigner::plus_assign>,
26 std::integral_constant<::InsertMode, ADD_VALUES>,
27 std::integral_constant<::InsertMode, INSERT_VALUES>>;
41 template <
class Basis>
43 : dofMap_(basis.communicator().dofMap())
48 : dofMap_(other.dofMap_)
55 : dofMap_(other.dofMap_)
56 , initialized_(other.initialized_)
58 if (other.initialized_) {
59 VecDuplicate(other.vector_, &vector_);
60 VecCopy(other.vector_, vector_);
98 return dofMap_.localSize();
104 return dofMap_.globalSize();
109 template <
class SizeInfo>
110 void init(SizeInfo
const&,
bool clear)
116 info(3,
" create new vector needed {} seconds", t.elapsed());
122 VecGetLocalSize(vector_, &localSize);
125 if (std::size_t(localSize) != dofMap_.localSize() ||
126 std::size_t(
globalSize) != dofMap_.globalSize()) {
129 info(3,
" destroy old and create new vector needed {} seconds", t.elapsed());
145 VecAssemblyBegin(vector_);
146 VecAssemblyEnd(vector_);
147 info(3,
" finish vector assembly needed {} seconds", t.elapsed());
155 VecGhostUpdateBegin(vector_, INSERT_VALUES, SCATTER_FORWARD);
156 VecGhostUpdateEnd(vector_, INSERT_VALUES, SCATTER_FORWARD);
157 info(3,
" synchronize vector needed {} seconds", t.elapsed());
162 template <
class MultiIndex>
166 gather(std::array<MultiIndex,1>{idx}, &y);
172 template <
class MultiIndex,
class Assign>
175 assert(initialized_);
176 VecSetValue(vector_, dofMap_.global(flatMultiIndex(dof)), value, AssignMode<Assign>::value);
181 template <
class IndexRange,
class OutputIterator>
182 void gather(IndexRange
const& localInd, OutputIterator buffer)
const 184 forEach(localInd, [&buffer](
auto&&,
auto const& value) { *buffer = value; ++buffer; });
193 template <
class IndexRange,
class LocalValues,
class MaskRange,
class Assign>
194 void scatter(IndexRange
const& localInd, LocalValues
const& localVal, MaskRange
const& mask, Assign)
196 static_assert(std::is_same_v<typename LocalValues::value_type, PetscScalar>,
"");
197 assert(initialized_);
198 assert(localInd.size() == localVal.size());
201 std::vector<PetscInt> globalInd;
202 globalInd.reserve(localInd.size());
204 auto ind_it = std::begin(localInd);
205 auto mask_it = std::begin(mask);
206 for (; ind_it != std::end(localInd); ++mask_it, ++ind_it)
207 globalInd.push_back(*mask_it ? dofMap_.global(flatMultiIndex(*ind_it)) : -1);
210 VecSetOption(vector_, VEC_IGNORE_NEGATIVE_INDICES, PETSC_TRUE);
212 VecSetValues(vector_, globalInd.size(), globalInd.data(), localVal.data(), AssignMode<Assign>::value);
213 VecSetOption(vector_, VEC_IGNORE_NEGATIVE_INDICES, PETSC_FALSE);
218 template <
class IndexRange,
class Func>
219 void forEach(IndexRange
const& localInd, Func&& f)
const 222 Vec localGhostedVec =
nullptr;
223 VecGhostGetLocalForm(vector_, &localGhostedVec);
224 assert(localGhostedVec !=
nullptr);
228 VecGetArray(localGhostedVec, &ptr);
230 for (
auto const& dof : localInd)
233 if (dofMap_.owner(i)) {
235 f(dof, ptr[dofMap_.dofToLocal(i)]);
239 f(dof, ptr[dofMap_.localSize() + dofMap_.dofToGhost(i)]);
243 VecRestoreArray(localGhostedVec, &ptr);
244 VecGhostRestoreLocalForm(vector_, &localGhostedVec);
249 template <
class Func>
253 PetscScalar
const* ptr;
254 VecGetArrayRead(vector_, &ptr);
257 f(ptr[dofMap_.dofToLocal(i)]);
259 VecRestoreArrayRead(vector_, &ptr);
265 template <
class Func>
270 VecGetArray(vector_, &ptr);
273 f(ptr[dofMap_.dofToLocal(i)]);
275 VecRestoreArray(vector_, &ptr);
280 template <
class Operation,
class... VecIns>
284 std::array<PetscScalar
const*,
sizeof...(VecIns)> ptrsIn{};
287 VecGetArray(vecOut.vector_, &ptrOut);
288 Ranges::forIndices<
sizeof...(VecIns)>([&](
auto ii) {
289 VecGetArrayRead(std::get<ii>(std::tie(vecIn...)).vector_, &ptrsIn[ii]);
293 auto idx = vecOut.dofMap_.dofToLocal(i);
294 Ranges::applyIndices<
sizeof...(VecIns)>([&](
auto... ii) {
295 ptrOut[idx] = op(ptrsIn[ii][idx]...);
300 VecRestoreArray(vecOut.vector_, &ptrOut);
301 Ranges::forIndices<
sizeof...(VecIns)>([&](
auto ii) {
302 VecRestoreArrayRead(std::get<ii>(std::tie(vecIn...)).vector_, &ptrsIn[ii]);
308 template <
class T,
class BinOp1,
class BinOp2>
311 PetscScalar
const* ptr1;
312 PetscScalar
const* ptr2;
315 VecGetArrayRead(in1.vector_, &ptr1);
316 VecGetArrayRead(in2.vector_, &ptr2);
319 auto idx = in1.dofMap_.dofToLocal(i);
320 init = op1(std::move(init), op2(ptr1[idx], ptr2[idx]));
324 VecRestoreArrayRead(in1.vector_, &ptr1);
325 VecRestoreArrayRead(in2.vector_, &ptr2);
332 void set(PetscScalar value)
334 Vec localGhostedVec =
nullptr;
335 VecGhostGetLocalForm(vector_, &localGhostedVec);
336 assert(localGhostedVec !=
nullptr);
338 VecSet(localGhostedVec, value);
339 VecGhostRestoreLocalForm(vector_, &localGhostedVec);
346 Vec localGhostedVec =
nullptr;
347 VecGhostGetLocalForm(vector_, &localGhostedVec);
348 assert(localGhostedVec !=
nullptr);
350 VecZeroEntries(localGhostedVec);
351 VecGhostRestoreLocalForm(vector_, &localGhostedVec);
356 assert(&lhs.dofMap_ == &rhs.dofMap_);
357 std::swap(lhs.vector_, rhs.vector_);
358 std::swap(lhs.initialized_, rhs.initialized_);
363 MPI_Comm comm()
const 368 return PETSC_COMM_SELF;
375 VecCreateGhost(comm(),
376 dofMap_.localSize(), dofMap_.globalSize(), dofMap_.ghostSize(), dofMap_.ghostIndices().data(),
384 VecDestroy(&vector_);
386 initialized_ =
false;
391 DofMap
const& dofMap_;
394 mutable Vec vector_ =
nullptr;
395 bool initialized_ =
false;
401 template <
class DofMap>
404 template <
class Vec,
class UnaryFunction>
405 static void impl(Vec&& vec, UnaryFunction f)
411 template <
class DofMap>
414 template <
class Operation,
class... VecIns>
421 template <
class DofMap>
424 template <
class T,
class BinOp1,
class BinOp2>
void forEachLocal(Func &&f) const
Perform the f(value) on the local elements of this vector.
Definition: VectorBackend.hpp:250
constexpr bool MultiIndex
A multi-index type.
Definition: Concepts.hpp:150
BaseVector const & vector() const
Return the data-vector vector_.
Definition: VectorBackend.hpp:84
PetscVector(PetscVector &&other)
Move constructor.
Definition: VectorBackend.hpp:47
BaseVector & vector()
Return the data-vector vector_.
Definition: VectorBackend.hpp:90
PetscVector(PetscVector const &other)
Copy constructor.
Definition: VectorBackend.hpp:54
~PetscVector()
Destructor.
Definition: VectorBackend.hpp:65
void forEachLocal(Func &&f)
Perform the f(value) on the local elements of this vector.
Definition: VectorBackend.hpp:266
std::size_t globalSize() const
Return the number of entries in the global vector.
Definition: VectorBackend.hpp:102
void forEach(IndexRange const &localInd, Func &&f) const
Apply the functor f to each vector entry to local index in localInd range.
Definition: VectorBackend.hpp:219
PetscScalar value_type
The type of the elements of the DOFVector.
Definition: VectorBackend.hpp:34
void insert(MultiIndex const &dof, PetscScalar value, Assign)
Access the entry i of the vector with write-access.
Definition: VectorBackend.hpp:173
Definition: AdaptBase.hpp:6
PetscVector & operator=(PetscVector &&other)
Move assignment operator.
Definition: VectorBackend.hpp:71
static void transformLocal(PetscVector &vecOut, Operation op, VecIns const &... vecIn)
Perform the valueOut = op(valueIn...) on the local elements of [vecOut] and [vecIn...].
Definition: VectorBackend.hpp:281
PetscVector & operator=(PetscVector const &other)
Copy assignment operator.
Definition: VectorBackend.hpp:78
void init(SizeInfo const &, bool clear)
Resize the vector_ to the size s.
Definition: VectorBackend.hpp:110
void setZero()
Zero all entries, including the ghost entries.
Definition: VectorBackend.hpp:344
void scatter(IndexRange const &localInd, LocalValues const &localVal, MaskRange const &mask, Assign)
Store all values given by localVal with indices localInd in the vector.
Definition: VectorBackend.hpp:194
std::size_t localSize() const
Return the number of entries in the local part of the vector.
Definition: VectorBackend.hpp:96
void gather(IndexRange const &localInd, OutputIterator buffer) const
Collect all values from this vector to indices given by localInd and store it into the output buffer...
Definition: VectorBackend.hpp:182
A container-like data-structure not storing anything and with empty implementations in many container...
Definition: FakeContainer.hpp:34
PetscVector(Basis const &basis)
Constructor. Constructs new BaseVector.
Definition: VectorBackend.hpp:42
PetscInt size_type
The index/size - type.
Definition: VectorBackend.hpp:37
static T innerProductLocal(PetscVector const &in1, PetscVector const &in2, T init, BinOp1 op1, BinOp2 op2)
Perform the op1(init, op2(value1, value2)) on the local elements of [in1] and [in2].
Definition: VectorBackend.hpp:309
void synchronize()
Update the ghost regions with values from the owning process.
Definition: VectorBackend.hpp:152
::Vec BaseVector
The type of the base vector.
Definition: VectorBackend.hpp:31
void finish()
Finish assembly. Must be called before vector can be used in a KSP.
Definition: VectorBackend.hpp:142
PetscScalar at(MultiIndex const &idx) const
Access the entry i of the vector with read-only-access.
Definition: VectorBackend.hpp:163
The basic container that stores a base vector data.
Definition: VectorBackend.hpp:22
static Dune::MPIHelper::MPICommunicator comm()
Return the MPI_Comm object (or a fake communicator)
Definition: Environment.hpp:86