Feellgood
time_integration.h
1 #ifndef time_integration_h
2 #define time_integration_h
3 
4 #include "config.h" // gamma0
5 
12 class timing
13  {
14 public:
17  inline timing(const double _tf, const double _dtmin, const double _dtmax)
18  : tf(_tf), DTMIN(_dtmin), DTMAX(_dtmax), TAUR(100. * DTMAX), t(0)
19  {
20  set_dt(sqrt(DTMIN * DTMAX));
21  }
22 
24  const double tf;
25 
27  const double DTMIN; // 1e-14;
28 
30  const double DTMAX;
31 
33  inline double get_prefactor(void) const { return prefactor; }
34 
36  inline double get_dt() const { return dt; }
37 
39  inline double get_dt_phys() const { return dt / gamma0; }
40 
43  inline void set_dt(const double _dt)
44  {
45  dt = _dt;
46  double t_tilde = _dt / TAUR;
47  prefactor = (1. + t_tilde * abs(log( t_tilde)))*THETA*dt;
48  }
49 
53  template <int NPI>
54  Eigen::Matrix<double,NPI,1> get_alpha_eff(
55  const Eigen::Ref<const Eigen::Matrix<double,NPI,1>> alpha_g,
56  const Eigen::Ref<Eigen::Matrix<double,NPI,1>> uHeff) const
57  {
58  Eigen::Matrix<double,NPI,1> a_eff = alpha_g;
59  const double r(0.1);
60 
61  for(int npi=0;npi<NPI;npi++)
62  {
63  const double alpha = alpha_g(npi);
64  const double M = 2. * alpha * r / dt;
65  const double h = uHeff(npi);
66  if (h > 0.)
67  {
68  if (h > M)
69  a_eff(npi) = alpha*(1.+r);
70  else
71  a_eff(npi) = alpha + dt / 2. * h;
72  }
73  else
74  {
75  if (h < -M)
76  a_eff(npi) = alpha/(1.+r);
77  else
78  a_eff(npi) = alpha / (1. - dt / (2. * alpha) * h);
79  }
80  }
81  return a_eff;
82  }
83 
84 
86  inline bool is_dt_TooSmall() const { return (dt < DTMIN); }
87 
89  inline void inc_t() { t += dt; }
90 
92  inline double get_t() const { return t; }
93 
95  inline double get_t_phys() const { return t / gamma0; }
96 
98  inline double get_TAUR() const { return TAUR; }
99 
101  inline void set_t(const double _t) { t = _t; }
102 
103 private:
105  const double TAUR;
106 
108  double t;
109 
111  double dt;
112 
114  double prefactor;
115  };
116 
117 #endif
Definition: time_integration.h:13
void set_dt(const double _dt)
Definition: time_integration.h:43
const double DTMIN
Definition: time_integration.h:27
void set_t(const double _t)
Definition: time_integration.h:101
double get_dt_phys() const
Definition: time_integration.h:39
double get_t() const
Definition: time_integration.h:92
const double TAUR
Definition: time_integration.h:105
void inc_t()
Definition: time_integration.h:89
timing(const double _tf, const double _dtmin, const double _dtmax)
Definition: time_integration.h:17
bool is_dt_TooSmall() const
Definition: time_integration.h:86
const double DTMAX
Definition: time_integration.h:30
double get_dt() const
Definition: time_integration.h:36
double dt
Definition: time_integration.h:111
double t
Definition: time_integration.h:108
double get_t_phys() const
Definition: time_integration.h:95
const double tf
Definition: time_integration.h:24
double get_TAUR() const
Definition: time_integration.h:98
double prefactor
Definition: time_integration.h:114
Eigen::Matrix< double, NPI, 1 > get_alpha_eff(const Eigen::Ref< const Eigen::Matrix< double, NPI, 1 >> alpha_g, const Eigen::Ref< Eigen::Matrix< double, NPI, 1 >> uHeff) const
Definition: time_integration.h:54
double get_prefactor(void) const
Definition: time_integration.h:33
constexpr int NPI
Definition: tetra.h:51