[SCM] Gerris Flow Solver branch, upstream, updated. b3aa46814a06c9cb2912790b23916ffb44f1f203
Stephane Popinet
popinet at users.sf.net
Fri May 15 02:53:55 UTC 2009
The following commit has been merged in the upstream branch:
commit a12c4d894ad99784ad6b8880851d4fc688039ae1
Author: Stephane Popinet <popinet at users.sf.net>
Date: Mon Aug 14 09:55:46 2006 +1000
New function gfs_domain_filter()
darcs-hash:20060813235546-d4795-d14cd12416acb83ed84eebad272760bf05251b02.gz
diff --git a/src/domain.c b/src/domain.c
index d43c9d5..d13b3fa 100644
--- a/src/domain.c
+++ b/src/domain.c
@@ -3250,3 +3250,55 @@ void gfs_domain_sum (GfsDomain * domain, FttDirection d, GfsFunction * f, GfsVar
gfs_domain_cell_traverse (domain, FTT_PRE_ORDER, FTT_TRAVERSE_LEAFS, -1,
(FttCellTraverseFunc) sum, &data);
}
+
+static void filter (FttCell * cell, gpointer * data)
+{
+ 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.;
+ GfsVariable * a = data[0];
+ GfsVariable * b = data[1];
+
+ for (i = 0; i < 4*(FTT_DIMENSION - 1); i++)
+ val += gfs_cell_corner_value (cell, d[i], a, -1);
+ GFS_VARIABLE (cell, b->i) = val/(4*(FTT_DIMENSION - 1));
+}
+
+/**
+ * gfs_domain_filter:
+ * @domain: a #GfsDomain.
+ * @v: a #GfsVariable.
+ * @fv: the filtered variable or %NULL.
+ *
+ * Apply a "corner-averaging" filter to variable @v on all leaf cells
+ * of @domain.
+ *
+ * If @fv is %NULL, @v is replaced by its filtered value.
+ */
+void gfs_domain_filter (GfsDomain * domain, GfsVariable * v, GfsVariable * fv)
+{
+ g_return_if_fail (domain != NULL);
+ g_return_if_fail (v != NULL);
+
+ gpointer data[2];
+ data[0] = v;
+ data[1] = fv ? fv : gfs_temporary_variable (domain);
+ gfs_domain_cell_traverse (domain, FTT_PRE_ORDER, FTT_TRAVERSE_LEAFS, -1,
+ (FttCellTraverseFunc) filter, data);
+ if (fv == NULL) {
+ gfs_variables_swap (data[0], data[1]);
+ gts_object_destroy (data[1]);
+ gfs_domain_bc (domain, FTT_TRAVERSE_LEAFS, -1, v);
+ }
+ else
+ gfs_domain_copy_bc (domain, FTT_TRAVERSE_LEAFS, -1, v, fv);
+}
diff --git a/src/domain.h b/src/domain.h
index 5484803..a432d72 100644
--- a/src/domain.h
+++ b/src/domain.h
@@ -275,6 +275,9 @@ void gfs_domain_sum (GfsDomain * domain,
FttDirection d,
GfsFunction * f,
GfsVariable * v);
+void gfs_domain_filter (GfsDomain * domain,
+ GfsVariable * v,
+ GfsVariable * fv);
#ifdef __cplusplus
}
diff --git a/src/variable.c b/src/variable.c
index 3e0a5bd..c42b403 100644
--- a/src/variable.c
+++ b/src/variable.c
@@ -366,10 +366,6 @@ static void variable_filtered_read (GtsObject ** o, GtsFile * fp)
return;
}
v->niter = atoi (fp->token->str);
- if (v->niter <= 0) {
- gts_file_error (fp, "'niter' must be larger than zero");
- return;
- }
gts_file_next_token (fp);
if (GFS_VARIABLE1 (v)->description)
@@ -384,49 +380,12 @@ static void variable_filtered_write (GtsObject * o, FILE * fp)
fprintf (fp, " %s %d", GFS_VARIABLE_FILTERED (o)->v->name, GFS_VARIABLE_FILTERED (o)->niter);
}
-static void filter (FttCell * cell, gpointer * data)
-{
- 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.;
- GfsVariable * a = data[0];
- GfsVariable * b = data[1];
-
- for (i = 0; i < 4*(FTT_DIMENSION - 1); i++)
- val += gfs_cell_corner_value (cell, d[i], a, -1);
- GFS_VARIABLE (cell, b->i) = val/(4*(FTT_DIMENSION - 1));
-}
-
static void variable_filtered_event_half (GfsEvent * event, GfsSimulation * sim)
{
- guint n, niter = GFS_VARIABLE_FILTERED (event)->niter - 1;
- gpointer data[2];
-
- data[0] = GFS_VARIABLE_FILTERED (event)->v;
- data[1] = event;
- gfs_domain_cell_traverse (GFS_DOMAIN (sim), FTT_PRE_ORDER, FTT_TRAVERSE_LEAFS, -1,
- (FttCellTraverseFunc) filter, data);
- gfs_domain_copy_bc (GFS_DOMAIN (sim), FTT_TRAVERSE_LEAFS, -1, data[0], data[1]);
- if (niter > 0) {
- data[0] = event;
- data[1] = gfs_temporary_variable (GFS_DOMAIN (sim));
- for (n = 0; n < niter; n++) {
- gfs_domain_cell_traverse (GFS_DOMAIN (sim), FTT_PRE_ORDER, FTT_TRAVERSE_LEAFS, -1,
- (FttCellTraverseFunc) filter, data);
- gfs_domain_copy_bc (GFS_DOMAIN (sim), FTT_TRAVERSE_LEAFS, -1, data[0], data[1]);
- gfs_variables_swap (data[0], data[1]);
- }
- gts_object_destroy (data[1]);
- }
+ guint n = GFS_VARIABLE_FILTERED (event)->niter;
+
+ while (n--)
+ gfs_domain_filter (GFS_DOMAIN (sim), GFS_VARIABLE_FILTERED (event)->v, GFS_VARIABLE1 (event));
}
static gboolean variable_filtered_event (GfsEvent * event, GfsSimulation * sim)
--
Gerris Flow Solver
More information about the debian-science-commits
mailing list