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

Stephane Popinet popinet at users.sf.net
Fri May 15 02:56:04 UTC 2009


The following commit has been merged in the upstream branch:
commit 82ac4996b19598781727d156bbbbbbdad78317f4
Author: Stephane Popinet <popinet at users.sf.net>
Date:   Sun Sep 2 17:11:05 2007 +1000

    New VariableDiagonal for Poisson solver diagonal dominance evaluation
    
    darcs-hash:20070902071105-d4795-151ad3f3aa26c1d3ce4ae67daaf0cfb8a4b33128.gz

diff --git a/src/init.c b/src/init.c
index e298b5a..eeb2d80 100644
--- a/src/init.c
+++ b/src/init.c
@@ -138,6 +138,7 @@ GtsObjectClass ** gfs_classes (void)
         gfs_variable_tracer_vof_class (),
       gfs_variable_residual_class (),
       gfs_variable_filtered_class (),
+      gfs_variable_diagonal_class (),
       gfs_variable_curvature_class (),
         gfs_variable_position_class (),
       gfs_variable_distance_class (),
diff --git a/src/variable.c b/src/variable.c
index b7ad720..9ca2779 100644
--- a/src/variable.c
+++ b/src/variable.c
@@ -447,6 +447,89 @@ GfsVariableClass * gfs_variable_filtered_class (void)
   return klass;
 }
 
+/* GfsVariableDiagonal: object */
+
+static void unity (FttCell * cell, GfsVariable * v)
+{
+  GFS_VARIABLE (cell, v->i) = 1.;
+}
+
+static void variable_diagonal (FttCell * cell, gpointer * data)
+{
+  GfsVariable * v = data[0];
+  GfsVariable * tmp = data[1];
+  GfsGradient g;
+  FttCellNeighbors neighbor;
+  FttCellFace f;
+  GfsGradient ng;
+
+  GFS_VARIABLE (cell, tmp->i) = G_MAXDOUBLE;
+  g.a = g.b = 0.;
+  f.cell = cell;
+  ftt_cell_neighbors (cell, &neighbor);
+  for (f.d = 0; f.d < FTT_NEIGHBORS; f.d++) {
+    f.neighbor = neighbor.c[f.d];
+    if (f.neighbor) {
+      gfs_face_weighted_gradient (&f, &ng, tmp->i, -1);
+      g.a += ng.a;
+      g.b += ng.b;
+    }
+  }
+  if (g.a > 0.)
+    GFS_VARIABLE (cell, v->i) = g.b/g.a;
+  else
+    GFS_VARIABLE (cell, v->i) = G_MAXDOUBLE;
+  GFS_VARIABLE (cell, tmp->i) = 1.;
+}
+
+static gboolean variable_diagonal_event (GfsEvent * event, GfsSimulation * sim)
+{
+  if ((* GFS_EVENT_CLASS (GTS_OBJECT_CLASS (gfs_variable_diagonal_class ())->parent_class)->event)
+      (event, sim)) {
+    GfsDomain * domain = GFS_DOMAIN (sim);
+    GfsVariable * tmp = gfs_temporary_variable (domain);
+    gpointer data[2];
+    data[0] = event;
+    data[1] = tmp;
+    gfs_domain_cell_traverse (domain, FTT_PRE_ORDER, FTT_TRAVERSE_LEAFS, -1,
+			      (FttCellTraverseFunc) unity, tmp);
+    gfs_domain_bc (domain, FTT_TRAVERSE_LEAFS, -1, tmp);
+    gfs_poisson_coefficients (domain, sim->physical_params.alpha);
+    gfs_domain_cell_traverse (domain, FTT_PRE_ORDER, FTT_TRAVERSE_LEAFS, -1,
+			      (FttCellTraverseFunc) variable_diagonal, data);
+    gfs_domain_bc (domain, FTT_TRAVERSE_LEAFS, -1, GFS_VARIABLE1 (event));
+    gts_object_destroy (GTS_OBJECT (tmp));
+    return TRUE;
+  }
+  return FALSE;
+}
+
+static void variable_diagonal_class_init (GtsObjectClass * klass)
+{
+  GFS_EVENT_CLASS (klass)->event = variable_diagonal_event;
+}
+
+GfsVariableClass * gfs_variable_diagonal_class (void)
+{
+  static GfsVariableClass * klass = NULL;
+
+  if (klass == NULL) {
+    GtsObjectClassInfo gfs_variable_diagonal_info = {
+      "GfsVariableDiagonal",
+      sizeof (GfsVariable),
+      sizeof (GfsVariableClass),
+      (GtsObjectClassInitFunc) variable_diagonal_class_init,
+      (GtsObjectInitFunc) NULL,
+      (GtsArgSetFunc) NULL,
+      (GtsArgGetFunc) NULL
+    };
+    klass = gts_object_class_new (GTS_OBJECT_CLASS (gfs_variable_class ()), 
+				  &gfs_variable_diagonal_info);
+  }
+
+  return klass;
+}
+
 /* GfsDerivedVariable: object */
 
 static void gfs_derived_variable_destroy (GtsObject * object)
diff --git a/src/variable.h b/src/variable.h
index f9e9927..179e686 100644
--- a/src/variable.h
+++ b/src/variable.h
@@ -132,6 +132,10 @@ struct _GfsVariableFiltered {
 
 GfsVariableClass * gfs_variable_filtered_class  (void);
 
+/* GfsVariableDiagonal: Header */
+
+GfsVariableClass * gfs_variable_diagonal_class  (void);
+
 /* GfsDerivedVariable: Header */
 
 struct _GfsDerivedVariable {

-- 
Gerris Flow Solver



More information about the debian-science-commits mailing list