[SCM] Gerris Flow Solver branch, upstream, updated. b3aa46814a06c9cb2912790b23916ffb44f1f203
Stephane Popinet
popinet at users.sf.net
Fri May 15 02:53:04 UTC 2009
The following commit has been merged in the upstream branch:
commit fc027518c0e7e223b70d346c90d21fc4754ff8c2
Author: Stephane Popinet <popinet at users.sf.net>
Date: Fri Feb 3 07:19:10 2006 +1100
New "nitermin" param for multilevel solvers
This is optional but useful in some cases to prevent noise building up in a
stationary solution (spurious currents test case for example).
darcs-hash:20060202201910-d4795-a0c9e991cd1546bf511f5f5cbda9503d9d988ae1.gz
diff --git a/src/ocean.c b/src/ocean.c
index 99c1a26..e55f337 100644
--- a/src/ocean.c
+++ b/src/ocean.c
@@ -238,7 +238,8 @@ static void gfs_free_surface_pressure (GfsDomain * toplayer,
gfs_domain_norm_residual (toplayer, FTT_TRAVERSE_LEAFS, -1, apar->dt, res1);
par->niter = 0;
par->dimension = 2;
- while (par->residual.infty > par->tolerance && par->niter < par->nitermax) {
+ while (par->niter < par->nitermin ||
+ (par->residual.infty > par->tolerance && par->niter < par->nitermax)) {
#if 0
fprintf (stderr, "%d bias: %g first: %g second: %g infty: %g\n",
par->niter,
diff --git a/src/poisson.c b/src/poisson.c
index f5001b3..bcd2768 100644
--- a/src/poisson.c
+++ b/src/poisson.c
@@ -42,6 +42,7 @@ void gfs_multilevel_params_write (GfsMultilevelParams * par, FILE * fp)
" erelax = %u\n"
" minlevel = %u\n"
" nitermax = %u\n"
+ " nitermin = %u\n"
" weighted = %d\n"
" beta = %g\n"
"}",
@@ -50,6 +51,7 @@ void gfs_multilevel_params_write (GfsMultilevelParams * par, FILE * fp)
par->erelax,
par->minlevel,
par->nitermax,
+ par->nitermin,
par->weighted,
par->beta);
}
@@ -63,6 +65,7 @@ void gfs_multilevel_params_init (GfsMultilevelParams * par)
par->erelax = 1;
par->minlevel = 0;
par->nitermax = 100;
+ par->nitermin = 0;
par->dimension = FTT_DIMENSION;
par->weighted = FALSE;
@@ -77,6 +80,7 @@ void gfs_multilevel_params_read (GfsMultilevelParams * par, GtsFile * fp)
{GTS_UINT, "erelax", TRUE},
{GTS_UINT, "minlevel", TRUE},
{GTS_UINT, "nitermax", TRUE},
+ {GTS_UINT, "nitermin", TRUE},
{GTS_INT, "weighted", TRUE},
{GTS_DOUBLE, "beta", TRUE},
{GTS_NONE}
@@ -90,8 +94,9 @@ void gfs_multilevel_params_read (GfsMultilevelParams * par, GtsFile * fp)
var[2].data = &par->erelax;
var[3].data = &par->minlevel;
var[4].data = &par->nitermax;
- var[5].data = &par->weighted;
- var[6].data = &par->beta;
+ var[5].data = &par->nitermin;
+ var[6].data = &par->weighted;
+ var[7].data = &par->beta;
gts_file_assign_variables (fp, var);
if (fp->type == GTS_ERROR)
diff --git a/src/poisson.h b/src/poisson.h
index df66afa..178f1f7 100644
--- a/src/poisson.h
+++ b/src/poisson.h
@@ -35,7 +35,7 @@ struct _GfsMultilevelParams {
gdouble tolerance;
guint nrelax, erelax;
guint minlevel;
- guint nitermax;
+ guint nitermax, nitermin;
guint dimension;
guint niter;
diff --git a/src/timestep.c b/src/timestep.c
index 096b4c4..ce89a6b 100644
--- a/src/timestep.c
+++ b/src/timestep.c
@@ -233,8 +233,8 @@ void gfs_mac_projection (GfsDomain * domain,
par->residual_before = par->residual =
gfs_domain_norm_residual (domain, FTT_TRAVERSE_LEAFS, -1, apar->dt, res);
par->niter = 0;
- while (par->residual.infty > par->tolerance &&
- par->niter < par->nitermax) {
+ while (par->niter < par->nitermin ||
+ (par->residual.infty > par->tolerance && par->niter < par->nitermax)) {
gfs_poisson_cycle (domain, par, p, div, dia, res);
par->residual = gfs_domain_norm_residual (domain, FTT_TRAVERSE_LEAFS, -1, apar->dt, res);
par->niter++;
@@ -397,8 +397,8 @@ void gfs_approximate_projection (GfsDomain * domain,
par->residual_before = par->residual =
gfs_domain_norm_residual (domain, FTT_TRAVERSE_LEAFS, -1, apar->dt, res1);
par->niter = 0;
- while (par->residual.infty > par->tolerance &&
- par->niter < par->nitermax) {
+ while (par->niter < par->nitermin ||
+ (par->residual.infty > par->tolerance && par->niter < par->nitermax)) {
#if 0
fprintf (stderr, "%d bias: %g first: %g second: %g infty: %g\n",
par->niter,
@@ -512,8 +512,8 @@ void gfs_diffusion (GfsDomain * domain,
par->residual_before = par->residual =
gfs_domain_norm_variable (domain, res, FTT_TRAVERSE_LEAFS, -1);
par->niter = 0;
- while (par->residual.infty > par->tolerance &&
- par->niter < par->nitermax) {
+ while (par->niter < par->nitermin ||
+ (par->residual.infty > par->tolerance && par->niter < par->nitermax)) {
gfs_diffusion_cycle (domain, minlevel, maxlevel, par->nrelax, v, rhs, dia, res);
par->residual = gfs_domain_norm_variable (domain, res, FTT_TRAVERSE_LEAFS, -1);
par->niter++;
--
Gerris Flow Solver
More information about the debian-science-commits
mailing list