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

Stephane Popinet s.popinet at niwa.co.nz
Tue Nov 24 12:25:30 UTC 2009


The following commit has been merged in the upstream branch:
commit 36cd8af5abff23282bdbf58649644031a57a7738
Author: Stephane Popinet <s.popinet at niwa.co.nz>
Date:   Sat Nov 7 01:10:06 2009 +1100

    New object GfsEventList
    
    Ignore-this: 1d6c1438161b8fa0a45c03696dcd14a7
    
    darcs-hash:20091106141006-fbd8f-f91dd349e3884a46994726a4d37a1c8eabca44c0.gz

diff --git a/src/event.c b/src/event.c
index aa894d0..2d51cef 100644
--- a/src/event.c
+++ b/src/event.c
@@ -353,7 +353,6 @@ void gfs_event_set (GfsEvent * e,
 		    gint istart, gint iend, gint istep)
 {
   g_return_if_fail (e != NULL);
-  g_return_if_fail (step < 0. || istep < 0.);
   g_return_if_fail (end < 0. || start < 0. || start <= end);
   g_return_if_fail (istep >= 0 || step >= 0. || iend < 0);
   g_return_if_fail (istart < 0 || iend < 0 || istart <= iend);
@@ -2081,3 +2080,144 @@ GfsEventClass * gfs_event_filter_class (void)
   return klass;
 }
 
+/* GfsEventList: Object */
+
+static gboolean gfs_event_list_event (GfsEvent * event, GfsSimulation * sim)
+{
+  if ((* GFS_EVENT_CLASS (GTS_OBJECT_CLASS (gfs_event_list_class ())->parent_class)->event) 
+      (event, sim)) {
+    gts_container_foreach (GTS_CONTAINER (GFS_EVENT_LIST (event)->list), 
+			   (GtsFunc) gfs_event_do, sim);
+    return TRUE;
+  }
+  return FALSE;
+}
+
+static void copy_event (GfsEvent * event, GfsEvent * list)
+{
+  gfs_event_set (event, list->start, list->end, list->step, list->istart, list->iend, list->istep);
+}
+
+static void gfs_event_list_read (GtsObject ** o, GtsFile * fp)
+{
+  (* GTS_OBJECT_CLASS (gfs_event_list_class ())->parent_class->read) (o, fp);
+  if (fp->type == GTS_ERROR)
+    return;
+
+  GfsEventList * l = GFS_EVENT_LIST (*o);
+  if (fp->type == GTS_STRING) {
+    l->klass = gfs_object_class_from_name (fp->token->str);
+    if (l->klass == NULL) {
+      gts_file_error (fp, "unknown class `%s'", fp->token->str);
+      return;
+    }
+    gts_file_next_token (fp);
+  }
+
+  if (fp->type != '{') {
+    gts_file_error (fp, "expecting an opening brace");
+    return;
+  }
+  fp->scope_max++;
+  gts_file_next_token (fp);
+  while (fp->type == '\n') gts_file_next_token (fp);
+
+  GtsObjectClass * default_class = l->klass;
+  GfsSimulation * sim = gfs_object_simulation (*o);
+  while (fp->type != '}') {
+    GtsObjectClass * klass = default_class;
+    if (klass == NULL) {
+      if (fp->type != GTS_STRING) {
+	gts_file_error (fp, "expecting a keyword");
+	return;
+      }
+      klass = gfs_object_class_from_name (fp->token->str);
+      if (klass == NULL) {
+	gts_file_error (fp, "unknown class `%s'", fp->token->str);
+	return;
+      }
+      if (!gts_object_class_is_from_class (klass, gfs_event_class ())) {
+	gts_file_error (fp, "'%s' is not a GfsEvent", fp->token->str);
+	return;
+      }
+    }
+    
+    GtsObject * object = gts_object_new (klass);
+    gfs_object_simulation_set (object, sim);
+    (* klass->read) (&object, fp);
+    if (fp->type == GTS_ERROR) {
+      gts_object_destroy (object);
+      return;
+    }
+    while (fp->type == '\n') gts_file_next_token (fp);
+
+    gts_container_add (GTS_CONTAINER (l->list), GTS_CONTAINEE (object));
+  }
+  fp->scope_max--;
+  gts_file_next_token (fp);
+  
+  l->list->items = g_slist_reverse (l->list->items);
+  gts_container_foreach (GTS_CONTAINER (l->list), (GtsFunc) copy_event, l);
+}
+
+static void gfs_event_list_write (GtsObject * o, FILE * fp)
+{
+  (* GTS_OBJECT_CLASS (gfs_event_list_class ())->parent_class->write) (o, fp);
+  GfsEventList * l = GFS_EVENT_LIST (o);
+  if (l->klass)
+    fprintf (fp, " %s", l->klass->info.name);
+  fputs (" {\n", fp);
+  GSList * i = l->list->items;
+  while (i) {
+    fputs ("    ", fp);
+    (* GTS_OBJECT (i->data)->klass->write) (i->data, fp);
+    fputc ('\n', fp);
+    i = i->next;
+  }
+  fputc ('}', fp);
+}
+
+static void gfs_event_list_destroy (GtsObject * o)
+{
+  GfsEventList * l = GFS_EVENT_LIST (o);
+  gts_container_foreach (GTS_CONTAINER (l->list), (GtsFunc) gts_object_destroy, NULL);
+  gts_object_destroy (GTS_OBJECT (l->list));
+
+  (* GTS_OBJECT_CLASS (gfs_event_list_class ())->parent_class->destroy) (o);
+}
+
+static void gfs_event_list_class_init (GfsEventClass * klass)
+{
+  GFS_EVENT_CLASS (klass)->event = gfs_event_list_event;
+  GTS_OBJECT_CLASS (klass)->read = gfs_event_list_read;
+  GTS_OBJECT_CLASS (klass)->write = gfs_event_list_write;
+  GTS_OBJECT_CLASS (klass)->destroy = gfs_event_list_destroy;
+}
+
+static void gfs_event_list_init (GfsEventList * l)
+{
+  l->list = 
+    GTS_SLIST_CONTAINER (gts_container_new (GTS_CONTAINER_CLASS (gts_slist_container_class ())));
+}
+
+GfsEventClass * gfs_event_list_class (void)
+{
+  static GfsEventClass * klass = NULL;
+
+  if (klass == NULL) {
+    GtsObjectClassInfo gfs_event_list_info = {
+      "GfsEventList",
+      sizeof (GfsEventList),
+      sizeof (GfsEventClass),
+      (GtsObjectClassInitFunc) gfs_event_list_class_init,
+      (GtsObjectInitFunc) gfs_event_list_init,
+      (GtsArgSetFunc) NULL,
+      (GtsArgGetFunc) NULL
+    };
+    klass = gts_object_class_new (GTS_OBJECT_CLASS (gfs_event_class ()),
+				  &gfs_event_list_info);
+  }
+
+  return klass;
+}
+
diff --git a/src/event.h b/src/event.h
index cb93597..feec3df 100644
--- a/src/event.h
+++ b/src/event.h
@@ -338,6 +338,27 @@ struct _GfsEventFilter {
 
 GfsEventClass * gfs_event_filter_class  (void);
 
+/* GfsEventList: Header */
+
+typedef struct _GfsEventList         GfsEventList;
+
+struct _GfsEventList {
+  /*< private >*/
+  GfsEvent parent;
+
+  /*< public >*/
+  GtsObjectClass * klass;
+  GtsSListContainer * list;
+};
+
+#define GFS_EVENT_LIST(obj)            GTS_OBJECT_CAST (obj,\
+					         GfsEventList,\
+					         gfs_event_list_class ())
+#define GFS_IS_EVENT_LIST(obj)         (gts_object_is_from_class (obj,\
+						 gfs_event_list_class ()))
+
+GfsEventClass * gfs_event_list_class  (void);
+
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */
diff --git a/src/init.c b/src/init.c
index 38d4a4e..79b6dbc 100644
--- a/src/init.c
+++ b/src/init.c
@@ -203,6 +203,7 @@ GtsObjectClass ** gfs_classes (void)
     gfs_remove_droplets_class (),
     gfs_remove_ponds_class (),
     gfs_event_filter_class (),
+    gfs_event_list_class (),
    
     gfs_output_class (),
       gfs_output_time_class (),

-- 
Gerris Flow Solver



More information about the debian-science-commits mailing list