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

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


The following commit has been merged in the upstream branch:
commit 9d9fb275c03c13ddba3f73cc195635948e0bbd98
Author: Stephane Popinet <popinet at users.sf.net>
Date:   Tue Nov 28 10:24:16 2006 +1100

    Generic boundary conditions cannot be applied for VOF fractions
    
    A special case treatment has been added for symmetry and Dirichlet conditions.
    
    darcs-hash:20061127232416-d4795-6467a16c12e5a3a1d51aeb641de1a519534c4f25.gz

diff --git a/src/boundary.c b/src/boundary.c
index 12fce5c..6122d81 100644
--- a/src/boundary.c
+++ b/src/boundary.c
@@ -53,6 +53,11 @@ static void face_symmetry (FttCellFace * f, GfsBc * b)
       GFS_STATE (f->neighbor)->f[FTT_OPPOSITE_DIRECTION (f->d)].v;
 }
 
+static void face_symmetry_vof (FttCellFace * f, GfsBc * b)
+{
+  GFS_STATE (f->cell)->f[f->d].v = GFS_VARIABLE (f->neighbor, b->v->i);
+}
+
 static void bc_write (GtsObject * o, FILE * fp)
 {
   g_assert (GFS_BC (o)->v);
@@ -81,6 +86,9 @@ static void bc_read (GtsObject ** o, GtsFile * fp)
     gts_file_error (fp, "unknown variable `%s'", fp->token->str);
   else
     gts_file_next_token (fp);
+
+  if (GFS_IS_VARIABLE_TRACER (bc->v) && GFS_VARIABLE_TRACER (bc->v)->advection.scheme == GFS_VOF)
+    bc->face_bc = (FttFaceTraverseFunc) face_symmetry_vof;
 }
 
 static void gfs_bc_class_init (GtsObjectClass * klass)
@@ -215,6 +223,11 @@ static void dirichlet (FttCellFace * f, GfsBc * b)
     - GFS_VARIABLE (f->neighbor, b->v->i);
 }
 
+static void dirichlet_vof (FttCellFace * f, GfsBc * b)
+{
+  GFS_VARIABLE (f->cell, b->v->i) = gfs_function_face_value (GFS_BC_VALUE (b)->val, f);
+}
+
 static void homogeneous_dirichlet (FttCellFace * f, GfsBc * b)
 {
   GFS_VARIABLE (f->cell, b->v->i) = - GFS_VARIABLE (f->neighbor, b->v->i);
@@ -226,6 +239,19 @@ static void face_dirichlet (FttCellFace * f, GfsBc * b)
     gfs_function_face_value (GFS_BC_VALUE (b)->val, f);
 }
 
+static void bc_dirichlet_read (GtsObject ** o, GtsFile * fp)
+{
+  GfsBc * bc = GFS_BC (*o);
+
+  if (GTS_OBJECT_CLASS (gfs_bc_dirichlet_class ())->parent_class->read)
+    (* GTS_OBJECT_CLASS (gfs_bc_dirichlet_class ())->parent_class->read) (o, fp);
+  if (fp->type == GTS_ERROR)
+    return;
+  
+  if (GFS_IS_VARIABLE_TRACER (bc->v) && GFS_VARIABLE_TRACER (bc->v)->advection.scheme == GFS_VOF)
+    bc->bc = (FttFaceTraverseFunc) dirichlet_vof;
+}
+
 static void gfs_bc_dirichlet_init (GfsBc * object)
 {
   object->bc =             (FttFaceTraverseFunc) dirichlet;
@@ -233,6 +259,11 @@ static void gfs_bc_dirichlet_init (GfsBc * object)
   object->face_bc =        (FttFaceTraverseFunc) face_dirichlet;
 }
 
+static void gfs_bc_dirichlet_class_init (GtsObjectClass * klass)
+{
+  klass->read = bc_dirichlet_read;
+}
+
 GfsBcClass * gfs_bc_dirichlet_class (void)
 {
   static GfsBcClass * klass = NULL;
@@ -242,7 +273,7 @@ GfsBcClass * gfs_bc_dirichlet_class (void)
       "GfsBcDirichlet",
       sizeof (GfsBcValue),
       sizeof (GfsBcClass),
-      (GtsObjectClassInitFunc) NULL,
+      (GtsObjectClassInitFunc) gfs_bc_dirichlet_class_init,
       (GtsObjectInitFunc) gfs_bc_dirichlet_init,
       (GtsArgSetFunc) NULL,
       (GtsArgGetFunc) NULL
diff --git a/src/vof.c b/src/vof.c
index 5384978..f84b290 100644
--- a/src/vof.c
+++ b/src/vof.c
@@ -555,6 +555,8 @@ static gdouble fine_fraction (FttCellFace * face, VofParms * p, gdouble un)
   gdouble f = GFS_VARIABLE (face->cell, p->par->v->i);
   if (f == 0. || f == 1.)
     return f;
+  else if (GFS_CELL_IS_BOUNDARY (face->cell))
+    return GFS_STATE (face->cell)->f[face->d].v;
   else {
     FttComponent c;
     FttVector m;
@@ -677,12 +679,7 @@ void gfs_tracer_vof_advection (GfsDomain * domain,
 
     gfs_domain_cell_traverse (domain, FTT_PRE_ORDER, FTT_TRAVERSE_LEAFS, -1,
 			      (FttCellTraverseFunc) vof_plane, &p);
-    /* fixme: this does not work for all types of boundary conditions */
-    FttComponent i;
-    for (i = 0; i < FTT_DIMENSION; i++)
-      gfs_domain_bc (domain, FTT_TRAVERSE_LEAFS, -1, p.m[i]);
-    gfs_domain_bc (domain, FTT_TRAVERSE_LEAFS, -1, p.alpha);
-
+    gfs_domain_face_bc (domain, c, par->v);
     gfs_domain_cell_traverse (domain, FTT_PRE_ORDER, FTT_TRAVERSE_LEAFS, -1,
 			      (FttCellTraverseFunc) gfs_cell_reset, par->fv);
     gfs_domain_face_traverse (domain, p.c,

-- 
Gerris Flow Solver



More information about the debian-science-commits mailing list