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

Stephane Popinet popinet at users.sf.net
Fri May 15 02:55:03 UTC 2009


The following commit has been merged in the upstream branch:
commit 9212f2f04ed24ee540d482fc33a27a1eacab538b
Author: Stephane Popinet <popinet at users.sf.net>
Date:   Thu Oct 18 14:30:51 2007 +1000

    Added stability conditions for SourceDiffusionExplicit and SourceViscosityExplicit
    
    darcs-hash:20071018043051-d4795-f2dbd214148f1b653e4025c636143ce6ab74ccdb.gz

diff --git a/src/source.c b/src/source.c
index 08fc973..27bb395 100644
--- a/src/source.c
+++ b/src/source.c
@@ -731,12 +731,60 @@ static gdouble source_diffusion_explicit_value (GfsSourceGeneric * s,
   return GFS_VARIABLE (cell, GFS_SOURCE_DIFFUSION_EXPLICIT (s)->s->i);
 }
 
+typedef struct {
+  GfsFunction * alpha;
+  GfsSourceGeneric * s;
+  gdouble dtmax;
+} StabilityParams;
+
+static void cell_diffusion_stability (FttCell * cell,
+				      StabilityParams * par)
+{
+  if (GFS_IS_MIXED (cell))
+    return;
+
+  FttCellFace f;
+  FttCellNeighbors n;
+  gdouble Dmax = 0.;
+  f.cell = cell;
+  ftt_cell_neighbors (cell, &n);
+  for (f.d = 0; f.d < FTT_NEIGHBORS; f.d++) {
+    gdouble D;
+
+    f.neighbor = n.c[f.d];
+    D = gfs_source_diffusion_face (GFS_SOURCE_DIFFUSION (par->s), &f);
+    if (D > Dmax)
+      Dmax = D;
+  }
+
+  gdouble h = ftt_cell_size (cell);
+  if (Dmax > 0.) {
+    gdouble dtmax = h*h/(Dmax*(par->alpha ? gfs_function_value (par->alpha, cell) : 1.));
+    if (dtmax < par->dtmax)
+      par->dtmax = dtmax;
+  }
+}
+
+static gdouble source_diffusion_stability (GfsSourceGeneric * s,
+					   GfsSimulation * sim)
+{
+  StabilityParams par;
+
+  par.s = s;
+  par.dtmax = G_MAXDOUBLE;
+  par.alpha = NULL;
+  gfs_domain_cell_traverse (GFS_DOMAIN (sim), FTT_PRE_ORDER, FTT_TRAVERSE_LEAFS, -1,
+			    (FttCellTraverseFunc) cell_diffusion_stability, &par);
+  return par.dtmax;
+}
+
 static void gfs_source_diffusion_explicit_class_init (GfsSourceGenericClass * klass)
 {
   GFS_EVENT_CLASS (klass)->event = gfs_source_diffusion_explicit_event;
   GTS_OBJECT_CLASS (klass)->read = gfs_source_diffusion_explicit_read;
   GTS_OBJECT_CLASS (klass)->destroy = gfs_source_diffusion_explicit_destroy;
   klass->mac_value = klass->centered_value = source_diffusion_explicit_value;
+  klass->stability = source_diffusion_stability;
 }
 
 GfsSourceGenericClass * gfs_source_diffusion_explicit_class (void)
@@ -861,9 +909,23 @@ GfsSourceGenericClass * gfs_source_viscosity_class (void)
 
 /* GfsSourceViscosityExplicit: Object */
 
+static gdouble source_viscosity_stability (GfsSourceGeneric * s,
+					   GfsSimulation * sim)
+{
+  StabilityParams par;
+
+  par.s = s;
+  par.dtmax = G_MAXDOUBLE;
+  par.alpha = sim->physical_params.alpha;
+  gfs_domain_cell_traverse (GFS_DOMAIN (sim), FTT_PRE_ORDER, FTT_TRAVERSE_LEAFS, -1,
+			    (FttCellTraverseFunc) cell_diffusion_stability, &par);
+  return par.dtmax;
+}
+
 static void source_viscosity_explicit_class_init (GfsSourceGenericClass * klass)
 {
   klass->mac_value = klass->centered_value = source_viscosity_value;
+  klass->stability = source_viscosity_stability;
 }
 
 GfsSourceGenericClass * gfs_source_viscosity_explicit_class (void)

-- 
Gerris Flow Solver



More information about the debian-science-commits mailing list