[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