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 */ }
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; }
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; }