00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00040
00041
00042
00043 #include "dyn.h"
00044
00045 #ifndef TOOLBOX
00046
00047 bool get_physical_scales(dyn *b, real& mass, real& length, real& time)
00048 {
00049 mass = length = time = -1;
00050
00051 if (b)
00052 if (b->get_starbase()) {
00053
00054 #define Rsun_pc 2.255e-8 // R_sun/1 parsec = 6.960e+10/3.086e+18;
00055
00056 mass = b->get_starbase()->conv_m_dyn_to_star(1);
00057 length = b->get_starbase()->conv_r_dyn_to_star(1) * Rsun_pc;
00058 time = b->get_starbase()->conv_t_dyn_to_star(1);
00059
00060 return (mass > 0 && length > 0 && time > 0);
00061 }
00062
00063 return false;
00064 }
00065
00066 void add_power_law(dyn *b,
00067 real coeff, real exponent, real scale,
00068 vector center,
00069 bool n_flag,
00070 bool verbose,
00071 bool G_flag)
00072 {
00073
00074
00075 char id[9];
00076 int ind;
00077
00078 if (exponent == 0) {
00079 strcpy(id, "plummer");
00080 ind = 14;
00081 } else {
00082 strcpy(id, "power_law");
00083 ind = 16;
00084 }
00085
00086
00087
00088 real mass, length, time;
00089 bool phys = get_physical_scales(b, mass, length, time);
00090
00091
00092
00093
00094
00095 if (phys && !n_flag) {
00096
00097 cerr << "add_" << id
00098 << ": converting input physical parameters to N-body units"
00099 << endl;
00100 PRI(ind);
00101 if (exponent == 0)
00102 cerr << "M";
00103 else
00104 cerr << "A";
00105 cerr << " = " << coeff << " Msun, a = " << scale
00106 << " pc" << endl;
00107 PRI(ind); cerr << "center = (" << center << ") pc" << endl;
00108 PRI(ind); cerr << "N-body mass scale = " << mass
00109 << " Msun, length scale = " << length
00110 << " pc" << endl;
00111
00112
00113
00114 coeff *= pow(length, exponent) / mass;
00115 scale /= length;
00116 center /= length;
00117
00118 } else {
00119
00120 cerr << "add_" << id
00121 << ": interpreting input parameters as N-body units"
00122 << endl;
00123
00124 if (G_flag) {
00125
00126
00127
00128 PRI(ind); cerr << "warning: -G but ";
00129 if (phys)
00130 cerr << "ignoring";
00131 else
00132 cerr << "no";
00133 cerr << " physical scaling" << endl;
00134 }
00135 }
00136
00137 PRI(ind);
00138 if (phys && !n_flag) cerr << "N-body ";
00139
00140 if (exponent != 0) {
00141
00142 putrq(b->get_log_story(), "kira_pl_coeff", coeff);
00143 putrq(b->get_log_story(), "kira_pl_exponent", exponent);
00144 putrq(b->get_log_story(), "kira_pl_scale", scale);
00145 putvq(b->get_log_story(), "kira_pl_center", center);
00146
00147
00148 cerr << "A = " << coeff << ", a = " << scale
00149 << ", x = " << exponent << endl;
00150
00151 } else {
00152
00153 putrq(b->get_log_story(), "kira_plummer_mass", coeff);
00154 putrq(b->get_log_story(), "kira_plummer_scale", scale);
00155 putvq(b->get_log_story(), "kira_plummer_center", center);
00156
00157 cerr << "M = " << coeff << ", a = " << scale << endl;
00158 }
00159
00160 PRI(ind); cerr << "center = (" << center << ")" << endl;
00161 }
00162
00163 #else
00164
00165 main(int argc, char *argv[])
00166 {
00167 bool c_flag = false;
00168 char *comment;
00169
00170 real coeff = 1, scale = 1, exponent = 0;
00171 vector center = 0;
00172
00173 bool G_flag = false;
00174 bool n_flag = false;
00175
00176 check_help();
00177
00178 extern char *poptarg;
00179 extern char *poparr[];
00180 int c;
00181 char* param_string = "A:a:c:C:::e:E:GnR:x:X:";
00182
00183 dyn *b = get_dyn(cin);
00184 if (b == NULL) err_exit("Can't read input snapshot");
00185
00186 b->log_history(argc, argv);
00187
00188
00189
00190 while ((c = pgetopt(argc, argv, param_string)) != -1) {
00191 switch (c) {
00192 case 'A':
00193 case 'M': coeff = atof(poptarg);
00194 break;
00195
00196 case 'c': c_flag = TRUE;
00197 comment = poptarg;
00198 break;
00199
00200 case 'C': center = vector(atof(poparr[0]),
00201 atof(poparr[1]),
00202 atof(poparr[2]));
00203 break;
00204 case 'e':
00205 case 'E':
00206 case 'x':
00207 case 'X':
00208 exponent = atof(poptarg);
00209 break;
00210
00211 case 'a':
00212 case 'R': scale = atof(poptarg);
00213 break;
00214
00215 case 'G': G_flag = true;
00216 break;
00217 case 'n': n_flag = true;
00218 break;
00219
00220 default:
00221 case '?': params_to_usage(cerr, argv[0], param_string);
00222 get_help();
00223 return false;
00224 }
00225 }
00226
00227 if (c_flag)
00228 b->log_comment(comment);
00229
00230 if (G_flag) {
00231
00232
00233
00234 coeff = 4.25e6;
00235 exponent = 1.2;
00236
00237 scale = 0.1;
00238 center = vector(0,0,0);
00239 }
00240
00241 add_power_law(b, coeff, exponent, scale, center, n_flag, true, G_flag);
00242 put_node(cout, *b);
00243 }
00244
00245 #endif