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

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


The following commit has been merged in the upstream branch:
commit 4649556f8b4d122b808f09f9eaa560de8e82a294
Author: Stephane Popinet <popinet at users.sf.net>
Date:   Fri Jan 19 14:53:31 2007 +1100

    VOF works (as in "does not crash") with embedded solid boundaries
    
    darcs-hash:20070119035331-d4795-b184d87ba5c848eb0b01227f0c7a0dab1fe95b90.gz

diff --git a/src/vof.c b/src/vof.c
index fff2223..fe5c85b 100644
--- a/src/vof.c
+++ b/src/vof.c
@@ -538,9 +538,6 @@ static void vof_plane (FttCell * cell, VofParms * p)
   FttVector m;
   gdouble alpha;
 
-  if (GFS_IS_MIXED (cell))
-    g_assert_not_implemented ();
-
   gfs_vof_plane (cell, p->par->v, &m, &alpha);
   for (c = 0; c < FTT_DIMENSION; c++) {
     GFS_VARIABLE (cell, p->m[c]->i) = - (&m.x)[c];
@@ -643,36 +640,33 @@ static void vof_flux (FttCellFace * face, VofParms * p)
     ftt_face_pos (face, &p);
     g_warning ("CFL (%g) at (%g,%g,%g) is larger than 0.5!", un, p.x, p.y, p.z);
   }
+  un *= GFS_FACE_FRACTION (face);
 
+  GFS_VARIABLE (face->cell, p->par->fv->i) += GFS_VARIABLE (face->cell, p->par->v->i)*un;
+  gdouble flux = GFS_STATE (face->cell)->f[face->d].v*un;
   switch (ftt_face_type (face)) {
   case FTT_FINE_FINE: {
-    gdouble f = un > 0. ? 
-      GFS_STATE (face->cell)->f[face->d].v :
-      GFS_STATE (face->neighbor)->f[FTT_OPPOSITE_DIRECTION (face->d)].v;
-    GFS_VARIABLE (face->cell, p->par->fv->i) += 
-      (GFS_VARIABLE (face->cell, p->par->v->i) - f)*un;
-    GFS_VARIABLE (face->neighbor, p->par->fv->i) -= 
-      (GFS_VARIABLE (face->neighbor, p->par->v->i) - f)*un;
+    if (un < 0.)
+      flux = GFS_STATE (face->neighbor)->f[FTT_OPPOSITE_DIRECTION (face->d)].v*un;
+    GFS_VARIABLE (face->neighbor, p->par->fv->i) +=
+      flux - GFS_VARIABLE (face->neighbor, p->par->v->i)*un;
     break;
   }
   case FTT_FINE_COARSE: {
-    GFS_VARIABLE (face->cell, p->par->fv->i) += GFS_VARIABLE (face->cell, p->par->v->i)*un;
-    GFS_VARIABLE (face->neighbor, p->par->fv->i) -= coarse_fraction (face, p, 1.)*un/FTT_CELLS;
-
-    gdouble flux = GFS_STATE (face->cell)->f[face->d].v*un;
-    GFS_VARIABLE (face->cell, p->par->fv->i) -= flux;
-    GFS_VARIABLE (face->neighbor, p->par->fv->i) += flux/FTT_CELLS;
+    GFS_VARIABLE (face->neighbor, p->par->fv->i) += 
+      (flux - coarse_fraction (face, p, 1.)*un)/FTT_CELLS;
     break;
   }
   default:
     g_assert_not_reached ();
   }
+  GFS_VARIABLE (face->cell, p->par->fv->i) -= flux;
 }
 
-static void vof_update (FttCell * cell, GfsAdvectionParams * par)
+static void clamp (FttCell * cell, GfsVariable * v)
 {
-  gdouble f = GFS_VARIABLE (cell, par->v->i) + GFS_VARIABLE (cell, par->fv->i);
-  GFS_VARIABLE (cell, par->v->i) = f < 0. ? 0. : f > 1. ? 1. : f;
+  gdouble f = GFS_VARIABLE (cell, v->i);
+  GFS_VARIABLE (cell, v->i) = f < 0. ? 0. : f > 1. ? 1. : f;
 }
 
 /**
@@ -715,8 +709,9 @@ void gfs_tracer_vof_advection (GfsDomain * domain,
     gfs_domain_face_traverse (domain, p.c,
 			      FTT_PRE_ORDER, FTT_TRAVERSE_LEAFS, -1,
 			      (FttFaceTraverseFunc) vof_flux, &p);
+    gfs_domain_traverse_merged (domain, (GfsMergedTraverseFunc) gfs_advection_update, par);
     gfs_domain_cell_traverse (domain, FTT_PRE_ORDER, FTT_TRAVERSE_LEAFS, -1,
-			      (FttCellTraverseFunc) vof_update, par);
+    			      (FttCellTraverseFunc) clamp, par->v);
     gfs_domain_cell_traverse (domain, FTT_POST_ORDER, FTT_TRAVERSE_NON_LEAFS, -1,
 			      (FttCellTraverseFunc) par->v->fine_coarse, par->v);
     gfs_domain_bc (domain, FTT_TRAVERSE_ALL, -1, par->v);

-- 
Gerris Flow Solver



More information about the debian-science-commits mailing list