59 lines
1.5 KiB
C++
59 lines
1.5 KiB
C++
#pragma once
|
|
#include "double3.h"
|
|
|
|
class External_gravity {
|
|
public:
|
|
void apply(const int n_act, const double3 x[], const double3 v[], double pot[], double3 a[], double3 adot[])
|
|
{
|
|
for (int i=0; i<n_act; i++) {
|
|
this->set_coordinates(x[i], v[i]);
|
|
this->calc_gravity();
|
|
pot[i] += potential;
|
|
a[i] += acceleration;
|
|
adot[i] += jerk;
|
|
}
|
|
}
|
|
virtual void calc_gravity() = 0;
|
|
bool is_active;
|
|
protected:
|
|
double potential;
|
|
double3 acceleration, jerk;
|
|
double3 x, v;
|
|
void set_coordinates(double3 x, double3 v)
|
|
{
|
|
this->x = x;
|
|
this->v = v;
|
|
}
|
|
};
|
|
|
|
class Plummer : public External_gravity {
|
|
public:
|
|
Plummer(double m, double b) : m(m), b(b) {is_active=(m>0);}
|
|
void calc_gravity();
|
|
private:
|
|
double m, b;
|
|
};
|
|
|
|
class Miyamoto_Nagai : public External_gravity {
|
|
public:
|
|
Miyamoto_Nagai(double m, double a, double b) : m(m), a(a), b(b) {is_active=(m>0);}
|
|
void calc_gravity();
|
|
private:
|
|
double m, a, b;
|
|
};
|
|
|
|
class Logarithmic_halo : public External_gravity {
|
|
public:
|
|
Logarithmic_halo(double v_halo, double r_halo) : v2_halo(v_halo*v_halo), r2_halo(r_halo*r_halo) {is_active=(r_halo>0);}
|
|
void calc_gravity();
|
|
private:
|
|
double v2_halo, r2_halo;
|
|
};
|
|
|
|
class Dehnen : public External_gravity {
|
|
public:
|
|
Dehnen(double m, double r, double gamma) : m(m), r(r), gamma(gamma) {is_active=(m>0);}
|
|
void calc_gravity();
|
|
private:
|
|
double m, r, gamma;
|
|
};
|