diff options
author | Anton Khirnov <anton@khirnov.net> | 2019-03-26 17:31:58 +0100 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2019-03-26 17:31:58 +0100 |
commit | a4a5fc2666bfd3ca009ce6c7d05bc83ff4d57313 (patch) | |
tree | 5bf0fa534ad8794cecd4d75580f372affe4ff7ff /mg2d.c | |
parent | 0e3f76cc16fa93a2b8d58922bae090828bfbf05a (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.c | 10 |
1 files changed, 7 insertions, 3 deletions
@@ -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; |