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

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


The following commit has been merged in the upstream branch:
commit db21a034dc3df8f1e517d894f9aa8a434c55d66e
Author: Stephane Popinet <popinet at users.sf.net>
Date:   Thu Dec 14 12:30:56 2006 +1100

    Density (and viscosity) is computed using face-interpolated volume fraction values
    
    This uses the new gfs_function_face_value(). Large density ratio flows
    can now be computed correctly. Needs further testing.
    
    darcs-hash:20061214013056-d4795-7a091ccfa81f6b5f2e774585845f4d6e82f22ef7.gz

diff --git a/src/poisson.c b/src/poisson.c
index 9139b89..3a5c862 100644
--- a/src/poisson.c
+++ b/src/poisson.c
@@ -331,29 +331,17 @@ static void poisson_coeff (FttCellFace * face, gdouble * lambda2)
   }
 }
 
-static void reset_alpha_coeff (FttCell * cell, gpointer * data)
-{
-  FttDirection d;
-  GfsFaceStateVector * f = GFS_STATE (cell)->f;
-  GfsFunction * alpha = data[0];
-  GfsVariable * a = data[1];
-  
-  for (d = 0; d < FTT_NEIGHBORS; d++)
-    f[d].v = 0.;
-  GFS_VARIABLE (cell, a->i) = gfs_function_value (alpha, cell);
-}
-
 static void poisson_alpha_coeff (FttCellFace * face,
 				 gpointer * data)
 {
   gdouble * lambda2 = data[0];
-  GfsVariable * alpha = data[1];
+  GfsFunction * alpha = data[1];
   gdouble v = lambda2[face->d/2];
   GfsStateVector * s = GFS_STATE (face->cell);
 
   if (GFS_IS_MIXED (face->cell))
     v *= s->solid->s[face->d];
-  v *= gfs_face_interpolated_value (face, alpha->i);
+  v *= gfs_function_face_value (alpha, face);
   s->f[face->d].v = v;
 
   switch (ftt_face_type (face)) {
@@ -418,29 +406,21 @@ void gfs_poisson_coefficients (GfsDomain * domain,
 
     lambda2[i] = lambda*lambda;
   }
-  if (alpha == NULL) {
-    gfs_domain_cell_traverse (domain,
-			      FTT_PRE_ORDER, FTT_TRAVERSE_LEAFS, -1,
-			      (FttCellTraverseFunc) reset_coeff, NULL);
+  gfs_domain_cell_traverse (domain,
+			    FTT_PRE_ORDER, FTT_TRAVERSE_LEAFS, -1,
+			    (FttCellTraverseFunc) reset_coeff, NULL);
+  if (alpha == NULL)
     gfs_domain_face_traverse (domain, FTT_XYZ, 
 			      FTT_PRE_ORDER, FTT_TRAVERSE_LEAFS, -1,
 			      (FttFaceTraverseFunc) poisson_coeff, lambda2);
-  }
   else {
     gpointer data[2];
 
-    data[0] = alpha;
-    data[1] = gfs_temporary_variable (domain);
-    gfs_domain_cell_traverse (domain,
-			      FTT_PRE_ORDER, FTT_TRAVERSE_LEAFS, -1,
-			      (FttCellTraverseFunc) reset_alpha_coeff, data);
-    gfs_domain_bc (domain, FTT_TRAVERSE_LEAFS, -1, data[1]);
     data[0] = lambda2;
+    data[1] = alpha;
     gfs_domain_face_traverse (domain, FTT_XYZ, 
 			      FTT_PRE_ORDER, FTT_TRAVERSE_LEAFS, -1,
-			      (FttFaceTraverseFunc) poisson_alpha_coeff, 
-			      data);
-    gts_object_destroy (data[1]);
+			      (FttFaceTraverseFunc) poisson_alpha_coeff, data);
   }
   gfs_domain_cell_traverse (domain,
 			    FTT_POST_ORDER, FTT_TRAVERSE_NON_LEAFS, -1,
@@ -453,7 +433,8 @@ static void tension_coeff (FttCellFace * face, gpointer * data)
   GfsStateVector * s = GFS_STATE (face->cell);
   GfsSourceTensionGeneric * t = data[1];
   gdouble v = lambda2[face->d/2]*t->sigma;
-  GfsVariable * alpha = data[2], * kappa = GFS_SOURCE_TENSION (data[1])->k;
+  GfsFunction * alpha = data[2];
+  GfsVariable * kappa = GFS_SOURCE_TENSION (data[1])->k;
   gdouble c1 = GFS_VARIABLE (face->cell, t->c->i);
   gdouble c2 = GFS_VARIABLE (face->neighbor, t->c->i);
   gdouble w1 = c1*(1. - c1);
@@ -477,7 +458,7 @@ static void tension_coeff (FttCellFace * face, gpointer * data)
   }
 
   if (alpha)
-    v *= gfs_face_interpolated_value (face, alpha->i);
+    v *= gfs_function_face_value (alpha, face);
   if (GFS_IS_MIXED (face->cell))
     v *= s->solid->s[face->d];
   s->f[face->d].v = v;
@@ -521,28 +502,15 @@ void gfs_source_tension_coefficients (GfsSourceTension * s,
 
     lambda2[i] = lambda*lambda;
   }
-  if (alpha) {
-    data[0] = alpha;
-    data[1] = gfs_temporary_variable (domain);
-    gfs_domain_cell_traverse (domain,
-			      FTT_PRE_ORDER, FTT_TRAVERSE_LEAFS, -1,
-			      (FttCellTraverseFunc) reset_alpha_coeff, data);
-    gfs_domain_bc (domain, FTT_TRAVERSE_LEAFS, -1, data[1]);
-    data[2] = data[1];
-  }
-  else {
-    gfs_domain_cell_traverse (domain,
-			      FTT_PRE_ORDER, FTT_TRAVERSE_LEAFS, -1,
-			      (FttCellTraverseFunc) reset_coeff, NULL);
-    data[2] = NULL;
-  }
+  gfs_domain_cell_traverse (domain,
+			    FTT_PRE_ORDER, FTT_TRAVERSE_LEAFS, -1,
+			    (FttCellTraverseFunc) reset_coeff, NULL);
   data[0] = lambda2;
   data[1] = s;
+  data[2] = alpha;
   gfs_domain_face_traverse (domain, FTT_XYZ, 
 			    FTT_PRE_ORDER, FTT_TRAVERSE_LEAFS, -1,
 			    (FttFaceTraverseFunc) tension_coeff, data);
-  if (alpha)
-    gts_object_destroy (data[2]);
 }
 
 static void correct (FttCell * cell, gpointer * data)
diff --git a/src/source.c b/src/source.c
index 9cb28f4..23cc49c 100644
--- a/src/source.c
+++ b/src/source.c
@@ -462,8 +462,7 @@ static gboolean diffusion_event (GfsEvent * event, GfsSimulation * sim)
 
 static gdouble diffusion_face (GfsDiffusion * d, FttCellFace * f)
 {
-  return d->mu ? gfs_face_interpolated_value (f, d->mu->i) :
-    gfs_function_get_constant_value (d->val);
+  return gfs_function_face_value (d->val, f);
 }
 
 static gdouble diffusion_cell (GfsDiffusion * d, FttCell * cell)

-- 
Gerris Flow Solver



More information about the debian-science-commits mailing list