[SCM] Gerris Flow Solver branch, upstream, updated. b3aa46814a06c9cb2912790b23916ffb44f1f203
Stephane Popinet
s.popinet at niwa.co.nz
Fri May 15 02:52:13 UTC 2009
The following commit has been merged in the upstream branch:
commit 1e8d9463808d8403ec92b82a193c987bc60f7cd4
Author: Stephane Popinet <s.popinet at niwa.co.nz>
Date: Mon Feb 14 15:33:44 2005 +1100
New GfsEventFilter class
Uses averages of corner values as a filter. This is very efficient to filter
out grid-scale oscillations of crappy schemes...
darcs-hash:20050214043344-fbd8f-121006c8f4395cd1c16d94e585498a8bd2bfb17b.gz
diff --git a/src/event.c b/src/event.c
index 70c9494..51c7c4e 100644
--- a/src/event.c
+++ b/src/event.c
@@ -1791,3 +1791,104 @@ GfsEventClass * gfs_remove_ponds_class (void)
return klass;
}
+
+/* GfsEventFilter: Object */
+
+static void filter (FttCell * cell, GfsVariable * v)
+{
+ FttDirection d[4*(FTT_DIMENSION - 1)][FTT_DIMENSION] = {
+#if FTT_2D
+ {FTT_RIGHT, FTT_TOP}, {FTT_RIGHT, FTT_BOTTOM}, {FTT_LEFT, FTT_TOP}, {FTT_LEFT, FTT_BOTTOM}
+#else
+ {FTT_RIGHT, FTT_TOP, FTT_FRONT}, {FTT_RIGHT, FTT_BOTTOM, FTT_FRONT},
+ {FTT_LEFT, FTT_TOP, FTT_FRONT}, {FTT_LEFT, FTT_BOTTOM, FTT_FRONT},
+ {FTT_RIGHT, FTT_TOP, FTT_BACK}, {FTT_RIGHT, FTT_BOTTOM, FTT_BACK},
+ {FTT_LEFT, FTT_TOP, FTT_BACK}, {FTT_LEFT, FTT_BOTTOM, FTT_BACK}
+#endif
+ };
+ guint i;
+ gdouble val = 0.;
+
+ for (i = 0; i < 4*(FTT_DIMENSION - 1); i++)
+ val += gfs_cell_corner_value (cell, d[i], v, -1);
+ GFS_STATE (cell)->div = val/(4*(FTT_DIMENSION - 1));
+}
+
+static void filtered (FttCell * cell, GfsVariable * v)
+{
+ GFS_VARIABLE (cell, v->i) = GFS_STATE (cell)->div;
+}
+
+static gboolean gfs_event_filter_event (GfsEvent * event, GfsSimulation * sim)
+{
+ if ((* GFS_EVENT_CLASS (GTS_OBJECT_CLASS (gfs_event_filter_class ())->parent_class)->event)
+ (event, sim)) {
+ gfs_domain_cell_traverse (GFS_DOMAIN (sim), FTT_PRE_ORDER, FTT_TRAVERSE_LEAFS, -1,
+ (FttCellTraverseFunc) filter, GFS_EVENT_FILTER (event)->v);
+ gfs_domain_cell_traverse (GFS_DOMAIN (sim), FTT_PRE_ORDER, FTT_TRAVERSE_LEAFS, -1,
+ (FttCellTraverseFunc) filtered, GFS_EVENT_FILTER (event)->v);
+ gfs_domain_bc (GFS_DOMAIN (sim), FTT_TRAVERSE_LEAFS, -1, GFS_EVENT_FILTER (event)->v);
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void gfs_event_filter_read (GtsObject ** o, GtsFile * fp)
+{
+ GfsDomain * domain;
+
+ if (GTS_OBJECT_CLASS (gfs_event_filter_class ())->parent_class->read)
+ (* GTS_OBJECT_CLASS (gfs_event_filter_class ())->parent_class->read)
+ (o, fp);
+ if (fp->type == GTS_ERROR)
+ return;
+
+ if (fp->type != GTS_STRING) {
+ gts_file_error (fp, "expecting a string (variable)");
+ return;
+ }
+ domain = GFS_DOMAIN (gfs_object_simulation (*o));
+ if ((GFS_EVENT_FILTER (*o)->v = gfs_variable_from_name (domain->variables, fp->token->str))
+ == NULL) {
+ gts_file_error (fp, "unknown variable `%s'", fp->token->str);
+ return;
+ }
+ gts_file_next_token (fp);
+}
+
+static void gfs_event_filter_write (GtsObject * o, FILE * fp)
+{
+ if (GTS_OBJECT_CLASS (gfs_event_filter_class ())->parent_class->write)
+ (* GTS_OBJECT_CLASS (gfs_event_filter_class ())->parent_class->write)
+ (o, fp);
+ fprintf (fp, " %s", GFS_EVENT_FILTER (o)->v->name);
+}
+
+static void gfs_event_filter_class_init (GfsEventClass * klass)
+{
+ GFS_EVENT_CLASS (klass)->event = gfs_event_filter_event;
+ GTS_OBJECT_CLASS (klass)->read = gfs_event_filter_read;
+ GTS_OBJECT_CLASS (klass)->write = gfs_event_filter_write;
+}
+
+GfsEventClass * gfs_event_filter_class (void)
+{
+ static GfsEventClass * klass = NULL;
+
+ if (klass == NULL) {
+ GtsObjectClassInfo gfs_event_filter_info = {
+ "GfsEventFilter",
+ sizeof (GfsEventFilter),
+ sizeof (GfsEventClass),
+ (GtsObjectClassInitFunc) gfs_event_filter_class_init,
+ (GtsObjectInitFunc) NULL,
+ (GtsArgSetFunc) NULL,
+ (GtsArgGetFunc) NULL
+ };
+ klass = gts_object_class_new (GTS_OBJECT_CLASS (gfs_event_class ()),
+ &gfs_event_filter_info);
+ }
+
+ return klass;
+}
+
diff --git a/src/event.h b/src/event.h
index f5a635d..a4515de 100644
--- a/src/event.h
+++ b/src/event.h
@@ -298,6 +298,26 @@ struct _GfsRemovePonds {
GfsEventClass * gfs_remove_ponds_class (void);
+/* GfsEventFilter: Header */
+
+typedef struct _GfsEventFilter GfsEventFilter;
+
+struct _GfsEventFilter {
+ /*< private >*/
+ GfsEvent parent;
+
+ /*< public >*/
+ GfsVariable * v;
+};
+
+#define GFS_EVENT_FILTER(obj) GTS_OBJECT_CAST (obj,\
+ GfsEventFilter,\
+ gfs_event_filter_class ())
+#define GFS_IS_EVENT_FILTER(obj) (gts_object_is_from_class (obj,\
+ gfs_event_filter_class ()))
+
+GfsEventClass * gfs_event_filter_class (void);
+
#ifdef __cplusplus
}
#endif /* __cplusplus */
--
Gerris Flow Solver
More information about the debian-science-commits
mailing list