SlowDown Algorithmic Regularization (SDAR)
Algorithmic Regularization with slowdown method for integrating few-body motions
slow_down.h
Go to the documentation of this file.
1 #pragma once
2 
3 #include "Common/Float.h"
4 
5 namespace AR{
6 
8 
11  class SlowDown{
12  private:
13  Float time_update_; // update time (int) for new slowdown factor
14  Float kappa_; // slow-down factor
15  Float kappa_org_; // original slow-down factor without kappa limit (1.0, kappa_max)
16  Float kappa_max_; // maximum kappa factor
17  Float kappa_ref_;
18  Float timescale_max_;
19  public:
20  Float pert_in; // inner strength
21  Float pert_out; // perturbation strength
22  Float timescale; // perturbation strength change timescale
23  Float period; // orbital period
24 
26  SlowDown(): time_update_(Float(0.0)), kappa_(Float(1.0)), kappa_org_(Float(1.0)), kappa_max_(Float(1.0)), kappa_ref_(Float(1.0e-6)), timescale_max_(NUMERIC_FLOAT_MAX), pert_in(0.0), pert_out(0.0), timescale(NUMERIC_FLOAT_MAX), period(NUMERIC_FLOAT_MAX) {}
27 
29  void clear(){
30  time_update_ = Float(0.0);
31  kappa_ = kappa_org_ = kappa_max_ = Float(1.0);
32  kappa_ref_ = Float(1.0e-6);
33  pert_in = pert_out = Float(0.0);
34  timescale_max_ = timescale = period = NUMERIC_FLOAT_MAX;
35  }
36 
38 
42  void initialSlowDownReference(const Float _kappa_ref, const Float _timescale_max) {
43  ASSERT(_kappa_ref>0.0);
44  ASSERT(_timescale_max>0.0);
45  kappa_ref_ = _kappa_ref;
46  timescale_max_ = _timescale_max;
47  }
48 
50  void setUpdateTime (const Float _time) {
51  time_update_ = _time;
52  }
53 
55  Float getUpdateTime() const {
56  return time_update_;
57  }
58 
61  time_update_ += period;
62  }
63 
65  void setSlowDownFactor(const Float _kappa) {
66  kappa_ = _kappa;
67  kappa_org_ = _kappa;
68  }
69 
71  /* if it is a hyperbolic encounter, (ebin_>0), set slowdown factor to 1.0
72  \return slowdown factor
73  */
75  // hyberbolic case or no perturbation
76  if(pert_in<=0.0) {
77  kappa_org_ = kappa_max_ = kappa_ = Float(1.0);
78  }
79  else {
80  ASSERT(period>0.0);
81  kappa_max_ = std::max(Float(1.0), timescale/period);
82  if (pert_out==0.0) kappa_org_ = kappa_max_;
83  else kappa_org_ = kappa_ref_*pert_in/pert_out;
84  kappa_ = std::min(kappa_org_, kappa_max_);
85  kappa_ = std::max(Float(1.0), kappa_);
86  }
87  return kappa_;
88  }
89 
91 
95  return kappa_;
96  }
97 
99 
103  return kappa_org_;
104  }
105 
108  return kappa_ref_;
109  }
110 
113  return kappa_max_;
114  }
115 
116  Float getPertIn() const {
117  return pert_in;
118  }
119 
120  Float getPertOut() const {
121  return pert_out;
122  }
123 
125  return timescale_max_;
126  }
127 
129 
131  void writeBinary(FILE *_fout) {
132  fwrite(this, sizeof(*this),1,_fout);
133  }
134 
136 
138  void readBinary(FILE *_fin) {
139  size_t rcount = fread(this, sizeof(*this), 1, _fin);
140  if (rcount<1) {
141  std::cerr<<"Error: Data reading fails! requiring data number is 1, only obtain "<<rcount<<".\n";
142  abort();
143  }
144  }
145 
147 
149  static int getBackupDataSize() {
150  return 2;
151  }
152 
154 
157  int backup(Float* _bk) {
158  _bk[0] = kappa_;
159  _bk[1] = time_update_;
160  return 2;
161  }
162 
164 
167  int restore(Float* _bk) {
168  kappa_ = _bk[0];
169  time_update_ = _bk[1];
170  return 2;
171  }
172 
174 
179  void print(std::ostream & fout, const int precision=15, const int width=23) {
180  ASSERT(width>0);
181  ASSERT(precision>0);
182  fout<<"kappa= "<<std::setw(width)<<kappa_
183  <<"kappa_org= "<<std::setw(width)<<kappa_org_
184  <<"kappa_max= "<<std::setw(width)<<kappa_max_
185  <<"kappa_ref= "<<std::setw(width)<<kappa_ref_;
186  }
187 
189 
193  static void printColumnTitle(std::ostream & _fout, const int _width=20) {
194  _fout<<std::setw(_width)<<"SD_factor"
195  <<std::setw(_width)<<"SD_factor_org"
196  <<std::setw(_width)<<"SD_factor_max";
197  }
198 
200 
204  void printColumn(std::ostream & _fout, const int _width=20){
205  _fout<<std::setw(_width)<<kappa_
206  <<std::setw(_width)<<kappa_org_
207  <<std::setw(_width)<<kappa_max_;
208  }
209 
210  };
211 }
AR::SlowDown::getTimescaleMax
Float getTimescaleMax() const
Definition: slow_down.h:124
AR::SlowDown::SlowDown
SlowDown()
defaulted constructor
Definition: slow_down.h:26
AR::SlowDown::timescale
Float timescale
Definition: slow_down.h:22
AR::SlowDown::getPertIn
Float getPertIn() const
Definition: slow_down.h:116
AR::SlowDown::getPertOut
Float getPertOut() const
Definition: slow_down.h:120
Float.h
AR
Algorithmic regularization (time transformed explicit symplectic integrator) namespace.
Definition: force.h:5
AR::SlowDown::getSlowDownFactorMax
Float getSlowDownFactorMax() const
Get slow-down fact maximum.
Definition: slow_down.h:112
AR::SlowDown::clear
void clear()
clear function
Definition: slow_down.h:29
NUMERIC_FLOAT_MAX
const Float NUMERIC_FLOAT_MAX
Definition: Float.h:29
AR::SlowDown::readBinary
void readBinary(FILE *_fin)
read class data with BINARY format
Definition: slow_down.h:138
AR::SlowDown::printColumnTitle
static void printColumnTitle(std::ostream &_fout, const int _width=20)
print titles of class members using column style
Definition: slow_down.h:193
AR::SlowDown::print
void print(std::ostream &fout, const int precision=15, const int width=23)
print slowdown data
Definition: slow_down.h:179
AR::SlowDown::pert_out
Float pert_out
Definition: slow_down.h:21
AR::SlowDown::getSlowDownFactor
Float getSlowDownFactor() const
Get slow-down factor.
Definition: slow_down.h:94
AR::SlowDown::getUpdateTime
Float getUpdateTime() const
get update time for new slowdown factor
Definition: slow_down.h:55
AR::SlowDown::calcSlowDownFactor
Float calcSlowDownFactor()
calculate slowdown factor based on perturbation and inner acceleration
Definition: slow_down.h:74
AR::SlowDown::backup
int backup(Float *_bk)
backup real time and force ratio
Definition: slow_down.h:157
Float
double Float
Definition: Float.h:25
AR::SlowDown::setUpdateTime
void setUpdateTime(const Float _time)
set update time for new slowdown factor
Definition: slow_down.h:50
AR::SlowDown::pert_in
Float pert_in
Definition: slow_down.h:20
AR::SlowDown::getBackupDataSize
static int getBackupDataSize()
get backup data size
Definition: slow_down.h:149
AR::SlowDown::restore
int restore(Float *_bk)
restore real time and force ratio
Definition: slow_down.h:167
AR::SlowDown::initialSlowDownReference
void initialSlowDownReference(const Float _kappa_ref, const Float _timescale_max)
initialize slow-down parameters
Definition: slow_down.h:42
AR::SlowDown::getSlowDownFactorReference
Float getSlowDownFactorReference() const
Get sd reference factor.
Definition: slow_down.h:107
AR::SlowDown::increaseUpdateTimeOnePeriod
void increaseUpdateTimeOnePeriod()
advance update time by one period
Definition: slow_down.h:60
AR::SlowDown::getSlowDownFactorOrigin
Float getSlowDownFactorOrigin() const
Get original slow-down factor.
Definition: slow_down.h:102
AR::SlowDown
Slow-down parameter control class.
Definition: slow_down.h:11
AR::SlowDown::writeBinary
void writeBinary(FILE *_fout)
write class data with BINARY format
Definition: slow_down.h:131
AR::SlowDown::period
Float period
Definition: slow_down.h:23
AR::SlowDown::setSlowDownFactor
void setSlowDownFactor(const Float _kappa)
manually set kappa
Definition: slow_down.h:65
AR::SlowDown::printColumn
void printColumn(std::ostream &_fout, const int _width=20)
print data of class members using column style
Definition: slow_down.h:204