diff options
author | Anton Khirnov <anton@khirnov.net> | 2019-09-28 11:46:52 +0200 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2019-09-28 11:46:52 +0200 |
commit | bd71174fd6dc58c8f22ec3325d95c9057daeaf20 (patch) | |
tree | 74dcccd97a71fdfbc8da5bbc29da8799d9a1fcc6 | |
parent | 3bb94aa06bdaee136fdc3a6a206e5f391a8b5361 (diff) |
Extrapolate only from the levels that are synced with a coarser level.
Same as is done for maximal slicing, should be more stable.
-rw-r--r-- | src/qms.c | 16 |
1 files changed, 14 insertions, 2 deletions
@@ -1302,6 +1302,7 @@ void qms_mg_solve(CCTK_ARGUMENTS) ts_tmp /= 2; reflevel_top--; } + reflevel_top = MAX(reflevel_top, ms->solve_level_max); if (reflevel < ms->solve_level_max) goto skip_solve; @@ -1359,7 +1360,7 @@ void qms_mg_solve(CCTK_ARGUMENTS) ms->time_bnd += gettime() - start; ms->count_bnd++; - fprintf(stderr, "%d qms solve: time %g\n", reflevel, time); + fprintf(stderr, "%d qms solve: time %g step %d\n", reflevel, time, timestep); start = gettime(); ret = mg2d_solve(cp->solver); ms->time_mg2d += gettime() - start; @@ -1376,6 +1377,11 @@ skip_solve: memcpy(W_val_tl1, W_val, grid_size * sizeof(*W_val_tl1)); } + if (reflevel > ms->solve_level_max && timestep % 2) + goto skip_export; + + + fprintf(stderr, "%d qms export: time %g step %d\n", reflevel, time, timestep); /* add the solution to the list of past solutions */ { #if 0 @@ -1493,6 +1499,8 @@ skip_solve: ms->time_export += gettime() - start; ms->count_export++; +skip_export: + ms->time_solve += gettime() - total_start; ms->count_solve++; @@ -1650,9 +1658,13 @@ void qms_mg_inithist(CCTK_ARGUMENTS) DECLARE_CCTK_PARAMETERS; const int reflevel = ctz(cctk_levfac[0]); - const double dt = cctk_delta_time / (1 << MIN(reflevel, solve_level)); size_t grid_size = cctk_lsh[0] * cctk_lsh[1] * cctk_lsh[2]; + double dt; + + dt = cctk_delta_time / (1 << MIN(reflevel, solve_level)); + if (reflevel > solve_level_max) + dt *= 2; fprintf(stderr, "%d inithist\n", reflevel); |