SPH
BruteForceGravity.h
Go to the documentation of this file.
1 #pragma once
2 
7 
8 #include "gravity/IGravity.h"
9 #include "physics/Constants.h"
10 #include "quantities/Storage.h"
12 #include "thread/ThreadLocal.h"
13 
15 
20 class BruteForceGravity : public IGravity {
21 private:
24 
25  GravityLutKernel kernel;
26  Float gravityConstant = Constants::gravity;
27 
28 public:
30  BruteForceGravity(const Float gravityContant = Constants::gravity)
31  : gravityConstant(gravityContant) {
32  SPH_ASSERT(kernel.radius() == 0._f);
33  }
34 
36  BruteForceGravity(GravityLutKernel&& kernel, const Float gravityContant = Constants::gravity)
37  : kernel(std::move(kernel))
38  , gravityConstant(gravityContant) {}
39 
40  virtual void build(IScheduler& UNUSED(scheduler), const Storage& storage) override {
41  r = storage.getValue<Vector>(QuantityId::POSITION);
42  m = storage.getValue<Float>(QuantityId::MASS);
43  }
44 
45  virtual void evalAll(IScheduler& scheduler,
47  Statistics& UNUSED(stats)) const override {
48  SPH_ASSERT(r.size() == dv.size());
50  parallelFor(scheduler, 0, r.size(), [&dv, &actKernel, this](const Size i) {
51  dv[i] += this->evalImpl(actKernel, r[i], i);
52  });
53  }
54 
55  virtual Vector eval(const Vector& r0) const override {
56  struct NoSymmetrization {
57  const GravityLutKernel& kernel;
58 
59  INLINE Vector grad(const Vector& r1, const Vector& r2) const {
60  return kernel.grad(r1 - r2, r1[H]);
61  }
62  };
63  return this->evalImpl(NoSymmetrization{ kernel }, r0, Size(-1));
64  }
65 
66  virtual Float evalEnergy(IScheduler& scheduler, Statistics& UNUSED(stats)) const override {
68  ThreadLocal<Float> energy(scheduler, 0._f);
69  parallelFor(scheduler, energy, 0, r.size(), [&actKernel, this](const Size i, Float& e) {
70  for (Size j = 0; j < m.size(); ++j) {
71  if (i != j) {
72  e += m[i] * m[j] * actKernel.value(r[i], r[j]);
73  }
74  }
75  });
76  return 0.5_f * gravityConstant * energy.accumulate();
77  }
78 
79  virtual RawPtr<const IBasicFinder> getFinder() const override {
80  return nullptr;
81  }
82 
83 private:
84  template <typename TKernel>
85  INLINE Vector evalImpl(const TKernel& actKernel, const Vector& r0, const Size idx) const {
86  SPH_ASSERT(r && m);
87  Vector a(0._f);
88 
89  if (idx != Size(-1)) {
90  // do 2 for loops to avoid the if
91  for (Size i = 0; i < idx; ++i) {
92  a += m[i] * actKernel.grad(r[i], r0);
93  }
94  for (Size i = idx + 1; i < r.size(); ++i) {
95  a += m[i] * actKernel.grad(r[i], r0);
96  }
97  } else {
98  for (Size i = 0; i < r.size(); ++i) {
99  a += m[i] * actKernel.grad(r[i], r0);
100  }
101  }
102  return gravityConstant * a;
103  }
104 };
105 
#define SPH_ASSERT(x,...)
Definition: Assert.h:94
NAMESPACE_SPH_BEGIN
Definition: BarnesHut.cpp:13
Definitions of physical constaints (in SI units).
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
Smoothing kernels for including gravity into SPH.
Base class for solvers of gravity.
#define INLINE
Macros for conditional compilation based on selected compiler.
Definition: Object.h:31
#define UNUSED(x)
Definition: Object.h:37
#define NAMESPACE_SPH_END
Definition: Object.h:12
@ POSITION
Positions (velocities, accelerations) of particles, always a vector quantity,.
@ MASS
Paricles masses, always a scalar quantity.
INLINE void parallelFor(IScheduler &scheduler, const Size from, const Size to, TFunctor &&functor)
Executes a functor concurrently from all available threads.
Definition: Scheduler.h:98
Container for storing particle quantities and materials.
Template for thread-local storage.
@ H
Definition: Vector.h:25
Object providing safe access to continuous memory of data.
Definition: ArrayView.h:17
INLINE TCounter size() const
Definition: ArrayView.h:101
Computes gravitational acceleration by summing up forces from all particle pairs.
virtual void build(IScheduler &UNUSED(scheduler), const Storage &storage) override
virtual Vector eval(const Vector &r0) const override
Evaluates the gravitational acceleration at given point.
virtual RawPtr< const IBasicFinder > getFinder() const override
Optionally returns a finder used by the gravity implementation.
BruteForceGravity(const Float gravityContant=Constants::gravity)
Default-construced gravity, assuming point-like particles.
BruteForceGravity(GravityLutKernel &&kernel, const Float gravityContant=Constants::gravity)
Constructs gravity using smoothing kernel.
virtual void evalAll(IScheduler &scheduler, ArrayView< Vector > dv, Statistics &UNUSED(stats)) const override
virtual Float evalEnergy(IScheduler &scheduler, Statistics &UNUSED(stats)) const override
Gravitational kernel approximated by LUT for close particles.
Definition: GravityKernel.h:35
INLINE Vector grad(const Vector &r, const Float h) const
Definition: GravityKernel.h:69
INLINE Float radius() const
Definition: GravityKernel.h:51
Interface for computing gravitational interactions of particles.
Definition: IGravity.h:14
Interface that allows unified implementation of sequential and parallelized versions of algorithms.
Definition: Scheduler.h:27
Non-owning wrapper of pointer.
Definition: RawPtr.h:19
Object holding various statistics about current run.
Definition: Statistics.h:22
Container storing all quantities used within the simulations.
Definition: Storage.h:230
Array< TValue > & getValue(const QuantityId key)
Retrieves a quantity values from the storage, given its key and value type.
Definition: Storage.cpp:191
Template for storing a copy of a value for every thread in given scheduler.
Definition: ThreadLocal.h:36
constexpr Float gravity
Gravitational constant (CODATA 2014)
Definition: Constants.h:29
Overload of std::swap for Sph::Array.
Definition: Array.h:578