00001 00003 // (Based on "slow-KS" treatment of Mikkola & Aarseth.) 00004 00006 00007 class slow_binary { 00008 00009 private: 00010 00011 int kappa; 00012 xreal t_init; 00013 xreal t_apo; 00014 real tau; 00015 real tau_pred; 00016 real dtau; 00017 vec acc_p; 00018 vec jerk_p; 00019 vec old_acc_p; 00020 vec old_jerk_p; 00021 bool stop; 00022 00023 public: 00024 00025 slow_binary(int k = 1) { 00026 kappa = k; 00027 t_init = t_apo = tau = tau_pred = dtau = 0; 00028 acc_p = jerk_p = old_acc_p = old_jerk_p = 0; 00029 stop = false; 00030 } 00031 00032 // Convert slow time to real time. 00033 00034 xreal tau_to_time(real tt = 0) { 00035 if (tt == 0) 00036 return t_init + kappa * tau; 00037 else 00038 return t_init + kappa * tt; 00039 } 00040 00042 00043 real time_to_tau(xreal t) {return ((real)(t - t_init)) / kappa;} 00044 00045 void set_kappa(int k) {kappa = k;} 00046 int get_kappa() {return kappa;} 00047 00048 void set_t_init(xreal t) {t_init = t;} 00049 xreal get_t_init() {return t_init;} 00050 00051 void set_t_apo(xreal t) {t_apo = t;} 00052 xreal get_t_apo() {return t_apo;} 00053 00054 void set_tau(real t) {tau = t;} 00055 void inc_tau(real dt) {tau += dt;} 00056 real get_tau() {return tau;} 00057 00058 void set_tau_pred(real t) {tau_pred = t;} 00059 void clear_tau_pred() {tau_pred = -VERY_LARGE_NUMBER;} 00060 void init_tau_pred() {tau_pred = tau;} 00061 00062 real get_tau_pred() {return tau_pred;} 00063 00064 void set_dtau(real dt) {dtau = dt;} 00065 real get_dtau() {return dtau;} 00066 00067 void set_acc_p(vec a) {acc_p = a;} 00068 vec get_acc_p() {return acc_p;} 00069 00070 void set_jerk_p(vec j) {jerk_p = j;} 00071 vec get_jerk_p() {return jerk_p;} 00072 00073 void set_old_acc_p(vec a) {old_acc_p = a;} 00074 vec get_old_acc_p() {return old_acc_p;} 00075 00076 void set_old_jerk_p(vec j) {old_jerk_p = j;} 00077 vec get_old_jerk_p() {return old_jerk_p;} 00078 00079 void store_old_force() { 00080 old_acc_p = acc_p; 00081 old_jerk_p = jerk_p; 00082 } 00083 00084 void set_stop(bool v = true) {stop = v;} 00085 bool get_stop() {return stop;} 00086 00087 }; 00088 00089 class _dyn_; // to permit the_node pointer below... 00090 00092 00093 class slow_perturbed { 00094 00095 private: 00096 00097 _dyn_ *the_node; 00098 int kappa; 00099 vec acc_p; 00100 vec jerk_p; 00101 vec old_acc_p; 00102 vec old_jerk_p; 00103 slow_perturbed *sp; 00104 00105 public: 00106 00107 slow_perturbed() { 00108 the_node = NULL; 00109 kappa = 1; 00110 acc_p = jerk_p = old_acc_p = old_jerk_p = 0; 00111 sp = NULL; 00112 } 00113 00114 ~slow_perturbed() { 00115 if (sp) delete sp; // recursive 00116 } 00117 00118 void set_node(_dyn_ *n) {the_node = n;} 00119 _dyn_ *get_node() {return the_node;} 00120 00121 void set_kappa(int k) {kappa = k;} 00122 int get_kappa() {return kappa;} 00123 00124 void set_acc_p(vec a) {acc_p = a;} 00125 vec get_acc_p() {return acc_p;} 00126 00127 void set_jerk_p(vec j) {jerk_p = j;} 00128 vec get_jerk_p() {return jerk_p;} 00129 00130 void set_old_acc_p(vec a) {old_acc_p = a;} 00131 vec get_old_acc_p() {return old_acc_p;} 00132 00133 void set_old_jerk_p(vec j) {old_jerk_p = j;} 00134 vec get_old_jerk_p() {return old_jerk_p;} 00135 00136 void store_old_force() { 00137 old_acc_p = acc_p; 00138 old_jerk_p = jerk_p; 00139 if (sp) sp->store_old_force(); // recursive! 00140 } 00141 00142 void set_next(slow_perturbed *s) {sp = s;} 00143 slow_perturbed *get_next() {return sp;} 00144 };