[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