[SCM] Gerris Flow Solver branch, upstream, updated. b3aa46814a06c9cb2912790b23916ffb44f1f203

Stephane Popinet popinet at users.sf.net
Fri May 15 02:54:59 UTC 2009


The following commit has been merged in the upstream branch:
commit aa23f45b33aa24fee4702da5c87f5a65a017f577
Author: Stephane Popinet <popinet at users.sf.net>
Date:   Wed Jan 30 07:51:03 2008 +1100

    Added 'omega' over-relaxation parameter
    
    darcs-hash:20080129205103-d4795-0736243753f349bef833febc23e6042b08669cd2.gz

diff --git a/src/event.c b/src/event.c
index d5a2772..47da9f1 100644
--- a/src/event.c
+++ b/src/event.c
@@ -763,11 +763,8 @@ static void stream_from_vorticity (GfsDomain * domain,
   res = gfs_temporary_variable (domain);
   gfs_residual (domain, FTT_DIMENSION, FTT_TRAVERSE_LEAFS, -1, stream, vorticity, dia, res);
   norm = gfs_domain_norm_residual (domain, FTT_TRAVERSE_LEAFS, -1, 1., res);
+  gfs_multilevel_params_init (&par);
   par.depth = gfs_domain_depth (domain);
-  par.minlevel = 0;
-  par.nrelax = 4;
-  par.erelax = 1;
-  par.dimension = FTT_DIMENSION;
   while (norm.infty > tolerance && maxit) {
     gfs_poisson_cycle (domain, &par, stream, vorticity, dia, res);
     norm = gfs_domain_norm_residual (domain, FTT_TRAVERSE_LEAFS, -1, 1., res);
diff --git a/src/poisson.c b/src/poisson.c
index ba08df2..f5e1d36 100644
--- a/src/poisson.c
+++ b/src/poisson.c
@@ -46,6 +46,7 @@ void gfs_multilevel_params_write (GfsMultilevelParams * par, FILE * fp)
 	   "  nitermin  = %u\n"
 	   "  weighted  = %d\n"
 	   "  beta      = %g\n"
+	   "  omega     = %g\n"
 	   "}",
 	   par->tolerance,
 	   par->nrelax,
@@ -54,7 +55,8 @@ void gfs_multilevel_params_write (GfsMultilevelParams * par, FILE * fp)
 	   par->nitermax,
 	   par->nitermin,
 	   par->weighted,
-	   par->beta);
+	   par->beta,
+	   par->omega);
 }
 
 void gfs_multilevel_params_init (GfsMultilevelParams * par)
@@ -71,6 +73,7 @@ void gfs_multilevel_params_init (GfsMultilevelParams * par)
   par->dimension = FTT_DIMENSION;
   par->weighted = FALSE;
   par->beta = 0.5;
+  par->omega = 1.;
 }
 
 void gfs_multilevel_params_read (GfsMultilevelParams * par, GtsFile * fp)
@@ -84,6 +87,7 @@ void gfs_multilevel_params_read (GfsMultilevelParams * par, GtsFile * fp)
     {GTS_UINT,   "nitermin",  TRUE},
     {GTS_INT,    "weighted",  TRUE},
     {GTS_DOUBLE, "beta",      TRUE},
+    {GTS_DOUBLE, "omega",     TRUE},
     {GTS_NONE}
   };
 
@@ -98,6 +102,7 @@ void gfs_multilevel_params_read (GfsMultilevelParams * par, GtsFile * fp)
   var[5].data = &par->nitermin;
   var[6].data = &par->weighted;
   var[7].data = &par->beta;
+  var[8].data = &par->omega;
 
   gts_file_assign_variables (fp, var);
   if (fp->type == GTS_ERROR)
@@ -166,7 +171,7 @@ void gfs_multilevel_params_stats_write (GfsMultilevelParams * par,
 typedef struct {
   guint u, rhs, dia, res;
   gint maxlevel;
-  gdouble beta;
+  gdouble beta, omega;
 } RelaxParams;
 
 static void relax (FttCell * cell, RelaxParams * p)
@@ -214,7 +219,9 @@ static void relax2D (FttCell * cell, RelaxParams * p)
     }
   }
   if (g.a > 0.)
-    GFS_VARIABLE (cell, p->u) = (g.b - GFS_VARIABLE (cell, p->rhs))/g.a;
+    GFS_VARIABLE (cell, p->u) = 
+      (1. - p->omega)*GFS_VARIABLE (cell, p->u) 
+      + p->omega*(g.b - GFS_VARIABLE (cell, p->rhs))/g.a;
   else
     GFS_VARIABLE (cell, p->u) = 0.;
 }
@@ -237,6 +244,7 @@ static void relax2D (FttCell * cell, RelaxParams * p)
 void gfs_relax (GfsDomain * domain,
 		guint d,
 		gint max_depth,
+		gdouble omega,
 		GfsVariable * u,
 		GfsVariable * rhs,
 		GfsVariable * dia)
@@ -253,6 +261,7 @@ void gfs_relax (GfsDomain * domain,
   p.rhs = rhs->i;
   p.dia = dia->i;
   p.maxlevel = max_depth;
+  p.omega = omega;
   gfs_domain_cell_traverse (domain, FTT_PRE_ORDER, 
 			    FTT_TRAVERSE_LEVEL | FTT_TRAVERSE_LEAFS,
 			    max_depth,
@@ -685,7 +694,7 @@ void gfs_poisson_cycle (GfsDomain * domain,
     gfs_domain_homogeneous_bc (domain,
 			       FTT_TRAVERSE_LEVEL | FTT_TRAVERSE_LEAFS,
 			       minlevel, dp, u);
-    gfs_relax (domain, p->dimension, minlevel, dp, res, dia);
+    gfs_relax (domain, p->dimension, minlevel, p->omega, dp, res, dia);
   }
   nrelax /= p->erelax;
 
@@ -699,7 +708,7 @@ void gfs_poisson_cycle (GfsDomain * domain,
       gfs_domain_homogeneous_bc (domain, 
 				 FTT_TRAVERSE_LEVEL | FTT_TRAVERSE_LEAFS,
 				 l, dp, u);
-      gfs_relax (domain, p->dimension, l, dp, res, dia);
+      gfs_relax (domain, p->dimension, l, p->omega, dp, res, dia);
     }
   }
   /* correct on leaf cells */
diff --git a/src/poisson.h b/src/poisson.h
index c171901..8c65153 100644
--- a/src/poisson.h
+++ b/src/poisson.h
@@ -40,7 +40,7 @@ struct _GfsMultilevelParams {
   guint niter;
   guint depth;
   gboolean weighted;
-  gdouble beta;
+  gdouble beta, omega;
   GfsNorm residual_before, residual;
 };
 
@@ -54,6 +54,7 @@ void                  gfs_multilevel_params_stats_write (GfsMultilevelParams * p
 void                  gfs_relax                      (GfsDomain * domain,
 						      guint d,
 						      gint max_depth,
+						      gdouble omega,
 						      GfsVariable * u,
 						      GfsVariable * rhs,
 						      GfsVariable * dia);

-- 
Gerris Flow Solver



More information about the debian-science-commits mailing list