コード例 #1
0
ファイル: makemass.C プロジェクト: Ingwar/amuse
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;
}
コード例 #2
0
ファイル: compute_max_cod.C プロジェクト: Ingwar/amuse
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;
	}
    }
コード例 #3
0
ファイル: fct_daq_fft.cpp プロジェクト: hewumars/Spider
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]
	);
}
コード例 #4
0
ファイル: makemass.C プロジェクト: Ingwar/amuse
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;
}
コード例 #5
0
ファイル: makemass.C プロジェクト: Ingwar/amuse
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;
}
コード例 #6
0
ファイル: makemass.C プロジェクト: Ingwar/amuse
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;
}
コード例 #7
0
ファイル: makemass.C プロジェクト: Ingwar/amuse
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

}
コード例 #8
0
ファイル: makemass.C プロジェクト: Ingwar/amuse
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;
}
コード例 #9
0
ファイル: refine_mass2.C プロジェクト: Ingwar/amuse
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