[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