[SCM] Gerris Flow Solver branch, upstream, updated. b3aa46814a06c9cb2912790b23916ffb44f1f203
Stephane Popinet
popinet at users.sf.net
Fri May 15 02:53:01 UTC 2009
The following commit has been merged in the upstream branch:
commit 5f81db9bda7b821ef206d15339b7cbf85363d2a4
Author: Stephane Popinet <popinet at users.sf.net>
Date: Sat Jan 21 08:45:13 2006 +1100
Generic coarse_fine() method for GfsVariable
darcs-hash:20060120214513-d4795-e8913eb855a1b2830a5f4beac0b16933c4454960.gz
diff --git a/src/adaptive.c b/src/adaptive.c
index 7a685df..81d2c56 100644
--- a/src/adaptive.c
+++ b/src/adaptive.c
@@ -54,56 +54,31 @@ void gfs_cell_coarse_init (FttCell * cell, GfsDomain * domain)
/**
* gfs_cell_fine_init:
- * @cell: a #FttCell.
- * @domain: a #GfsDomain containing @cell.
+ * @parent: a #FttCell.
+ * @domain: a #GfsDomain containing @parent.
*
- * Initializes the variables of @cell using interpolation from its
- * parent cell.
- *
- * First-order interpolation (straight injection) is used for boundary
- * cells and second-order interpolation for the other cells.
+ * Initialises the children of @parent.
*/
-void gfs_cell_fine_init (FttCell * cell, GfsDomain * domain)
+void gfs_cell_fine_init (FttCell * parent, GfsDomain * domain)
{
- FttCell * parent;
GSList * i;
- g_return_if_fail (cell != NULL);
- g_return_if_fail (!FTT_CELL_IS_ROOT (cell));
+ g_return_if_fail (parent != NULL);
+ g_return_if_fail (!FTT_CELL_IS_LEAF (parent));
g_return_if_fail (domain != NULL);
- parent = ftt_cell_parent (cell);
/* refinement of mixed cell is not implemented (yet) */
g_assert (GFS_CELL_IS_BOUNDARY (parent) || GFS_IS_FLUID (parent));
- gfs_cell_init (cell, domain);
+ gfs_cell_init (parent, domain);
+
i = domain->variables;
while (i) {
GfsVariable * v = i->data;
-
- GFS_VARIABLE (cell, v->i) = GFS_VARIABLE (parent, v->i);
+
+ (* v->coarse_fine) (parent, v);
i = i->next;
}
-
- if (!GFS_CELL_IS_BOUNDARY (parent)) {
- FttVector p;
- FttComponent c;
-
- ftt_cell_relative_pos (cell, &p);
- i = domain->variables;
- while (i) {
- GfsVariable * v = i->data;
-
- for (c = 0; c < FTT_DIMENSION; c++)
- GFS_VARIABLE (cell, v->i) += (&p.x)[c]*
-#if 1
- gfs_center_van_leer_gradient (parent, c, v->i);
-#else
- gfs_center_gradient (parent, c, v->i);
-#endif
- i = i->next;
- }
- }
}
/* GfsAdapt: Object */
diff --git a/src/domain.c b/src/domain.c
index c2bf37f..fe4568a 100644
--- a/src/domain.c
+++ b/src/domain.c
@@ -2077,15 +2077,27 @@ gdouble gfs_domain_cfl (GfsDomain * domain,
* @cell: a #FttCell.
* @domain: a #GfsDomain containing @cell.
*
- * Allocates the memory for fluid state data associated to @cell.
+ * Allocates the memory for fluid state data associated to @cell or its children.
*/
void gfs_cell_init (FttCell * cell, GfsDomain * domain)
{
g_return_if_fail (cell != NULL);
- g_return_if_fail (cell->data == NULL);
g_return_if_fail (domain != NULL);
- cell->data = g_malloc0 (gfs_domain_variables_size (domain));
+ if (FTT_CELL_IS_LEAF (cell)) {
+ g_return_if_fail (cell->data == NULL);
+ cell->data = g_malloc0 (gfs_domain_variables_size (domain));
+ }
+ else {
+ FttCellChildren child;
+ guint n;
+
+ ftt_cell_children (cell, &child);
+ for (n = 0; n < FTT_CELLS; n++) {
+ g_return_if_fail (child.c[n]->data == NULL);
+ child.c[n]->data = g_malloc0 (gfs_domain_variables_size (domain));
+ }
+ }
}
/**
diff --git a/src/event.c b/src/event.c
index 9973f0d..d9d9e3d 100644
--- a/src/event.c
+++ b/src/event.c
@@ -1321,6 +1321,7 @@ static void gfs_event_stop_read (GtsObject ** o, GtsFile * fp)
s->max = atof (fp->token->str);
s->oldv = gfs_temporary_variable (domain);
s->oldv->fine_coarse = s->v->fine_coarse;
+ s->oldv->coarse_fine = s->v->coarse_fine;
if (fp->next_token != '\n') {
gts_file_next_token (fp);
@@ -1334,6 +1335,7 @@ static void gfs_event_stop_read (GtsObject ** o, GtsFile * fp)
return;
}
s->diff->fine_coarse = s->v->fine_coarse;
+ s->diff->coarse_fine = s->v->coarse_fine;
}
gts_file_next_token (fp);
}
diff --git a/src/fluid.c b/src/fluid.c
index febca19..9980812 100644
--- a/src/fluid.c
+++ b/src/fluid.c
@@ -1406,6 +1406,46 @@ void gfs_get_from_below_extensive (FttCell * cell, const GfsVariable * v)
}
/**
+ * gfs_cell_coarse_fine:
+ * @parent: a #FttCell.
+ * @v: a #GfsVariable.
+ *
+ * Initializes @v on the children of @parent using interpolation.
+ *
+ * First-order interpolation (straight injection) is used for boundary
+ * cells and second-order interpolation for the other cells.
+ */
+void gfs_cell_coarse_fine (FttCell * parent, GfsVariable * v)
+{
+ FttCellChildren child;
+ guint n;
+
+ g_return_if_fail (parent != NULL);
+ g_return_if_fail (!FTT_CELL_IS_LEAF (parent));
+ g_return_if_fail (v != NULL);
+
+ ftt_cell_children (parent, &child);
+ for (n = 0; n < FTT_CELLS; n++)
+ GFS_VARIABLE (child.c[n], v->i) = GFS_VARIABLE (parent, v->i);
+
+ if (!GFS_CELL_IS_BOUNDARY (parent)) {
+ FttVector g;
+ FttComponent c;
+
+ for (c = 0; c < FTT_DIMENSION; c++)
+ (&g.x)[c] = gfs_center_van_leer_gradient (parent, c, v->i);
+
+ for (n = 0; n < FTT_CELLS; n++) {
+ FttVector p;
+
+ ftt_cell_relative_pos (child.c[n], &p);
+ for (c = 0; c < FTT_DIMENSION; c++)
+ GFS_VARIABLE (child.c[n], v->i) += (&p.x)[c]*(&g.x)[c];
+ }
+ }
+}
+
+/**
* gfs_cell_cleanup:
* @cell: a #FttCell.
*
diff --git a/src/fluid.h b/src/fluid.h
index 13d1356..556d29b 100644
--- a/src/fluid.h
+++ b/src/fluid.h
@@ -95,6 +95,8 @@ void gfs_get_from_below_intensive (FttCell * cell,
const GfsVariable * v);
void gfs_get_from_below_extensive (FttCell * cell,
const GfsVariable * v);
+void gfs_cell_coarse_fine (FttCell * cell,
+ GfsVariable * v);
gdouble gfs_face_interpolated_value (const FttCellFace * face,
guint v);
typedef gdouble (* GfsCenterGradient) (FttCell * cell,
diff --git a/src/ftt.c b/src/ftt.c
index 916af1f..e9ce217 100644
--- a/src/ftt.c
+++ b/src/ftt.c
@@ -516,8 +516,7 @@ static void oct_new (FttCell * parent,
parent->children = oct;
if (init)
- for (n = 0; n < FTT_CELLS; n++)
- (* init) (&(oct->cell[n]), data);
+ (* init) (parent, data);
}
/**
diff --git a/src/variable.c b/src/variable.c
index 9f826f1..95d8b87 100644
--- a/src/variable.c
+++ b/src/variable.c
@@ -95,6 +95,7 @@ static void gfs_variable_init (GfsVariable * v)
v->centered = FALSE;
v->component = FTT_DIMENSION;
v->fine_coarse = (GfsVariableFineCoarseFunc) gfs_get_from_below_intensive;
+ v->coarse_fine = (GfsVariableFineCoarseFunc) gfs_cell_coarse_fine;
}
GfsVariableClass * gfs_variable_class (void)
diff --git a/src/variable.h b/src/variable.h
index 46f102c..338df7c 100644
--- a/src/variable.h
+++ b/src/variable.h
@@ -42,7 +42,7 @@ struct _GfsVariable {
FttComponent component;
gchar * name;
gboolean centered;
- GfsVariableFineCoarseFunc fine_coarse;
+ GfsVariableFineCoarseFunc fine_coarse, coarse_fine;
GtsContainer * sources;
GfsSurfaceGenericBc * surface_bc;
GfsDomain * domain;
--
Gerris Flow Solver
More information about the debian-science-commits
mailing list