7 #include <dune/common/classname.hh> 8 #include <dune/common/deprecated.hh> 9 #include <dune/common/hybridutilities.hh> 10 #include <dune/common/rangeutilities.hh> 11 #include <dune/common/shared_ptr.hh> 12 #include <dune/common/std/type_traits.hh> 13 #include <dune/functions/functionspacebases/concepts.hh> 14 #include <dune/functions/functionspacebases/sizeinfo.hh> 16 #include <amdis/Output.hpp> 17 #include <amdis/algorithm/ForEach.hpp> 18 #include <amdis/algorithm/InnerProduct.hpp> 19 #include <amdis/algorithm/Transform.hpp> 20 #include <amdis/common/Concepts.hpp> 21 #include <amdis/common/ConceptsBase.hpp> 22 #include <amdis/common/FakeContainer.hpp> 23 #include <amdis/common/TypeTraits.hpp> 24 #include <amdis/functions/NodeIndices.hpp> 25 #include <amdis/operations/Assigner.hpp> 26 #include <amdis/typetree/MultiIndex.hpp> 38 template <
class T,
template <
class>
class VectorImpl>
42 using Impl = VectorImpl<T>;
46 enum class VectorState
55 using VectorStateOf_t = std::conditional_t<std::is_same_v<A,Assigner::plus_assign>,
56 std::integral_constant<VectorState, VectorState::add_values>,
57 std::integral_constant<VectorState, VectorState::insert_values>>;
60 using size_type =
typename Impl::size_type;
61 using value_type =
typename Impl::value_type;
66 class = std::void_t<decltype(std::declval<GlobalBasis>().dimension())> >
79 using HasLocalSize = decltype(std::declval<V>().
localSize());
82 using HasGlobalSize = decltype(std::declval<V>().
globalSize());
87 if constexpr (Dune::Std::is_detected<HasLocalSize,Impl>::value)
88 return impl_.localSize();
96 if constexpr (Dune::Std::is_detected<HasGlobalSize,Impl>::value)
97 return impl_.globalSize();
103 template <
class SizeInfo>
106 init(sizeInfo,
false);
110 template <
class SizeInfo>
113 init(sizeInfo,
true);
118 template <
class SizeInfo>
119 void init(SizeInfo
const& sizeInfo,
bool clear)
121 impl_.init(sizeInfo, clear);
122 state_ = clear ? VectorState::synchronized : VectorState::unknown;
129 state_ = VectorState::unknown;
144 REQUIRES(Concepts::MultiIndex<Index>)>
145 void insert(Index
const& idx,
typename Impl::value_type
const& value, Assign assign = {})
147 test_exit_dbg(state_ == VectorStateOf_t<Assign>::value ||
148 state_ == VectorState::unknown ||
149 state_ == VectorState::synchronized,
150 "Vector in invalid state {} for insertion by {}.", to_string(state_), Dune::className<Assign>());
152 impl_.insert(idx, value, assign);
155 state_ = VectorStateOf_t<Assign>::value;
159 template <
class Index,
160 REQUIRES(Concepts::MultiIndex<Index>)>
161 void set(Index
const& idx,
typename Impl::value_type
const& value)
167 template <
class Index,
168 REQUIRES(Concepts::MultiIndex<Index>)>
169 void add(Index
const& idx,
typename Impl::value_type
const& value)
175 template <
class Index,
176 REQUIRES(Concepts::MultiIndex<Index>)>
177 typename Impl::value_type
get(Index
const& idx)
const 179 const_cast<Self*
>(
this)->synchronize();
180 return impl_.at(idx);
198 template <
class LocalView,
class Node,
class Buffer,
199 REQUIRES(Concepts::LocalView<LocalView>),
200 REQUIRES(Concepts::BasisNode<Node>)>
203 test_exit(state_ == VectorState::unknown ||
204 state_ == VectorState::synchronized,
205 "Vector in invalid state {} for gather operations.", to_string(state_));
207 const_cast<Self*
>(
this)->synchronize();
209 buffer.
resize(node.size());
210 impl_.gather(nodeIndices(localView, node), buffer.begin());
215 REQUIRES(Concepts::LocalView<LocalView>)>
241 template <
class LocalView,
class Node,
class NodeVector,
class MaskRange,
class Assign,
242 REQUIRES(Concepts::LocalView<LocalView>),
243 REQUIRES(Concepts::BasisNode<Node>)>
244 void scatter(LocalView
const& localView, Node
const& node, NodeVector
const& localVector,
245 MaskRange
const& mask, Assign assign)
247 test_exit(state_ == VectorStateOf_t<Assign>::value ||
248 state_ == VectorState::unknown ||
249 state_ == VectorState::synchronized,
250 "Vector in invalid state {} for insertion by {}.", to_string(state_), Dune::className<Assign>());
252 assert(localVector.size() == node.size());
255 impl_.scatter(nodeIndices(localView, node), localVector, mask, assign);
258 state_ = VectorStateOf_t<Assign>::value;
264 template <
class LocalView,
class Node,
class NodeVector,
class Assign,
265 REQUIRES(Concepts::LocalView<LocalView>),
266 REQUIRES(Concepts::BasisNode<Node>)>
267 void scatter(LocalView
const& localView, Node
const& node, NodeVector
const& localVector, Assign assign)
274 template <
class LocalView,
class LocalVector,
class Assign,
275 REQUIRES(Concepts::LocalView<LocalView>)>
276 void scatter(LocalView
const& localView, LocalVector
const& localVector, Assign assign)
278 scatter(localView, localView.
tree(), localVector, assign);
288 template <
class LocalInd,
class Func>
289 void forEach(LocalInd
const& localInd, Func&& func)
292 impl_.forEach(localInd, FWD(func));
302 template <
class LocalInd,
class Func>
303 void forEach(LocalInd
const& localInd, Func&& func)
const 305 const_cast<Self*
>(
this)->synchronize();
306 impl_.
forEach(localInd, FWD(func));
313 if (state_ != VectorState::synchronized)
316 state_ = VectorState::synchronized;
320 static std::string to_string(VectorState state)
323 case VectorState::synchronized:
return "synchronized";
324 case VectorState::insert_values:
return "insert_values";
325 case VectorState::add_values:
return "add_values";
326 default:
return "unknown";
336 VectorState state_ = VectorState::unknown;
342 template <
class T,
template <
class>
class Impl>
345 template <
class Vec,
class UnaryFunction>
346 static void impl (Vec&& vec, UnaryFunction f)
349 Recursive::forEach(vec.impl(), f);
353 template <
class T,
template <
class>
class Impl>
356 template <
class Operation,
class... Ts>
360 Recursive::transform(vecOut.
impl(), op, vecIn.
impl()...);
364 template <
class S,
template <
class>
class Impl>
367 template <
class In1,
class In2,
class T,
class BinOp1,
class BinOp2>
368 static T
impl (In1
const& in1, In2
const& in2, T
init, BinOp1 op1, BinOp2 op2)
371 return Recursive::innerProduct(in1.impl(), in2.impl(), std::move(init), op1, op2);
380 template <
class T,
class Facade>
381 struct VectorTypeImpl;
383 template <
class T,
class S,
template <
class>
class Impl>
384 struct VectorTypeImpl<T,VectorFacade<S,Impl>>
392 template <
class T,
class Facade>
393 using VectorType_t =
typename Impl::VectorTypeImpl<T,Facade>::type;
std::size_t localSize() const
Return the number of entries in the local part of the vector.
Definition: VectorFacade.hpp:85
void gather(LocalView const &localView, Node const &node, Buffer &buffer) const
Extract values from the vector referring to the given local indices and store it into a buffer...
Definition: VectorFacade.hpp:201
void finish()
Finish the insertion of values, see init()
Definition: VectorFacade.hpp:126
The basic container that stores a base vector and a corresponding basis.
Definition: VectorFacade.hpp:39
std::size_t globalSize() const
Return the number of entries in the global vector.
Definition: VectorFacade.hpp:94
Definition: Assigner.hpp:16
Global basis defined on a pre-basis.
Definition: GlobalBasis.hpp:50
void scatter(LocalView const &localView, Node const &node, NodeVector const &localVector, MaskRange const &mask, Assign assign)
Insert a block of values into the vector (add or overwrite to existing values)
Definition: VectorFacade.hpp:244
void forEach(LocalInd const &localInd, Func &&func)
Apply func to each value at given indices localInd.
Definition: VectorFacade.hpp:289
VectorFacade(GlobalBasis const &basis)
Definition: VectorFacade.hpp:67
Definition: AdaptBase.hpp:6
constexpr bool LocalView
A Dune::Functions::LocalView type.
Definition: Concepts.hpp:182
The restriction of a finite element basis to a single element.
Definition: LocalView.hpp:20
Tree const & tree() const
Return the local ansatz tree associated to the bound entity.
Definition: LocalView.hpp:129
void add(Index const &idx, typename Impl::value_type const &value)
See insert for assignment operation Assigner::plus_assign.
Definition: VectorFacade.hpp:169
void forEach(LocalInd const &localInd, Func &&func) const
Apply func to each value at given indices localInd.
Definition: VectorFacade.hpp:303
void resize(SizeInfo const &sizeInfo)
Resize the vector to the size of the basis.
Definition: VectorFacade.hpp:104
A container-like data-structure not storing anything and with empty implementations in many container...
Definition: FakeContainer.hpp:34
void init(SizeInfo const &sizeInfo, bool clear)
Definition: VectorFacade.hpp:119
void insert(Index const &idx, typename Impl::value_type const &value, Assign assign={})
Insert a single value into the matrix (add or overwrite to existing value)
Definition: VectorFacade.hpp:145
void resizeZero(SizeInfo const &sizeInfo)
Resize the vector to the size of the basis and set to zero.
Definition: VectorFacade.hpp:111
Impl const & impl() const
Return the underlying linear algebra backend.
Definition: VectorFacade.hpp:74
void scatter(LocalView const &localView, Node const &node, NodeVector const &localVector, Assign assign)
Call scatter with MaskRange set to FakeContainer.
Definition: VectorFacade.hpp:267
constexpr bool GlobalBasis
A Dune::Functions::GlobalBasis type.
Definition: Concepts.hpp:190
void scatter(LocalView const &localView, LocalVector const &localVector, Assign assign)
Call scatter with Node given by the tree of the localView.
Definition: VectorFacade.hpp:276
Definition: Assigner.hpp:7