SPH
Potentials.h
Go to the documentation of this file.
1 #pragma once
2 
7 
8 #include "physics/Functions.h"
10 
12 
21 template <typename TFunctor>
22 class ExternalForce : public IEquationTerm {
23 private:
24  std::remove_reference_t<TFunctor> functor;
25 
26 public:
27  ExternalForce(TFunctor&& functor)
28  : functor(std::forward<TFunctor>(functor)) {}
29 
30  virtual void setDerivatives(DerivativeHolder& UNUSED(derivatives),
31  const RunSettings& UNUSED(settings)) override {}
32 
33  virtual void initialize(IScheduler& UNUSED(scheduler),
34  Storage& UNUSED(storage),
35  const Float UNUSED(t)) override {}
36 
37  virtual void finalize(IScheduler& UNUSED(scheduler), Storage& storage, const Float t) override {
38  ArrayView<Vector> r, v, dv;
39  tie(r, v, dv) = storage.getAll<Vector>(QuantityId::POSITION);
41  for (Size i = 0; i < r.size(); ++i) {
42  dv[i] += functor(r[i], t);
43  }
44  }
45 
46  virtual void create(Storage& UNUSED(storage), IMaterial& UNUSED(material)) const override {}
47 };
48 
51 template <typename TFunctor>
52 EquationHolder makeExternalForce(TFunctor&& functor) {
53  return EquationHolder(makeShared<ExternalForce<TFunctor>>(std::forward<TFunctor>(functor)));
54 }
55 
59 class InertialForce : public IEquationTerm {
60 private:
61  Vector omega;
62 
63 public:
64  InertialForce(const Vector omega)
65  : omega(omega) {}
66 
67  virtual void setDerivatives(DerivativeHolder& UNUSED(derivatives),
68  const RunSettings& UNUSED(settings)) override {}
69 
70  virtual void initialize(IScheduler& UNUSED(scheduler),
71  Storage& UNUSED(storage),
72  const Float UNUSED(t)) override {}
73 
74  virtual void finalize(IScheduler& UNUSED(scheduler), Storage& storage, const Float UNUSED(t)) override {
75  ArrayView<Vector> r, v, dv;
76  tie(r, v, dv) = storage.getAll<Vector>(QuantityId::POSITION);
78  for (Size i = 0; i < r.size(); ++i) {
79  dv[i] -= 2._f * cross(omega, v[i]) + cross(omega, cross(omega, r[i]));
80  // no energy term - energy is not generally conserved when external force is used
81  }
82  }
83 
84  virtual void create(Storage& UNUSED(storage), IMaterial& UNUSED(material)) const override {}
85 };
86 
NAMESPACE_SPH_BEGIN
Definition: BarnesHut.cpp:13
Right-hand side term of SPH equations.
uint32_t Size
Integral type used to index arrays (by default).
Definition: Globals.h:16
double Float
Precision used withing the code. Use Float instead of float or double where precision is important.
Definition: Globals.h:13
#define UNUSED(x)
Definition: Object.h:37
#define NAMESPACE_SPH_END
Definition: Object.h:12
EquationHolder makeExternalForce(TFunctor &&functor)
Definition: Potentials.h:52
@ POSITION
Positions (velocities, accelerations) of particles, always a vector quantity,.
INLINE SharedPtr< T > makeShared(TArgs &&... args)
Definition: SharedPtr.h:410
StaticArray< T0 &, sizeof...(TArgs)+1 > tie(T0 &t0, TArgs &... rest)
Creates a static array from a list of l-value references.
Definition: StaticArray.h:281
INLINE BasicVector< float > cross(const BasicVector< float > &v1, const BasicVector< float > &v2)
Cross product between two vectors.
Definition: Vector.h:559
Object providing safe access to continuous memory of data.
Definition: ArrayView.h:17
INLINE TCounter size() const
Definition: ArrayView.h:101
Container holding derivatives and the storage they accumulate to.
Definition: Derivative.h:173
Container holding equation terms.
Definition: EquationTerm.h:238
Generic external force given by lambda function.
Definition: Potentials.h:22
virtual void create(Storage &UNUSED(storage), IMaterial &UNUSED(material)) const override
Definition: Potentials.h:46
virtual void finalize(IScheduler &UNUSED(scheduler), Storage &storage, const Float t) override
Definition: Potentials.h:37
virtual void initialize(IScheduler &UNUSED(scheduler), Storage &UNUSED(storage), const Float UNUSED(t)) override
Definition: Potentials.h:33
ExternalForce(TFunctor &&functor)
Definition: Potentials.h:27
virtual void setDerivatives(DerivativeHolder &UNUSED(derivatives), const RunSettings &UNUSED(settings)) override
Definition: Potentials.h:30
Represents a term or terms appearing in evolutionary equations.
Definition: EquationTerm.h:22
Material settings and functions specific for one material.
Definition: IMaterial.h:110
Interface that allows unified implementation of sequential and parallelized versions of algorithms.
Definition: Scheduler.h:27
Centrifugal and Coriolis force.
Definition: Potentials.h:59
virtual void setDerivatives(DerivativeHolder &UNUSED(derivatives), const RunSettings &UNUSED(settings)) override
Definition: Potentials.h:67
virtual void finalize(IScheduler &UNUSED(scheduler), Storage &storage, const Float UNUSED(t)) override
Definition: Potentials.h:74
virtual void create(Storage &UNUSED(storage), IMaterial &UNUSED(material)) const override
Definition: Potentials.h:84
virtual void initialize(IScheduler &UNUSED(scheduler), Storage &UNUSED(storage), const Float UNUSED(t)) override
Definition: Potentials.h:70
InertialForce(const Vector omega)
Definition: Potentials.h:64
Container storing all quantities used within the simulations.
Definition: Storage.h:230
StaticArray< Array< TValue > &, 3 > getAll(const QuantityId key)
Retrieves quantity buffers from the storage, given its key and value type.
Definition: Storage.cpp:163
Overload of std::swap for Sph::Array.
Definition: Array.h:578