PeTar
N-body code for collisional gravitational systems
|
Go to the documentation of this file.
2 typedef std::array<double,2> KDPair;
8 bool next_is_start_flag_;
9 bool next_is_kick_flag_;
10 std::vector<KDPair> coff_one_step_;
11 std::vector<KDPair> coff_continue_;
15 KickDriftStep(): ds_(0.0), mode_(0), count_one_step_(0), count_continue_(0), next_is_start_flag_(true), next_is_kick_flag_(true) {}
30 count_one_step_ %= coff_one_step_.size();
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";
40 count_continue_ %= coff_continue_.size();
45 return count_one_step_;
52 return count_continue_;
57 if(count_one_step_||!next_is_start_flag_) {
58 std::cerr<<
"Error: in the middel step, cannot switch mode!\n";
61 next_is_kick_flag_=
false;
67 if(count_one_step_||!next_is_start_flag_) {
68 std::cerr<<
"Error: in the middel step, cannot switch mode!\n";
71 next_is_kick_flag_=
true;
77 if(count_one_step_||!next_is_start_flag_) {
78 std::cerr<<
"Error: in the middel step, cannot reset step size!\n";
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_}));
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}));
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]}));
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);
100 coff_continue_.reserve(1);
101 coff_continue_.push_back(KDPair({ds_, ds_}));
102 assert(coff_continue_.size()==1);
113 return coff_one_step_[count_one_step_][mode_];
118 return coff_one_step_[count_one_step_][1-mode_];
123 if (next_is_start_flag_) {
124 std::cerr<<
"Error: not yet call start step!\n";
127 if (!next_is_kick_flag_) {
128 std::cerr<<
"Error: try get kick steps twice!\n";
131 next_is_kick_flag_ =
false;
132 return coff_continue_[count_continue_][mode_];
137 if (next_is_start_flag_) {
138 std::cerr<<
"Error: not yet call start step!\n";
141 if (next_is_kick_flag_) {
142 std::cerr<<
"Error: try get drift steps twice!\n";
145 next_is_kick_flag_ =
true;
146 return coff_continue_[count_continue_][1-mode_];
151 if (!next_is_start_flag_) {
152 std::cerr<<
"Error: try to obtain the first step dt during the middle (count = "<<count_continue_<<
")!\n";
155 next_is_start_flag_ =
false;
156 next_is_kick_flag_ = !next_is_kick_flag_;
157 return coff_one_step_[0][mode_];
163 std::cerr<<
"Error: try to obtain the last step dt during the middle (count = "<<count_continue_<<
")!\n";
167 next_is_start_flag_ =
true;
168 return coff_one_step_[coff_one_step_.size()-1][mode_];
173 return next_is_start_flag_;
178 return count_continue_==0&&!next_is_start_flag_&&((mode_==0&&next_is_kick_flag_)||(mode_==1&&!next_is_kick_flag_));
PS::F64 getDtEndContinue()
Get ending step size for continue case.
Definition: kickdriftstep.hpp:161
Type value
Definition: io.hpp:43
void setDKDMode()
set DKD mode (default is KDK)
Definition: kickdriftstep.hpp:56
int32_t S32
Definition: pikg_vector.hpp:24
void print(std::ostream &os) const
Definition: io.hpp:192
void readAscii(FILE *_fin)
Definition: io.hpp:112
Definition: kickdriftstep.hpp:1
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
PS::F64 getDtKickOneStep() const
Get kick step size for one full step.
Definition: kickdriftstep.hpp:112
PS::F64 getStep() const
get base step size
Definition: kickdriftstep.hpp:107
double F64
Definition: pikg_vector.hpp:17
void print(std::ostream &os) const
Definition: io.hpp:54
void setStep(const PS::F64 _ds)
set base step size
Definition: kickdriftstep.hpp:76
bool isNextStart() const
get whether next is start
Definition: kickdriftstep.hpp:172
bool isNextEndPossible() const
get whether next can be end
Definition: kickdriftstep.hpp:177
void setKDKMode()
set DKD mode (default is KDK)
Definition: kickdriftstep.hpp:66
void writeAscii(FILE *_fout)
Definition: io.hpp:106
PS::S32 getCountContinue() const
get step count for continue case
Definition: kickdriftstep.hpp:51
KickDriftStep()
Definition: kickdriftstep.hpp:15
void resetCountContinue()
reset step count for continuing case
Definition: kickdriftstep.hpp:23
PS::F64 getDtKickContinue()
Get kick step size for continue case.
Definition: kickdriftstep.hpp:122
PS::S32 getCountOneStep() const
get step count for one full step case
Definition: kickdriftstep.hpp:44
void nextOneStep()
advance step count for one full step case
Definition: kickdriftstep.hpp:28
PS::F64 getDtStartContinue()
Get staring step size for continue case.
Definition: kickdriftstep.hpp:150
PS::F64 getDtDriftContinue()
Get drift step size for continue case.
Definition: kickdriftstep.hpp:136
void resetCountOneStep()
reset step count for one full step case
Definition: kickdriftstep.hpp:18
IO Params container.
Definition: io.hpp:82
int main(int argc, char **argv)
Definition: io_test.cxx:7
void nextContinue()
advance step count for continuing case
Definition: kickdriftstep.hpp:34
PS::F64 getDtDriftOneStep() const
Get drift step size for one full step
Definition: kickdriftstep.hpp:117