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

Stephane Popinet popinet at users.sf.net
Fri May 15 02:53:26 UTC 2009


The following commit has been merged in the upstream branch:
commit d50abe18434a0e40a7a062c89e8e9c2ee22d0cf1
Author: Stephane Popinet <popinet at users.sf.net>
Date:   Tue Jan 30 09:34:50 2007 +1100

    New GfsGlobal object defines "global" functions
    
    darcs-hash:20070129223450-d4795-01d9fda53f92a61d6c1e7e01c2a1bb4992b69247.gz

diff --git a/src/init.c b/src/init.c
index 8c8da03..1ca0c7e 100644
--- a/src/init.c
+++ b/src/init.c
@@ -135,6 +135,7 @@ void gfs_init (int * argc, char *** argv)
 		     (GLogFunc) gfs_log, NULL);
 
   /* Instantiates classes before reading any domain or simulation file */
+  gfs_global_class ();
   gfs_simulation_class ();
     gfs_ocean_class ();
     gfs_advection_class ();
diff --git a/src/simulation.c b/src/simulation.c
index 04d50c6..da04ba2 100644
--- a/src/simulation.c
+++ b/src/simulation.c
@@ -36,7 +36,6 @@
 static void simulation_destroy (GtsObject * object)
 {
   GfsSimulation * sim = GFS_SIMULATION (object);
-  GSList * i;
 
   if (sim->surface)
     gts_object_destroy (GTS_OBJECT (sim->surface));
@@ -50,16 +49,13 @@ static void simulation_destroy (GtsObject * object)
   gts_object_destroy (GTS_OBJECT (sim->events));
   gts_object_destroy (GTS_OBJECT (sim->adapts));
 
-  i = sim->modules;
-  while (i) {
-    g_module_close (i->data);
-    i = i->next;
-  }
+  g_slist_foreach (sim->modules, (GFunc) g_module_close, NULL);
   g_slist_free (sim->modules);
   g_slist_free (sim->variables);
+  g_slist_foreach (sim->globals, (GFunc) gts_object_destroy, NULL);
+  g_slist_free (sim->globals);
 
-  (* GTS_OBJECT_CLASS (gfs_simulation_class ())->parent_class->destroy) 
-    (object);
+  (* GTS_OBJECT_CLASS (gfs_simulation_class ())->parent_class->destroy) (object);
 }
 
 static void simulation_write (GtsObject * object, FILE * fp)
@@ -71,8 +67,14 @@ static void simulation_write (GtsObject * object, FILE * fp)
   (* GTS_OBJECT_CLASS (gfs_simulation_class ())->parent_class->write)
     (object, fp);
 
-  fputs (" {\n"
-	 "  GfsTime ", fp);
+  fputs (" {\n", fp);
+  i = sim->globals;
+  while (i) {
+    fputs ("  ", fp);
+    (* GTS_OBJECT (i->data)->klass->write) (i->data, fp);
+    i = i->next;
+  }
+  fputs ("  GfsTime ", fp);
   gfs_time_write (&sim->time, fp);
   fputs ("\n  GfsPhysicalParams ", fp);
   gfs_physical_params_write (&sim->physical_params, fp);
@@ -392,7 +394,8 @@ static void simulation_read (GtsObject ** object, GtsFile * fp)
       GtsObject * object;
 
       if (klass == NULL ||
-	  (!gts_object_class_is_from_class (klass, gfs_refine_class ()) &&
+	  (!gts_object_class_is_from_class (klass, gfs_global_class ()) &&
+	   !gts_object_class_is_from_class (klass, gfs_refine_class ()) &&
 	   !gts_object_class_is_from_class (klass, gfs_event_class ()) &&
 	   !gts_object_class_is_from_class (klass, gfs_surface_generic_bc_class ()))) {
 	gts_file_error (fp, "unknown keyword `%s'", fp->token->str);
@@ -409,7 +412,9 @@ static void simulation_read (GtsObject ** object, GtsFile * fp)
 	return;
       }
 
-      if (GFS_IS_REFINE (object))
+      if (GFS_IS_GLOBAL (object))
+	sim->globals = g_slist_append (sim->globals, object);
+      else if (GFS_IS_REFINE (object))
 	gts_container_add (GTS_CONTAINER (sim->refines), GTS_CONTAINEE (object));
       else if (GFS_IS_ADAPT (object)) {
 	gts_container_add (GTS_CONTAINER (sim->adapts), GTS_CONTAINEE (object));
diff --git a/src/simulation.h b/src/simulation.h
index 9cfd50e..99fd68d 100644
--- a/src/simulation.h
+++ b/src/simulation.h
@@ -74,8 +74,7 @@ struct _GfsSimulation {
   GfsAdaptStats adapts_stats;
 
   GtsSListContainer * events;
-  GSList * modules;
-  GSList * variables;
+  GSList * modules, * variables, * globals;
 
   gdouble tnext;
 };
diff --git a/src/utils.c b/src/utils.c
index d943a20..442e72e 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -64,6 +64,104 @@ static GfsDerivedVariable * lookup_derived_variable (const gchar * name,
   return NULL;
 }
 
+/* GfsGlobal: Object */
+
+struct _GfsGlobal {
+  /*< private >*/
+  GtsObject parent;
+
+  /*< public >*/
+  GString * s;
+  guint line;
+};
+
+static void global_destroy (GtsObject * object)
+{
+  g_string_free (GFS_GLOBAL (object)->s, TRUE);
+  (* gfs_global_class ()->parent_class->destroy) (object);
+}
+
+static void global_write (GtsObject * object, FILE * fp)
+{
+  fprintf (fp, "%s {", object->klass->info.name);
+  fputs (GFS_GLOBAL (object)->s->str, fp);
+  fputs ("}\n", fp);
+}
+
+static void global_read (GtsObject ** object, GtsFile * fp)
+{
+  GfsGlobal * global = GFS_GLOBAL (*object);
+  GtsObjectClass * klass;
+
+  if (fp->type != GTS_STRING) {
+    gts_file_error (fp, "expecting a string (GfsGlobalClass)");
+    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_global_class ())) {
+    gts_file_error (fp, "`%s' is not a GfsGlobal", fp->token->str);
+    return;
+  }
+  gts_file_next_token (fp);
+  if (fp->type != '{') {
+    gts_file_error (fp, "expecting an opening brace");
+    return;
+  }
+  global->line = fp->line;
+  gchar * comments = fp->comments;
+  fp->comments = g_strdup ("");
+  guint scope = fp->scope_max;
+  gint c = gts_file_getc (fp);
+  while (c != EOF && fp->scope > scope) {
+    g_string_append_c (global->s, c);
+    c = gts_file_getc (fp);
+  }
+  g_free (fp->comments);
+  fp->comments = comments;
+  if (fp->scope != scope) {
+    gts_file_error (fp, "parse error");
+    return;
+  }
+  gts_file_next_token (fp);
+}
+
+static void gfs_global_class_init (GtsObjectClass * klass)
+{
+  klass->destroy = global_destroy;
+  klass->read =    global_read;
+  klass->write =   global_write;
+}
+
+static void gfs_global_init (GfsGlobal * object)
+{
+  object->s = g_string_new ("");
+}
+
+GtsObjectClass * gfs_global_class (void)
+{
+  static GtsObjectClass * klass = NULL;
+
+  if (klass == NULL) {
+    GtsObjectClassInfo gfs_global_info = {
+      "GfsGlobal",
+      sizeof (GfsGlobal),
+      sizeof (GtsObjectClass),
+      (GtsObjectClassInitFunc) gfs_global_class_init,
+      (GtsObjectInitFunc) gfs_global_init,
+      (GtsArgSetFunc) NULL,
+      (GtsArgGetFunc) NULL
+    };
+    klass = gts_object_class_new (GTS_OBJECT_CLASS (gts_object_class ()),
+				  &gfs_global_info);
+  }
+
+  return klass;
+}
+
 /* GfsFunction: Object */
 
 struct _GfsFunction {
@@ -397,8 +495,16 @@ static void function_read (GtsObject ** o, GtsFile * fp)
     fputs ("#include <stdlib.h>\n"
 	   "#include <stdio.h>\n"
 	   "#include <math.h>\n"
-	   "#include <gfs.h>\n"
-	   "typedef double (* Func) (const FttCell * cell,\n"
+	   "#include <gfs.h>\n",
+	   fin);
+    i = sim->globals;
+    while (i) {
+      fprintf (fin, "#line %d \"GfsGlobal\"\n", GFS_GLOBAL (i->data)->line);
+      fputs (GFS_GLOBAL (i->data)->s->str, fin);
+      fputc ('\n', fin);
+      i = i->next;
+    }
+    fputs ("typedef double (* Func) (const FttCell * cell,\n"
 	   "                         const FttCellFace * face,\n"
 	   "                         GfsSimulation * sim,\n"
 	   "                         gpointer data);\n"
diff --git a/src/utils.h b/src/utils.h
index d287327..224c236 100644
--- a/src/utils.h
+++ b/src/utils.h
@@ -31,6 +31,18 @@ extern "C" {
 
 gboolean gfs_char_in_string (char c, const char * s);
 
+/* GfsGlobal: Header */
+
+typedef struct _GfsGlobal         GfsGlobal;
+
+#define GFS_GLOBAL(obj)            GTS_OBJECT_CAST (obj,\
+					         GfsGlobal,\
+					         gfs_global_class ())
+#define GFS_IS_GLOBAL(obj)         (gts_object_is_from_class (obj,\
+						 gfs_global_class ()))
+
+GtsObjectClass * gfs_global_class  (void);
+
 /* GfsFunction: Header */
 
 typedef struct _GfsFunction         GfsFunction;

-- 
Gerris Flow Solver



More information about the debian-science-commits mailing list