summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2019-09-12 12:23:18 +0200
committerAnton Khirnov <anton@khirnov.net>2019-09-12 12:23:18 +0200
commit80dff3e38de86f886952ebf133e03551cdbef541 (patch)
tree02fdbaebc35b9997ae468b70df7c24cb1a9cdbb9
parent95efa8296b60bd6405d1098f950b269decbddd17 (diff)
Allow specifying maximum level on which to solve for W.
-rw-r--r--param.ccl5
-rw-r--r--src/qms.c19
2 files changed, 19 insertions, 5 deletions
diff --git a/param.ccl b/param.ccl
index b7d9bcf..22c4d21 100644
--- a/param.ccl
+++ b/param.ccl
@@ -12,6 +12,11 @@ CCTK_INT solve_level "" STEERABLE=recover
0: :: ""
} 0
+CCTK_INT solve_level_max "" STEERABLE=recover
+{
+ 0: :: ""
+} 0
+
CCTK_REAL switchoff_time "" STEERABLE=recover
{
: :: ""
diff --git a/src/qms.c b/src/qms.c
index c22cc97..7f0f3e1 100644
--- a/src/qms.c
+++ b/src/qms.c
@@ -82,6 +82,7 @@ typedef struct QMSMGContext {
double tol_residual_base;
double cfl_factor;
int solve_level;
+ int solve_level_max;
int boundary_offset;
CoordPatch **patches;
@@ -1292,6 +1293,9 @@ void qms_mg_solve(CCTK_ARGUMENTS)
grid_size = cctkGH->cctk_lsh[0] * cctkGH->cctk_lsh[1] * cctkGH->cctk_lsh[2];
+ if (reflevel < ms->solve_level_max)
+ goto skip_solve;
+
start = gettime();
fill_eq_coeffs(ms, cp, cp->solver);
@@ -1300,7 +1304,7 @@ void qms_mg_solve(CCTK_ARGUMENTS)
ms->count_fill++;
start = gettime();
- if (reflevel > 0) {
+ if (reflevel > ms->solve_level_max) {
/* outer-most level for this solve, use extrapolated values as boundary condition */
if (fabs(time - W_val1_time[reflevel - 1]) > 1e-13) {
const double fact0 = (W_val1_time[reflevel] - time) / dt;
@@ -1353,8 +1357,10 @@ void qms_mg_solve(CCTK_ARGUMENTS)
if (ret < 0)
CCTK_WARN(0, "Error solving the quasi-maximal slicing equation");
+skip_solve:
+
start = gettime();
- {
+ if (reflevel >= ms->solve_level_max) {
double *W_val_tl1 = CCTK_VarDataPtr(cctkGH, 1, "QuasiMaximalSlicingMG::W_val");
solution_to_grid(cp, cp->solver, W_val);
memcpy(W_val_tl1, W_val, grid_size * sizeof(*W_val_tl1));
@@ -1528,7 +1534,7 @@ void qms_mg_eval(CCTK_ARGUMENTS)
ms->count_eval++;
}
-static int context_init(cGH *gh, int solve_level, int fd_stencil, int maxiter, int exact_size, int nb_cycles,
+static int context_init(cGH *gh, int solve_level, int solve_level_max, int fd_stencil, int maxiter, int exact_size, int nb_cycles,
int nb_relax_pre, int nb_relax_post, double tol_residual_base,
double cfl_factor, const char *loglevel_str, int boundary_offset,
QMSMGContext **ctx)
@@ -1544,6 +1550,7 @@ static int context_init(cGH *gh, int solve_level, int fd_stencil, int maxiter, i
qms->gh = gh;
qms->solve_level = solve_level;
+ qms->solve_level_max = solve_level_max;
qms->fd_stencil = fd_stencil;
qms->maxiter = maxiter;
qms->max_exact_size = exact_size;
@@ -1591,16 +1598,18 @@ void qms_mg_init(CCTK_ARGUMENTS)
DECLARE_CCTK_ARGUMENTS;
DECLARE_CCTK_PARAMETERS;
+ const int reflevel = ctz(cctk_levfac[0]);
+
int use_tapered_grids = *(int*)CCTK_ParameterGet("use_tapered_grids", "Carpet", &use_tapered_grids);
int ret;
- fprintf(stderr, "%d init\n", ctz(cctk_levfac[0]));
+ fprintf(stderr, "%d init\n", reflevel);
if (!use_tapered_grids)
CCTK_WARN(0, "MaximalSlicingAxiMG only works with use_tapered_grids=1");
if (!qms_context) {
- ret = context_init(cctkGH, solve_level, fd_stencil, maxiter, exact_size, nb_cycles,
+ ret = context_init(cctkGH, solve_level, solve_level_max, fd_stencil, maxiter, exact_size, nb_cycles,
nb_relax_pre, nb_relax_post, tol_residual_base,
cfl_factor, loglevel, boundary_offset, &qms_context);
if (ret < 0)