Main Page | Namespace List | Class Hierarchy | Class List | Directories | File List | Namespace Members | Class Members | File Members

sdyn.h

00001 
00002        //=======================================================//    _\|/_
00003       //  __  _____           ___                    ___       //      /|\ ~
00004      //  /      |      ^     |   \  |         ^     |   \     //          _\|/_
00005     //   \__    |     / \    |___/  |        / \    |___/    //            /|\ ~
00006    //       \   |    /___\   |  \   |       /___\   |   \   // _\|/_
00007   //     ___/   |   /     \  |   \  |____  /     \  |___/  //   /|\ ~
00008  //                                                       //            _\|/_
00009 //=======================================================//              /|\ ~
00010 
00011 /*
00012  *  sdyn.h: derived class for nbody systems, for scattering experiments
00013  *.............................................................................
00014  *    version 1:  Mar 1994   Piet Hut, Steve McMillan
00015  *    version 2:
00016  *.............................................................................
00017  *     This file includes:
00018  *  1) definition of class sdyn
00019  *.............................................................................
00020  */
00021 
00022 #ifndef  STARLAB_SDYN_H
00023 #  define  STARLAB_SDYN_H
00024 
00025 #define MAX_N_STEPS     VERY_LARGE_NUMBER
00026 //#define MAX_N_STEPS   1000000
00027 
00028 #include  "_dyn_.h"
00029 
00030 /*-----------------------------------------------------------------------------
00031  *  sdyn  --  a derived class of dynamical particles, with enough information
00032  *            to integrate the equations of motions with a 4th-order
00033  *            generalized Hermite polynomial integrator.
00034  *-----------------------------------------------------------------------------
00035  */
00036 class  sdyn : public _dyn_
00037 {
00038     protected:
00039 
00040         xreal  time_offset;
00041     
00042         real  energy_dissipation;          // dissipation associated with this
00043                                            // star due to its merger history
00044 
00045         real  min_encounter_time_sq;       // pair-wise
00046         real  min_free_fall_time_sq;       // pair-wise
00047 
00048         sdyn* nn;               // pointer to the nearest neighbor
00049         real d_nn_sq;           // distance squared to the nearest neighbor
00050                                                 
00051         real  nn_dr2;         // current nearest neighbor distance squared
00052         int   nn_label;       // identity of current nearest neighbor
00053         sdyn* nn_ptr;         // pointer to current nearest neighbor
00054         sdyn* nnn_ptr;        // pointer to current next-nearest neighbor
00055         real  min_nn_dr2;     // minimum-ever nearest neighbor distance squared
00056         int   min_nn_label;   // identity of nearest-ever neighbor
00057 
00058         // For use in determination of substructure:
00059 
00060         real  nnn_dr2;        // distance squared to next-nearest neighbor
00061         int   nnn_label;      // identity of next nearest neighbor
00062 
00063         int   init_nn_label;  // Identity of initial nearest neighbor
00064         int   nn_change_flag; // While zero, nearest neighbor remains unchanged
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 // the following three quantities could be put in the dyn_story.
00075 
00076         real n_steps;       // number of integration steps, to make it easy
00077                            // to store a partially completed experiment, and 
00078                            // complete the run later.
00079         real e_tot_init;       // initial total energy of the system
00080         real de_tot_abs_max;   // maximum error at any previous step in the
00081                                // total energy.
00082 
00083 // for use in determining quarantine status:
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               //            radius = 0;
00099             energy_dissipation = 0;
00100             time_offset = 0;
00101             min_nn_dr2 = VERY_LARGE_NUMBER;
00102             min_nn_label = -1;   // illegal value; no nearest-ever neighbor set
00103             init_nn_label = -1;  // illegal value; no initial neighbor set
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;                   // not a valid number
00182             }
00183 
00184         void  prepare_branch()
00185             {
00186             // nothing in here for now (there was ssd info in the sdyn3 case)
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;  // to enable dynamic array declarations such as
00245                          //    sdyn** sdyn_ptr_array = new sdynptr[n];
00246                          // (note that the following expression is illegal:
00247                          //    sdyn** sdyn_ptr_array = new (sdyn *)[n];)
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);        // to extract information
00265                                                 // from the integrator
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 // Standard integrators for scattering problems:
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 //  |  the end of:  |         /|\         |  inc/sdyn.h
00298 //  +---------------+                     +------------------------------//
00299 //========================= STARLAB =====================================\\ ~
00300 

Generated on Wed Jul 20 12:43:36 2005 for Starlab by  doxygen 1.4.3