SPH
Quantity.cpp
Go to the documentation of this file.
1 #include "quantities/Quantity.h"
2 
4 
5 namespace Detail {
6 
7 template <typename TValue>
9  Holder cloned(order);
10  visitConst(cloned, flags, [](const Array<TValue>& array, Array<TValue>& clonedArray) {
11  clonedArray = array.clone();
12  });
13  return cloned;
14 }
15 
16 template <typename TValue>
18  return Holder(order, TValue(0._f), particleCnt);
19 }
20 
21 template <typename TValue>
23  visitMutable(other, flags, [](Array<TValue>& ar1, Array<TValue>& ar2) { ar1.swap(ar2); });
24 }
25 
26 template <typename TValue>
27 void Holder<TValue>::setOrder(const OrderEnum newOrder) {
28  SPH_ASSERT(Size(newOrder) > Size(order));
29  if (newOrder == OrderEnum::SECOND) {
30  d2v_dt2.resize(v.size());
31  d2v_dt2.fill(TValue(0._f));
32  } else if (newOrder == OrderEnum::FIRST) {
33  dv_dt.resize(v.size());
34  dv_dt.fill(TValue(0._f));
35  }
36  order = newOrder;
37 }
38 
39 template <typename TValue>
40 void Holder<TValue>::initDerivatives(const Size size) {
41  switch (order) {
42  case OrderEnum::SECOND:
43  d2v_dt2.resize(size);
44  d2v_dt2.fill(TValue(0._f));
45  dv_dt.resize(size);
46  dv_dt.fill(TValue(0._f));
47  // [[fallthrough]] - somehow doesn't work with gcc6
48  break;
49  case OrderEnum::FIRST:
50  dv_dt.resize(size);
51  dv_dt.fill(TValue(0._f));
52  break;
53  default:
54  break;
55  }
56 }
57 
58 template <typename TValue>
59 template <typename TFunctor>
60 void Holder<TValue>::visitMutable(Holder& other, const Flags<VisitorEnum> flags, TFunctor&& functor) {
65  functor(v, other.v);
66  }
67  switch (order) {
68  case OrderEnum::FIRST:
69  if (flags.hasAny(
71  functor(dv_dt, other.dv_dt);
72  }
73  break;
74  case OrderEnum::SECOND:
76  functor(dv_dt, other.dv_dt);
77  }
78  if (flags.hasAny(
80  functor(d2v_dt2, other.d2v_dt2);
81  }
82  break;
83  default:
84  break;
85  }
86 }
87 
88 template <typename TValue>
89 template <typename TFunctor>
90 void Holder<TValue>::visitConst(Holder& other, const Flags<VisitorEnum> flags, TFunctor&& functor) const {
91  const_cast<Holder*>(this)->visitMutable(other, flags, std::forward<TFunctor>(functor));
92 }
93 
94 template class Holder<Size>;
95 template class Holder<Float>;
96 template class Holder<Vector>;
97 template class Holder<SymmetricTensor>;
98 template class Holder<TracelessTensor>;
99 template class Holder<Tensor>;
100 
101 } // namespace Detail
102 
103 
#define SPH_ASSERT(x,...)
Definition: Assert.h:94
NAMESPACE_SPH_BEGIN
Definition: BarnesHut.cpp:13
uint32_t Size
Integral type used to index arrays (by default).
Definition: Globals.h:16
#define NAMESPACE_SPH_END
Definition: Object.h:12
Holder of quantity values and their temporal derivatives.
@ FIRST_ORDER
Iterates only over first-order quantities. Passes values and derivatives as arguments of functor.
OrderEnum
Definition: Quantity.h:15
@ SECOND
Quantity with 1st and 2nd derivative.
@ FIRST
Quantity with 1st derivative.
void swap(Array &other)
Swaps content of two arrays.
Definition: Array.h:444
Array clone() const
Performs a deep copy of all elements of the array.
Definition: Array.h:147
void swap(Holder &other, Flags< VisitorEnum > flags)
Definition: Quantity.cpp:22
Holder createZeros(const Size particleCnt) const
Definition: Quantity.cpp:17
void setOrder(const OrderEnum newOrder)
Definition: Quantity.cpp:27
Holder clone(const Flags< VisitorEnum > flags) const
Definition: Quantity.cpp:8
Wrapper of an integral value providing functions for reading and modifying individual bits.
Definition: Flags.h:20
constexpr INLINE bool hasAny(const TEnum flag, const TArgs... others) const
Checks if the object has any of given flags.
Definition: Flags.h:83