summaryrefslogtreecommitdiff
path: root/mg2d.c
diff options
context:
space:
mode:
Diffstat (limited to 'mg2d.c')
-rw-r--r--mg2d.c50
1 files changed, 8 insertions, 42 deletions
diff --git a/mg2d.c b/mg2d.c
index 11a8158..05bc10f 100644
--- a/mg2d.c
+++ b/mg2d.c
@@ -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;