aboutsummaryrefslogtreecommitdiff
path: root/mg2d.c
diff options
context:
space:
mode:
authorAnton Khirnov <anton@khirnov.net>2019-03-26 17:31:58 +0100
committerAnton Khirnov <anton@khirnov.net>2019-03-26 17:31:58 +0100
commita4a5fc2666bfd3ca009ce6c7d05bc83ff4d57313 (patch)
tree5bf0fa534ad8794cecd4d75580f372affe4ff7ff /mg2d.c
parent0e3f76cc16fa93a2b8d58922bae090828bfbf05a (diff)
egs_exact: do not construct the matrix more often than necessary
It does not change unless the diff coeffs change.
Diffstat (limited to 'mg2d.c')
-rw-r--r--mg2d.c10
1 files changed, 7 insertions, 3 deletions
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;