00001  
00016 
00017 
00018 #include "dyn.h"
00019 #include "constants.h"
00020 
00021 #ifdef TOOLBOX
00022 
00023 #define  FALSE  0
00024 #define  TRUE   1
00025 
00026 main(int argc, char ** argv) {
00027 
00028     bool virial_units = false;
00029     real eps = 0;
00030 
00031     dyn *root;
00032 
00033     check_help();
00034 
00035     extern char *poptarg;
00036     int c;
00037     char* param_string = "e:v";
00038 
00039     while ((c = pgetopt(argc, argv, param_string)) != -1)
00040         switch(c) {
00041             case 'e': eps = atof(poptarg);
00042                       break;
00043             case 'v': virial_units = true;
00044                       break;
00045             case '?': params_to_usage(cerr, argv[0], param_string);
00046                       get_help();
00047                       exit(1);
00048         }
00049 
00050     
00051     root = get_dyn(cin);
00052     root->log_history(argc, argv);
00053     
00054     real mtot = root->get_mass();
00055     PRL(mtot);
00056 
00057     
00058     
00059     
00060     
00061     
00062     
00063     
00064     real Uk = cnsts.parameters(Msun)*square(cnsts.physics(km_per_s));
00065     real Up = cnsts.physics(G)*square(cnsts.parameters(Msun))
00066             / cnsts.parameters(PC);
00067     real Newton_G = Up/Uk;
00068 
00069     real P, K, E;
00070     get_top_level_energies(root, eps*eps, P, K);
00071     P *= Newton_G;
00072     E = K + P;
00073     real Q = -K/P;
00074 
00075     cerr << "basis scaling units" << endl;
00076     cerr << "Unit for kinetic energy:   " << K << endl;
00077     cerr << "Unit for potential energy: " << P << endl;
00078     cerr << "Unit for total energy:     " << E << endl;
00079     cerr << "Unit for virial ratio:     " << Q << endl;
00080     cerr << "Unit for G:              1/" << 1/Newton_G << endl;
00081 
00082     cerr << "Virial units" << endl;
00083     real r_vir = -0.5 * Newton_G * pow(mtot, 2) / P;
00084     PRL(r_vir);
00085     real t_vir= 21.0 * sqrt(Q*pow(r_vir, 3) / mtot);
00086     PRL(t_vir);
00087 
00088     real Um = mtot;
00089     real Ul = Newton_G * pow(Um, 2)/(-4*E);
00090     real Ut = Newton_G * pow(Um, 5./2.) / pow(-4*E, 3./2.);
00091         
00092     if(virial_units || Ul<0) {
00093       cerr << "Use virial radius instead of distance unit" << endl;
00094       Ul = r_vir;
00095       cerr << "Use virial radius crossing time as time unit" << endl;
00096       Ut = t_vir;
00097     }
00098 
00099     real Uv = Ul/Ut;
00100 
00101     cerr << "Unit for M:                " << Um << endl;
00102     cerr << "Unit for R:                " << Ul << endl;
00103     cerr << "Unit for T:                " << Ut << endl;
00104     cerr << "Unit for v:                " << Uv << endl;
00105 
00106     
00107     for_all_leaves(dyn, root, bi) {
00108       bi->set_mass(bi->get_mass() / Um);
00109       bi->set_pos(bi->get_pos() / Ul);
00110       bi->set_vel(bi->get_vel() / Uv);
00111     }
00112 
00113     
00114     
00115     
00116     real mf = Um;
00117     
00118     real rf = Ul;
00119       
00120     
00121     real tf = Ut; 
00122     PRC(mf);PRC(rf);PRL(tf);
00123 
00124     root->get_starbase()->set_stellar_evolution_scaling(mf, rf, tf);
00125     root->get_starbase()->print_stellar_evolution_scaling(cerr);
00126 
00127     root->set_mass(1);
00128     put_node(cout, *root);
00129 }
00130 
00131 #endif
00132 
00133 
00134  
00135