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

Stephane Popinet s.popinet at niwa.co.nz
Fri May 15 02:52:39 UTC 2009


The following commit has been merged in the upstream branch:
commit 7649e545781b0a568de9b1a41f924b2d7d5c458a
Author: Stephane Popinet <s.popinet at niwa.co.nz>
Date:   Tue Sep 20 15:48:29 2005 +1000

    New function gfs_cell_traverse_cut_2D
    
    darcs-hash:20050920054829-fbd8f-efa9f520f155c0c4627252bbc262694f0871fd26.gz

diff --git a/src/domain.c b/src/domain.c
index 3b2cd19..2c96494 100644
--- a/src/domain.c
+++ b/src/domain.c
@@ -952,6 +952,53 @@ void gfs_domain_traverse_cut (GfsDomain * domain,
   gts_container_foreach (GTS_CONTAINER (domain), (GtsFunc) traverse_cut, datum);
 }
 
+static void traverse_cut_2D (GfsBox * box, gpointer * datum)
+{
+  FttCellTraverseCutFunc func = (FttCellTraverseCutFunc) datum[0];
+  gpointer data = datum[1];
+  FttTraverseType * order = datum[2];
+  FttTraverseFlags * flags = datum[3];
+  GtsSurface * s = datum[4];
+
+  gfs_cell_traverse_cut_2D (box->root, s, *order, *flags, func, data);
+}
+
+/**
+ * gfs_domain_traverse_cut_2D:
+ * @domain: a #GfsDomain.
+ * @s: a #GtsSurface.
+ * @order: the order in which the cells are visited - %FTT_PRE_ORDER,
+ * %FTT_POST_ORDER. 
+ * @flags: which types of children are to be visited.
+ * @func: the function to call for each visited #FttCell.
+ * @data: user data to pass to @func.
+ *
+ * Calls @func for each cell of @domain cut by @s.
+ *
+ * The cells are flattened in the z-direction.
+ */
+void gfs_domain_traverse_cut_2D (GfsDomain * domain,
+				 GtsSurface * s,
+				 FttTraverseType order,
+				 FttTraverseFlags flags,
+				 FttCellTraverseCutFunc func,
+				 gpointer data)
+{
+  gpointer datum[5];
+
+  datum[0] = func;
+  datum[1] = data;
+  datum[2] = &order;
+  datum[3] = &flags;
+  datum[4] = s;
+
+  g_return_if_fail (domain != NULL);
+  g_return_if_fail (s != NULL);
+  g_return_if_fail (func != NULL);
+
+  gts_container_foreach (GTS_CONTAINER (domain), (GtsFunc) traverse_cut_2D, datum);
+}
+
 static void box_depth (GfsBox * box, guint * depth)
 {
   guint d = ftt_cell_depth (box->root);
diff --git a/src/domain.h b/src/domain.h
index 8003d6e..31919d9 100644
--- a/src/domain.h
+++ b/src/domain.h
@@ -124,6 +124,12 @@ void         gfs_domain_traverse_cut          (GfsDomain * domain,
 					       FttTraverseFlags flags,
 					       FttCellTraverseCutFunc func,
 					       gpointer data);
+void         gfs_domain_traverse_cut_2D       (GfsDomain * domain,
+					       GtsSurface * s,
+					       FttTraverseType order,
+					       FttTraverseFlags flags,
+					       FttCellTraverseCutFunc func,
+					       gpointer data);
 void         gfs_domain_face_traverse         (GfsDomain * domain,
 					       FttComponent c,
 					       FttTraverseType order,
diff --git a/src/fluid.c b/src/fluid.c
index efa30fb..443d884 100644
--- a/src/fluid.c
+++ b/src/fluid.c
@@ -1820,11 +1820,12 @@ static void face_overlaps_box (GtsTriangle * t, gpointer * data)
  * gfs_cell_is_cut:
  * @cell: a #FttCell.
  * @s: a #GtsSurface.
+ * @flatten: if set to %TRUE, @cell is flattened in the z direction.
  *
  * Returns: a new #GtsSurface containing the faces of @s which may
  * intersect @cell or %NULL if no faces of @s intersects @cell.
  */
-GtsSurface * gfs_cell_is_cut (FttCell * cell, GtsSurface * s)
+GtsSurface * gfs_cell_is_cut (FttCell * cell, GtsSurface * s, gboolean flatten)
 {
   GtsSurface * s1 = NULL;
   gpointer data[2];
@@ -1834,6 +1835,8 @@ GtsSurface * gfs_cell_is_cut (FttCell * cell, GtsSurface * s)
   g_return_val_if_fail (s != NULL, NULL);
 
   ftt_cell_bbox (cell, &bb);
+  if (flatten)
+    bb.z1 = bb.z2 = 0.;
   data[0] = &bb;
   data[1] = &s1;
   gts_surface_foreach_face (s, (GtsFunc) face_overlaps_box, data);
@@ -1845,9 +1848,10 @@ static void cell_traverse_cut (FttCell * cell,
 			       FttTraverseType order,
 			       FttTraverseFlags flags,
 			       FttCellTraverseCutFunc func,
-			       gpointer data)
+			       gpointer data,
+			       gboolean flatten)
 {
-  GtsSurface * s1 = gfs_cell_is_cut (cell, s);
+  GtsSurface * s1 = gfs_cell_is_cut (cell, s, flatten);
 
   if (s1 == NULL)
     return;
@@ -1864,7 +1868,7 @@ static void cell_traverse_cut (FttCell * cell,
       FttCell * c = &(children->cell[n]);
 
       if (!FTT_CELL_IS_DESTROYED (c))
-	cell_traverse_cut (c, s1, order, flags, func, data);
+	cell_traverse_cut (c, s1, order, flags, func, data, flatten);
     }
   }
   if (order == FTT_POST_ORDER &&
@@ -1899,7 +1903,36 @@ void gfs_cell_traverse_cut (FttCell * root,
   g_return_if_fail (s != NULL);
   g_return_if_fail (func != NULL);
 
-  cell_traverse_cut (root, s, order, flags, func, data);
+  cell_traverse_cut (root, s, order, flags, func, data, FALSE);
+}
+
+/**
+ * gfs_cell_traverse_cut_2D:
+ * @root: the root #FttCell of the tree to traverse.
+ * @s: a #GtsSurface.
+ * @order: the order in which the cells are visited - %FTT_PRE_ORDER,
+ * %FTT_POST_ORDER. 
+ * @flags: which types of children are to be visited.
+ * @func: the function to call for each visited #FttCell.
+ * @data: user data to pass to @func.
+ * 
+ * Traverses a cell tree starting at the given root #FttCell. Calls
+ * the given function for each cell cut by @s.
+ *
+ * The cells are "flattened" in the z-direction.
+ */
+void gfs_cell_traverse_cut_2D (FttCell * root,
+			       GtsSurface * s,
+			       FttTraverseType order,
+			       FttTraverseFlags flags,
+			       FttCellTraverseCutFunc func,
+			       gpointer data)
+{
+  g_return_if_fail (root != NULL);
+  g_return_if_fail (s != NULL);
+  g_return_if_fail (func != NULL);
+
+  cell_traverse_cut (root, s, order, flags, func, data, TRUE);
 }
 
 /**
diff --git a/src/fluid.h b/src/fluid.h
index 25fc1a8..3530785 100644
--- a/src/fluid.h
+++ b/src/fluid.h
@@ -193,7 +193,8 @@ void                  gfs_cell_traverse_mixed       (FttCell * root,
 						     FttCellTraverseFunc func,
 						     gpointer data);
 GtsSurface *          gfs_cell_is_cut               (FttCell * cell,
-						     GtsSurface * s);
+						     GtsSurface * s,
+						     gboolean flatten);
 typedef void       (* FttCellTraverseCutFunc)       (FttCell * cell,
 						     GtsSurface * s,
 						     gpointer data);
@@ -203,6 +204,12 @@ void                  gfs_cell_traverse_cut         (FttCell * root,
 						     FttTraverseFlags flags,
 						     FttCellTraverseCutFunc func,
 						     gpointer data);
+void                  gfs_cell_traverse_cut_2D      (FttCell * root,
+						     GtsSurface * s,
+						     FttTraverseType order,
+						     FttTraverseFlags flags,
+						     FttCellTraverseCutFunc func,
+						     gpointer data);
 gdouble               gfs_interpolate               (FttCell * cell,
 						     FttVector p,
 						     GfsVariable * v);

-- 
Gerris Flow Solver



More information about the debian-science-commits mailing list