This commit is contained in:
Jan Eitzinger 2024-03-05 13:16:04 +01:00
parent 1cb82b1bfa
commit ed929ab752
3 changed files with 14 additions and 19 deletions

View File

@ -20,6 +20,7 @@ int main(int argc, char** argv)
Parameter p;
Discretization d;
Solver s;
initParameter(&p);
if (argc != 2) {
@ -31,6 +32,7 @@ int main(int argc, char** argv)
printParameter(&p);
initDiscretization(&d, &p);
initSolver(&s, &d, &p);
#ifndef VERBOSE
initProgress(d.te);
#endif

View File

@ -9,15 +9,14 @@
#include <string.h>
#include "parameter.h"
#include "util.h"
#define MAXLINE 4096
void initParameter(Parameter* param)
{
param->xlength = 1.0;
param->ylength = 1.0;
param->imax = 100;
param->jmax = 100;
param->imax = 128;
param->jmax = 128;
param->itermax = 1000;
param->eps = 0.0001;
param->omg = 1.7;

View File

@ -12,7 +12,7 @@
#include "util.h"
#define FINEST_LEVEL 0
#define COARSEST_LEVEL (solver->levels - 1)
#define COARSEST_LEVEL (s->levels - 1)
#define S(i, j) s[(j) * (imax + 2) + (i)]
#define E(i, j) e[(j) * (imax + 2) + (i)]
#define R(i, j) r[(j) * (imax + 2) + (i)]
@ -106,47 +106,41 @@ static double smooth(Solver* s, double* p, double* rhs, int level, int imax, int
return res;
}
static double multiGrid(
Solver* solver, double* p, double* rhs, int level, int imax, int jmax)
static double multiGrid(Solver* s, double* p, double* rhs, int level, int imax, int jmax)
{
double res = 0.0;
// coarsest level TODO: Use direct solver?
if (level == (solver->levels - 1)) {
if (level == COARSEST_LEVEL) {
for (int i = 0; i < 5; i++) {
smooth(solver, p, rhs, level, imax, jmax);
smooth(s, p, rhs, level, imax, jmax);
}
return res;
}
// pre-smoothing TODO: Make smoothing steps configurable?
for (int i = 0; i < 5; i++) {
smooth(solver, p, rhs, level, imax, jmax);
smooth(s, p, rhs, level, imax, jmax);
if (level == FINEST_LEVEL) setBoundaryCondition(p, imax, jmax);
}
// restrict
restrictMG(solver, level, imax, jmax);
restrictMG(s, level, imax, jmax);
// MGSolver on residual and error.
// TODO: What if there is a rest?
multiGrid(solver,
solver->e[level + 1],
solver->r[level + 1],
level + 1,
imax / 2,
jmax / 2);
multiGrid(s, s->e[level + 1], s->r[level + 1], level + 1, imax / 2, jmax / 2);
// prolongate
prolongate(solver, level, imax, jmax);
prolongate(s, level, imax, jmax);
// correct p on finer level using residual
correct(solver, p, level, imax, jmax);
correct(s, p, level, imax, jmax);
if (level == FINEST_LEVEL) setBoundaryCondition(p, imax, jmax);
// post-smoothing
for (int i = 0; i < 5; i++) {
res = smooth(solver, p, rhs, level, imax, jmax);
res = smooth(s, p, rhs, level, imax, jmax);
if (level == FINEST_LEVEL) setBoundaryCondition(p, imax, jmax);
}