[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