Ejemplo n.º 1
0
Archivo: rt.c Proyecto: sleitner/cart
void rtInitStep(double dt)
{
  frt_real uDen = units->number_density;
  frt_real uLen = units->length;
  frt_real uTime = units->time;
  frt_real dtCode = dt;

#ifdef COSMOLOGY
  frt_real aExp = abox[min_level];
  frt_real daExp = abox_from_tcode(tl[min_level]+dt) - abox[min_level];
  frt_real HExp = Hubble(aExp)/units->time;
#else
  frt_real aExp = 1.0;
  frt_real daExp = 0.0;
  frt_real HExp = 0.0;
#endif

  start_time(WORK_TIMER);

  frtCall(stepbegin)(&uDen,&uLen,&uTime,&aExp,&HExp,&daExp,&dtCode);

  end_time(WORK_TIMER);

#ifdef RT_TRANSFER
  rtInitStepTransfer();
#endif

  rtUpdateTables();

#ifdef RT_DEBUG
  switch(rt_debug.Mode)
    {
    case 1:
      {
	int i, cell;
	cell = cell_find_position(rt_debug.Pos);
	cart_debug("In cell-level debug for cell %d/%d",cell,cell_level(cell));
	cart_debug("RT_HVAR_OFFSET: %d",RT_HVAR_OFFSET);
#ifdef RT_VAR_SOURCE
	cart_debug("RT_VAR_SOURCE: %d",RT_VAR_SOURCE);
#endif
	cart_debug("rt_grav_vars_offset: %d",rt_grav_vars_offset);
#ifdef RT_TRANSFER
	cart_debug("rt_num_vars: %d",rt_num_vars);
#if (RT_TRANSFER_METHOD == RT_METHOD_OTVET)
	cart_debug("RT_VAR_OT_FIELD: %d",RT_VAR_OT_FIELD);
	cart_debug("rt_et_offset: %d",rt_et_offset);
	cart_debug("rt_field_offset: %d",rt_field_offset);
#endif
#endif
	for(i=0; i<num_vars; i++)
	  {
	    cart_debug("Var[%d] = %g",i,cell_var(cell,i));
	  }
	break;
      }
    }
#endif /* RT_DEBUG */
}
Ejemplo n.º 2
0
void compute_time_scalefactor_spline(){
  double aexp_ini, aexp_end, da, integrand;
  double *tt, *aa;
  int nsteps;

  // Initialize
  nsteps   = 5000;
  aexp_ini = sim._aexp_ini/2.0;
  aexp_end = 2.0;
  da       = (aexp_end - aexp_ini)/double(nsteps-1);
  tt       = new double[nsteps];
  aa       = new double[nsteps];
  for(int i = 0; i < nsteps; i++) {
    tt[i] = 0.0;
    aa[i] = aexp_ini + da*i;
  }

  // Integrate up
  for(int i = 1; i < nsteps; i++){
    integrand = da/( Hubble(aa[i]) * pow3(aa[i]) );
    tt[i] = tt[i-1] + integrand;
  }

  // Shift to tt=0 for a = 0 (just for consistency)
  int aunityind = int( (1.0 - aexp_ini) / da + 0.5 );
  double t0 = tt[aunityind];
  for(int i = 0; i < nsteps; i++)
    tt[i] -= t0;

  // Make a spline
  sim._ttofa_spline = DSpline(aa, tt, nsteps, "The tt(a) function");
  sim._aoftt_spline = DSpline(tt, aa, nsteps, "The a(tt) function");

  delete[] aa;
  delete[] tt;
}
Ejemplo n.º 3
0
double calc_new_timestep(){
  double dt1, dt2, dt3, dt, cfac = 0.1;
  double rhomax = 0.0, vmax = 0.0;

  // Maximim density
#ifdef OMP
#pragma omp parallel for reduction(max:rhomax)
#endif
  for(int i = 0;i < sim._ngrid_tot; i++)
    if(sim._Rho[i] > rhomax) 
      rhomax = sim._Rho[i];
  
  // Maximum velocity
#ifdef OMP
#pragma omp parallel for reduction(max:vmax)
#endif
  for(int i = 0;i < sim._npart; i++)
    for(int k = 0; k < 3; k++)
      if(fabs(sim._Particle[i]._v[k]) > vmax) 
        vmax = fabs(sim._Particle[i]._v[k]);

  // dt based gravity free fall time
  dt1 = cfac * sqrt(pow2(M_PI)/(4.0 * sim._omega_m * sim._aexp * rhomax));

  // dt based on background expansion
  dt2 = 0.1/(sim._aexp*Hubble(sim._aexp));

  // dt based on courant condition for max velocity (do not allow travel more than 1/2 gridcell)
  dt3 = cfac/(double(sim._ngrid) * vmax);

  // Take the minimum time-step
  dt = min(dt1,dt2);
  dt = min(dt,dt3);

  return dt;
}