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

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


The following commit has been merged in the upstream branch:
commit 5929d8a964a2819d177ab02dd8cbf31d8c940f10
Author: Stephane Popinet <popinet at users.sf.net>
Date:   Mon Feb 2 20:51:53 2009 +1100

    New object GfsVariableFunction
    
    Used to efficiently refine adaptively a variable defined by a GfsFunction.
    
    darcs-hash:20090202095153-d4795-002010adda0f29999a763937869795f7555ebe7a.gz

diff --git a/src/init.c b/src/init.c
index 443e761..2192529 100644
--- a/src/init.c
+++ b/src/init.c
@@ -139,6 +139,7 @@ GtsObjectClass ** gfs_classes (void)
       gfs_variable_residual_class (),
       gfs_variable_filtered_class (),
       gfs_variable_diagonal_class (),
+      gfs_variable_function_class (),
       gfs_variable_curvature_class (),
         gfs_variable_position_class (),
       gfs_variable_distance_class (),
diff --git a/src/variable.c b/src/variable.c
index 9ca2779..9a5a859 100644
--- a/src/variable.c
+++ b/src/variable.c
@@ -58,6 +58,7 @@ static void gfs_variable_read (GtsObject ** o, GtsFile * fp)
     if ((i = g_slist_find (domain->variables_io, old)))
       i->data = v;
     domain->variables = g_slist_remove (domain->variables, old);
+    v->units = old->units;
     gts_object_destroy (GTS_OBJECT (old));
   }
   variable_init_domain (v, domain);
@@ -530,6 +531,81 @@ GfsVariableClass * gfs_variable_diagonal_class (void)
   return klass;
 }
 
+/* GfsVariableFunction: Object */
+
+static void variable_function_destroy (GtsObject * o)
+{
+  gts_object_destroy (GTS_OBJECT (GFS_VARIABLE_FUNCTION (o)->f));
+
+  (* GTS_OBJECT_CLASS (gfs_variable_function_class ())->parent_class->destroy) (o);
+}
+
+static void variable_function_read (GtsObject ** o, GtsFile * fp)
+{
+  (* GTS_OBJECT_CLASS (gfs_variable_function_class ())->parent_class->read) (o, fp);
+  if (fp->type == GTS_ERROR)
+    return;
+
+  GfsVariableFunction * v = GFS_VARIABLE_FUNCTION (*o);
+  gfs_function_read (v->f, GFS_DOMAIN (gfs_object_simulation (*o)), fp);
+  if (fp->type == GTS_ERROR)
+    return;
+  gfs_function_set_units (v->f, GFS_VARIABLE1 (*o)->units);
+}
+
+static void variable_function_write (GtsObject * o, FILE * fp)
+{
+  (* GTS_OBJECT_CLASS (gfs_variable_function_class ())->parent_class->write) (o, fp);
+
+  gfs_function_write (GFS_VARIABLE_FUNCTION (o)->f, fp);
+}
+
+static void variable_function_class_init (GtsObjectClass * klass)
+{
+  klass->destroy = variable_function_destroy;
+  klass->read = variable_function_read;
+  klass->write = variable_function_write;
+}
+
+static void variable_function_coarse_fine (FttCell * parent, GfsVariable * v)
+{
+  GfsFunction * f = GFS_VARIABLE_FUNCTION (v)->f;
+  FttCellChildren child;
+  guint n;
+
+  ftt_cell_children (parent, &child);
+  for (n = 0; n < FTT_CELLS; n++)
+    if (child.c[n])
+      GFS_VALUE (child.c[n], v) = gfs_function_value (f, child.c[n]);
+}
+
+static void variable_function_init (GfsVariableFunction * v)
+{
+  GFS_VARIABLE1 (v)->coarse_fine = variable_function_coarse_fine;
+  v->f = gfs_function_new (gfs_function_class (), 0.);
+}
+
+GfsVariableClass * gfs_variable_function_class (void)
+{
+  static GfsVariableClass * klass = NULL;
+
+  if (klass == NULL) {
+    GtsObjectClassInfo gfs_variable_function_info = {
+      "GfsVariableFunction",
+      sizeof (GfsVariableFunction),
+      sizeof (GfsVariableClass),
+      (GtsObjectClassInitFunc) variable_function_class_init,
+      (GtsObjectInitFunc) variable_function_init,
+      (GtsArgSetFunc) NULL,
+      (GtsArgGetFunc) NULL
+    };
+    klass = gts_object_class_new (GTS_OBJECT_CLASS (gfs_variable_class ()), 
+				  &gfs_variable_function_info);
+  }
+
+  return klass;
+}
+
 /* GfsDerivedVariable: object */
 
 static void gfs_derived_variable_destroy (GtsObject * object)
diff --git a/src/variable.h b/src/variable.h
index 179e686..68eb9d0 100644
--- a/src/variable.h
+++ b/src/variable.h
@@ -136,6 +136,26 @@ GfsVariableClass * gfs_variable_filtered_class  (void);
 
 GfsVariableClass * gfs_variable_diagonal_class  (void);
 
+/* GfsVariableFunction: header */
+
+typedef struct _GfsVariableFunction                GfsVariableFunction;
+
+struct _GfsVariableFunction {
+  /*< private >*/
+  GfsVariable parent;
+
+  /*< public >*/
+  GfsFunction * f;
+};
+
+#define GFS_VARIABLE_FUNCTION(obj)            GTS_OBJECT_CAST (obj,\
+					           GfsVariableFunction,\
+					           gfs_variable_function_class ())
+#define GFS_IS_VARIABLE_FUNCTION(obj)         (gts_object_is_from_class (obj,\
+					     gfs_variable_function_class ()))
+
+GfsVariableClass * gfs_variable_function_class  (void);
+
 /* GfsDerivedVariable: Header */
 
 struct _GfsDerivedVariable {

-- 
Gerris Flow Solver



More information about the debian-science-commits mailing list