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

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


The following commit has been merged in the upstream branch:
commit ab70c7529495a4177c4f06691f020f163068500f
Author: Stephane Popinet <popinet at users.sf.net>
Date:   Thu Oct 8 08:08:54 2009 +1100

    New object GfsMapFunction
    
    darcs-hash:20091007210854-d4795-0ce9f0c827dd8b064fe04d97c08f39ecab6ff491.gz

diff --git a/modules/map.mod b/modules/map.mod
index 858ff82..3947296 100644
--- a/modules/map.mod
+++ b/modules/map.mod
@@ -132,8 +132,6 @@ static void gfs_map_projection_class_init (GfsMapClass * klass)
   GTS_OBJECT_CLASS (klass)->read = gfs_map_projection_read;
   GTS_OBJECT_CLASS (klass)->write = gfs_map_projection_write;
   GTS_OBJECT_CLASS (klass)->destroy = gfs_map_projection_destroy;
-  GFS_MAP_CLASS (klass)->transform = projection_transform;
-  GFS_MAP_CLASS (klass)->inverse = projection_inverse;
 }
 
 static void gfs_map_projection_init (GfsMapProjection * object)
@@ -143,6 +141,8 @@ static void gfs_map_projection_init (GfsMapProjection * object)
   object->lat = -41.288889;
   object->angle = 0.; object->cosa = 1.; object->sina = 0.;
   object->pj = NULL;
+  GFS_MAP (object)->transform = projection_transform;
+  GFS_MAP (object)->inverse = projection_inverse;
 }
 
 GfsMapClass * gfs_map_projection_class (void)
diff --git a/src/init.c b/src/init.c
index c5f0ea7..d42ccdf 100644
--- a/src/init.c
+++ b/src/init.c
@@ -43,6 +43,7 @@
 #include "moving.h"
 #include "river.h"
 #include "balance.h"
+#include "map.h"
 
 #include "modules.h"
 
@@ -229,6 +230,9 @@ GtsObjectClass ** gfs_classes (void)
 	gfs_output_streamline_class (),
         gfs_output_ppm_class (),  
 
+  gfs_map_class (),
+    gfs_map_function_class (),
+  
   NULL};
 
     guint n = 0;
diff --git a/src/map.c b/src/map.c
index 1b46d1d..f3c0a2f 100644
--- a/src/map.c
+++ b/src/map.c
@@ -18,8 +18,6 @@
  */
 
 #include "map.h"
-#include "variable.h"
-#include "utils.h"
 
 /* GfsMap: Object */
 
@@ -56,16 +54,20 @@ static void gfs_map_write (GtsObject * o, FILE * fp)
   fprintf (fp, "%s", o->klass->info.name);
 }
 
+static void gfs_map_class_init (GfsMapClass * klass)
+{
+  GTS_OBJECT_CLASS (klass)->read = gfs_map_read;
+  GTS_OBJECT_CLASS (klass)->write = gfs_map_write;
+}
+
 static void identity (GfsMap * map, const FttVector * src, FttVector * dest)
 {
   *dest = *src;
 }
 
-static void gfs_map_class_init (GfsMapClass * klass)
+static void gfs_map_init (GfsMap * map)
 {
-  GTS_OBJECT_CLASS (klass)->read = gfs_map_read;
-  GTS_OBJECT_CLASS (klass)->write = gfs_map_write;
-  GFS_MAP_CLASS (klass)->transform = GFS_MAP_CLASS (klass)->inverse = identity;
+  map->transform = map->inverse = identity;
 }
 
 GfsMapClass * gfs_map_class (void)
@@ -78,7 +80,7 @@ GfsMapClass * gfs_map_class (void)
       sizeof (GfsMap),
       sizeof (GfsMapClass),
       (GtsObjectClassInitFunc) gfs_map_class_init,
-      (GtsObjectInitFunc) NULL,
+      (GtsObjectInitFunc) gfs_map_init,
       (GtsArgSetFunc) NULL,
       (GtsArgGetFunc) NULL
     };
@@ -88,3 +90,155 @@ GfsMapClass * gfs_map_class (void)
 
   return klass;
 }
+
+/* GfsMapFunction: Object */
+
+static void gfs_map_function_read (GtsObject ** o, GtsFile * fp)
+{
+  (* GTS_OBJECT_CLASS (gfs_map_function_class ())->parent_class->read) (o, fp);
+  if (fp->type == GTS_ERROR)
+    return;
+
+  if (fp->type != '{') {
+    gts_file_error (fp, "expecting an opening brace");
+    return;
+  }
+  fp->scope_max++;
+  gts_file_next_token (fp);
+  while (fp->type != GTS_ERROR && fp->type != '}') {
+    if (fp->type == '\n') {
+      gts_file_next_token (fp);
+      continue;
+    }
+    if (fp->type != GTS_STRING) {
+      gts_file_error (fp, "expecting a keyword");
+      return;
+    }
+    else {
+      static gchar name[3][3] = { "x:", "y:", "z:" };
+      FttComponent c;
+      for (c = 0; c < FTT_DIMENSION; c++)
+	if (!strcmp (fp->token->str, name[c]))
+	  break;
+      if (c == FTT_DIMENSION) {
+	gts_file_error (fp, "unknown keyword '%s'", fp->token->str);
+	return;
+      }
+      gts_file_next_token (fp);
+
+      GfsMapFunction * map = GFS_MAP_FUNCTION (*o);
+      if (!map->inverse[c])
+	map->inverse[c] = gfs_function_new (gfs_function_map_class (), 0.);
+      gfs_function_read (map->inverse[c], gfs_object_simulation (*o), fp);
+      if (fp->type == GTS_ERROR)
+	return;
+
+      if (fp->type != '\n') {
+	gts_file_error (fp, "expecting new line");
+	return;
+      }
+      while (fp->type == '\n')
+	gts_file_next_token (fp);
+	
+      if (!map->transform[c])
+	map->transform[c] = gfs_function_new (gfs_function_map_class (), 0.);
+      gfs_function_read (map->transform[c], gfs_object_simulation (*o), fp);
+      if (fp->type == GTS_ERROR)
+	return;
+    }
+  }
+  if (fp->type != '}') {
+    gts_file_error (fp, "expecting a closing brace");
+    return;
+  }
+  fp->scope_max--;
+  gts_file_next_token (fp);
+}
+
+static void gfs_map_function_write (GtsObject * o, FILE * fp)
+{
+  (* GTS_OBJECT_CLASS (gfs_map_function_class ())->parent_class->write) (o, fp);
+  fputs (" {\n", fp);
+  GfsMapFunction * map = GFS_MAP_FUNCTION (o);
+  static gchar name[3][5] = { "  x:", "  y:", "  z:" };
+  FttComponent c;
+  for (c = 0; c < FTT_DIMENSION; c++)
+    if (map->transform[c]) {
+      fputs (name[c], fp);
+      gfs_function_write (map->inverse[c], fp);
+      fputs ("\n    ", fp);
+      gfs_function_write (map->transform[c], fp);
+      fputc ('\n', fp);
+    }
+  fputc ('}', fp);
+}
+
+static void gfs_map_function_destroy (GtsObject * o)
+{
+  GfsMapFunction * map = GFS_MAP_FUNCTION (o);
+  FttComponent c;
+
+  for (c = 0; c < FTT_DIMENSION; c++) {
+    if (map->transform[c])
+      gts_object_destroy (GTS_OBJECT (map->transform[c]));
+    if (map->inverse[c])
+      gts_object_destroy (GTS_OBJECT (map->inverse[c]));
+  }
+
+  (* GTS_OBJECT_CLASS (gfs_map_function_class ())->parent_class->destroy) (o);
+}
+
+static void gfs_map_function_class_init (GfsMapClass * klass)
+{
+  GTS_OBJECT_CLASS (klass)->read = gfs_map_function_read;
+  GTS_OBJECT_CLASS (klass)->write = gfs_map_function_write;
+  GTS_OBJECT_CLASS (klass)->destroy = gfs_map_function_destroy;
+}
+
+static void map_function_transform (GfsMap * map, const FttVector * src, FttVector * dest)
+{
+  GfsMapFunction * mf = GFS_MAP_FUNCTION (map);
+  FttComponent c;
+  for (c = 0; c < FTT_DIMENSION; c++)
+    if (mf->transform[c])
+      (&dest->x)[c] = gfs_function_spatial_value (mf->transform[c], src);
+    else
+      (&dest->x)[c] = (&src->x)[c];
+}
+
+static void map_function_inverse (GfsMap * map, const FttVector * src, FttVector * dest)
+{
+  GfsMapFunction * mf = GFS_MAP_FUNCTION (map);
+  FttComponent c;
+  for (c = 0; c < FTT_DIMENSION; c++)
+    if (mf->inverse[c])
+      (&dest->x)[c] = gfs_function_spatial_value (mf->inverse[c], src);
+    else
+      (&dest->x)[c] = (&src->x)[c];
+}
+
+static void gfs_map_function_init (GfsMap * map)
+{
+  map->transform = map_function_transform;
+  map->inverse =   map_function_inverse;
+}
+
+GfsMapClass * gfs_map_function_class (void)
+{
+  static GfsMapClass * klass = NULL;
+
+  if (klass == NULL) {
+    GtsObjectClassInfo gfs_map_function_info = {
+      "GfsMapFunction",
+      sizeof (GfsMapFunction),
+      sizeof (GfsMapClass),
+      (GtsObjectClassInitFunc) gfs_map_function_class_init,
+      (GtsObjectInitFunc) gfs_map_function_init,
+      (GtsArgSetFunc) NULL,
+      (GtsArgGetFunc) NULL
+    };
+    klass = gts_object_class_new (GTS_OBJECT_CLASS (gfs_map_class ()), &gfs_map_function_info);
+  }
+
+  return klass;
+}
diff --git a/src/map.h b/src/map.h
index 2184b86..7d23d95 100644
--- a/src/map.h
+++ b/src/map.h
@@ -24,7 +24,8 @@
 extern "C" {
 #endif /* __cplusplus */
 
-#include "ftt.h"
+#include "variable.h"
+#include "utils.h"
 
 /* GfsMap: Header */
 
@@ -34,6 +35,8 @@ struct _GfsMap {
   /*< private >*/
   GtsSListContainee parent;
 
+  void (* transform) (GfsMap * map, const FttVector * src, FttVector * dest);
+  void (* inverse)   (GfsMap * map, const FttVector * src, FttVector * dest);
   /*< public >*/
 };
 
@@ -44,8 +47,6 @@ struct _GfsMapClass {
   GtsSListContaineeClass parent_class;
 
   /*< public >*/
-  void (* transform) (GfsMap * map, const FttVector * src, FttVector * dest);
-  void (* inverse)   (GfsMap * map, const FttVector * src, FttVector * dest);
 };
 
 #define GFS_MAP(obj)            GTS_OBJECT_CAST (obj,\
@@ -59,6 +60,26 @@ struct _GfsMapClass {
 
 GfsMapClass * gfs_map_class      (void);
 
+/* GfsMapFunction: Header */
+
+typedef struct _GfsMapFunction         GfsMapFunction;
+
+struct _GfsMapFunction {
+  /*< private >*/
+  GfsMap parent;
+
+  /*< public >*/
+  GfsFunction * transform[FTT_DIMENSION], * inverse[FTT_DIMENSION];
+};
+
+#define GFS_MAP_FUNCTION(obj)            GTS_OBJECT_CAST (obj,\
+					         GfsMapFunction,\
+					         gfs_map_function_class ())
+#define GFS_IS_MAP_FUNCTION(obj)         (gts_object_is_from_class (obj,\
+						 gfs_map_function_class ()))
+
+GfsMapClass * gfs_map_function_class      (void);
+
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */
diff --git a/src/simulation.c b/src/simulation.c
index 9f453df..0b5b80c 100644
--- a/src/simulation.c
+++ b/src/simulation.c
@@ -1651,8 +1651,7 @@ void gfs_simulation_map (GfsSimulation * sim, FttVector * p)
   
   GSList * i = sim->maps->items;
   while (i) {
-    GtsObject * o = i->data;
-    (* GFS_MAP_CLASS (o->klass)->transform) (i->data, p, p);
+    (* GFS_MAP (i->data)->transform) (i->data, p, p);
     i = i->next;
   }
   FttComponent c;
@@ -1678,8 +1677,7 @@ void gfs_simulation_map_inverse (GfsSimulation * sim, FttVector * p)
     (&p->x)[c] *= sim->physical_params.L/(&GFS_DOMAIN (sim)->lambda.x)[c];
   GSList * i = sim->maps->items;
   while (i) {
-    GtsObject * o = i->data;
-    (* GFS_MAP_CLASS (o->klass)->inverse) (i->data, p, p);
+    (* GFS_MAP (i->data)->inverse) (i->data, p, p);
     i = i->next;
   }
 }
diff --git a/src/utils.c b/src/utils.c
index 2860ead..ba9a698 100644
--- a/src/utils.c
+++ b/src/utils.c
@@ -198,7 +198,7 @@ struct _GfsFunction {
   GfsVariable * v;
   GfsDerivedVariable * dv;
   gdouble val;
-  gboolean spatial, constant;
+  gboolean spatial, constant, nomap;
   GtsFile fpd;
   gdouble units;
 };
@@ -1144,7 +1144,7 @@ GfsFunctionClass * gfs_function_spatial_class (void)
  *
  * Returns: the value of function @f at location @p.
  */
-gdouble gfs_function_spatial_value (GfsFunction * f, FttVector * p)
+gdouble gfs_function_spatial_value (GfsFunction * f, const FttVector * p)
 {
   g_return_val_if_fail (f != NULL, 0.);
   g_return_val_if_fail (GFS_IS_FUNCTION_SPATIAL (f), 0.);
@@ -1155,7 +1155,8 @@ gdouble gfs_function_spatial_value (GfsFunction * f, FttVector * p)
     GfsSimulation * sim = gfs_object_simulation (f);
     FttVector q = *p;
     check_for_deferred_compilation (f);
-    gfs_simulation_map_inverse (sim, &q);
+    if (!f->nomap)
+      gfs_simulation_map_inverse (sim, &q);
     dimensional = (* (GfsFunctionSpatialFunc) f->f) (q.x, q.y, q.z, sim->time.t);
   }
   else
@@ -1176,6 +1177,34 @@ GfsFunction * gfs_function_spatial_new (GfsFunctionClass * klass,
   return object;
 }
 
+/* GfsFunctionMap: object */
+
+static void gfs_function_map_init (GfsFunction * f)
+{
+  f->nomap = TRUE;
+}
+
+GfsFunctionClass * gfs_function_map_class (void)
+{
+  static GfsFunctionClass * klass = NULL;
+
+  if (klass == NULL) {
+    GtsObjectClassInfo gfs_function_info = {
+      "GfsFunctionMap",
+      sizeof (GfsFunction),
+      sizeof (GfsFunctionClass),
+      (GtsObjectClassInitFunc) NULL,
+      (GtsObjectInitFunc) gfs_function_map_init,
+      (GtsArgSetFunc) NULL,
+      (GtsArgGetFunc) NULL
+    };
+    klass = gts_object_class_new (GTS_OBJECT_CLASS (gfs_function_spatial_class ()),
+				  &gfs_function_info);
+  }
+
+  return klass;
+}
+
 /* GfsFunctionConstant: object */
 
 static void gfs_function_constant_init (GfsFunction * f)
diff --git a/src/utils.h b/src/utils.h
index 4f8b006..7f070ee 100644
--- a/src/utils.h
+++ b/src/utils.h
@@ -135,7 +135,14 @@ typedef gdouble (* GfsFunctionSpatialFunc)    (double x, double y, double z, dou
 GfsFunctionClass * gfs_function_spatial_class (void);
 GfsFunction *      gfs_function_spatial_new   (GfsFunctionClass * klass, 
 					       GfsFunctionSpatialFunc func);
-gdouble            gfs_function_spatial_value (GfsFunction * f, FttVector * p);
+gdouble            gfs_function_spatial_value (GfsFunction * f, const FttVector * p);
+
+/* GfsFunctionMap: Header */
+
+#define GFS_IS_FUNCTION_MAP(obj)         (gts_object_is_from_class (obj,\
+					      gfs_function_map_class ()))
+
+GfsFunctionClass * gfs_function_map_class (void);
 
 /* GfsFunctionConstant: Header */
 

-- 
Gerris Flow Solver



More information about the debian-science-commits mailing list