[SCM] Gerris Flow Solver branch, upstream, updated. b3aa46814a06c9cb2912790b23916ffb44f1f203
Stephane Popinet
s.popinet at niwa.co.nz
Fri May 15 02:52:06 UTC 2009
The following commit has been merged in the upstream branch:
commit 1a73363df67100c30e09708d75547c30bb455c82
Author: Stephane Popinet <s.popinet at niwa.co.nz>
Date: Tue Jun 28 14:07:16 2005 +1000
GfsInit creates unknown variables and preserves the order of initialisation
darcs-hash:20050628040716-fbd8f-170193d02b19e73638d86f19825f49ea7604a213.gz
diff --git a/src/event.c b/src/event.c
index 02253d3..6936ce8 100644
--- a/src/event.c
+++ b/src/event.c
@@ -437,6 +437,25 @@ GfsEventClass * gfs_generic_init_class (void)
/* GfsInit: Object */
+typedef struct {
+ GfsVariable * v;
+ GfsFunction * f;
+} VarFunc;
+
+static VarFunc * var_func_new (GfsVariable * v, GfsFunction * f)
+{
+ VarFunc * vf = g_malloc (sizeof (VarFunc));
+ vf->v = v;
+ vf->f = f;
+ return vf;
+}
+
+static void var_func_destroy (VarFunc * v)
+{
+ gts_object_destroy (GTS_OBJECT (v->f));
+ g_free (v);
+}
+
static void gfs_init_read (GtsObject ** o, GtsFile * fp)
{
if (GTS_OBJECT_CLASS (gfs_init_class ())->parent_class->read)
@@ -461,14 +480,13 @@ static void gfs_init_read (GtsObject ** o, GtsFile * fp)
return;
}
else {
- GfsVariable * v = gfs_variable_from_name (GFS_DOMAIN (gfs_object_simulation (*o))->variables,
- fp->token->str);
+ GfsInit * init = GFS_INIT (*o);
+ GfsDomain * domain = GFS_DOMAIN (gfs_object_simulation (*o));
+ GfsVariable * v = gfs_variable_from_name (domain->variables, fp->token->str);
GfsFunction * f;
- if (!v) {
- gts_file_error (fp, "unknown variable `%s'\n", fp->token->str);
- return;
- }
+ if (!v)
+ v = gfs_domain_add_variable (domain, fp->token->str);
gts_file_next_token (fp);
if (fp->type != '=') {
@@ -483,7 +501,7 @@ static void gfs_init_read (GtsObject ** o, GtsFile * fp)
gts_object_destroy (GTS_OBJECT (f));
return;
}
- g_hash_table_insert (GFS_INIT (*o)->f, v, f);
+ init->f = g_slist_append (init->f, var_func_new (v, f));
}
}
if (fp->type != '}') {
@@ -494,65 +512,53 @@ static void gfs_init_read (GtsObject ** o, GtsFile * fp)
gts_file_next_token (fp);
}
-static void write_f (GfsVariable * v, GfsFunction * f, FILE * fp)
-{
- fprintf (fp, " %s =", v->name);
- gfs_function_write (f, fp);
- fputc ('\n', fp);
-}
-
static void gfs_init_write (GtsObject * o, FILE * fp)
{
- GfsInit * i = GFS_INIT (o);
-
+ GSList * i;
+
if (GTS_OBJECT_CLASS (gfs_init_class ())->parent_class->write)
(* GTS_OBJECT_CLASS (gfs_init_class ())->parent_class->write)
(o, fp);
fputs (" {\n", fp);
- g_hash_table_foreach (i->f, (GHFunc) write_f, fp);
+ i = GFS_INIT (o)->f;
+ while (i) {
+ VarFunc * v = i->data;
+ fprintf (fp, " %s =", v->v->name);
+ gfs_function_write (v->f, fp);
+ fputc ('\n', fp);
+ i = i->data;
+ }
fputc ('}', fp);
}
-static void destroy_f (GfsVariable * v, GtsObject * o)
-{
- gts_object_destroy (o);
-}
-
static void gfs_init_destroy (GtsObject * object)
{
GfsInit * i = GFS_INIT (object);
- g_hash_table_foreach (i->f, (GHFunc) destroy_f, NULL);
- g_hash_table_destroy (i->f);
+ g_slist_foreach (i->f, (GFunc) var_func_destroy, NULL);
+ g_slist_free (i->f);
(* GTS_OBJECT_CLASS (gfs_init_class ())->parent_class->destroy)
(object);
}
-static void init_vf (FttCell * cell, gpointer * data)
-{
- GfsVariable * v = data[0];
- GfsFunction * f = data[1];
-
- GFS_VARIABLE (cell, v->i) = gfs_function_value (f, cell);
-}
-
-static void init_f (GfsVariable * v, GfsFunction * f, GfsDomain * domain)
+static void init_vf (FttCell * cell, VarFunc * vf)
{
- gpointer data[2];
-
- data[0] = v;
- data[1] = f;
- gfs_domain_cell_traverse (domain, FTT_PRE_ORDER, FTT_TRAVERSE_LEAFS, -1,
- (FttCellTraverseFunc) init_vf, data);
+ GFS_VARIABLE (cell, vf->v->i) = gfs_function_value (vf->f, cell);
}
static gboolean gfs_init_event (GfsEvent * event, GfsSimulation * sim)
{
if ((* GFS_EVENT_CLASS (GTS_OBJECT_CLASS (gfs_init_class ())->parent_class)->event)
(event, sim)) {
- g_hash_table_foreach (GFS_INIT (event)->f, (GHFunc) init_f, sim);
+ GSList * i = GFS_INIT (event)->f;
+
+ while (i) {
+ gfs_domain_cell_traverse (GFS_DOMAIN (sim), FTT_PRE_ORDER, FTT_TRAVERSE_LEAFS, -1,
+ (FttCellTraverseFunc) init_vf, i->data);
+ i = i->next;
+ }
return TRUE;
}
return FALSE;
@@ -566,11 +572,6 @@ static void gfs_init_class_init (GfsGenericInitClass * klass)
GTS_OBJECT_CLASS (klass)->destroy = gfs_init_destroy;
}
-static void gfs_init_init (GfsInit * object)
-{
- object->f = g_hash_table_new (NULL, NULL);
-}
-
GfsGenericInitClass * gfs_init_class (void)
{
static GfsGenericInitClass * klass = NULL;
@@ -581,7 +582,7 @@ GfsGenericInitClass * gfs_init_class (void)
sizeof (GfsInit),
sizeof (GfsGenericInitClass),
(GtsObjectClassInitFunc) gfs_init_class_init,
- (GtsObjectInitFunc) gfs_init_init,
+ (GtsObjectInitFunc) NULL,
(GtsArgSetFunc) NULL,
(GtsArgGetFunc) NULL
};
diff --git a/src/event.h b/src/event.h
index 0caf12b..82cc579 100644
--- a/src/event.h
+++ b/src/event.h
@@ -94,7 +94,7 @@ typedef struct _GfsInit GfsInit;
struct _GfsInit {
/*< private >*/
GfsGenericInit parent;
- GHashTable * f;
+ GSList * f;
};
#define GFS_INIT(obj) GTS_OBJECT_CAST (obj,\
--
Gerris Flow Solver
More information about the debian-science-commits
mailing list