39 int nrelax,
int minlevel,
int maxlevel)
51 minlevel =
min (minlevel, maxlevel);
52 for (
int l = minlevel;
l <= maxlevel;
l++) {
59 for (
int _s = 0;
_s < 1;
_s++)
70 for (
int _s = 0;
_s < 1;
_s++)
79 for (
int i = 0;
i < nrelax;
i++) {
156 for (
int _s = 0;
_s < 1;
_s++)
157 s.boundary[
b] =
s.boundary_homogeneous[
b];
168 s.nrelax = nrelax > 0 ? nrelax : 4;
174 resb =
s.resb =
s.resa = (* residual) (
a,
b, res,
data);
188 s.resa = (* residual) (
a,
b, res,
data);
197 if (
s.resa > tolerance) {
198 if (resb/
s.resa < 1.2 &&
s.nrelax < 100)
200 else if (resb/
s.resa > 10 &&
s.nrelax > 2)
212 s.minlevel = minlevel;
217 if (
s.resa > tolerance) {
220 "src/poisson.h:%d: warning: convergence for %s not reached after %d iterations\n"
221 " res: %g sum: %g nrelax: %d tolerance: %g\n",
LINENO,
v.name,
229 delete (res),
free (res);
302#if GAUSS_SEIDEL || _GPU
338 a[] = (
a[] + 2.*
c[])/3.;
427 alpha[] = {1.,1.,1.};
vector uf[]
We allocate the (face) velocity field.
vector g[]
We store the combined pressure gradient and acceleration field in g*.
scalar * list_clone(scalar *l)
void(* boundary_level)(scalar *, int l)
static double symmetry(Point point, Point neighbor, scalar s, bool *data)
#define face_gradient_x(a, i)
static number sq(number x)
double embed_flux(Point point, scalar s, vector mu, double *val)
void(* restriction)(Point, scalar)
static double bilinear(Point point, scalar s)
trace mgstats mg_solve(scalar *a, scalar *b, double(*residual)(scalar *a, scalar *b, scalar *res, void *data), void(*relax)(scalar *da, scalar *res, int depth, void *data), void *data=NULL, int nrelax=4, scalar *res=NULL, int minlevel=0, double tolerance=TOLERANCE)
The user needs to provide a function which computes the residual field (and returns its maximum) as w...
trace void mg_cycle(scalar *a, scalar *res, scalar *da, void(*relax)(scalar *da, scalar *res, int depth, void *data), void *data, int nrelax, int minlevel, int maxlevel)
static void relax(scalar *al, scalar *bl, int l, void *data)
We can now write the relaxation function.
static double residual(scalar *al, scalar *bl, scalar *resl, void *data)
The equivalent residual function is obtained in a similar way in the case of a Cartesian grid,...
trace mgstats project(vector uf, scalar p, const vector alpha=unityf, double dt=1., int nrelax=4)
Information about the convergence of the solver is returned in a structure.
#define poisson(...)
Finally, we overload the poisson() function called by [two-phase.h]() with our new function.