diff options
Diffstat (limited to 'mg2d.c')
-rw-r--r-- | mg2d.c | 50 |
1 files changed, 8 insertions, 42 deletions
@@ -45,9 +45,6 @@ typedef struct MG2DLevel { GridTransferContext *transfer_restrict; GridTransferContext *transfer_prolong; - NDArray *prolong_tmp_base; - NDArray *prolong_tmp; - struct MG2DLevel *child; /* timings */ @@ -55,7 +52,6 @@ typedef struct MG2DLevel { int64_t time_relax; int64_t time_prolong; int64_t time_restrict; - int64_t time_correct; int64_t time_reinit; } MG2DLevel; @@ -98,18 +94,6 @@ static void log_relax_step(MG2DContext *ctx, MG2DLevel *level, const char *step_ prefix, level->depth, step_desc, res_old, res_new, res_old / res_new); } -static int coarse_correct_task(void *arg, unsigned int job_idx, unsigned int thread_idx) -{ - MG2DLevel *level = arg; - - for (size_t idx0 = 0; idx0 < level->solver->domain_size[0]; idx0++) { - const ptrdiff_t idx_dst = job_idx * level->solver->u->stride[0] + idx0; - const ptrdiff_t idx_src = job_idx * level->prolong_tmp->stride[0] + idx0; - level->solver->u->data[idx_dst] -= level->prolong_tmp->data[idx_src]; - } - return 0; -} - static int mg_relax_step(MG2DContext *ctx, MG2DLevel *level, const char *step_desc) { double res_old; @@ -176,7 +160,7 @@ static int mg_solve_subgrid(MG2DContext *ctx, MG2DLevel *level) /* restrict the residual as to the coarser-level rhs */ start = gettime(); ret = mg2di_gt_transfer(level->transfer_restrict, level->child->solver->rhs, - level->solver->residual); + level->solver->residual, 0); if (ret < 0) return ret; level->time_restrict += gettime() - start; @@ -188,19 +172,12 @@ static int mg_solve_subgrid(MG2DContext *ctx, MG2DLevel *level) /* prolongate the coarser-level correction */ start = gettime(); - ret = mg2di_gt_transfer(level->transfer_prolong, level->prolong_tmp, - level->child->solver->u); + ret = mg2di_gt_transfer(level->transfer_prolong, level->solver->u, + level->child->solver->u, -1.0); if (ret < 0) return ret; level->time_prolong += gettime() - start; - /* apply the correction */ - start = gettime(); - - tp_execute(ctx->priv->tp, level->solver->domain_size[1], coarse_correct_task, level); - - level->time_correct += gettime() - start; - /* re-init the current-level solver (re-calc the residual) */ res_prev = level->solver->residual_max; start = gettime(); @@ -280,7 +257,7 @@ static int restrict_diff_coeffs(MG2DContext *ctx, enum GridTransferOperator op, goto finish; for (int i = 0; i < MG2D_DIFF_COEFF_NB; i++) { - ret = mg2di_gt_transfer(tc, dst->diff_coeffs[i], src->diff_coeffs[i]); + ret = mg2di_gt_transfer(tc, dst->diff_coeffs[i], src->diff_coeffs[i], 0); if (ret < 0) goto finish; } @@ -566,8 +543,6 @@ static void mg_level_free(MG2DLevel **plevel) if (!level) return; - mg2di_ndarray_free(&level->prolong_tmp); - mg2di_ndarray_free(&level->prolong_tmp_base); mg2di_egs_free(&level->solver); mg2di_gt_free(&level->transfer_restrict); @@ -586,14 +561,6 @@ static MG2DLevel *mg_level_alloc(enum EGSType type, const size_t domain_size) if (!level) return NULL; - ret = mg2di_ndarray_alloc(&level->prolong_tmp_base, 2, (size_t [2]){domain_size + 1, domain_size + 1}, 0); - if (ret < 0) - goto fail; - - ret = mg2di_ndarray_slice(&level->prolong_tmp, level->prolong_tmp_base, (Slice [2]){ SLICE(0, -1, 1), SLICE(0, -1, 1) }); - if (ret < 0) - goto fail; - level->solver = mg2di_egs_alloc(type, (size_t [2]){domain_size, domain_size}); if (!level->solver) @@ -791,7 +758,7 @@ void mg2d_print_stats(MG2DContext *ctx, const char *prefix) EGSExactContext *e = NULL; int64_t level_total = level->time_relax + level->time_prolong + level->time_restrict + - level->time_correct + level->time_reinit; + level->time_reinit; if (level->solver->solver_type == EGS_SOLVER_RELAXATION) r = level->solver->solver_data; @@ -799,7 +766,7 @@ void mg2d_print_stats(MG2DContext *ctx, const char *prefix) e = level->solver->solver_data; level_total = level->time_relax + level->time_prolong + level->time_restrict + - level->time_correct + level->time_reinit; + level->time_reinit; levels_total += level_total; @@ -814,11 +781,10 @@ void mg2d_print_stats(MG2DContext *ctx, const char *prefix) if (level->child) { ret = snprintf(p, sizeof(buf) - (p - buf), - "||%2.2f%% relax %2.2f%% prolong %2.2f%% restrict %2.2f%% correct %2.2f%% reinit", + "||%2.2f%% relax %2.2f%% prolong %2.2f%% restrict %2.2f%% reinit", level->time_relax * 100.0 / level_total, level->time_prolong * 100.0 / level_total, level->time_restrict * 100.0 / level_total, - level->time_correct * 100.0 / level_total, level->time_reinit * 100.0 / level_total); if (ret > 0) p += ret; @@ -926,7 +892,7 @@ int mg2d_init_guess(MG2DContext *ctx, const double *src, if (ret < 0) return ret; - ret = mg2di_gt_transfer(priv->transfer_init, priv->u ? priv->u : priv->root->solver->u, a_src); + ret = mg2di_gt_transfer(priv->transfer_init, priv->u ? priv->u : priv->root->solver->u, a_src, 0); mg2di_ndarray_free(&a_src); return ret; |