59#define laplacian(a) ((a[1,0] + a[-1,0] + a[0,1] + a[0,-1] - 4.*a[])/sq(Delta))
97 _da.boundary[
b] =
_da.boundary_homogeneous[
b];
124 for (
int i = 0;
i <
_s.nrelax;
i++) {
126 for (
int _i = 0;
_i <
l;
_i++) {
162 if (
_s.resa > tolerance) {
163 if (
_resb/
_s.resa < 1.2 &&
_s.nrelax < 100)
165 else if (
_resb/
_s.resa > 10 &&
_s.nrelax > 2)
170 _s.minlevel = minlevel;
171 if (
_s.resa > tolerance)
173 "src/solve.h:%d: warning: convergence for %s not reached after %d iterations\n"
174 " res: %g nrelax: %d\n",
LINENO,
a.name,
175 _s.i,
_s.resa,
_s.nrelax),
207 double tolerance = 1
e-3)
248 for (
int _l = 0;
_l <
l;
_l++) {
264 for (
int _s = 0;
_s < 1;
_s++)
266 s.boundary[
b] =
s.boundary_homogeneous[
b];
278 for (
int _s = 0;
_s < 1;
_s++)
282 for (
int _s = 0;
_s < 1;
_s++)
324 _R[
_k++] += res[] - rhs[];
337 else if (
_len == 2) {
338 double det =
_D[0][0]*
_D[1][1] -
_D[0][1]*
_D[1][0];
365 s.boundary[
b] =
ds.boundary[
b];
388 if (
_s.resa > tolerance) {
389 if (
_resb/
_s.resa < 1.2 &&
_s.nrelax < 100)
391 else if (
_resb/
_s.resa > 10 &&
_s.nrelax > 2)
400 _s.minlevel = minlevel;
401 if (
_s.resa > tolerance) {
403 for (
int _a = 0;
_a < 1;
_a++)
406 " res: %g nrelax: %d\n",
407 _s.i,
_s.resa,
_s.nrelax);
413 if (((
long)
mg) + 1 != 1)
scalar * list_clone(scalar *l)
void(* boundary_level)(scalar *, int l)
void(* scalar_clone)(scalar, scalar)
static number sq(number x)
int list_len(scalar *list)
double mu1
The dynamic viscosities for each phase, as well as the volumetric viscosity coefficients.
define sysmalloc malloc define syscalloc calloc define sysrealloc realloc define sysfree free define systrdup strdup define func
macro2 diagonalize(int a)
*cs[i, 0, 0] a *[i -1, 0, 0] j
static int include(char *file, FILE *fin, FILE *fout)
macro
We also redefine the "per field" (inner) traversal.
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)
macro msolve(scalar *X, double *equations, mgstats *mg=NULL, int nrelax=4, int minlevel=0, double tolerance=1e-3)
macro mgstats solve(scalar a, double func, double rhs, int nrelax=4, int minlevel=0, double tolerance=TOLERANCE)
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.