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

Stephane Popinet popinet at users.sf.net
Tue Nov 24 12:25:05 UTC 2009


The following commit has been merged in the upstream branch:
commit 4590b44bc9592f1b1021ee9d75ff04aaa8f9eff0
Author: Stephane Popinet <popinet at users.sf.net>
Date:   Wed Sep 16 13:28:20 2009 +1000

    Bug fix for CGD/GTS files and multiple GfsFunctions
    
    darcs-hash:20090916032820-d4795-d25817792720b63b1e160b492d885c0b038b0caf.gz

diff --git a/src/cartesian.h b/src/cartesian.h
index 602db15..0a07bf0 100644
--- a/src/cartesian.h
+++ b/src/cartesian.h
@@ -33,7 +33,7 @@ typedef struct _GfsCartesianGrid      GfsCartesianGrid;
 struct _GfsCartesianGrid {
   /*< private >*/
   GtsObject parent;
-  guint N;       /* Number of dimension */
+  guint N;       /* Number of dimensions */
   guint * n;     /* Size of each dimension */
   gdouble ** x;  /* Position of each point in the grid */
   gdouble * v;   /* Data */
diff --git a/src/utils.c b/src/utils.c
index cc8b40f..7b05b7c 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -259,15 +259,15 @@ static GfsCartesianGrid * read_cartesian_grid (gchar * name, GtsFile * fp)
 static gboolean fit_index_dimension (GfsCartesianGrid * grid, guint * val, GtsFile * fp)
 {
   guint i, j;
-  gchar liste[] = {'x','y','z','t'};
+  gchar list[] = {'x','y','z','t'};
 
   if (grid->N > 4) {
     gts_file_error (fp, "Cartesian grids can only use four dimensions or less");
     return FALSE;
   }
 
-  for(i = 0; i < grid->N; i++) {
-    for (j = 0; j < 4 && *grid->name[i] != liste[j]; j++);
+  for (i = 0; i < grid->N; i++) {
+    for (j = 0; j < 4 && *grid->name[i] != list[j]; j++);
     if (j == 4) {
       gts_file_error (fp, "unknown Cartesian grid index `%s'", grid->name[i]);
       return FALSE;
@@ -277,23 +277,32 @@ static gboolean fit_index_dimension (GfsCartesianGrid * grid, guint * val, GtsFi
   return TRUE;
 }
 
+static gboolean cgd_is_spatial (GfsFunction * f)
+{
+  guint i;
+  for (i = 0; i < f->g->N; i++)
+    if (f->index[i] < 3)
+      return TRUE;
+  return FALSE;
+}
+
 static gdouble interpolated_cgd (GfsFunction * f, FttVector * p)
 {
-  gdouble vecteur[4];
+  gdouble vector[4];
   gdouble val;
   guint i;
 
   gfs_simulation_map_inverse (gfs_object_simulation (f), p);
   for (i = 0; i < f->g->N; i++)
     switch (f->index[i]) {
-    case 0: vecteur[i] = p->x; break;
-    case 1: vecteur[i] = p->y; break;
-    case 2: vecteur[i] = p->z; break;
-    case 3: vecteur[i] = gfs_object_simulation (f)->time.t; break;
+    case 0: vector[i] = p->x; break;
+    case 1: vector[i] = p->y; break;
+    case 2: vector[i] = p->z; break;
+    case 3: vector[i] = gfs_object_simulation (f)->time.t; break;
     default: g_assert_not_reached ();
     }
 
-  if (!gfs_cartesian_grid_interpolate (f->g, vecteur, &val))
+  if (!gfs_cartesian_grid_interpolate (f->g, vector, &val))
     return 0.;
   return val;
 }
@@ -718,6 +727,25 @@ static void function_read (GtsObject ** o, GtsFile * fp)
     return;
   }
 
+  if (fp->type == GTS_STRING && !f->spatial && !f->constant && strlen (fp->token->str) > 3) {
+    if (!strcmp (&(fp->token->str[strlen (fp->token->str) - 4]), ".gts")) {
+      if ((f->s = read_surface (fp->token->str, fp)) == NULL)
+	return;
+      f->sname = g_strdup (fp->token->str);
+      gts_file_next_token (fp);
+      return;
+    }
+    else if (!strcmp (&(fp->token->str[strlen (fp->token->str) - 4]), ".cgd")) {
+      if ((f->g = read_cartesian_grid (fp->token->str, fp)) == NULL)
+	return;
+      if (!fit_index_dimension (f->g, f->index, fp))
+	return;
+      f->sname = g_strdup (fp->token->str);
+      gts_file_next_token (fp);
+      return;
+    }   
+  }
+
   if ((f->expr = gfs_function_expression (fp, &f->isexpr)) == NULL)
     return;
 
@@ -730,29 +758,8 @@ static void function_read (GtsObject ** o, GtsFile * fp)
       }
     }
     else if (fp->type == GTS_STRING && !f->spatial && !f->constant) {
-      if (strlen (f->expr->str) > 3 &&
-	  !strcmp (&(f->expr->str[strlen (f->expr->str) - 4]), ".gts")) {
-	if ((f->s = read_surface (f->expr->str, fp)) == NULL)
-	  return;
-	f->sname = g_strdup (f->expr->str);
-	gts_file_next_token (fp);
-	return;
-      }
-      else if (strlen (f->expr->str) > 3 &&
-	       !strcmp (&(f->expr->str[strlen (f->expr->str) - 4]), ".cgd")) {
-	if ((f->g = read_cartesian_grid (f->expr->str, fp)) == NULL)
-	  return;
-	if (!fit_index_dimension (f->g, f->index, fp))
-	  return;
-	f->sname = g_strdup (f->expr->str);
-	gts_file_next_token (fp);
-	return;
-      }
-      else if ((f->v = gfs_variable_from_name (domain->variables, f->expr->str))) {
-	gts_file_next_token (fp);
-	return;
-      }
-      else if ((f->dv = lookup_derived_variable (f->expr->str, domain->derived_variables))) {
+      if ((f->v = gfs_variable_from_name (domain->variables, f->expr->str)) ||
+	  (f->dv = lookup_derived_variable (f->expr->str, domain->derived_variables))) {
 	gts_file_next_token (fp);
 	return;
       }
@@ -961,8 +968,9 @@ gdouble gfs_function_value (GfsFunction * f, FttCell * cell)
     dimensional = interpolated_value (f, &p);
   }
   else if (f->g) {
-    FttVector p;
-    gfs_cell_cm (cell, &p);
+    FttVector p = {0.,0.,0.};
+    if (cgd_is_spatial (f))
+      gfs_cell_cm (cell, &p);
     dimensional = interpolated_cgd (f, &p);
   }
   else if (f->v)
@@ -999,8 +1007,9 @@ gdouble gfs_function_face_value (GfsFunction * f, FttCellFace * fa)
     dimensional = interpolated_value (f, &p);
   }
   else if (f->g) {
-    FttVector p;
-    ftt_face_pos (fa, &p);
+    FttVector p = {0.,0.,0.};
+    if (cgd_is_spatial (f))
+      ftt_face_pos (fa, &p);
     dimensional = interpolated_cgd (f, &p);
   }
   else if (f->v)

-- 
Gerris Flow Solver



More information about the debian-science-commits mailing list