[SCM] Gerris Flow Solver branch, upstream, updated. b3aa46814a06c9cb2912790b23916ffb44f1f203
Stephane Popinet
popinet at users.sf.net
Fri May 15 02:53:37 UTC 2009
The following commit has been merged in the upstream branch:
commit 01ca55ee16457c414d0b668ba8d86da006531c19
Author: Stephane Popinet <popinet at users.sf.net>
Date: Sun Feb 5 12:32:49 2006 +1100
VariableCurvature must be interpolated with care on adaptive mesh
darcs-hash:20060205013249-d4795-180008f0bd2d4f77851060c43cae8f47f50aa506.gz
diff --git a/src/levelset.c b/src/levelset.c
index b077396..b2bb253 100644
--- a/src/levelset.c
+++ b/src/levelset.c
@@ -327,8 +327,50 @@ static void variable_curvature_class_init (GtsObjectClass * klass)
GFS_EVENT_CLASS (klass)->event_half = variable_curvature_event_half;
}
+static void curvature_coarse_fine (FttCell * parent, GfsVariable * v)
+{
+ FttCellChildren child;
+ guint n;
+
+ ftt_cell_children (parent, &child);
+ for (n = 0; n < FTT_CELLS; n++) {
+ GfsVariableCurvature * k = GFS_VARIABLE_CURVATURE (v);
+ gdouble f = GFS_VARIABLE (child.c[n], GFS_VARIABLE_DISTANCE (k->d)->v->i);
+
+ GFS_VARIABLE (child.c[n], v->i) = GFS_VARIABLE (parent, v->i);
+ if (!GFS_IS_FULL (f))
+ g_assert (fabs (GFS_VARIABLE (child.c[n], v->i)) < G_MAXDOUBLE);
+ }
+}
+
+static void curvature_fine_coarse (FttCell * parent, GfsVariable * v)
+{
+ GfsVariableCurvature * k = GFS_VARIABLE_CURVATURE (v);
+ GfsVariable * t = GFS_VARIABLE_DISTANCE (k->d)->v;
+ FttCellChildren child;
+ gdouble val = 0., sa = 0.;
+ guint i;
+
+ ftt_cell_children (parent, &child);
+ for (i = 0; i < FTT_CELLS; i++)
+ if (child.c[i] && !GFS_IS_FULL (GFS_VARIABLE (child.c[i], t->i))) {
+ gdouble a = GFS_IS_MIXED (child.c[i]) ? GFS_STATE (child.c[i])->solid->a : 1.;
+
+ val += GFS_VARIABLE (child.c[i], v->i)*a;
+ sa += a;
+ }
+ if (sa > 0.)
+ GFS_VARIABLE (parent, v->i) = val/sa;
+ else {
+ GFS_VARIABLE (parent, v->i) = G_MAXDOUBLE;
+ g_assert (GFS_IS_FULL (GFS_VARIABLE (parent, t->i)));
+ }
+}
+
static void variable_curvature_init (GfsVariableCurvature * v)
{
+ GFS_VARIABLE1 (v)->coarse_fine = curvature_coarse_fine;
+ GFS_VARIABLE1 (v)->fine_coarse = curvature_fine_coarse;
}
GfsVariableClass * gfs_variable_curvature_class (void)
--
Gerris Flow Solver
More information about the debian-science-commits
mailing list