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

Stephane Popinet s.popinet at niwa.co.nz
Fri May 15 02:53:07 UTC 2009


The following commit has been merged in the upstream branch:
commit 079e97eb12aff26c1af6f35152587fdce8ead13d
Author: Stephane Popinet <s.popinet at niwa.co.nz>
Date:   Wed Mar 8 15:32:45 2006 +1100

    Approximate projection uses fraction-weighted average pressure gradients
    
    The previous unweighted averages were unstable for the "thin plate"
    test case which has been added to the test suite.
    
    darcs-hash:20060308043245-fbd8f-31f4da15e45d564e3d6aacb870e6ddf58203f77c.gz

diff --git a/configure.in b/configure.in
index 1f6596d..da823aa 100644
--- a/configure.in
+++ b/configure.in
@@ -13,7 +13,7 @@ dnl are available for $ac_help expansion (don't we all *love* autoconf?)
 #
 GFS_MAJOR_VERSION=0
 GFS_MINOR_VERSION=9
-GFS_MICRO_VERSION=0
+GFS_MICRO_VERSION=1
 GFS_INTERFACE_AGE=0
 GFS_BINARY_AGE=0
 GFS_VERSION=$GFS_MAJOR_VERSION.$GFS_MINOR_VERSION.$GFS_MICRO_VERSION
diff --git a/src/ocean.c b/src/ocean.c
index 77a211c..5ff8d36 100644
--- a/src/ocean.c
+++ b/src/ocean.c
@@ -39,8 +39,8 @@ static void reset_gradients (FttCell * cell, gpointer * data)
     GFS_VARIABLE (cell, g[c]->i) = 0.;
 }
 
-static void correct_normal_velocity_weighted (FttCellFace * face,
-					      gpointer * data)
+static void correct_normal_velocity (FttCellFace * face,
+				     gpointer * data)
 {
   GfsGradient g;
   gdouble dp;
@@ -67,49 +67,27 @@ static void correct_normal_velocity_weighted (FttCellFace * face,
     dp /= s->solid->s[face->d];
 
   GFS_FACE_NORMAL_VELOCITY_LEFT (face) -= dp*(*dt);
-  GFS_VARIABLE (face->cell, gv[c]->i) += dp*GFS_FACE_FRACTION_LEFT (face);
-
-  switch (type) {
-  case FTT_FINE_FINE:
-    GFS_FACE_NORMAL_VELOCITY_RIGHT (face) -= dp*(*dt);
-    GFS_VARIABLE (face->neighbor, gv[c]->i) += dp*GFS_FACE_FRACTION_RIGHT (face);
-    break;
-  case FTT_FINE_COARSE: {
-    dp *= GFS_FACE_FRACTION_LEFT (face)/(FTT_CELLS/2);
-    GFS_VARIABLE (face->neighbor, gv[c]->i) += dp;
-    g_assert (GFS_FACE_FRACTION_RIGHT (face) > 0.);
-    GFS_FACE_NORMAL_VELOCITY_RIGHT (face) -= dp/GFS_FACE_FRACTION_RIGHT (face)*(*dt);
-    break;
-  }
-  default:
-    g_assert_not_reached ();
-  }
+  GFS_VARIABLE (face->cell, gv[c]->i) += dp;
+
+  if (ftt_face_type (face) == FTT_FINE_COARSE)
+    dp *= GFS_FACE_FRACTION_LEFT (face)/(GFS_FACE_FRACTION_RIGHT (face)*FTT_CELLS/2);
+  GFS_FACE_NORMAL_VELOCITY_RIGHT (face) -= dp*(*dt);
+  GFS_VARIABLE (face->neighbor, gv[c]->i) += dp;
 }
 
-static void scale_gradients_weighted (FttCell * cell, gpointer * data)
+static void scale_gradients (FttCell * cell, gpointer * data)
 {
   GfsVariable ** g = data[0];
   guint * dimension = data[1];
+  FttCellNeighbors n;
   FttComponent c;
 
-  if (GFS_IS_MIXED (cell)) {
-    GfsSolidVector * s = GFS_STATE (cell)->solid;
-
-    for (c = 0; c < *dimension; c++) {
-      g_assert (s->s[2*c] + s->s[2*c + 1] > 0.);
-      GFS_VARIABLE (cell, g[c]->i) /= s->s[2*c] + s->s[2*c + 1];
-    }
-  }
-  else {
-    FttCellNeighbors n;
-
-    ftt_cell_neighbors (cell, &n);
-    for (c = 0; c < *dimension; c++) {
-      FttCell * c1 = n.c[2*c], * c2 = n.c[2*c + 1];
-
-      if (c1 && c2 && !GFS_CELL_IS_GRADIENT_BOUNDARY (c1) && !GFS_CELL_IS_GRADIENT_BOUNDARY (c2))
-	GFS_VARIABLE (cell, g[c]->i) /= 2.;
-    }
+  ftt_cell_neighbors (cell, &n);
+  for (c = 0; c < *dimension; c++) {
+    FttCell * c1 = n.c[2*c], * c2 = n.c[2*c + 1];
+    
+    if (c1 && c2 && !GFS_CELL_IS_GRADIENT_BOUNDARY (c1) && !GFS_CELL_IS_GRADIENT_BOUNDARY (c2))
+      GFS_VARIABLE (cell, g[c]->i) /= 2.;
   }
 }
 
@@ -133,7 +111,7 @@ static void gfs_correct_normal_velocities_weighted (GfsDomain * domain,
 						    gdouble dt,
 						    gboolean weighted)
 {
-  if (!weighted)
+  if (weighted)
     gfs_correct_normal_velocities (domain, dimension, p, g, dt, NULL);
   else {
     gpointer data[3];
@@ -156,11 +134,11 @@ static void gfs_correct_normal_velocities_weighted (GfsDomain * domain,
     data[2] = &dt;
     gfs_domain_face_traverse (domain, dimension == 2 ? FTT_XY : FTT_XYZ,
 			      FTT_PRE_ORDER, FTT_TRAVERSE_LEAFS, -1,
-			      (FttFaceTraverseFunc) correct_normal_velocity_weighted, data);
+			      (FttFaceTraverseFunc) correct_normal_velocity, data);
     data[0] = g;
     data[1] = &dimension;
     gfs_domain_cell_traverse (domain, FTT_PRE_ORDER, FTT_TRAVERSE_LEAFS, -1,
-			      (FttCellTraverseFunc) scale_gradients_weighted, data);
+			      (FttCellTraverseFunc) scale_gradients, data);
     for (c = 0; c < dimension; c++)
       gfs_domain_bc (domain, FTT_TRAVERSE_LEAFS, -1, g[c]);
   }
@@ -680,7 +658,7 @@ static void ocean_run (GfsSimulation * sim)
 
     gfs_domain_timer_start (domain, "correct_normal_velocities");
     gfs_poisson_coefficients (domain, NULL);
-    gfs_correct_normal_velocities (domain, 2, p, g, sim->advection_params.dt/2., NULL);
+    gfs_correct_normal_velocities_weighted (domain, 2, p, g, sim->advection_params.dt/2., FALSE);
     gfs_domain_cell_traverse_boundary (domain, FTT_BACK,
 				       FTT_PRE_ORDER, FTT_TRAVERSE_LEAFS, -1,
 				       (FttCellTraverseFunc) compute_w, 
diff --git a/src/timestep.c b/src/timestep.c
index 69b7f5e..f786179 100644
--- a/src/timestep.c
+++ b/src/timestep.c
@@ -62,28 +62,39 @@ static void correct_normal_velocity (FttCellFace * face,
 
   GFS_FACE_NORMAL_VELOCITY_LEFT (face) -= dp*(*dt);
   if (gv)
-    GFS_VARIABLE (face->cell, gv[c]->i) += dp;
+    GFS_VARIABLE (face->cell, gv[c]->i) += dp*GFS_FACE_FRACTION_LEFT (face);
 
   if (ftt_face_type (face) == FTT_FINE_COARSE)
     dp *= GFS_FACE_FRACTION_LEFT (face)/(GFS_FACE_FRACTION_RIGHT (face)*FTT_CELLS/2);
   GFS_FACE_NORMAL_VELOCITY_RIGHT (face) -= dp*(*dt);
   if (gv)
-    GFS_VARIABLE (face->neighbor, gv[c]->i) += dp;
+    GFS_VARIABLE (face->neighbor, gv[c]->i) += dp*GFS_FACE_FRACTION_RIGHT (face);
 }
 
 static void scale_gradients (FttCell * cell, gpointer * data)
 {
   GfsVariable ** g = data[0];
   guint * dimension = data[1];
-  FttCellNeighbors n;
   FttComponent c;
 
-  ftt_cell_neighbors (cell, &n);
-  for (c = 0; c < *dimension; c++) {
-    FttCell * c1 = n.c[2*c], * c2 = n.c[2*c + 1];
+  if (GFS_IS_MIXED (cell)) {
+    GfsSolidVector * s = GFS_STATE (cell)->solid;
+
+    for (c = 0; c < *dimension; c++) {
+      g_assert (s->s[2*c] + s->s[2*c + 1] > 0.);
+      GFS_VARIABLE (cell, g[c]->i) /= s->s[2*c] + s->s[2*c + 1];
+    }
+  }
+  else {
+    FttCellNeighbors n;
     
-    if (c1 && c2 && !GFS_CELL_IS_GRADIENT_BOUNDARY (c1) && !GFS_CELL_IS_GRADIENT_BOUNDARY (c2))
-      GFS_VARIABLE (cell, g[c]->i) /= 2.;
+    ftt_cell_neighbors (cell, &n);
+    for (c = 0; c < *dimension; c++) {
+      FttCell * c1 = n.c[2*c], * c2 = n.c[2*c + 1];
+      
+      if (c1 && c2 && !GFS_CELL_IS_GRADIENT_BOUNDARY (c1) && !GFS_CELL_IS_GRADIENT_BOUNDARY (c2))
+	GFS_VARIABLE (cell, g[c]->i) /= 2.;
+    }
   }
 }
 
diff --git a/test/Makefile.am b/test/Makefile.am
index e38a1e6..fc4c14f 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -14,7 +14,8 @@ TESTDIRS = \
 	waves \
 	geo \
 	lid \
-	couette
+	couette \
+	plate
 
 EXTRA_DIST = \
 	template.tex \
diff --git a/test/plate/plate.gfs b/test/plate/plate.gfs
new file mode 100644
index 0000000..ec28635
--- /dev/null
+++ b/test/plate/plate.gfs
@@ -0,0 +1,27 @@
+# Title: Potential flow around a thin plate
+#
+# Description:
+#
+# This test case triggers an instability if the cell-centered pressure
+# gradient used in the approximate projection is not computed using
+# solid-fraction-weighted averages of the face-centered pressure
+# gradients.
+#
+# Author: St\'ephane Popinet
+# Command: sh plate.sh plate.gfs
+# Version: 0.9.1
+# Required files: plate.sh
+#
+1 0 GfsSimulation GfsBox GfsGEdge {} {
+  Time { iend = 30 dtmax = 1e-2 }
+  Refine 5
+  RefineSolid 6
+  GtsSurfaceFile square.gts
+  AdvectionParams { scheme = none }
+  Init {} { U = 1 }
+  OutputScalarNorm { start = end } stdout { v = Velocity } 
+}
+GfsBox {
+  left = Boundary { BcDirichlet U 1 }
+  right = BoundaryOutflow 
+}
diff --git a/test/plate/plate.sh b/test/plate/plate.sh
new file mode 100644
index 0000000..d43dcc2
--- /dev/null
+++ b/test/plate/plate.sh
@@ -0,0 +1,6 @@
+shapes square | transform --sy 0.06251 | transform --tx .031249 | transform --ty -.015 > square.gts
+if gerris2D $1 | awk '{ if ($9 < 10.) exit (1); }'; then :
+    exit 1
+else
+    exit 0
+fi
diff --git a/test/template.tex b/test/template.tex
index a797a22..392cc40 100644
--- a/test/template.tex
+++ b/test/template.tex
@@ -55,6 +55,7 @@ current stable branch of the version-controlled source code.
 
 \input{boundaries/boundaries.tex}
 \input{channel/channel.tex}
+\input{plate/plate.tex}
 
 \section{Surface tension}
 

-- 
Gerris Flow Solver



More information about the debian-science-commits mailing list