[SCM] Gerris Flow Solver branch, upstream, updated. b3aa46814a06c9cb2912790b23916ffb44f1f203
Stephane Popinet
popinet at users.sf.net
Fri May 15 02:53:38 UTC 2009
The following commit has been merged in the upstream branch:
commit 200acf82ff1e911ead98d1329a581760d5d5265b
Author: Stephane Popinet <popinet at users.sf.net>
Date: Tue May 23 16:23:43 2006 +1000
gfs_line_alpha() uses explicit formula
... rather than Newton iterations.
darcs-hash:20060523062343-d4795-a010b06a018a8187ca8519c9cc41c22862a9fc54.gz
diff --git a/src/vof.c b/src/vof.c
index adb5a9e..4ae358c 100644
--- a/src/vof.c
+++ b/src/vof.c
@@ -55,19 +55,23 @@ gdouble gfs_line_area (FttVector * m, gdouble alpha)
if (alpha1 >= n.x + n.y)
return 1.;
- n.x += 1e-4; n.y += 1e-4;
-
- v = alpha1*alpha1;
-
- a = alpha1 - n.x;
- if (a > 0.)
- v -= a*a;
+ if (n.x == 0.)
+ return alpha1/n.y;
+ else if (n.y == 0.)
+ return alpha1/n.x;
+ else {
+ v = alpha1*alpha1;
- a = alpha1 - n.y;
- if (a > 0.)
- v -= a*a;
+ a = alpha1 - n.x;
+ if (a > 0.)
+ v -= a*a;
+
+ a = alpha1 - n.y;
+ if (a > 0.)
+ v -= a*a;
- return v/(2.*n.x*n.y);
+ return v/(2.*n.x*n.y);
+ }
}
/**
@@ -261,30 +265,6 @@ void gfs_plane_center (FttVector * m, gdouble alpha, gdouble a, FttVector * p)
}
#endif /* 3D */
-static gdouble line_area_derivative_ratio (FttVector * m,
- gdouble alpha,
- gdouble c)
-{
- gdouble a, v, vp;
-
- vp = alpha;
- v = vp*vp;
-
- a = alpha - m->x;
- if (a > 0.) {
- vp -= a;
- v -= a*a;
- }
-
- a = alpha - m->y;
- if (a > 0.) {
- vp -= a;
- v -= a*a;
- }
-
- return (v - c)/(2.*vp);
-}
-
/**
* gfs_line_alpha:
* @m: a #FttVector.
@@ -295,23 +275,24 @@ static gdouble line_area_derivative_ratio (FttVector * m,
*/
gdouble gfs_line_alpha (FttVector * m, gdouble c)
{
- gdouble alpha, dalpha;
- FttVector n;
+ gdouble alpha, m1, m2, v1;
g_return_val_if_fail (m != NULL, 0.);
g_return_val_if_fail (c >= 0. && c <= 1., 0.);
-
- n.x = fabs (m->x); n.y = fabs (m->y);
- if (n.x*n.y < 1e-6)
- alpha = c;
- else {
- c *= 2.*n.x*n.y;
- alpha = (n.x + n.y)/2.;
- do {
- dalpha = line_area_derivative_ratio (&n, alpha, c);
- alpha -= dalpha;
- } while (fabs (dalpha) > 1e-6);
+
+ m1 = fabs (m->x); m2 = fabs (m->y);
+ if (m1 > m2) {
+ v1 = m1; m1 = m2; m2 = v1;
}
+
+ v1 = m1/2.;
+ if (c <= v1/m2)
+ alpha = sqrt (2.*c*m1*m2);
+ else if (c <= 1. - v1/m2)
+ alpha = c*m2 + v1;
+ else
+ alpha = m1 + m2 - sqrt (2.*m1*m2*(1. - c));
+
if (m->x < 0.)
alpha += m->x;
if (m->y < 0.)
--
Gerris Flow Solver
More information about the debian-science-commits
mailing list