[SCM] Gerris Flow Solver branch, upstream, updated. b3aa46814a06c9cb2912790b23916ffb44f1f203
Stephane Popinet
popinet at users.sf.net
Fri May 15 02:53:48 UTC 2009
The following commit has been merged in the upstream branch:
commit 9d9fb275c03c13ddba3f73cc195635948e0bbd98
Author: Stephane Popinet <popinet at users.sf.net>
Date: Tue Nov 28 10:24:16 2006 +1100
Generic boundary conditions cannot be applied for VOF fractions
A special case treatment has been added for symmetry and Dirichlet conditions.
darcs-hash:20061127232416-d4795-6467a16c12e5a3a1d51aeb641de1a519534c4f25.gz
diff --git a/src/boundary.c b/src/boundary.c
index 12fce5c..6122d81 100644
--- a/src/boundary.c
+++ b/src/boundary.c
@@ -53,6 +53,11 @@ static void face_symmetry (FttCellFace * f, GfsBc * b)
GFS_STATE (f->neighbor)->f[FTT_OPPOSITE_DIRECTION (f->d)].v;
}
+static void face_symmetry_vof (FttCellFace * f, GfsBc * b)
+{
+ GFS_STATE (f->cell)->f[f->d].v = GFS_VARIABLE (f->neighbor, b->v->i);
+}
+
static void bc_write (GtsObject * o, FILE * fp)
{
g_assert (GFS_BC (o)->v);
@@ -81,6 +86,9 @@ static void bc_read (GtsObject ** o, GtsFile * fp)
gts_file_error (fp, "unknown variable `%s'", fp->token->str);
else
gts_file_next_token (fp);
+
+ if (GFS_IS_VARIABLE_TRACER (bc->v) && GFS_VARIABLE_TRACER (bc->v)->advection.scheme == GFS_VOF)
+ bc->face_bc = (FttFaceTraverseFunc) face_symmetry_vof;
}
static void gfs_bc_class_init (GtsObjectClass * klass)
@@ -215,6 +223,11 @@ static void dirichlet (FttCellFace * f, GfsBc * b)
- GFS_VARIABLE (f->neighbor, b->v->i);
}
+static void dirichlet_vof (FttCellFace * f, GfsBc * b)
+{
+ GFS_VARIABLE (f->cell, b->v->i) = gfs_function_face_value (GFS_BC_VALUE (b)->val, f);
+}
+
static void homogeneous_dirichlet (FttCellFace * f, GfsBc * b)
{
GFS_VARIABLE (f->cell, b->v->i) = - GFS_VARIABLE (f->neighbor, b->v->i);
@@ -226,6 +239,19 @@ static void face_dirichlet (FttCellFace * f, GfsBc * b)
gfs_function_face_value (GFS_BC_VALUE (b)->val, f);
}
+static void bc_dirichlet_read (GtsObject ** o, GtsFile * fp)
+{
+ GfsBc * bc = GFS_BC (*o);
+
+ if (GTS_OBJECT_CLASS (gfs_bc_dirichlet_class ())->parent_class->read)
+ (* GTS_OBJECT_CLASS (gfs_bc_dirichlet_class ())->parent_class->read) (o, fp);
+ if (fp->type == GTS_ERROR)
+ return;
+
+ if (GFS_IS_VARIABLE_TRACER (bc->v) && GFS_VARIABLE_TRACER (bc->v)->advection.scheme == GFS_VOF)
+ bc->bc = (FttFaceTraverseFunc) dirichlet_vof;
+}
+
static void gfs_bc_dirichlet_init (GfsBc * object)
{
object->bc = (FttFaceTraverseFunc) dirichlet;
@@ -233,6 +259,11 @@ static void gfs_bc_dirichlet_init (GfsBc * object)
object->face_bc = (FttFaceTraverseFunc) face_dirichlet;
}
+static void gfs_bc_dirichlet_class_init (GtsObjectClass * klass)
+{
+ klass->read = bc_dirichlet_read;
+}
+
GfsBcClass * gfs_bc_dirichlet_class (void)
{
static GfsBcClass * klass = NULL;
@@ -242,7 +273,7 @@ GfsBcClass * gfs_bc_dirichlet_class (void)
"GfsBcDirichlet",
sizeof (GfsBcValue),
sizeof (GfsBcClass),
- (GtsObjectClassInitFunc) NULL,
+ (GtsObjectClassInitFunc) gfs_bc_dirichlet_class_init,
(GtsObjectInitFunc) gfs_bc_dirichlet_init,
(GtsArgSetFunc) NULL,
(GtsArgGetFunc) NULL
diff --git a/src/vof.c b/src/vof.c
index 5384978..f84b290 100644
--- a/src/vof.c
+++ b/src/vof.c
@@ -555,6 +555,8 @@ static gdouble fine_fraction (FttCellFace * face, VofParms * p, gdouble un)
gdouble f = GFS_VARIABLE (face->cell, p->par->v->i);
if (f == 0. || f == 1.)
return f;
+ else if (GFS_CELL_IS_BOUNDARY (face->cell))
+ return GFS_STATE (face->cell)->f[face->d].v;
else {
FttComponent c;
FttVector m;
@@ -677,12 +679,7 @@ void gfs_tracer_vof_advection (GfsDomain * domain,
gfs_domain_cell_traverse (domain, FTT_PRE_ORDER, FTT_TRAVERSE_LEAFS, -1,
(FttCellTraverseFunc) vof_plane, &p);
- /* fixme: this does not work for all types of boundary conditions */
- FttComponent i;
- for (i = 0; i < FTT_DIMENSION; i++)
- gfs_domain_bc (domain, FTT_TRAVERSE_LEAFS, -1, p.m[i]);
- gfs_domain_bc (domain, FTT_TRAVERSE_LEAFS, -1, p.alpha);
-
+ gfs_domain_face_bc (domain, c, par->v);
gfs_domain_cell_traverse (domain, FTT_PRE_ORDER, FTT_TRAVERSE_LEAFS, -1,
(FttCellTraverseFunc) gfs_cell_reset, par->fv);
gfs_domain_face_traverse (domain, p.c,
--
Gerris Flow Solver
More information about the debian-science-commits
mailing list