From a4a5fc2666bfd3ca009ce6c7d05bc83ff4d57313 Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Tue, 26 Mar 2019 17:31:58 +0100 Subject: egs_exact: do not construct the matrix more often than necessary It does not change unless the diff coeffs change. --- mg2d.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) (limited to 'mg2d.c') diff --git a/mg2d.c b/mg2d.c index 01c7624..1326a38 100644 --- a/mg2d.c +++ b/mg2d.c @@ -40,6 +40,7 @@ typedef struct MG2DLevel { unsigned int depth; EGSContext *solver; + int egs_init_flags; GridTransferContext *transfer_restrict; GridTransferContext *transfer_prolong; @@ -139,9 +140,10 @@ static int mg_solve_subgrid(MG2DContext *ctx, MG2DLevel *level) level->solver->domain_size[1]); /* re-init the current-level solver (re-calc the residual) */ - ret = mg2di_egs_init(level->solver); + ret = mg2di_egs_init(level->solver, level->egs_init_flags); if (ret < 0) return ret; + level->egs_init_flags |= EGS_INIT_FLAG_SAME_DIFF_COEFFS; } res_old = level->solver->residual_max; @@ -198,7 +200,7 @@ static int mg_solve_subgrid(MG2DContext *ctx, MG2DLevel *level) /* re-init the current-level solver (re-calc the residual) */ res_prev = level->solver->residual_max; start = gettime(); - ret = mg2di_egs_init(level->solver); + ret = mg2di_egs_init(level->solver, 0); if (ret < 0) return ret; level->time_reinit += gettime() - start; @@ -434,6 +436,8 @@ static int mg_levels_init(MG2DContext *ctx) return ret; } + cur->egs_init_flags &= ~EGS_INIT_FLAG_SAME_DIFF_COEFFS; + cur = cur->child; } @@ -490,7 +494,7 @@ int mg2d_solve(MG2DContext *ctx) if (ret < 0) return ret; - ret = mg2di_egs_init(s_root); + ret = mg2di_egs_init(s_root, 0); if (ret < 0) return ret; -- cgit v1.2.3