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

Stephane Popinet s.popinet at niwa.co.nz
Fri May 15 02:52:49 UTC 2009


The following commit has been merged in the upstream branch:
commit 59ea32fb94db0ac1f000c33b2d149f04f9d37e9f
Author: Stephane Popinet <s.popinet at niwa.co.nz>
Date:   Thu Oct 6 08:48:58 2005 +1000

    Variable viscosity coupled with variable density should now work
    
    darcs-hash:20051005224858-fbd8f-cce74e55484f3431731ffee1c29423459e0537ba.gz

diff --git a/src/ocean.c b/src/ocean.c
index 20b698c..9d9e1c7 100644
--- a/src/ocean.c
+++ b/src/ocean.c
@@ -337,7 +337,8 @@ static void ocean_run (GfsSimulation * sim)
     gfs_centered_velocity_advection_diffusion (domain, 2,
 					       &sim->advection_params,
 					       &sim->diffusion_params,
-					       g);
+					       g,
+					       sim->physical_params.alpha);
 
     gfs_poisson_coefficients (domain, fH);
     gfs_correct_normal_velocities_weighted (domain, 2, p, g, 0., 
@@ -720,7 +721,8 @@ static void ocean_run (GfsSimulation * sim)
     gfs_centered_velocity_advection_diffusion (domain, 2,
 					       &sim->advection_params,
 					       &sim->diffusion_params,
-					       g);
+					       g,
+					       sim->physical_params.alpha);
 
     /* barotropic pressure and Coriolis terms */
     set_solid2D (sim, solid);
diff --git a/src/poisson.c b/src/poisson.c
index 1b08935..e1ef8a2 100644
--- a/src/poisson.c
+++ b/src/poisson.c
@@ -486,7 +486,7 @@ static void face_coeff_from_below (FttCell * cell)
 /**
  * gfs_poisson_coefficients:
  * @domain: a #GfsDomain.
- * @alpha: the density or %NULL.
+ * @alpha: the inverse of density or %NULL.
  *
  * Initializes the face coefficients for the Poisson equation
  * $\nabla\cdot\alpha\nabla p=\dots$.
@@ -701,7 +701,8 @@ static void diffusion_mixed_coef (FttCell * cell, gpointer * data)
 
     GFS_STATE (cell)->solid->v = *dt*gfs_source_diffusion_cell (d, cell);
   }
-  GFS_VARIABLE (cell, GFS_VARIABLE1 (data[3])->i) = 1.;
+  GFS_VARIABLE (cell, GFS_VARIABLE1 (data[3])->i) =
+    data[4] ? 1./gfs_function_value (data[4], cell) : 1.;
 }
 
 /**
@@ -710,16 +711,18 @@ static void diffusion_mixed_coef (FttCell * cell, gpointer * data)
  * @d: a #GfsSourceDiffusion.
  * @dt: the time-step.
  * @dia: where to store the diagonal weight.
+ * @alpha: the inverse of density or %NULL.
  *
  * Initializes the face coefficients for the diffusion equation.
  */
 void gfs_diffusion_coefficients (GfsDomain * domain,
 				 GfsSourceDiffusion * d,
 				 gdouble dt,
-				 GfsVariable * dia)
+				 GfsVariable * dia,
+				 GfsFunction * alpha)
 {
   gdouble lambda2[FTT_DIMENSION];
-  gpointer data[4];
+  gpointer data[5];
   FttComponent i;
 
   g_return_if_fail (domain != NULL);
@@ -735,6 +738,7 @@ void gfs_diffusion_coefficients (GfsDomain * domain,
   data[1] = lambda2;
   data[2] = &dt;
   data[3] = dia;
+  data[4] = alpha;
   gfs_domain_cell_traverse (domain,
 			    FTT_PRE_ORDER, FTT_TRAVERSE_ALL, -1,
 			    (FttCellTraverseFunc) diffusion_mixed_coef, data);
diff --git a/src/poisson.h b/src/poisson.h
index f027fcd..e9cd8a9 100644
--- a/src/poisson.h
+++ b/src/poisson.h
@@ -76,7 +76,8 @@ void                  gfs_poisson_cycle              (GfsDomain * domain,
 void                  gfs_diffusion_coefficients     (GfsDomain * domain,
 						      GfsSourceDiffusion * d,
 						      gdouble dt,
-						      GfsVariable * dia);
+						      GfsVariable * dia,
+						      GfsFunction * alpha);
 void                  gfs_diffusion_rhs              (GfsDomain * domain,
 						      GfsVariable * v,
 						      GfsVariable * rhs,
diff --git a/src/simulation.c b/src/simulation.c
index 58f9fcc..696ab9f 100644
--- a/src/simulation.c
+++ b/src/simulation.c
@@ -572,7 +572,8 @@ static void simulation_run (GfsSimulation * sim)
 					       FTT_DIMENSION,
 					       &sim->advection_params,
 					       &sim->diffusion_params,
-					       g);
+					       g,
+					       sim->physical_params.alpha);
 
     gfs_simulation_adapt (sim, NULL);
     gfs_approximate_projection (domain,
diff --git a/src/source.c b/src/source.c
index 4631234..5d133ff 100644
--- a/src/source.c
+++ b/src/source.c
@@ -376,14 +376,26 @@ GfsSourceGenericClass * gfs_source_control_class (void)
 
 static void diffusion_destroy (GtsObject * o)
 {
-  gts_object_destroy (GTS_OBJECT (GFS_DIFFUSION (o)->val));
+  GfsDiffusion * d = GFS_DIFFUSION (o);
+
+  if (d->mu != gfs_function_get_variable (d->val))
+    gts_object_destroy (GTS_OBJECT (d->mu));
+  gts_object_destroy (GTS_OBJECT (d->val));
 
   (* GTS_OBJECT_CLASS (gfs_diffusion_class ())->parent_class->destroy) (o);
 }
 
 static void diffusion_read (GtsObject ** o, GtsFile * fp)
 {
-  gfs_function_read (GFS_DIFFUSION (*o)->val, gfs_object_simulation (*o), fp);
+  GfsDiffusion * d = GFS_DIFFUSION (*o);
+
+  gfs_function_read (d->val, gfs_object_simulation (*o), fp);
+  if (fp->type == GTS_ERROR)
+    return;
+
+  if (gfs_function_get_constant_value (d->val) == G_MAXDOUBLE &&
+      (d->mu = gfs_function_get_variable (d->val)) == NULL)
+    d->mu = gfs_temporary_variable (GFS_DOMAIN (gfs_object_simulation (*o)));
 }
 
 static void diffusion_write (GtsObject * o, FILE * fp)
@@ -391,14 +403,34 @@ static void diffusion_write (GtsObject * o, FILE * fp)
   gfs_function_write (GFS_DIFFUSION (o)->val, fp);
 }
 
+static void update_mu (FttCell * cell, GfsDiffusion * d)
+{
+  GFS_VARIABLE (cell, d->mu->i) = gfs_function_value (d->val, cell);
+}
+
+static gboolean diffusion_event (GfsEvent * event, GfsSimulation * sim)
+{
+  GfsDiffusion * d = GFS_DIFFUSION (event);
+
+  if (d->mu != gfs_function_get_variable (d->val)) {
+    gfs_domain_cell_traverse (GFS_DOMAIN (sim), FTT_PRE_ORDER, FTT_TRAVERSE_LEAFS, -1,
+			      (FttCellTraverseFunc) update_mu, event);
+    gfs_domain_bc (GFS_DOMAIN (sim), FTT_TRAVERSE_LEAFS, -1, d->mu);
+    return TRUE;
+  }
+  return FALSE;
+}
+
 static gdouble diffusion_face (GfsDiffusion * d, FttCellFace * f)
 {
-  return gfs_function_face_value (d->val, f);
+  return d->mu ? gfs_face_interpolated_value (f, d->mu->i) :
+    gfs_function_get_constant_value (d->val);
 }
 
 static gdouble diffusion_cell (GfsDiffusion * d, FttCell * cell)
 {
-  return gfs_function_value (d->val, cell);
+  return d->mu ? GFS_VARIABLE (cell, d->mu->i) :
+    gfs_function_get_constant_value (d->val);
 }
 
 static void diffusion_class_init (GfsDiffusionClass * klass)
@@ -406,7 +438,7 @@ static void diffusion_class_init (GfsDiffusionClass * klass)
   GTS_OBJECT_CLASS (klass)->destroy = diffusion_destroy;
   GTS_OBJECT_CLASS (klass)->read = diffusion_read;
   GTS_OBJECT_CLASS (klass)->write = diffusion_write;
-  GFS_EVENT_CLASS (klass)->event = NULL;
+  GFS_EVENT_CLASS (klass)->event = diffusion_event;
   klass->face = diffusion_face;
   klass->cell = diffusion_cell;
 }
@@ -414,6 +446,7 @@ static void diffusion_class_init (GfsDiffusionClass * klass)
 static void diffusion_init (GfsDiffusion * d)
 {
   d->val = gfs_function_new (gfs_function_class (), 0.);
+  d->mu = NULL;
 }
 
 GfsDiffusionClass * gfs_diffusion_class (void)
@@ -447,136 +480,6 @@ gdouble gfs_diffusion_cell (GfsDiffusion * d, FttCell * cell)
   return (* GFS_DIFFUSION_CLASS (GTS_OBJECT (d)->klass)->cell) (d, cell);
 }
 
-/* GfsDiffusionMulti: Object */
-
-static void diffusion_multi_destroy (GtsObject * object)
-{
-  g_slist_foreach (GFS_DIFFUSION_MULTI (object)->d, (GFunc) gts_object_destroy, NULL);
-  g_slist_free (GFS_DIFFUSION_MULTI (object)->d);
-
-  (* GTS_OBJECT_CLASS (gfs_diffusion_multi_class ())->parent_class->destroy) 
-    (object);
-}
-
-static void diffusion_multi_read (GtsObject ** o, GtsFile * fp)
-{
-  GfsDiffusionMulti * m = GFS_DIFFUSION_MULTI (*o);
-  gboolean constant = TRUE;
-  
-  while (fp->type != GTS_ERROR && fp->type != '\n') {
-    GtsObject * d = gts_object_new (GTS_OBJECT_CLASS (gfs_diffusion_class ()));
-
-    (* d->klass->read) (&d, fp);
-    if (m->d || d->klass != GTS_OBJECT_CLASS (gfs_diffusion_class ()))
-      constant = FALSE;
-    m->d = g_slist_prepend (m->d, d);
-  }
-  m->d = g_slist_reverse (m->d);
-  if (fp->type != GTS_ERROR && m->d->next)
-    m->c = gfs_variable_from_name (GFS_DOMAIN (gfs_object_simulation (m))->variables, "C");
-  if (!constant) {
-    m->mu = gfs_domain_add_variable (GFS_DOMAIN (gfs_object_simulation (m)), 
-				     "_gfs_diffusion_multi");
-    g_assert (m->mu);
-  }
-}
-
-static void diffusion_multi_write (GtsObject * o, FILE * fp)
-{
-  GSList * i = GFS_DIFFUSION_MULTI (o)->d;
-
-  while (i) {
-    (* GTS_OBJECT (i->data)->klass->write) (i->data, fp);
-    i = i->next;
-  }
-}
-
-static gdouble diffusion_multi_face (GfsDiffusion * d, FttCellFace * f)
-{
-  gdouble mu1 = gfs_diffusion_face (GFS_DIFFUSION_MULTI (d)->d->data, f);
-
-  if (!GFS_DIFFUSION_MULTI (d)->d->next)
-    return mu1;
-  else {
-    /* fixme: c should be evaluated at t or t + dt/2 */
-    gdouble c = gfs_face_interpolated_value (f, GFS_DIFFUSION_MULTI (d)->c->i);
-    gdouble mu2 = gfs_diffusion_face (GFS_DIFFUSION_MULTI (d)->d->next->data, f);
-
-    return mu1 + c*(mu2 - mu1);
-  }
-}
-
-static gdouble diffusion_multi_cell (GfsDiffusion * d, FttCell * cell)
-{
-  gdouble mu1 = gfs_diffusion_cell (GFS_DIFFUSION_MULTI (d)->d->data, cell);
-
-  if (!GFS_DIFFUSION_MULTI (d)->d->next)
-    return mu1;
-  else {
-    /* fixme: c should be evaluated at t or t + dt/2 */
-    gdouble c = GFS_VARIABLE (cell, GFS_DIFFUSION_MULTI (d)->c->i);
-    gdouble mu2 = gfs_diffusion_cell (GFS_DIFFUSION_MULTI (d)->d->next->data, cell);
-    
-    return mu1 + c*(mu2 - mu1);
-  }
-}
-
-static void set_mu (FttCell * cell, GfsDiffusion * d)
-{
-  GFS_VARIABLE (cell, GFS_DIFFUSION_MULTI (d)->mu->i) = diffusion_multi_cell (d, cell);
-}
-
-static gboolean diffusion_multi_event (GfsEvent * event, GfsSimulation * sim)
-{
-  GfsDiffusionMulti * m = GFS_DIFFUSION_MULTI (event);
-  GSList * i = m->d;
-
-  while (i) {
-    if (GFS_EVENT_CLASS (GTS_OBJECT (i->data)->klass)->event)
-      (* GFS_EVENT_CLASS (GTS_OBJECT (i->data)->klass)->event) (event, sim);
-    i = i->next;
-  }
-
-  if (m->mu) {
-    gfs_domain_cell_traverse (GFS_DOMAIN (sim), FTT_PRE_ORDER, FTT_TRAVERSE_LEAFS, -1,
-			      (FttCellTraverseFunc) set_mu, m);
-    gfs_domain_bc (GFS_DOMAIN (sim), FTT_TRAVERSE_LEAFS, -1, m->mu);
-  }
-  
-  return TRUE;
-}
-
-static void diffusion_multi_class_init (GfsDiffusionClass * klass)
-{
-  GTS_OBJECT_CLASS (klass)->read = diffusion_multi_read;
-  GTS_OBJECT_CLASS (klass)->write = diffusion_multi_write;
-  GTS_OBJECT_CLASS (klass)->destroy = diffusion_multi_destroy;
-  GFS_EVENT_CLASS (klass)->event = diffusion_multi_event;
-  klass->face = diffusion_multi_face;
-  klass->cell = diffusion_multi_cell;
-}
-
-GfsDiffusionClass * gfs_diffusion_multi_class (void)
-{
-  static GfsDiffusionClass * klass = NULL;
-
-  if (klass == NULL) {
-    GtsObjectClassInfo diffusion_multi_info = {
-      "GfsDiffusionMulti",
-      sizeof (GfsDiffusionMulti),
-      sizeof (GfsDiffusionClass),
-      (GtsObjectClassInitFunc) diffusion_multi_class_init,
-      (GtsObjectInitFunc) NULL,
-      (GtsArgSetFunc) NULL,
-      (GtsArgGetFunc) NULL
-    };
-    klass = gts_object_class_new (GTS_OBJECT_CLASS (gfs_diffusion_class ()),
-				  &diffusion_multi_info);
-  }
-
-  return klass;
-}
-
 /* GfsSourceDiffusion: Object */
 
 static void source_diffusion_destroy (GtsObject * o)
@@ -809,71 +712,62 @@ GfsSourceGenericClass * gfs_source_diffusion_explicit_class (void)
 
 /* GfsSourceViscosity: Object */
 
-static void source_viscosity_destroy (GtsObject * o)
-{
-  gts_object_destroy (GTS_OBJECT (GFS_SOURCE_VISCOSITY (o)->D));
-
-  (* GTS_OBJECT_CLASS (gfs_source_viscosity_class ())->parent_class->destroy) (o);
-}
-
 static void source_viscosity_read (GtsObject ** o, GtsFile * fp)
 {
+  GfsSourceViscosity * source;
+  GfsSourceDiffusion * d;
+  GfsDomain * domain;
   FttComponent c;
-  GfsSourceViscosity * s;
 
-  (* GTS_OBJECT_CLASS (gfs_source_viscosity_class ())->parent_class->read) (o, fp);
+  (* GTS_OBJECT_CLASS (gfs_source_velocity_class ())->parent_class->read) (o, fp);
   if (fp->type == GTS_ERROR)
     return;
 
+  source = GFS_SOURCE_VISCOSITY (*o);
+  domain =  GFS_DOMAIN (gfs_object_simulation (source));
+  if (!(source->v = gfs_domain_velocity (domain))) {
+    gts_file_error (fp, "cannot find velocity components");
+    return;
+  }
   for (c = 0; c < FTT_DIMENSION; c++) {
-    GfsVariable * v = GFS_SOURCE_VELOCITY (*o)->v[c];
-
-    if (v->sources) {
-      GSList * i = GTS_SLIST_CONTAINER (v->sources)->items;
-      
-      while (i) {
-	if (i->data != *o && GFS_IS_SOURCE_DIFFUSION (i->data)) {
-	  gts_file_error (fp, "variable '%s' cannot have multiple diffusion source terms", v->name);
-	  return;
-	}
-	i = i->next;
-      }
-    }
+    if (source->v[c]->sources == NULL)
+      source->v[c]->sources = 
+	gts_container_new (GTS_CONTAINER_CLASS (gts_slist_container_class ()));
+    gts_container_add (source->v[c]->sources, GTS_CONTAINEE (source));
   }
 
-  s = GFS_SOURCE_VISCOSITY (*o);
-  gfs_object_simulation_set (s->D, gfs_object_simulation (s));
-  (* GTS_OBJECT (s->D)->klass->read) ((GtsObject **) &s->D, fp);
+  d = GFS_SOURCE_DIFFUSION (*o);
+  gfs_object_simulation_set (d->D, gfs_object_simulation (d));
+  (* GTS_OBJECT (d->D)->klass->read) ((GtsObject **) &d->D, fp);
 }
 
 static void source_viscosity_write (GtsObject * o, FILE * fp)
 {
-  GfsSourceViscosity * s = GFS_SOURCE_VISCOSITY (o);
+  GfsSourceDiffusion * d = GFS_SOURCE_DIFFUSION (o);
 
-  (* GTS_OBJECT_CLASS (gfs_source_viscosity_class ())->parent_class->write) (o, fp);
-  (* GTS_OBJECT (s->D)->klass->write) (GTS_OBJECT (s->D), fp);
+  (* GTS_OBJECT_CLASS (gfs_source_velocity_class ())->parent_class->write) (o, fp);
+  (* GTS_OBJECT (d->D)->klass->write) (GTS_OBJECT (d->D), fp);
 }
 
 static gdouble source_viscosity_non_diffusion_value (GfsSourceGeneric * s,
 						     FttCell * cell,
 						     GfsVariable * v)
 {
-  GfsVariable * mu = GFS_DIFFUSION_MULTI (GFS_SOURCE_DIFFUSION (s)->D)->mu;
+  GfsVariable * mu = GFS_SOURCE_DIFFUSION (s)->D->mu;
 
   if (mu == NULL)
     return 0.;
   else {
-    GfsVariable ** u = GFS_SOURCE_VELOCITY (s)->v;
+    GfsVariable ** u = GFS_SOURCE_VISCOSITY (s)->v;
     FttComponent c = v->component, j;
-    gdouble rho = 1.
-      /* fixme: + GFS_STATE (cell)->c*(gfs_object_simulation (s)->physical_params.rho - 1.)*/;
+    GfsFunction * alpha = gfs_object_simulation (s)->physical_params.alpha;
     gdouble h = ftt_cell_size (cell);
     gdouble a = 0.;
 
     for (j = 0; j < FTT_DIMENSION; j++)
       a += (gfs_center_gradient (cell, c, u[j]->i)*
 	    gfs_center_gradient (cell, j, mu->i));
-    return a/(rho*h*h);
+    return a*(alpha ? gfs_function_value (alpha, cell) : 1.)/(h*h);
   }
 }
 
@@ -881,42 +775,21 @@ static gdouble source_viscosity_value (GfsSourceGeneric * s,
 				       FttCell * cell,
 				       GfsVariable * v)
 {
-  gdouble rho = 1.
-    /* fixme: + GFS_STATE (cell)->c*(gfs_object_simulation (s)->physical_params.rho - 1.)*/;
+  GfsFunction * alpha = gfs_object_simulation (s)->physical_params.alpha;
 
-  return (source_diffusion_value (s, cell, v)/rho +
+  return (source_diffusion_value (s, cell, v)*(alpha ? gfs_function_value (alpha, cell) : 1.) +
 	  source_viscosity_non_diffusion_value (s, cell, v));
 }
 
-static gboolean source_viscosity_event (GfsEvent * event, GfsSimulation * sim)
-{
-  if ((* gfs_event_class ()->event) (event, sim)) {
-    GfsSourceViscosity * s = GFS_SOURCE_VISCOSITY (event);
-
-    if ((* GFS_EVENT_CLASS (GTS_OBJECT (s->D)->klass)->event))
-      (* GFS_EVENT_CLASS (GTS_OBJECT (s->D)->klass)->event) (GFS_EVENT (s->D), sim);
-    return TRUE;
-  }
-  return FALSE;
-}
-
 static void source_viscosity_class_init (GfsSourceGenericClass * klass)
 {
-  GTS_OBJECT_CLASS (klass)->destroy = source_viscosity_destroy;
   GTS_OBJECT_CLASS (klass)->read = source_viscosity_read;
   GTS_OBJECT_CLASS (klass)->write = source_viscosity_write;
-  
-  GFS_EVENT_CLASS (klass)->event = source_viscosity_event;
 
   klass->mac_value = source_viscosity_value;
   klass->centered_value = source_viscosity_non_diffusion_value;
 }
 
-static void source_viscosity_init (GfsSourceViscosity * s)
-{
-  s->D = GFS_DIFFUSION (gts_object_new (GTS_OBJECT_CLASS (gfs_diffusion_class ())));
-}
-
 GfsSourceGenericClass * gfs_source_viscosity_class (void)
 {
   static GfsSourceGenericClass * klass = NULL;
@@ -927,11 +800,11 @@ GfsSourceGenericClass * gfs_source_viscosity_class (void)
       sizeof (GfsSourceViscosity),
       sizeof (GfsSourceGenericClass),
       (GtsObjectClassInitFunc) source_viscosity_class_init,
-      (GtsObjectInitFunc) source_viscosity_init,
+      (GtsObjectInitFunc) NULL,
       (GtsArgSetFunc) NULL,
       (GtsArgGetFunc) NULL
     };
-    klass = gts_object_class_new (GTS_OBJECT_CLASS (gfs_source_velocity_class ()),
+    klass = gts_object_class_new (GTS_OBJECT_CLASS (gfs_source_diffusion_class ()),
 				  &source_viscosity_info);
   }
 
diff --git a/src/source.h b/src/source.h
index 3e03792..3fbfa67 100644
--- a/src/source.h
+++ b/src/source.h
@@ -156,6 +156,7 @@ struct _GfsDiffusion {
 
   /*< public >*/
   GfsFunction * val;
+  GfsVariable * mu;
 };
 
 typedef struct _GfsDiffusionClass    GfsDiffusionClass;
@@ -184,27 +185,6 @@ gdouble             gfs_diffusion_face   (GfsDiffusion * d,
 gdouble             gfs_diffusion_cell   (GfsDiffusion * d, 
 					  FttCell * cell);
 
-/* GfsDiffusionMulti: Header */
-
-typedef struct _GfsDiffusionMulti         GfsDiffusionMulti;
-
-struct _GfsDiffusionMulti {
-  /*< private >*/
-  GfsDiffusion parent;
-
-  /*< public >*/
-  GSList * d;
-  GfsVariable * c, * mu;
-};
-
-#define GFS_DIFFUSION_MULTI(obj)            GTS_OBJECT_CAST (obj,\
-					         GfsDiffusionMulti,\
-					         gfs_diffusion_multi_class ())
-#define GFS_IS_DIFFUSION_MULTI(obj)         (gts_object_is_from_class (obj,\
-						 gfs_diffusion_multi_class ()))
-
-GfsDiffusionClass * gfs_diffusion_multi_class  (void);
-
 /* GfsSourceDiffusion: Header */
 
 struct _GfsSourceDiffusion {
@@ -253,10 +233,10 @@ typedef struct _GfsSourceViscosity         GfsSourceViscosity;
 
 struct _GfsSourceViscosity {
   /*< private >*/
-  GfsSourceVelocity parent;
+  GfsSourceDiffusion parent;
 
   /*< public >*/
-  GfsDiffusion * D;
+  GfsVariable ** v;
 };
 
 #define GFS_SOURCE_VISCOSITY(obj)            GTS_OBJECT_CAST (obj,\
diff --git a/src/timestep.c b/src/timestep.c
index 19793cb..98f8e14 100644
--- a/src/timestep.c
+++ b/src/timestep.c
@@ -566,13 +566,14 @@ static void variable_diffusion (GfsDomain * domain,
 				GfsSourceDiffusion * d,
 				GfsAdvectionParams * par,
 				GfsMultilevelParams * dpar,
-				GfsVariable * rhs)
+				GfsVariable * rhs,
+				GfsFunction * alpha)
 {
   GfsVariable * dia;
 
   dia = gfs_temporary_variable (domain);
 
-  gfs_diffusion_coefficients (domain, d, par->dt, dia);
+  gfs_diffusion_coefficients (domain, d, par->dt, dia, alpha);
   gfs_domain_surface_bc (domain, par->v);
   gfs_diffusion_rhs (domain, par->v, rhs, dia);
   /* fixme: time shoud be set to t + dt here in case boundary values are
@@ -590,6 +591,7 @@ static void variable_diffusion (GfsDomain * domain,
  * @apar: the advection parameters.
  * @dpar: the multilevel solver parameters for the diffusion equation.
  * @g: the pressure gradient.
+ * @alpha: the inverse of density or %NULL.
  *
  * Advects the (centered) velocity field using the current
  * face-centered (MAC) velocity field and @par->flux to compute the
@@ -608,7 +610,8 @@ void gfs_centered_velocity_advection_diffusion (GfsDomain * domain,
 						guint dimension,
 						GfsAdvectionParams * apar,
 						GfsMultilevelParams * dpar,
-						GfsVariable ** g)
+						GfsVariable ** g,
+						GfsFunction * alpha)
 {
   FttComponent c;
   GfsVariable ** v;
@@ -635,7 +638,7 @@ void gfs_centered_velocity_advection_diffusion (GfsDomain * domain,
       variable_sources (domain, apar, rhs, g);
       gts_object_destroy (GTS_OBJECT (g[c]));
       g[c] = NULL;
-      variable_diffusion (domain, d, apar, dpar, rhs);
+      variable_diffusion (domain, d, apar, dpar, rhs, alpha);
       gts_object_destroy (GTS_OBJECT (rhs));
     }
     else {
@@ -707,7 +710,7 @@ void gfs_tracer_advection_diffusion (GfsDomain * domain,
     gfs_domain_cell_traverse (domain, FTT_PRE_ORDER, FTT_TRAVERSE_LEAFS, -1,
 			      (FttCellTraverseFunc) gfs_cell_reset, rhs);
     variable_sources (domain, par, rhs, NULL);
-    variable_diffusion (domain, d, par, dpar, rhs);
+    variable_diffusion (domain, d, par, dpar, rhs, NULL);
     gts_object_destroy (GTS_OBJECT (rhs));
   }
   else {
diff --git a/src/timestep.h b/src/timestep.h
index cf2ce8e..e4c7964 100644
--- a/src/timestep.h
+++ b/src/timestep.h
@@ -62,7 +62,8 @@ void          gfs_centered_velocity_advection_diffusion (GfsDomain * domain,
 							 guint dimension,
 							 GfsAdvectionParams * apar,
 							 GfsMultilevelParams * dpar,
-							 GfsVariable ** g);
+							 GfsVariable ** g,
+							 GfsFunction * alpha);
 void          gfs_tracer_advection_diffusion  (GfsDomain * domain,
 					       GfsAdvectionParams * par,
 					       GfsMultilevelParams * dpar,

-- 
Gerris Flow Solver



More information about the debian-science-commits mailing list