[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] = ℴ
+ 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