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

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


The following commit has been merged in the upstream branch:
commit e8978b3ed06d377193dee3fc3950d202ee34a8b0
Author: Stephane Popinet <s.popinet at niwa.co.nz>
Date:   Tue May 31 09:57:21 2005 +1000

    New SourceControl object
    
    darcs-hash:20050530235721-fbd8f-4d3f602ecc859ac642c4476219073fbe3133e447.gz

diff --git a/src/init.c b/src/init.c
index 8545783..a1d4469 100644
--- a/src/init.c
+++ b/src/init.c
@@ -258,6 +258,7 @@ void gfs_init (int * argc, char *** argv)
     gfs_event_script_class ();
     gfs_source_generic_class ();
       gfs_source_class ();
+        gfs_source_control_class ();
       gfs_source_coriolis_class ();
       gfs_source_hydrostatic_class ();
       gfs_source_diffusion_class ();
diff --git a/src/source.c b/src/source.c
index 9c78f0a..2892389 100644
--- a/src/source.c
+++ b/src/source.c
@@ -330,6 +330,82 @@ GfsSourceGenericClass * gfs_source_class (void)
   return klass;
 }
 
+/* GfsSourceControl: Object */
+
+static void source_control_destroy (GtsObject * o)
+{
+  if (GFS_SOURCE_CONTROL (o)->delay)
+    gts_object_destroy (GTS_OBJECT (GFS_SOURCE_CONTROL (o)->delay));
+
+  (* GTS_OBJECT_CLASS (gfs_source_control_class ())->parent_class->destroy) (o);
+}
+
+static void source_control_read (GtsObject ** o, GtsFile * fp)
+{
+  (* GTS_OBJECT_CLASS (gfs_source_control_class ())->parent_class->read) (o, fp);
+  if (fp->type == GTS_ERROR)
+    return;
+
+  GFS_SOURCE_CONTROL (*o)->delay = gfs_function_new (gfs_function_class (), 1.);
+  gfs_function_read (GFS_SOURCE_CONTROL (*o)->delay, gfs_object_simulation (*o), fp);
+}
+
+static void source_control_write (GtsObject * o, FILE * fp)
+{
+  (* GTS_OBJECT_CLASS (gfs_source_control_class ())->parent_class->write) (o, fp);
+  gfs_function_write (GFS_SOURCE_CONTROL (o)->delay, fp);
+}
+
+static gboolean source_control_event (GfsEvent * event, GfsSimulation * sim)
+{
+  if ((* gfs_event_class ()->event) (event, sim)) {
+    GfsSourceControl * s = GFS_SOURCE_CONTROL (event);
+    GtsRange r = gfs_domain_stats_variable (GFS_DOMAIN (sim), GFS_SOURCE_GENERIC (event)->v,
+					    FTT_TRAVERSE_LEAFS, -1);
+    s->s = (gfs_function_value (GFS_SOURCE (s)->intensity, NULL, NULL, sim->time.t) - r.mean)/
+      gfs_function_value (s->delay, NULL, NULL, sim->time.t);
+    return TRUE;
+  }
+  return FALSE;
+}
+
+static gdouble source_control_value (GfsSourceGeneric * s, 
+				     FttCell * cell, 
+				     GfsVariable * v)
+{
+  return GFS_SOURCE_CONTROL (s)->s;
+}
+
+static void source_control_class_init (GfsSourceGenericClass * klass)
+{
+  GTS_OBJECT_CLASS (klass)->destroy = source_control_destroy;
+  GTS_OBJECT_CLASS (klass)->read = source_control_read;
+  GTS_OBJECT_CLASS (klass)->write = source_control_write;
+  GFS_EVENT_CLASS (klass)->event = source_control_event;
+  klass->mac_value = klass->centered_value = source_control_value;
+}
+
+GfsSourceGenericClass * gfs_source_control_class (void)
+{
+  static GfsSourceGenericClass * klass = NULL;
+
+  if (klass == NULL) {
+    GtsObjectClassInfo source_control_info = {
+      "GfsSourceControl",
+      sizeof (GfsSourceControl),
+      sizeof (GfsSourceGenericClass),
+      (GtsObjectClassInitFunc) source_control_class_init,
+      (GtsObjectInitFunc) NULL,
+      (GtsArgSetFunc) NULL,
+      (GtsArgGetFunc) NULL
+    };
+    klass = gts_object_class_new (GTS_OBJECT_CLASS (gfs_source_class ()),
+				  &source_control_info);
+  }
+
+  return klass;
+}
+
 /* GfsDiffusion: Object */
 
 static void diffusion_read (GtsObject ** o, GtsFile * fp)
diff --git a/src/source.h b/src/source.h
index 25daf42..97c64fd 100644
--- a/src/source.h
+++ b/src/source.h
@@ -64,7 +64,7 @@ struct _GfsSourceGenericClass {
 #define GFS_SOURCE_GENERIC_CLASS(klass)    GTS_OBJECT_CLASS_CAST (klass,\
 						 GfsSourceGenericClass,\
 						 gfs_source_generic_class())
-#define GFS_IS_SOURCE(obj)         (gts_object_is_from_class (obj,\
+#define GFS_IS_SOURCE_GENERIC(obj)         (gts_object_is_from_class (obj,\
 						 gfs_source_generic_class ()))
 
 GfsSourceGenericClass * gfs_source_generic_class  (void);
@@ -104,11 +104,32 @@ struct _GfsSource {
 #define GFS_SOURCE(obj)            GTS_OBJECT_CAST (obj,\
 					         GfsSource,\
 					         gfs_source_class ())
-#define GFS_IS_SOURCE_CONSTANT(obj)         (gts_object_is_from_class (obj,\
+#define GFS_IS_SOURCE(obj)         (gts_object_is_from_class (obj,\
 						 gfs_source_class ()))
 
 GfsSourceGenericClass * gfs_source_class  (void);
 
+/* GfsSourceControl: Header */
+
+typedef struct _GfsSourceControl         GfsSourceControl;
+
+struct _GfsSourceControl {
+  /*< private >*/
+  GfsSource parent;
+  gdouble s;
+
+  /*< public >*/
+  GfsFunction * delay;
+};
+
+#define GFS_SOURCE_CONTROL(obj)            GTS_OBJECT_CAST (obj,\
+					         GfsSourceControl,\
+					         gfs_source_control_class ())
+#define GFS_IS_SOURCE_CONTROL(obj)         (gts_object_is_from_class (obj,\
+						 gfs_source_control_class ()))
+
+GfsSourceGenericClass * gfs_source_control_class  (void);
+
 /* GfsDiffusion: Header */
 
 typedef struct _GfsDiffusion         GfsDiffusion;
diff --git a/src/utils.c b/src/utils.c
index ca24d82..4837f14 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -363,8 +363,10 @@ gdouble gfs_function_value (GfsFunction * f, FttCell * cell, FttVector * p, gdou
   if (f->s)
     return interpolated_value (f, p);
   else if (f->f) {
-    g_return_val_if_fail (p != NULL, 0.);
-    return (* f->f) (cell, p->x, p->y, p->z, t);
+    if (p != NULL)
+      return (* f->f) (cell, p->x, p->y, p->z, t);
+    else
+      return (* f->f) (cell, 0., 0., 0., t);
   }
   else
     return f->val;

-- 
Gerris Flow Solver



More information about the debian-science-commits mailing list