예제 #1
0
void polymodel(void)
{
  gsl_interp_accel *pmsplacc = gsl_interp_accel_alloc();
  bodyptr p;
  real rad, phi, vel, psi, vr, vp, a, E, J;
  vector rhat, vtmp, vper;

  for (p = btab; p < NthBody(btab, nbody); p = NextBody(p)) {
    rad = rad_m(xrandom(0.0, mtot));
    phi = gsl_spline_eval(pmspline, (double) rad, pmsplacc);
    vel = pick_v(phi);
    psi = pick_psi();
    vr = vel * rcos(psi);
    vp = vel * rsin(psi);
    Mass(p) = mtot / nbody;
    pickshell(rhat, NDIM, 1.0);
    MULVS(Pos(p), rhat, rad);
    pickshell(vtmp, NDIM, 1.0);
    a = dotvp(vtmp, rhat);
    MULVS(vper, rhat, - a);
    ADDV(vper, vper, vtmp);
    a = absv(vper);
    MULVS(vper, vper, vp / a);
    MULVS(Vel(p), rhat, vr);
    ADDV(Vel(p), Vel(p), vper);
    Phi(p) = phi;
    E = phi + 0.5 * rsqr(vel);
    J = rad * ABS(vp);
    Aux(p) = Kprime * rpow(phi1 - E, npol - 1.5) * rpow(J, 2 * mpol);
  }
  gsl_interp_accel_free(pmsplacc);
}
예제 #2
0
void setview(void)
{
    thetax = -360.0 * mouseval[XYANGLES][1];
    thetay = -360.0 * mouseval[XYANGLES][0];
    thetaz = -360.0 * mouseval[ZANGLE][0];
    xoff = mouseval[TRANSLATE][0];
    yoff = -mouseval[TRANSLATE][1];
    dview = 4.0 * pow(10.0, mouseval[PERSPECT][1]);
    fview = MIN(90.0, 40.0 * pow(10.0, mouseval[PERSPECT][0]));
    vscale = 0.01 * pow(10.0, mouseval[VSCALE][0]);
    cmidpt = mouseval[COLORMAP][0];
    crange = pow(10.0, mouseval[COLORMAP][1]);
    znorm[0] = - rsin(DEG2RAD(thetay));
    znorm[1] =   rcos(DEG2RAD(thetay)) * rsin(DEG2RAD(thetax));
    znorm[2] = - rcos(DEG2RAD(thetay)) * rcos(DEG2RAD(thetax));
}
예제 #3
0
void zmatrix(matrix rmat, real theta)
{
  real s = rsin(DEG2RAD * theta), c = rcos(DEG2RAD * theta);

  rmat[0][0] =  c ;    rmat[0][1] =  s ;    rmat[0][2] = 0.0;
  rmat[1][0] = -s ;    rmat[1][1] =  c ;    rmat[1][2] = 0.0;
  rmat[2][0] = 0.0;    rmat[2][1] = 0.0;    rmat[2][2] = 1.0;
}
예제 #4
0
void makedisk(void)
{
  real m, r, phi, vcir, omega, Adisk, kappa, sigma1, sigma2,
       mu_eff, sig_r, sig_p, sig_z, vrad, vorb2, vorb, vphi;
  double Trr = 0.0, Tpp = 0.0, Tzz = 0.0;
  int i;
  bodyptr dp;

  for (i = 0; i < ndisk; i++) {			/* loop initializing bodies */
    m = mdtab[NTAB-1] * ((real) i + 0.5) / ndisk;
    r = seval(m, &mdtab[0], &rdtab[0], &rdtab[NTAB], NTAB);
    vcir = seval(r, &rdtab[0], &vctab[0], &vctab[NTAB], NTAB);
    omega = vcir / r;
    Adisk = (omega - spldif(r, &rdtab[0], &vctab[0], &vctab[NTAB], NTAB)) / 2;
    if (omega - Adisk < 0.0)
      error("%s: kappa undefined (omega - Adisk < 0)\n"
	    "  r, omega, Adisk = %f %f %f\n", getargv0(), r, omega, Adisk);
    kappa = 2 * rsqrt(rsqr(omega) - Adisk * omega);
    sigma1 = rsqr(alpha1) * mdisk1 * rexp(- alpha1 * r) / TWO_PI;
    sigma2 = rsqr(alpha2) * mdisk2 * rexp(- alpha2 * r) / TWO_PI;
    mu_eff = (r_mu>0 ? 1 + (mu - 1) * (r / (r + r_mu)) : mu);
    sig_z = rsqrt(PI * (sigma1 + sigma2) * zdisk);
    sig_r = mu_eff * sig_z;
    sig_p = (0.5 * kappa / omega) * sig_r;
    vorb2 = rsqr(vcir) + rsqr(sig_r) * (1 - 2 * alpha1 * r) - rsqr(sig_p) +
      (r_mu>0 ? rsqr(sig_z) * r * mu_eff*(2*mu-2)*r_mu/rsqr(r+r_mu) : 0);
    vorb = rsqrt(MAX(vorb2, 0.0));
    dp = NthBody(disk, i);			/* set up ptr to disk body  */
    Mass(dp) = mdisk1 / ndisk;
    phi = xrandom(0.0, TWO_PI);
    Pos(dp)[0] = r * rsin(phi);
    Pos(dp)[1] = r * rcos(phi);
    Pos(dp)[2] = zdisk * ratanh(xrandom(-1.0, 1.0));
    vrad = (eta > 0 ? pickdist(eta, sig_r) : grandom(0.0, sig_r));
    vphi = (eta > 0 ? pickdist(eta, sig_p) : grandom(0.0, sig_p)) + vorb;
    Vel(dp)[0] = vrad * rsin(phi) + vphi * rcos(phi);
    Vel(dp)[1] = vrad * rcos(phi) - vphi * rsin(phi);
    Vel(dp)[2] = grandom(0.0, sig_z);
    Trr += Mass(dp) * rsqr(sig_r) / 2;
    Tpp += Mass(dp) * (rsqr(vorb) + rsqr(sig_p)) / 2;
    Tzz += Mass(dp) * rsqr(sig_z) / 2;
  }
  eprintf("[%s: Trr = %f  Tpp = %f  Tzz = %f]\n", getargv0(), Trr, Tpp, Tzz);
}
예제 #5
0
void testdisk(void)
{
    int ndisk, i;
    real rmin2, rmax2, eps2, sigma, r_i, theta_i, m_i, v_i;
    bodyptr gp, sp;

    ndisk = getiparam("ndisk");
    ngalaxy = ndisk + (getbparam("nosphr") ? 0 : nspheroid);
    galaxy = (bodyptr) allocate(ngalaxy * SizeofBody);
    rmin2 = rsqr(getdparam("rmin"));
    rmax2 = rsqr(getdparam("rmax"));
    eps2 = rsqr(getdparam("eps"));
    sigma = getdparam("sigma");
    init_random(getiparam("seed"));
    for (i = 0; i < ndisk; i++) {			/* build disk       */
        gp = NthBody(galaxy, i);
        Mass(gp) = 0.0;                                 /* set mass to zero */
        r_i = rsqrt(rmin2 + i * (rmax2 - rmin2) / (ndisk - 1.0));
        theta_i = xrandom(0.0, TWO_PI);
        Pos(gp)[0] = r_i * rsin(theta_i);               /* set positions    */
        Pos(gp)[1] = r_i * rcos(theta_i);
        Pos(gp)[2] = 0.0;
        if (r_i < rsph[NTAB-1])
            m_i = seval(r_i, &rsph[0], &msph[0], &msph[NTAB], NTAB);
        else
            m_i = msph[NTAB-1];
	v_i = rsqrt(MAX(m_i, 0.0) * r_i*r_i / rpow(r_i*r_i + eps2, 1.5));
							/* set velocities   */
        Vel(gp)[0] = grandom(  v_i * rcos(theta_i), sigma);
        Vel(gp)[1] = grandom(- v_i * rsin(theta_i), sigma);
        Vel(gp)[2] = grandom(                  0.0, sigma);
    }
    if (! getbparam("nosphr"))
	for (i = 0; i < nspheroid; i++) {		/* append spheroid  */
	    sp = NthBody(spheroid, i);
	    gp = NthBody(galaxy, ndisk + i);
	    memcpy(gp, sp, SizeofBody);
	}
    if (getbparam("zerocm"))
        snapcenter(galaxy, ngalaxy, MassField.offset);
}
예제 #6
0
int render_tunnel(struct fb *vfb, struct fb *tunnel, struct fb *texture, float time)
{
	int i; 
	int u, v;
	u = 256*rcos(time);
	/* v = 512*rsin(time); */
	v = 512*time;
	int *p = vfb->pixbuf;
	for(i=0; i < vfb->width*vfb->height; i++)
		*p++ = texture->pixbuf[(tunnel->pixbuf[i] + u + (v<<8)) & 0xffff];
	return 0;
}
예제 #7
0
void polymodel1(void)
{
  bodyptr p;
  real r, x, v;

  for (p = btab; p < NthBody(btab, nbody); p = NextBody(p)) {
    Mass(p) = 1.0 / nbody;
    r = xrandom(0.0, 2.0);
    pickshell(Pos(p), 3, r);
    x = SQRT2 * rcos(PI * (2.0 - xrandom(0.0, 1.0)) / 4.0);
    v = (xrandom(-1.0, 1.0) < 0.0 ? -1.0 : 1.0) *
      (1 - x*x) * rsqrt(rlog(2 / r));
    MULVS(Vel(p), Pos(p), v/r);
    Phi(p) = 0.5 * rlog(r / 2.0) - 0.5;
  }
  bodyfields[4] = NULL;				// don't output Aux data
}