local real tapered_power_law(real m, const real x1 = -1.35, const real x2 = 2.4, const real mbreak = 0.25) { if (twiddles(m_lower, m_upper, TOL)) return 0.5*(m_lower+m_upper); // Steve, 5/05 real x = randinter(1, 91.43); real ms = 0; if(x < 1) ms = randinter(5.62, 100); else if(x < 2) ms = randinter(3.55, 5.62); else if(x < 5.16) ms = randinter(2.24, 3.55); else if(x < 9.14) ms = randinter(1.41, 2.24); else if(x < 15.17) ms = randinter(0.89, 1.41); else if(x < 21.93) ms = randinter(0.56, 0.89); else if(x < 37.07) ms = randinter(0.35, 0.56); else if(x < 57.03) ms = randinter(0.22, 0.35); else if(x < 73.63) ms = randinter(0.14, 0.22); else if(x < 85.93) ms = randinter(0.09, 0.14); else if(x < 91.43) ms = randinter(0.04, 0.09); else ms = randinter(0.0, 0.04); // 562 3.55 2.24 1.41 0.89 0.56 0.35 0.22 0.14 0.09 0.04 // | | | | | | | | | | // 1.00 3.16 3.98 6.03 6.76 15.14 19.96 16.60 12.30 5.5 // 1 2.00 5.16 9.14 15.17 21.93 37.07 57.03 73.63 85.93 91.43 return ms; }
void compute_max_cod(dyn *b, vec& pos, vec& vel) { // First see if the data are already known. if (find_qmatch(b->get_dyn_story(), "density_center_type")) if (streq(getsq(b->get_dyn_story(), "density_center_type"), "max")) { if (twiddles(getrq(b->get_dyn_story(), "density_center_time"), b->get_system_time(), TTOL)) { pos = getvq(b->get_dyn_story(), "density_center_pos"); vel = getvq(b->get_dyn_story(), "density_center_vel"); return; } } real max_density = 0; pos = 0; vel = 0; // for_all_leaves(dyn, b, d) for_all_daughters(dyn, b, d) { real dens_time = getrq(d->get_dyn_story(), "density_time"); if (!twiddles(dens_time, b->get_system_time(), TTOL) && print_msg) { warning("compute_max_cod: using out-of-date densities."); PRC(d->format_label()), PRL(dens_time); if (++msg_count > MAX_MSG_COUNT) print_msg = false; } real this_density = getrq(d->get_dyn_story(), "density"); if (this_density > 0) { if (max_density < this_density) { max_density = this_density; pos = d->get_pos(); vel = d->get_vel(); } } else if (this_density <= -VERY_LARGE_NUMBER) { if (print_msg) { warning("compute_max_cod: density not set."); PRL(d->format_label()); } if (++msg_count > MAX_MSG_COUNT) print_msg = false; } }
void Twi_4(void* inputFIFOs[], void* outputFIFOs[], Param inParams[], Param outParams[]){ twiddles( /* size */ (Param) inParams[0], /* n */ (Param) inParams[1], /* ix */ (int*) inputFIFOs[0], /* in */ (Cplx16*) inputFIFOs[1], /* out */ (Cplx16*) outputFIFOs[0] ); }
local real mf_Miller_Scalo(real m_lower, real m_upper) { if (twiddles(m_lower, m_upper, TOL)) return 0.5*(m_lower+m_upper); // Steve, 5/05 real m, rnd; do { rnd = randinter(0,1); m = 0.19*rnd / (pow(1-rnd, 0.75) + 0.032*pow(1-rnd, 0.25)); } while (m < m_lower || m > m_upper); return m; }
local real mf_Scalo(real m_lower, real m_upper) { if (twiddles(m_lower, m_upper, TOL)) return 0.5*(m_lower+m_upper); // Steve, 5/05 real m, rnd; do { rnd = randinter(0,1); m = 0.3*rnd / pow(1-rnd, 0.55); } while (m < m_lower || m > m_upper); return m; }
local real Kroupa_Tout_Gilmore(real m_lower, real m_upper) { if (twiddles(m_lower, m_upper, TOL)) return 0.5*(m_lower+m_upper); // Steve, 5/05 real m, rnd; do { rnd = randinter(0,1); m = 0.08 + (0.19*pow(rnd, 1.55) + 0.05*pow(rnd, 0.6)) / pow(1-rnd, 0.58); //real X = 1-rnd; //m = 0.15 * (1 /(pow(X, 0.75) + 0.04*pow(X, 0.25)) - pow(X, 2)/1.04); } while (m < m_lower || m > m_upper); return m; }
local real mf_GdeMarchi(real m_lower, real m_upper) { if (twiddles(m_lower, m_upper, TOL)) return 0.5*(m_lower+m_upper); // Steve, 5/05 real m, X; do { X = randinter(0,1); // better fit to Guido's results at low mass end, // but lacks high mass component. //m = 0.15 * (1 /(pow(X, 0.9) + 0.03*pow(X, 0.2)) - pow(X, 8)/1.03); // most satisfactory m = 0.15 * (1 /(pow(X, 0.75) + 0.03*pow(X, 0.25)) - pow(X, 8)/1.03); } while (m < m_lower || m > m_upper); return m; #if 0 //dN/dLogm= m^(-1.35)*(1-exp(-m/0.15)^2.4) // for now we do it the poor way by Monte Carlo real x1, x2, mbreak; real mass = tapered_power_law(m_lower, x1, x2, mbreak); return mass; real x1 = -2.35; real x2 = 2.40; real mbreak = 0.15; real dNdm_min = tapered_power_law(m_lower, x1, x2, mbreak); real dNdm_max = tapered_power_law(m_upper, x1, x2, mbreak); // PRC(dNdm_min);PRL(dNdm_max); real m, rnd; real dNdm_try, dNdm; do { rnd = randinter(0,1); m = m_lower + rnd*(m_upper-m_lower); dNdm_try = randinter(dNdm_min,dNdm_max); dNdm = tapered_power_law(m, x1, x2, mbreak); } while(dNdm_try>dNdm); return m; #endif }
local real tapered_power_law(real m, const real x1 = -1.35, const real x2 = 2.4, const real mbreak = 0.25) { if (twiddles(m_lower, m_upper, TOL)) return 0.5*(m_lower+m_upper); // Steve, 5/05 real m, rnd; do { rnd = randinter(0,1); // m = 0.08 + (0.19*pow(rnd, 1.55) + 0.05*pow(rnd, 0.6)) // / pow(1-rnd, 0.58); real X = 1-rnd; m = 0.15 * (1 /(pow(X, 0.75) + 0.04*pow(X, 0.25)) - pow(X, 2)/1.04); } while (m < m_lower || m > m_upper); return m; }
void refine_cluster_mass2(dyn *b, // root node int verbose) // default = 0 { // Self-consistently determine the total mass within the outermost // closed zero-velocity surface under the specified external field(s). // Use a point-mass approximation for the cluster potential and iterate // until the actual mass within the surface agrees with the mass used // to generate the surface. // // This code is most likely to be called from refine_cluster_mass(). // Quit if internal forces are to be neglected. if (b->get_ignore_internal()) return; // Do nothing if all we want is to set the dyn story and the current // values are up to date. if (verbose == 0 && twiddles(getrq(b->get_dyn_story(), "bound_center_time"), b->get_system_time(), TTOL)) return; unsigned int ext = b->get_external_field(); if (!ext || b->get_tidal_field()) return; // Method assumes that the external field can be characterized as // depending on distance from a single point -- i.e. that it has a // single center -- and that it is independent of velocity. OK to // have multiple external fields (e.g. central mass + power law), // so long as they have a common center. int bits_set = bitcount(ext); vec external_center = 0; if (bits_set != 1) { if (bits_set < 1) return; else { // We have multiple external fields. Check for common center. cerr << " refine_cluster_mass2: "; PRC(ext); PRL(bits_set); int bit = 0, cbit = -1; for (unsigned int i = ext; i != 0; i >>= 1, bit++) { if (i & 01) { if (cbit < 0) { cbit = bit; external_center = b->get_external_center(cbit); } else { if (!twiddles(square(b->get_external_center(bit) - external_center), 0)) { cerr << " refine_cluster_mass2: center " << bit << " inconsistent with center " << cbit << endl; return; } } } } cerr << " common center = " << external_center << endl; } } else