[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 727bee252fe212f881639904fcfa36256784b810
Author: Stephane Popinet <s.popinet at niwa.co.nz>
Date:   Wed Jun 29 15:22:43 2005 +1000

    Derived variables are associated with GfsDomain
    
    darcs-hash:20050629052243-fbd8f-a6c6ce783a5ce7384f4ee152a97846844c2829a9.gz

diff --git a/src/adaptive.c b/src/adaptive.c
index 5e63ce8..78e08f4 100644
--- a/src/adaptive.c
+++ b/src/adaptive.c
@@ -240,8 +240,10 @@ static void gfs_adapt_read (GtsObject ** o, GtsFile * fp)
       }
       domain = GFS_DOMAIN (gfs_object_simulation (*o));
       a->c = gfs_variable_from_name (domain->variables, fp->token->str);
-      if (!a->c)
-	a->c = gfs_domain_add_variable (domain, fp->token->str);
+      if (!a->c && !(a->c = gfs_domain_add_variable (domain, fp->token->str))) {
+	gts_file_error (fp, "`%s' is a reserved keyword", fp->token->str);
+	return;
+      }
       g_assert (a->c);
       a->c->fine_coarse = none;
       gts_file_next_token (fp);
diff --git a/src/domain.c b/src/domain.c
index d43e9c0..cad8194 100644
--- a/src/domain.c
+++ b/src/domain.c
@@ -134,6 +134,7 @@ static void domain_read (GtsObject ** o, GtsFile * fp)
       s = strtok (NULL, ",");
     }
     g_free (variables1);
+    domain->variables_io = gfs_variables_from_list (domain->variables, variables, &s);
     g_free (variables);
   }
 }
@@ -238,6 +239,9 @@ static void domain_destroy (GtsObject * o)
   }
   g_assert (domain->variables == NULL);
 
+  g_slist_foreach (domain->derived_variables, (GFunc) g_free, NULL);
+  g_slist_free (domain->derived_variables);
+
   g_array_free (domain->allocated, TRUE);
 
   g_hash_table_foreach (domain->timers, (GHFunc) free_pair, NULL);
@@ -2863,3 +2867,59 @@ void gfs_domain_combine_traverse (GfsDomain * domain1,
 
   gts_container_foreach (GTS_CONTAINER (domain1), (GtsFunc) box_combine_traverse, data);
 }
+
+/**
+ * gfs_domain_add_derived_variable:
+ * @domain: a #GfsDomain.
+ * @v: the #GfsDerivedVariable.
+ *
+ * Adds @v to @domain.
+ *
+ * Returns: %TRUE if the variable was successfully added to @domain or
+ * %FALSE if a variable with the same name already exists.
+ */
+gboolean gfs_domain_add_derived_variable (GfsDomain * domain, GfsDerivedVariable v)
+{
+  g_return_val_if_fail (domain != NULL, FALSE);
+
+  if (gfs_variable_from_name (domain->variables, v.name))
+    return FALSE;
+  if (gfs_derived_variable_from_name (domain->derived_variables, v.name))
+    return FALSE;
+  domain->derived_variables = g_slist_prepend (domain->derived_variables, 
+					       g_memdup (&v, sizeof (GfsDerivedVariable)));
+  return TRUE;
+}
+
+/**
+ * gfs_domain_remove_derived_variable:
+ * @domain: a #GfsDomain.
+ * @name: the name of a #GfsDerivedVariable.
+ *
+ * Removes derived variable @name from @domain.
+ *
+ * Returns: %TRUE if the variable was successfully removed from @domain or
+ * %FALSE if a derived variable with the this name does not exist.
+ */
+gboolean gfs_domain_remove_derived_variable (GfsDomain * domain, const gchar * name)
+{
+  GSList * i;
+  
+  g_return_val_if_fail (domain != NULL, FALSE);
+  g_return_val_if_fail (name != NULL, FALSE);
+
+  i = domain->derived_variables;
+  while (i) {
+    GfsDerivedVariable * u = i->data;
+
+    if (!strcmp (u->name, name)) {
+      g_free (u);
+      domain->derived_variables = g_slist_remove_link (domain->derived_variables, i);
+      g_slist_free (i);
+      return TRUE;
+    }
+    i = i->next;
+  }
+  return FALSE;
+}
+
diff --git a/src/domain.h b/src/domain.h
index ce1fa59..e8ffec1 100644
--- a/src/domain.h
+++ b/src/domain.h
@@ -56,6 +56,7 @@ struct _GfsDomain {
 
   GArray * allocated;
   GSList * variables;
+  GSList * derived_variables;
 
   GfsVariable * velocity[FTT_DIMENSION];
 
@@ -232,6 +233,10 @@ void         gfs_domain_combine_traverse      (GfsDomain * domain1,
 					       gpointer idata,
 					       FttCellTraverseFunc outside,
 					       gpointer odata);
+gboolean     gfs_domain_add_derived_variable  (GfsDomain * domain, 
+					       GfsDerivedVariable v);
+gboolean     gfs_domain_remove_derived_variable (GfsDomain * domain, 
+						 const gchar * name);
 
 #ifdef __cplusplus
 }
diff --git a/src/event.c b/src/event.c
index 6936ce8..62f89dc 100644
--- a/src/event.c
+++ b/src/event.c
@@ -485,8 +485,10 @@ static void gfs_init_read (GtsObject ** o, GtsFile * fp)
       GfsVariable * v = gfs_variable_from_name (domain->variables, fp->token->str);
       GfsFunction * f;
 
-      if (!v)
-	v = gfs_domain_add_variable (domain, fp->token->str);
+      if (!v && !(v = gfs_domain_add_variable (domain, fp->token->str))) {
+	gts_file_error (fp, "`%s' is a reserved keyword", fp->token->str);
+	return;
+      }
       gts_file_next_token (fp);
 
       if (fp->type != '=') {
@@ -844,9 +846,10 @@ static void gfs_event_sum_read (GtsObject ** o, GtsFile * fp)
     gts_file_error (fp, "expecting a string (sv)");
     return;
   }
-  if (!(s->sv = gfs_variable_from_name (domain->variables, fp->token->str))) {
-    s->sv = gfs_domain_add_variable (domain, fp->token->str);
-    g_assert (s->sv);
+  if (!(s->sv = gfs_variable_from_name (domain->variables, fp->token->str)) &&
+      !(s->sv = gfs_domain_add_variable (domain, fp->token->str))) {
+    gts_file_error (fp, "`%s' is a reserved keyword", fp->token->str);
+    return;
   }
   s->sv->fine_coarse = s->v->fine_coarse;
   gts_file_next_token (fp);
@@ -1031,9 +1034,10 @@ static void gfs_event_harmonic_read (GtsObject ** o, GtsFile * fp)
     gts_file_error (fp, "expecting a string (Z)");
     return;
   }
-  if (!(s->z = gfs_variable_from_name (domain->variables, fp->token->str))) {
-    s->z = gfs_domain_add_variable (domain, fp->token->str);
-    g_assert (s->z);
+  if (!(s->z = gfs_variable_from_name (domain->variables, fp->token->str)) &&
+      !(s->z = gfs_domain_add_variable (domain, fp->token->str))) {
+    gts_file_error (fp, "`%s' is a reserved keyword", fp->token->str);
+    return;
   }
   gts_file_next_token (fp);
 
@@ -1067,15 +1071,17 @@ static void gfs_event_harmonic_read (GtsObject ** o, GtsFile * fp)
     gchar * u;
     
     u = g_strdup_printf ("%s%d", s->Aname, i);
-    if (!(s->A[i] = gfs_variable_from_name (domain->variables, u))) {
-      s->A[i] = gfs_domain_add_variable (domain, u);
-      g_assert (s->A[i]);
+    if (!(s->A[i] = gfs_variable_from_name (domain->variables, u)) &&
+	!(s->A[i] = gfs_domain_add_variable (domain, u))) {
+      gts_file_error (fp, "`%s' is a reserved keyword", u);
+      return;
     }
     g_free (u);
     u = g_strdup_printf ("%s%d", s->Bname, i);
-    if (!(s->B[i] = gfs_variable_from_name (domain->variables, u))) {
-      s->B[i] = gfs_domain_add_variable (domain, u);
-      g_assert (s->B[i]);
+    if (!(s->B[i] = gfs_variable_from_name (domain->variables, u)) &&
+	!(s->B[i] = gfs_domain_add_variable (domain, u))) {
+      gts_file_error (fp, "`%s' is a reserved keyword", u);
+      return;
     }
   }
 
@@ -1295,7 +1301,7 @@ static void gfs_event_stop_read (GtsObject ** o, GtsFile * fp)
     return;
   }
   s->max = atof (fp->token->str);
-  s->oldv = gfs_domain_add_variable (domain, NULL);
+  s->oldv = gfs_temporary_variable (domain);
   s->oldv->fine_coarse = s->v->fine_coarse;
 
   if (fp->next_token != '\n') {
@@ -1304,13 +1310,24 @@ static void gfs_event_stop_read (GtsObject ** o, GtsFile * fp)
       gts_file_error (fp, "expecting a string (diff)");
       return;
     }
-    if (!(s->diff = gfs_variable_from_name (domain->variables, fp->token->str)))
-      s->diff = gfs_domain_add_variable (domain, fp->token->str);
+    if (!(s->diff = gfs_variable_from_name (domain->variables, fp->token->str)) &&
+	!(s->diff = gfs_domain_add_variable (domain, fp->token->str))) {
+      gts_file_error (fp, "`%s' is a reserved keyword", fp->token->str);
+      return;
+    }
     s->diff->fine_coarse = s->v->fine_coarse;
   }
   gts_file_next_token (fp);
 }
 
+static void gfs_event_stop_destroy (GtsObject * o)
+{
+  if (GFS_EVENT_STOP (o)->oldv)
+    gts_object_destroy (GTS_OBJECT (GFS_EVENT_STOP (o)->oldv));
+
+  (* GTS_OBJECT_CLASS (gfs_event_stop_class ())->parent_class->destroy) (o);
+}
+
 static void diff (FttCell * cell, GfsEventStop * s)
 {
   GFS_VARIABLE (cell, s->oldv->i) -= GFS_VARIABLE (cell, s->v->i);
@@ -1361,6 +1378,7 @@ static void gfs_event_stop_class_init (GfsEventClass * klass)
 {
   GTS_OBJECT_CLASS (klass)->read = gfs_event_stop_read;
   GTS_OBJECT_CLASS (klass)->write = gfs_event_stop_write;
+  GTS_OBJECT_CLASS (klass)->destroy = gfs_event_stop_destroy;
   GFS_EVENT_CLASS (klass)->event = gfs_event_stop_event;
 }
 
diff --git a/src/ocean.c b/src/ocean.c
index bab1ffd..8b04ff0 100644
--- a/src/ocean.c
+++ b/src/ocean.c
@@ -593,12 +593,14 @@ static void gfs_source_hydrostatic_read (GtsObject ** o, GtsFile * fp)
   FttComponent c;
   GfsVariable * v;
   GfsDomain * domain = GFS_DOMAIN (gfs_object_simulation (*o));
+  GfsSourceHydrostatic * sh;
 
   if (GTS_OBJECT_CLASS (gfs_source_hydrostatic_class ())->parent_class->read)
     (* GTS_OBJECT_CLASS (gfs_source_hydrostatic_class ())->parent_class->read) (o, fp);
   if (fp->type == GTS_ERROR)
     return;
 
+  sh = GFS_SOURCE_HYDROSTATIC (*o);
   v = GFS_SOURCE_GENERIC (*o)->v->next;
   for (c = 1; c < 2; c++, v = v->next) {
     if (!v) {
@@ -616,8 +618,8 @@ static void gfs_source_hydrostatic_read (GtsObject ** o, GtsFile * fp)
     gts_file_error (fp, "expecting a string (rho)");
     return;
   }
-  GFS_SOURCE_HYDROSTATIC (*o)->rho = gfs_variable_from_name (domain->variables, fp->token->str);
-  if (GFS_SOURCE_HYDROSTATIC (*o)->rho == NULL) {
+  sh->rho = gfs_variable_from_name (domain->variables, fp->token->str);
+  if (sh->rho == NULL) {
     gts_file_error (fp, "unknown variable `%s'", fp->token->str);
     return;
   }
@@ -627,12 +629,12 @@ static void gfs_source_hydrostatic_read (GtsObject ** o, GtsFile * fp)
     gts_file_error (fp, "expecting a string (ph)");
     return;
   }
-  GFS_SOURCE_HYDROSTATIC (*o)->ph = gfs_variable_from_name (domain->variables, fp->token->str);
-  if (GFS_SOURCE_HYDROSTATIC (*o)->ph == NULL)
-    GFS_SOURCE_HYDROSTATIC (*o)->ph = gfs_domain_add_variable (domain, fp->token->str);
+  sh->ph = gfs_variable_from_name (domain->variables, fp->token->str);
+  if (sh->ph == NULL)
+    sh->ph = gfs_domain_add_variable (domain, fp->token->str);
   gts_file_next_token (fp);
 
-  GFS_SOURCE_HYDROSTATIC (*o)->ph1 = gfs_domain_add_variable (domain, NULL);
+  sh->ph1 = gfs_domain_add_variable (domain, NULL);
 }
 
 static void gfs_source_hydrostatic_write (GtsObject * o, FILE * fp)
diff --git a/src/output.c b/src/output.c
index d29714a..525c384 100644
--- a/src/output.c
+++ b/src/output.c
@@ -2189,9 +2189,11 @@ static void output_error_norm_read (GtsObject ** o, GtsFile * fp)
 	gts_file_error (fp, "expecting a variable name");
 	return;
       }
-      n->v = gfs_variable_from_name (domain->variables, fp->token->str);
-      if (!n->v)
-	n->v = gfs_domain_add_variable (domain, fp->token->str);
+      if (!(n->v = gfs_variable_from_name (domain->variables, fp->token->str)) &&
+	  !(n->v = gfs_domain_add_variable (domain, fp->token->str))) {
+	gts_file_error (fp, "`%s' is a reserved keyword", fp->token->str);
+	return;
+      }
       gts_file_next_token (fp);
     }
     else {
diff --git a/src/refine.c b/src/refine.c
index 9c0d940..f4c7700 100644
--- a/src/refine.c
+++ b/src/refine.c
@@ -314,7 +314,7 @@ static void refine_distance_destroy (GtsObject * object)
 
   if (d->stree)
     gts_bb_tree_destroy (d->stree, TRUE);
-  gfs_simulation_remove_derived_variable (gfs_object_simulation (object), "Distance");
+  gfs_domain_remove_derived_variable (GFS_DOMAIN (gfs_object_simulation (object)), "Distance");
 
   (* GTS_OBJECT_CLASS (gfs_refine_distance_class ())->parent_class->destroy) (object);
 }
@@ -338,7 +338,7 @@ static void refine_distance_read (GtsObject ** o, GtsFile * fp)
   GfsDerivedVariable v = { "Distance", cell_distance };
 
   v.data = *o;
-  if (!gfs_simulation_add_derived_variable (gfs_object_simulation (*o), v)) {
+  if (!gfs_domain_add_derived_variable (GFS_DOMAIN (gfs_object_simulation (*o)), v)) {
     gts_file_error (fp, "derived variable `Distance' already defined");
     return;
   }
@@ -383,7 +383,7 @@ GfsRefineClass * gfs_refine_distance_class (void)
 
 static void refine_height_destroy (GtsObject * object)
 {
-  gfs_simulation_remove_derived_variable (gfs_object_simulation (object), "Height");
+  gfs_domain_remove_derived_variable (GFS_DOMAIN (gfs_object_simulation (object)), "Height");
 
   (* GTS_OBJECT_CLASS (gfs_refine_height_class ())->parent_class->destroy) (object);
 }
@@ -428,7 +428,7 @@ static void refine_height_read (GtsObject ** o, GtsFile * fp)
   GfsDerivedVariable v = { "Height", cell_height };
 
   v.data = *o;
-  if (!gfs_simulation_add_derived_variable (gfs_object_simulation (*o), v)) {
+  if (!gfs_domain_add_derived_variable (GFS_DOMAIN (gfs_object_simulation (*o)), v)) {
     gts_file_error (fp, "derived variable `Height' already defined");
     return;
   }
diff --git a/src/simulation.c b/src/simulation.c
index a94346c..6c99070 100644
--- a/src/simulation.c
+++ b/src/simulation.c
@@ -59,8 +59,6 @@ static void simulation_destroy (GtsObject * object)
     i = i->next;
   }
   g_slist_free (sim->modules);
-  g_slist_foreach (sim->derived_variables, (GFunc) g_free, NULL);
-  g_slist_free (sim->derived_variables);
   g_slist_free (sim->variables);
 
   (* GTS_OBJECT_CLASS (gfs_simulation_class ())->parent_class->destroy) 
@@ -728,7 +726,7 @@ static void gfs_simulation_init (GfsSimulation * object)
 #endif /* FTT_3D */
 
   while (v->name) {
-    gfs_simulation_add_derived_variable (object, *v);
+    g_assert (gfs_domain_add_derived_variable (domain, *v));
     v++;
   }
 
@@ -1167,66 +1165,6 @@ void gfs_simulation_run (GfsSimulation * sim)
   g_timer_stop (GFS_DOMAIN (sim)->timer);
 }
 
-/**
- * gfs_simulation_add_derived_variable:
- * @sim: a #GfsSimulation.
- * @v: the #GfsDerivedVariable.
- *
- * Adds @v to @sim.
- *
- * Returns: %TRUE if the variable was successfully added to @sim or
- * %FALSE if a derived variable with the same name already exists.
- */
-gboolean gfs_simulation_add_derived_variable (GfsSimulation * sim, GfsDerivedVariable v)
-{
-  GSList * i;
-  
-  g_return_val_if_fail (sim != NULL, FALSE);
-
-  i = sim->derived_variables;
-  while (i) {
-    GfsDerivedVariable * u = i->data;
-    if (!strcmp (u->name, v.name))
-      return FALSE;
-    i = i->next;
-  }
-  sim->derived_variables = g_slist_prepend (sim->derived_variables, 
-					    g_memdup (&v, sizeof (GfsDerivedVariable)));
-  return TRUE;
-}
-
-/**
- * gfs_simulation_remove_derived_variable:
- * @sim: a #GfsSimulation.
- * @name: the name of a #GfsDerivedVariable.
- *
- * Removes derived variable @name from @sim.
- *
- * Returns: %TRUE if the variable was successfully removed from @sim or
- * %FALSE if a derived variable with the this name does not exist.
- */
-gboolean gfs_simulation_remove_derived_variable (GfsSimulation * sim, const gchar * name)
-{
-  GSList * i;
-  
-  g_return_val_if_fail (sim != NULL, FALSE);
-  g_return_val_if_fail (name != NULL, FALSE);
-
-  i = sim->derived_variables;
-  while (i) {
-    GfsDerivedVariable * u = i->data;
-
-    if (!strcmp (u->name, name)) {
-      g_free (u);
-      sim->derived_variables = g_slist_remove_link (sim->derived_variables, i);
-      g_slist_free (i);
-      return TRUE;
-    }
-    i = i->next;
-  }
-  return FALSE;
-}
-
 /* GfsAdvection: Object */
 
 static void advection_run (GfsSimulation * sim)
diff --git a/src/simulation.h b/src/simulation.h
index 6e51d8e..90c613e 100644
--- a/src/simulation.h
+++ b/src/simulation.h
@@ -55,8 +55,6 @@ struct _GfsAdaptStats {
 struct _GfsSimulation {
   GfsDomain parent;
 
-  GSList * derived_variables;
-
   GfsTime time;
   GfsPhysicalParams physical_params;
 
@@ -120,10 +118,6 @@ void                 gfs_physical_params_read    (GfsPhysicalParams * p,
 						  GtsFile * fp);
 void                 gfs_simulation_run          (GfsSimulation * sim);
 #define              gfs_object_simulation(o)     GFS_SIMULATION(GTS_OBJECT (o)->reserved)
-gboolean     gfs_simulation_add_derived_variable (GfsSimulation * sim, 
-						  GfsDerivedVariable v);
-gboolean     gfs_simulation_remove_derived_variable (GfsSimulation * sim, 
-						     const gchar * name);
 
 /* GfsAdvection: Header */
 
diff --git a/src/source.c b/src/source.c
index c58bd60..42191a1 100644
--- a/src/source.c
+++ b/src/source.c
@@ -784,7 +784,15 @@ static void gfs_source_diffusion_explicit_read (GtsObject ** o, GtsFile * fp)
     return;
 
   GFS_SOURCE_DIFFUSION_EXPLICIT (*o)->s = 
-    gfs_domain_add_variable (GFS_DOMAIN (gfs_object_simulation (*o)), NULL);
+    gfs_temporary_variable (GFS_DOMAIN (gfs_object_simulation (*o)));
+}
+
+static void gfs_source_diffusion_explicit_destroy (GtsObject * o)
+{
+  if (GFS_SOURCE_DIFFUSION_EXPLICIT (o)->s)
+    gts_object_destroy (GTS_OBJECT (GFS_SOURCE_DIFFUSION_EXPLICIT (o)->s));
+
+  (* GTS_OBJECT_CLASS (gfs_source_diffusion_explicit_class ())->parent_class->destroy) (o);
 }
 
 static gdouble source_diffusion_explicit_value (GfsSourceGeneric * s, 
@@ -798,6 +806,7 @@ static void gfs_source_diffusion_explicit_class_init (GfsSourceGenericClass * kl
 {
   GFS_EVENT_CLASS (klass)->event = gfs_source_diffusion_explicit_event;
   GTS_OBJECT_CLASS (klass)->read = gfs_source_diffusion_explicit_read;
+  GTS_OBJECT_CLASS (klass)->destroy = gfs_source_diffusion_explicit_destroy;
   klass->mac_value = klass->centered_value = source_diffusion_explicit_value;
 }
 
@@ -945,9 +954,15 @@ GfsSourceGenericClass * gfs_source_viscosity_class (void)
 
 static void source_coriolis_destroy (GtsObject * o)
 {
+  FttComponent c;
+
   if (GFS_SOURCE_CORIOLIS (o)->omegaz)
     gts_object_destroy (GTS_OBJECT (GFS_SOURCE_CORIOLIS (o)->omegaz));
 
+  for (c = 0; c <  2; c++)
+    if (GFS_SOURCE_CORIOLIS (o)->u[c])
+      gts_object_destroy (GTS_OBJECT (GFS_SOURCE_CORIOLIS (o)->u[c]));
+
   (* GTS_OBJECT_CLASS (gfs_source_class ())->parent_class->destroy) (o);
 }
 
@@ -964,7 +979,7 @@ static void gfs_source_coriolis_read (GtsObject ** o, GtsFile * fp)
   gfs_function_read (GFS_SOURCE_CORIOLIS (*o)->omegaz, gfs_object_simulation (*o), fp);
 
   for (c = 0; c <  2; c++)
-    GFS_SOURCE_CORIOLIS (*o)->u[c] = gfs_domain_add_variable (domain, NULL);
+    GFS_SOURCE_CORIOLIS (*o)->u[c] = gfs_temporary_variable (domain);
 }
 
 static void gfs_source_coriolis_write (GtsObject * o, FILE * fp)
diff --git a/src/utils.c b/src/utils.c
index 75ad6ec..ac8da1e 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -271,7 +271,7 @@ static void function_read (GtsObject ** o, GtsFile * fp)
     }
     else if ((f->v = gfs_variable_from_name (domain->variables, fp->token->str)))
       break;
-    else if ((f->dv = lookup_derived_variable (fp->token->str, sim->derived_variables))) {
+    else if ((f->dv = lookup_derived_variable (fp->token->str, domain->derived_variables))) {
       f->expr = g_string_new (fp->token->str);
       break;
     }
@@ -317,7 +317,7 @@ static void function_read (GtsObject ** o, GtsFile * fp)
 	  lv = g_slist_prepend (lv, i->data);
 	i = i->next;
       }
-      i = sim->derived_variables;
+      i = domain->derived_variables;
       while (i) {
 	GfsDerivedVariable * v = i->data;
 	if (find_identifier (f->expr->str, v->name))
@@ -648,6 +648,26 @@ void gfs_function_write (GfsFunction * f, FILE * fp)
 }
 
 /**
+ * gfs_derived_variable_from_name:
+ * @i: a list of #GfsDerivedVariable.
+ * @name: a name.
+ *
+ * Returns: the #GfsDerivedVariable @name of @list or %NULL.
+ */
+GfsDerivedVariable * gfs_derived_variable_from_name (GSList * i, const gchar * name)
+{
+  g_return_val_if_fail (name != NULL, NULL);
+
+  while (i) {
+    GfsDerivedVariable * v = i->data;
+    if (!strcmp (v->name, name))
+      return v;
+    i = i->next;
+  }
+  return NULL;
+}
+
+/**
  * gfs_object_class_from_name:
  * @name: the name of the class.
  *
diff --git a/src/utils.h b/src/utils.h
index 24b2c08..fda51ac 100644
--- a/src/utils.h
+++ b/src/utils.h
@@ -39,6 +39,8 @@ typedef struct {
   gpointer data;
 } GfsDerivedVariable;
 
+GfsDerivedVariable * gfs_derived_variable_from_name (GSList * i, const gchar * name);
+
 /* GfsFunction: Header */
 
 typedef struct _GfsFunction         GfsFunction;
diff --git a/src/variable.c b/src/variable.c
index 7aa15dc..fb8c950 100644
--- a/src/variable.c
+++ b/src/variable.c
@@ -131,7 +131,9 @@ GfsVariable * gfs_variable_new (GfsVariableClass * klass,
   g_return_val_if_fail (klass != NULL, NULL);
   g_return_val_if_fail (domain != NULL, NULL);
 
-  if (name && gfs_variable_from_name (domain->variables, name))
+  if (name &&
+      (gfs_variable_from_name (domain->variables, name) ||
+       gfs_derived_variable_from_name (domain->derived_variables, name)))
     return NULL;
 
   v = GFS_VARIABLE1 (gts_object_new (GTS_OBJECT_CLASS (klass)));

-- 
Gerris Flow Solver



More information about the debian-science-commits mailing list