From 36eb8bc7c24938163bcf8d7b3a58bfeb71755f8d Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Sat, 7 Apr 2018 10:05:36 +0200 Subject: Support configurable solving at finer levels. --- param.ccl | 5 +++++ src/qms.c | 25 +++++++++++++++++++++---- 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/param.ccl b/param.ccl index 35fa495..9d877b1 100644 --- a/param.ccl +++ b/param.ccl @@ -31,6 +31,11 @@ CCTK_REAL outer_bound "" STEERABLE=recover 0: :: "" } 64.0 +CCTK_INT solve_level "" STEERABLE=recover +{ + 0: :: "" +} 0 + CCTK_REAL switchoff_time "" STEERABLE=recover { 0: :: "" diff --git a/src/qms.c b/src/qms.c index 6faa62e..3d3fb64 100644 --- a/src/qms.c +++ b/src/qms.c @@ -51,7 +51,6 @@ struct QMSContext { double *coeffs_eval; double max_radius; - int solve_level; uint64_t grid_expand_count; uint64_t grid_expand_time; @@ -62,6 +61,21 @@ struct QMSContext { double scale_factor; +static int ctz(int a) +{ + int ret = 0; + + if (!a) + return INT_MAX; + + while (!(a & 1)) { + a >>= 1; + ret++; + } + + return ret; +} + /* get an approximate "main" frequency component in a basis function */ static double calc_basis_freq(const BasisSet *b, int order) { @@ -282,12 +296,15 @@ void quasimaximal_slicing_axi_solve(CCTK_ARGUMENTS) ms = qms_context; - time = cctkGH->cctk_time / ms->gh->cctk_delta_time; - if (cctkGH->cctk_time >= switchoff_time + 1.0) return; - if (ms->gh->cctk_levfac[0] != 1 || fabs(time - ceilf(time)) > 1e-8 || + if (ctz(ms->gh->cctk_levfac[0]) != solve_level) + return; + + time = cctkGH->cctk_time * ms->gh->cctk_levfac[0] / ms->gh->cctk_delta_time; + + if (fabs(time - ceilf(time)) > 1e-8 || (ms->solutions[ARRAY_ELEMS(ms->solutions) - 1].time >= cctkGH->cctk_time)) return; -- cgit v1.2.3