[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