PeTar
N-body code for collisional gravitational systems
kickdriftstep.hpp
Go to the documentation of this file.
2  typedef std::array<double,2> KDPair;
3 
4  double ds_; // full step size
5  int mode_; // 0: Kick first; 1: drift first
6  int count_one_step_; // counts for one step case
7  int count_continue_; // counts for continue case
8  bool next_is_start_flag_; // indicate next call should be getDtStartContinue
9  bool next_is_kick_flag_; // indicate next call should be getDtKickContinue
10  std::vector<KDPair> coff_one_step_; // cofficient table for one full step
11  std::vector<KDPair> coff_continue_; // cofficient table for continuing step (mergin first and last step)
12 
13 public:
14 
15  KickDriftStep(): ds_(0.0), mode_(0), count_one_step_(0), count_continue_(0), next_is_start_flag_(true), next_is_kick_flag_(true) {}
16 
19  count_one_step_ = 0;
20  }
21 
24  count_continue_ = 0;
25  }
26 
28  void nextOneStep() {
29  count_one_step_++;
30  count_one_step_ %= coff_one_step_.size();
31  }
32 
34  void nextContinue() {
35  if (next_is_start_flag_||(mode_==0&&!next_is_kick_flag_)||(mode_==1&&next_is_kick_flag_)) {
36  std::cerr<<"Error: not finish one K-D pair, cannot go to next pair!\n";
37  abort();
38  }
39  count_continue_++;
40  count_continue_ %= coff_continue_.size();
41  }
42 
45  return count_one_step_;
46  }
47 
49 
52  return count_continue_;
53  }
54 
56  void setDKDMode() {
57  if(count_one_step_||!next_is_start_flag_) {
58  std::cerr<<"Error: in the middel step, cannot switch mode!\n";
59  abort();
60  }
61  next_is_kick_flag_=false;
62  mode_ = 1;
63  }
64 
66  void setKDKMode() {
67  if(count_one_step_||!next_is_start_flag_) {
68  std::cerr<<"Error: in the middel step, cannot switch mode!\n";
69  abort();
70  }
71  next_is_kick_flag_=true;
72  mode_ = 0;
73  }
74 
76  void setStep(const PS::F64 _ds) {
77  if(count_one_step_||!next_is_start_flag_) {
78  std::cerr<<"Error: in the middel step, cannot reset step size!\n";
79  abort();
80  }
81  ds_ = _ds;
82  coff_one_step_.clear();
83  coff_continue_.clear();
84 #if (defined KDKDK_2ND) || (defined KDKDK_4TH)
85  coff_one_step_.reserve(3);
86  coff_one_step_.push_back(KDPair({ds_ /6.0, 0.5*ds_}));
87  // use ds_ - ** to remove roundoff error
88  coff_one_step_.push_back(KDPair({ds_*4.0/6.0, ds_ - coff_one_step_[0][1]}));
89  coff_one_step_.push_back(KDPair({ds_- coff_one_step_[0][0] - coff_one_step_[1][0], 0.0}));
90 
91  coff_continue_.reserve(2);
92  coff_continue_.push_back(KDPair({coff_one_step_[0][0] + coff_one_step_[2][0], coff_one_step_[0][1]}));
93  coff_continue_.push_back(KDPair({coff_one_step_[1][0], coff_one_step_[1][1]}));
94 #else
95  coff_one_step_.reserve(2);
96  coff_one_step_.push_back(KDPair({0.5*ds_, ds_}));
97  coff_one_step_.push_back(KDPair({ds_ - coff_one_step_[0][0], 0.0}));
98  assert(coff_one_step_.size()==2);
99 
100  coff_continue_.reserve(1);
101  coff_continue_.push_back(KDPair({ds_, ds_}));
102  assert(coff_continue_.size()==1);
103 #endif
104  }
105 
107  PS::F64 getStep() const {
108  return ds_;
109  }
110 
113  return coff_one_step_[count_one_step_][mode_];
114  }
115 
118  return coff_one_step_[count_one_step_][1-mode_];
119  }
120 
123  if (next_is_start_flag_) {
124  std::cerr<<"Error: not yet call start step!\n";
125  abort();
126  }
127  if (!next_is_kick_flag_) {
128  std::cerr<<"Error: try get kick steps twice!\n";
129  abort();
130  }
131  next_is_kick_flag_ = false;
132  return coff_continue_[count_continue_][mode_];
133  }
134 
137  if (next_is_start_flag_) {
138  std::cerr<<"Error: not yet call start step!\n";
139  abort();
140  }
141  if (next_is_kick_flag_) {
142  std::cerr<<"Error: try get drift steps twice!\n";
143  abort();
144  }
145  next_is_kick_flag_ = true;
146  return coff_continue_[count_continue_][1-mode_];
147  }
148 
151  if (!next_is_start_flag_) {
152  std::cerr<<"Error: try to obtain the first step dt during the middle (count = "<<count_continue_<<")!\n";
153  abort();
154  }
155  next_is_start_flag_ = false;
156  next_is_kick_flag_ = !next_is_kick_flag_;
157  return coff_one_step_[0][mode_];
158  }
159 
162  if (!isNextEndPossible()) {
163  std::cerr<<"Error: try to obtain the last step dt during the middle (count = "<<count_continue_<<")!\n";
164  abort();
165  }
166  // reset start flag to true
167  next_is_start_flag_ = true;
168  return coff_one_step_[coff_one_step_.size()-1][mode_];
169  }
170 
172  bool isNextStart() const {
173  return next_is_start_flag_;
174  }
175 
177  bool isNextEndPossible() const {
178  return count_continue_==0&&!next_is_start_flag_&&((mode_==0&&next_is_kick_flag_)||(mode_==1&&!next_is_kick_flag_));
179  }
180 };
KickDriftStep::getDtEndContinue
PS::F64 getDtEndContinue()
Get ending step size for continue case.
Definition: kickdriftstep.hpp:161
IOParams::value
Type value
Definition: io.hpp:43
KickDriftStep::setDKDMode
void setDKDMode()
set DKD mode (default is KDK)
Definition: kickdriftstep.hpp:56
PIKG::S32
int32_t S32
Definition: pikg_vector.hpp:24
IOParamsContainer::print
void print(std::ostream &os) const
Definition: io.hpp:192
IOParamsContainer::readAscii
void readAscii(FILE *_fin)
Definition: io.hpp:112
KickDriftStep
Definition: kickdriftstep.hpp:1
IOParamsContainer::printHelp
void printHelp(std::ostream &os, const int _offset_short_key=2, const int _offset_long_key=1, const int _width_key=23) const
Definition: io.hpp:198
KickDriftStep::getDtKickOneStep
PS::F64 getDtKickOneStep() const
Get kick step size for one full step.
Definition: kickdriftstep.hpp:112
KickDriftStep::getStep
PS::F64 getStep() const
get base step size
Definition: kickdriftstep.hpp:107
PIKG::F64
double F64
Definition: pikg_vector.hpp:17
IOParams::print
void print(std::ostream &os) const
Definition: io.hpp:54
KickDriftStep::setStep
void setStep(const PS::F64 _ds)
set base step size
Definition: kickdriftstep.hpp:76
KickDriftStep::isNextStart
bool isNextStart() const
get whether next is start
Definition: kickdriftstep.hpp:172
KickDriftStep::isNextEndPossible
bool isNextEndPossible() const
get whether next can be end
Definition: kickdriftstep.hpp:177
io.hpp
KickDriftStep::setKDKMode
void setKDKMode()
set DKD mode (default is KDK)
Definition: kickdriftstep.hpp:66
IOParamsContainer::writeAscii
void writeAscii(FILE *_fout)
Definition: io.hpp:106
KickDriftStep::getCountContinue
PS::S32 getCountContinue() const
get step count for continue case
Definition: kickdriftstep.hpp:51
KickDriftStep::KickDriftStep
KickDriftStep()
Definition: kickdriftstep.hpp:15
IOParams< PS::S64 >
KickDriftStep::resetCountContinue
void resetCountContinue()
reset step count for continuing case
Definition: kickdriftstep.hpp:23
KickDriftStep::getDtKickContinue
PS::F64 getDtKickContinue()
Get kick step size for continue case.
Definition: kickdriftstep.hpp:122
KickDriftStep::getCountOneStep
PS::S32 getCountOneStep() const
get step count for one full step case
Definition: kickdriftstep.hpp:44
KickDriftStep::nextOneStep
void nextOneStep()
advance step count for one full step case
Definition: kickdriftstep.hpp:28
KickDriftStep::getDtStartContinue
PS::F64 getDtStartContinue()
Get staring step size for continue case.
Definition: kickdriftstep.hpp:150
KickDriftStep::getDtDriftContinue
PS::F64 getDtDriftContinue()
Get drift step size for continue case.
Definition: kickdriftstep.hpp:136
KickDriftStep::resetCountOneStep
void resetCountOneStep()
reset step count for one full step case
Definition: kickdriftstep.hpp:18
IOParamsContainer
IO Params container.
Definition: io.hpp:82
main
int main(int argc, char **argv)
Definition: io_test.cxx:7
KickDriftStep::nextContinue
void nextContinue()
advance step count for continuing case
Definition: kickdriftstep.hpp:34
KickDriftStep::getDtDriftOneStep
PS::F64 getDtDriftOneStep() const
Get drift step size for one full step
Definition: kickdriftstep.hpp:117