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

Stephane Popinet popinet at users.sf.net
Fri May 15 02:53:11 UTC 2009


The following commit has been merged in the upstream branch:
commit 84e7182757ee8f5d9de7f739ddb22868ab0997f8
Author: Stephane Popinet <popinet at users.sf.net>
Date:   Fri Mar 24 15:40:02 2006 +1100

    Bug fix for relaxation on lowest level
    
    darcs-hash:20060324044002-d4795-82a3446e814138f58297ced0e3f0a573e7ca46d0.gz

diff --git a/src/poisson.c b/src/poisson.c
index bcd2768..3725f8b 100644
--- a/src/poisson.c
+++ b/src/poisson.c
@@ -116,116 +116,6 @@ void gfs_multilevel_params_read (GfsMultilevelParams * par, GtsFile * fp)
     gts_file_variable_error (fp, var, "beta", "beta must be in [0.5,1]");
 }
 
-#define FACE_GRADIENT(x, y, z, u) (gfs_face_weighted_gradient (x, y, z, u))
-//#define FACE_GRADIENT(x, y, z, u) (gfs_face_gradient_flux_centered (x, y, z, u))
-
-void gfs_face_gradient_flux_centered (const FttCellFace * face,
-				      GfsGradient * g,
-				      guint v,
-				      gint max_level)
-{
-  guint level;
-
-  g_return_if_fail (face != NULL);
-
-  g->a = g->b = 0.;
-  if (face->neighbor == NULL)
-    return;
-
-  level = ftt_cell_level (face->cell);
-  if (ftt_cell_level (face->neighbor) < level) {
-    g_assert_not_implemented ();
-#if 0
-    /* neighbor is at a shallower level */
-    Gradient gcf;
-    gdouble w = GFS_STATE (face->cell)->f[face->d].v;
-
-    gcf = gradient_flux_fine_coarse (face, v, max_level);
-    g->a = w*gcf.a;
-    g->b = w*(gcf.b*GFS_VARIABLE (face->neighbor, v) + gcf.c);
-#endif
-  }
-  else {
-    if (level == max_level || FTT_CELL_IS_LEAF (face->neighbor)) {
-      /* neighbor is at the same level */
-      gdouble w = GFS_STATE (face->cell)->f[face->d].v;
-
-      if (!GFS_IS_MIXED (face->cell) || !GFS_IS_MIXED (face->neighbor)) {
-	g->a = w;
-	g->b = w*GFS_VARIABLE (face->neighbor, v);
-      }
-      else {
-	FttComponent c = face->d/2;
-	FttComponent cp = FTT_ORTHOGONAL_COMPONENT (c);
-	FttCell * n[4];
-	gdouble ye = (1. - GFS_FACE_FRACTION (face))/2.;
-	GfsSolidVector * s = GFS_STATE (face->cell)->solid;
-
-	n[0] = face->cell; n[1] = face->neighbor;
-	if ((s->s[2*cp] == 1. && s->s[2*cp + 1] < 1.) ||
-	    (s->s[2*cp + 1] == 0. && 
-	     s->s[2*cp] < 1. && s->s[2*cp] > 0.)) {
-	  n[2] = ftt_cell_neighbor (n[0], 2*cp);
-	  n[3] = ftt_cell_neighbor (n[1], 2*cp);
-	}
-	else if ((s->s[2*cp + 1] == 1. && s->s[2*cp] < 1.) ||
-		 (s->s[2*cp] == 0. && 
-		  s->s[2*cp + 1] < 1. && s->s[2*cp + 1] > 0.)) {
-	  n[2] = ftt_cell_neighbor (n[0], 2*cp + 1);
-	  n[3] = ftt_cell_neighbor (n[1], 2*cp + 1);
-	}
-	else {
-	  g->a = w;
-	  g->b = w*GFS_VARIABLE (n[1], v);
-	  return;
-	}
-
-	//	g_assert (n[2] && n[3]);
-	if (n[2] && n[3]) {
-	  g->a = w*(1. - ye);
-	  g->b = w*(1. - ye)*GFS_VARIABLE (n[1], v) + 
-	    w*ye*(GFS_VARIABLE (n[3], v) - GFS_VARIABLE (n[2], v));
-	}
-	else {
-	  g->a = w;
-	  g->b = w*GFS_VARIABLE (n[1], v);
-	}
-      }
-    }
-    else {
-    g_assert_not_implemented ();
-#if 0
-      /* neighbor is at a deeper level */
-      FttCellChildren children;
-      FttCellFace f;
-      guint i, n;
-      
-      f.d = FTT_OPPOSITE_DIRECTION (face->d);
-      n = ftt_cell_children_direction (face->neighbor, f.d, &children);
-      f.neighbor = face->cell;
-      for (i = 0; i < n; i++) {
-	Gradient gcf;
-	gdouble w;
-
-	f.cell = children.c[i];
-	w = GFS_STATE (f.cell)->f[f.d].v;
-	
-	/* check for mixed cell refinement violation (topology.fig) */
-	g_assert (f.cell);
-	
-	gcf = gradient_fine_coarse (&f, v, max_level);
-	g->a += w*gcf.b;
-	g->b += w*(gcf.a*GFS_VARIABLE (f.cell, v) - gcf.c);
-      }
-#endif
-#if (!FTT_2D && !FTT_2D3)
-      g->a /= 2.;
-      g->b /= 2.;
-#endif /* not 2D and not 2D3 */
-    }
-  }
-}
-
 typedef struct {
   guint u, rhs, dia, res;
   gint maxlevel;
@@ -246,7 +136,7 @@ static void relax (FttCell * cell, RelaxParams * p)
   for (f.d = 0; f.d < FTT_NEIGHBORS; f.d++) {
     f.neighbor = neighbor.c[f.d];
     if (f.neighbor) {
-      FACE_GRADIENT (&f, &ng, p->u, p->maxlevel);
+      gfs_face_weighted_gradient (&f, &ng, p->u, p->maxlevel);
       g.a += ng.a;
       g.b += ng.b;
     }
@@ -271,7 +161,7 @@ static void relax2D (FttCell * cell, RelaxParams * p)
   for (f.d = 0; f.d < FTT_NEIGHBORS_2D; f.d++) {
     f.neighbor = neighbor.c[f.d];
     if (f.neighbor) {
-      FACE_GRADIENT (&f, &ng, p->u, p->maxlevel);
+      gfs_face_weighted_gradient (&f, &ng, p->u, p->maxlevel);
       g.a += ng.a;
       g.b += ng.b;
     }
@@ -336,7 +226,7 @@ static void residual_set (FttCell * cell, RelaxParams * p)
   for (f.d = 0; f.d < FTT_NEIGHBORS; f.d++) {
     f.neighbor = neighbor.c[f.d];
     if (f.neighbor) {
-      FACE_GRADIENT (&f, &ng, p->u, p->maxlevel);
+      gfs_face_weighted_gradient (&f, &ng, p->u, p->maxlevel);
       g.a += ng.a;
       g.b += ng.b;
     }
@@ -359,7 +249,7 @@ static void residual_set2D (FttCell * cell, RelaxParams * p)
   for (f.d = 0; f.d < FTT_NEIGHBORS_2D; f.d++) {
     f.neighbor = neighbor.c[f.d];
     if (f.neighbor) {
-      FACE_GRADIENT (&f, &ng, p->u, p->maxlevel);
+      gfs_face_weighted_gradient (&f, &ng, p->u, p->maxlevel);
       g.a += ng.a;
       g.b += ng.b;
     }
@@ -641,8 +531,8 @@ void gfs_poisson_cycle (GfsDomain * domain,
 			    (FttCellTraverseFunc) gfs_get_from_below_extensive, res);
 
   /* relax top level */
-  gfs_domain_cell_traverse (domain, 
-			    FTT_PRE_ORDER, FTT_TRAVERSE_LEVEL, minlevel,
+  gfs_domain_cell_traverse (domain,
+			    FTT_PRE_ORDER, FTT_TRAVERSE_LEVEL | FTT_TRAVERSE_LEAFS, minlevel,
 			    (FttCellTraverseFunc) gfs_cell_reset, dp);
   nrelax = p->nrelax;
   for (l = minlevel; l < p->depth; l++)

-- 
Gerris Flow Solver



More information about the debian-science-commits mailing list