User: szilagyi Date: 2014/01/03 05:01 AM
Modified: /PITTNullCode/SphericalHarmonicReconGen/ param.ccl, schedule.ccl /PITTNullCode/SphericalHarmonicReconGen/src/ read.cc
Log: work on the adaptive timestep controller
File Changes:
Directory: /PITTNullCode/SphericalHarmonicReconGen/ ===================================================
File [modified]: param.ccl Delta lines: +6 -0 =================================================================== --- PITTNullCode/SphericalHarmonicReconGen/param.ccl 2014-01-03 09:40:13 UTC (rev 107) +++ PITTNullCode/SphericalHarmonicReconGen/param.ccl 2014-01-03 11:01:21 UTC (rev 108) @@ -32,6 +32,12 @@ (0:* :: "larger than zero" } 0.1
+CCTK_REAL adjust_timestep__max_relative_change_per_step \ +"Maximum allowed relative change of the time-step during a single step. Ignored if time_interpolate==false." +{ + (0:1] :: "The smaller the value the more gradual the change in cctk_delta_time." +} 0.1 + CCTK_INT sphere_number "the sphere number (if multiple spheres are present in one file) that corresponds to the worldtube radius NullSHRExtract::cr" { 0:* :: "positive"
File [modified]: schedule.ccl Delta lines: +4 -1 =================================================================== --- PITTNullCode/SphericalHarmonicReconGen/schedule.ccl 2014-01-03 09:40:13 UTC (rev 107) +++ PITTNullCode/SphericalHarmonicReconGen/schedule.ccl 2014-01-03 11:01:21 UTC (rev 108) @@ -21,9 +21,12 @@ #} "Schedule group for reconstructing world-tube data"
if(adjust_timestep) { - SCHEDULE SphericalHarmonicReconGeneric_SetTimeStep IN PreStep + SCHEDULE SphericalHarmonicReconGeneric_SetTimeStep at CCTK_PRESTEP \ + before NullNews_InterpCycleTimelevels \ + before NullGrid_CopyTime { LANG: C + OPTIONS: global } "Set the time-step" } SCHEDULE SphericalHarmonicReconGeneric_ReadData IN SphericalHarmonicReconRead
Directory: /PITTNullCode/SphericalHarmonicReconGen/src/ =======================================================
File [modified]: read.cc Delta lines: +23 -7 =================================================================== --- PITTNullCode/SphericalHarmonicReconGen/src/read.cc 2014-01-03 09:40:13 UTC (rev 107) +++ PITTNullCode/SphericalHarmonicReconGen/src/read.cc 2014-01-03 11:01:21 UTC (rev 108) @@ -105,20 +105,34 @@ " SphericalHarmonicReconGeneric_Startup"); }
+ CCTK_REAL &dt = cctkGH->cctk_delta_time; + // no adaptivity for the 1st few time-steps + if(cctk_iteration<5) { + CCTK_VInfo(CCTK_THORNSTRING, "Time-step has been left at %g",(double)dt); + return; + } SHR::SPH_database& db=*(SHR::db[0]); - CCTK_REAL &dt = cctkGH->cctk_delta_time; - if(db.n_timesteps()<2) return; // no adjustment - if(cctk_time<=db.time(0)) { + const double dt_old = dt; + const double time=cctk_time + SHR::initial_time_in_file; + const double eps=1.e-10*(db.time(1)-db.time(0)); + if(db.n_timesteps()<2) { + CCTK_VInfo(CCTK_THORNSTRING, "Time-step has been left at %g",(double)dt); + return; // no adjustment + } + if(time<db.time(0)-eps) { dt = db.time(1)-db.time(0); + CCTK_VInfo(CCTK_THORNSTRING, "Time-step has been left at %g",(double)dt); return; } - if(cctk_time>=db.time(db.n_timesteps()-1)) return; // no adjustment + if(time>eps+db.time(db.n_timesteps()-1)) { + CCTK_VInfo(CCTK_THORNSTRING, "Time-step has been left at %g",(double)dt); + return; // no adjustment + }
- // locate by bisection the interval containing cctk_time + // locate by bisection the interval containing time for(int l0=0,l1=db.n_timesteps()-1,c=0;;++c) { const int lh=static_cast<int>(0.5*(l0+l1)); - const double eps=1.e-10*(db.time(1)-db.time(0)); - if(cctk_time<db.time(lh)-eps) l1=lh; + if(time<db.time(lh)-eps) l1=lh; else l0=lh; if(l1==l0+1) { dt = db.time(l1)-db.time(l0); @@ -131,6 +145,8 @@ if (time_interpolate) { dt /= adjust_timestep__steps_per_time_level; + // change the time-step gradually + dt = dt_old + (dt - dt_old) * adjust_timestep__max_relative_change_per_step; dt = std::min(dt,adjust_timestep__maximum_time_step); } if(verbose) CCTK_VInfo(CCTK_THORNSTRING, "Time-step has been set to %g",(double)dt);
commits@lists.einsteintoolkit.org