From bd71174fd6dc58c8f22ec3325d95c9057daeaf20 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Sat, 28 Sep 2019 11:46:52 +0200 Subject: Extrapolate only from the levels that are synced with a coarser level. Same as is done for maximal slicing, should be more stable. --- src/qms.c | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/qms.c b/src/qms.c index a1366bd..b5abcd2 100644 --- a/src/qms.c +++ b/src/qms.c @@ -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); -- cgit v1.2.3