00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef STARLAB_SDYN_H
00023 # define STARLAB_SDYN_H
00024
00025 #define MAX_N_STEPS VERY_LARGE_NUMBER
00026
00027
00028 #include "_dyn_.h"
00029
00030
00031
00032
00033
00034
00035
00036 class sdyn : public _dyn_
00037 {
00038 protected:
00039
00040 xreal time_offset;
00041
00042 real energy_dissipation;
00043
00044
00045 real min_encounter_time_sq;
00046 real min_free_fall_time_sq;
00047
00048 sdyn* nn;
00049 real d_nn_sq;
00050
00051 real nn_dr2;
00052 int nn_label;
00053 sdyn* nn_ptr;
00054 sdyn* nnn_ptr;
00055 real min_nn_dr2;
00056 int min_nn_label;
00057
00058
00059
00060 real nnn_dr2;
00061 int nnn_label;
00062
00063 int init_nn_label;
00064 int nn_change_flag;
00065
00066 real new_pot;
00067 vec new_pos;
00068 vec new_vel;
00069 vec new_acc;
00070 vec new_jerk;
00071
00072 void accumulate_new_acc_and_jerk_from_new(sdyn *, real, int, int &, real&);
00073
00074
00075
00076 real n_steps;
00077
00078
00079 real e_tot_init;
00080 real de_tot_abs_max;
00081
00082
00083
00084
00085 int temp_quarantine_flag;
00086 int quarantine_flag;
00087 real quarantine_time;
00088 real quarantine_sma;
00089 real quarantine_ecc;
00090
00091 public:
00092
00093 sdyn(hbpfp the_hbpfp = new_hydrobase, sbpfp the_sbpfp = new_starbase)
00094 : _dyn_(the_hbpfp, the_sbpfp)
00095 {
00096 nn = NULL;
00097 d_nn_sq = 0;
00098
00099 energy_dissipation = 0;
00100 time_offset = 0;
00101 min_nn_dr2 = VERY_LARGE_NUMBER;
00102 min_nn_label = -1;
00103 init_nn_label = -1;
00104 nn_change_flag = 0;
00105 n_steps = 0;
00106 de_tot_abs_max = 0;
00107 }
00108
00109 real get_pot() {return pot;}
00110 xreal get_time_offset() {return time_offset;}
00111
00112 real get_new_pot() {return new_pot;}
00113 vec get_new_pos() {return new_pos;}
00114 vec get_new_vel() {return new_vel;}
00115 vec get_new_acc() {return new_acc;}
00116 vec get_new_jerk() {return new_jerk;}
00117
00118 real get_min_encounter_time_sq() {return min_encounter_time_sq;}
00119 real get_min_free_fall_time_sq() {return min_free_fall_time_sq;}
00120
00121 void set_min_encounter_time_sq(real t) {min_encounter_time_sq = t;}
00122 void set_min_free_fall_time_sq(real t) {min_free_fall_time_sq = t;}
00123
00124 real get_n_steps() {return n_steps;}
00125 void set_n_steps(real n) {n_steps = n;}
00126
00127 void set_e_tot_init(real en) {e_tot_init = en;}
00128
00129 void set_min_nn_dr2(real r) {min_nn_dr2 = r;}
00130 void set_min_nn_label(int label) {min_nn_label = label;}
00131 void set_init_nn_label(int label) {init_nn_label = label;}
00132 void set_nn_change_flag(int flag) {nn_change_flag = flag;}
00133
00134 sdyn * get_nn(){return nn;}
00135 void set_nn(sdyn * new_nn){nn = new_nn;}
00136 real get_d_nn_sq(){return d_nn_sq;}
00137 void set_d_nn_sq(real d){d_nn_sq = d;}
00138
00139 void set_nn_dr2(real r) {nn_dr2 = r;}
00140 void set_nnn_dr2(real r) {nnn_dr2 = r;}
00141 void set_nn_label(int label) {nn_label = label;}
00142 void set_nnn_label(int label) {nnn_label = label;}
00143 void set_nn_ptr(sdyn* ptr) {nn_ptr = ptr;}
00144 void set_nnn_ptr(sdyn* ptr) {nnn_ptr = ptr;}
00145
00146 real get_nn_dr2() {return nn_dr2;}
00147 real get_nnn_dr2() {return nnn_dr2;}
00148 int get_nn_label() {return nn_label;}
00149 int get_nnn_label() {return nnn_label;}
00150 sdyn* get_nn_ptr() {return nn_ptr;}
00151 sdyn* get_nnn_ptr() {return nnn_ptr;}
00152
00153 real get_min_nn_dr2() {return min_nn_dr2;}
00154 int get_min_nn_label() {return min_nn_label;}
00155 int get_init_nn_label() {return init_nn_label;}
00156 int get_nn_change_flag() {return nn_change_flag;}
00157
00158 real get_radius() {return radius;}
00159 void set_radius(real r) {radius = r;}
00160
00161 real get_energy_dissipation() {return energy_dissipation;}
00162 void set_energy_dissipation(real d) {energy_dissipation = d;}
00163
00164 void set_temp_quarantine_flag(int f) {temp_quarantine_flag = f;}
00165 void set_quarantine_flag(int f) {quarantine_flag = f;}
00166 void set_quarantine_time(real t) {quarantine_time = t;}
00167 void set_quarantine_sma(real a) {quarantine_sma = a;}
00168 void set_quarantine_ecc(real e) {quarantine_ecc = e;}
00169
00170 int get_temp_quarantine_flag() {return temp_quarantine_flag;}
00171 int get_quarantine_flag() {return quarantine_flag;}
00172 real get_quarantine_time() {return quarantine_time;}
00173 real get_quarantine_sma() {return quarantine_sma;}
00174 real get_quarantine_ecc() {return quarantine_ecc;}
00175
00176 void clear_new_interaction() {new_acc=new_jerk=new_pot = 0;}
00177 void clear_de_tot_abs_max() {de_tot_abs_max = 0;}
00178
00179 void prepare_root()
00180 {
00181 min_nn_dr2 = -1;
00182 }
00183
00184 void prepare_branch()
00185 {
00186
00187 }
00188
00189 void inc_time(real dt) {time += dt;}
00190
00191 void begin_offset_time(real t_off) {time -= t_off;
00192 time_offset += t_off;}
00193
00194 void end_offset_time() {time += time_offset;
00195 time_offset = 0;}
00196
00197 void inc_new_pot(real dp) {new_pot += dp;}
00198 void inc_new_acc(vec da) {new_acc += da;}
00199 void inc_new_jerk(vec dj) {new_jerk += dj;}
00200
00201 void calculate_new_acc_and_jerk_from_new(sdyn *, real, int, int &, real&);
00202
00203 void taylor_pred_new_pos_and_vel(const real);
00204
00205 void taylor_pred_new_pos(const real dt)
00206 {
00207 new_pos = pos + dt * ( vel + 0.5*dt * acc );
00208 new_pos += (1./6) * dt*dt*dt * jerk;
00209 }
00210
00211 void taylor_pred_new_vel(const real dt)
00212 {
00213 new_vel = vel + dt * acc;
00214 new_vel += (1./2) * dt*dt * jerk;
00215 }
00216
00217 void correct_new_acc_and_jerk(const real, const real);
00218 void correct_new_pos_and_vel(const real);
00219
00220 void store_new_into_old()
00221 {
00222 pot = new_pot;
00223 pos = new_pos;
00224 vel = new_vel;
00225 acc = new_acc;
00226 jerk = new_jerk;
00227 }
00228
00229 sdyn * get_parent()
00230 {return (sdyn*) node::get_parent();}
00231 sdyn * get_oldest_daughter()
00232 {return (sdyn*)node::get_oldest_daughter();}
00233 sdyn * get_younger_sister()
00234 {return (sdyn*) node::get_younger_sister();}
00235 sdyn * get_elder_sister()
00236 {return (sdyn*) node::get_elder_sister();}
00237
00238 virtual istream& scan_dyn_story(istream&);
00239 virtual ostream& print_dyn_story(ostream &s,
00240 bool print_xreal = true,
00241 int short_output = 0);
00242 };
00243
00244 typedef sdyn * sdynptr;
00245
00246
00247
00248
00249 inline node * new_sdyn(hbpfp the_hbpfp, sbpfp the_sbpfp,
00250 bool use_stories = true)
00251 {return (node *) new sdyn(the_hbpfp, the_sbpfp);}
00252
00253 inline sdyn * mksdyn(int n, hbpfp the_hbpfp = new_hydrobase,
00254 sbpfp the_sbpfp = new_starbase)
00255 {return (sdyn *) mk_flat_tree(n, new_sdyn, the_hbpfp, the_sbpfp);}
00256
00257 inline sdyn * get_sdyn(istream & s = cin,
00258 hbpfp the_hbpfp = new_hydrobase,
00259 sbpfp the_sbpfp = new_starbase)
00260 {return (sdyn *) get_node(s, new_sdyn, the_hbpfp, the_sbpfp);}
00261
00262 #define put_sdyn put_node
00263
00264 typedef void (*sdyn_print_fp)(sdynptr);
00265
00266 void make_tree(sdyn*, bool, bool, int, int);
00267
00268 real calculate_energy(sdyn*, real&, real&);
00269 real calculate_energy_from_scratch(sdyn*, real&, real&);
00270
00271 sdyn* first_leaf(sdyn*);
00272 sdyn* next_leaf(sdyn*);
00273
00274 char* id(sdyn*);
00275
00276
00277
00278 bool tree_evolve(sdyn*, real, real, real, real, real,
00279 real &,
00280 real cpu_time_check = 3600,
00281 real dt = VERY_LARGE_NUMBER,
00282 sdyn_print_fp p = NULL);
00283 bool low_n_evolve(sdyn*, real, real, real, real, real, real,
00284 int, char *, int, int, real,
00285 real&,
00286 real cpu_time_check = 3600,
00287 real dt = VERY_LARGE_NUMBER,
00288 sdyn_print_fp p = NULL);
00289
00290 real merge_collisions(sdyn * b, int ci);
00291 void merge(sdyn * bi, sdyn * bj);
00292 bool tree_is_unbound(sdyn* root, real ttf, int debug);
00293 #endif
00294
00295
00296
00297
00298
00299
00300