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

Stephane Popinet popinet at users.sf.net
Fri May 15 02:52:41 UTC 2009


The following commit has been merged in the upstream branch:
commit f1f525602bb897645a12528633cb1dcd28ee1a81
Author: Stephane Popinet <popinet at users.sf.net>
Date:   Mon Sep 26 19:15:20 2005 +1000

    New GfsVariableFiltered class
    
    darcs-hash:20050926091520-d4795-56f72c9de90b68a030df2eb82bb1f852a7019e3f.gz

diff --git a/src/init.c b/src/init.c
index 1436dc7..c492d8e 100644
--- a/src/init.c
+++ b/src/init.c
@@ -143,6 +143,7 @@ void gfs_init (int * argc, char *** argv)
   gfs_variable_class ();
     gfs_variable_tracer_class ();
     gfs_variable_residual_class ();
+    gfs_variable_filtered_class ();
 
   gfs_surface_bc_class ();
 
diff --git a/src/variable.c b/src/variable.c
index 566fdb0..3e94833 100644
--- a/src/variable.c
+++ b/src/variable.c
@@ -307,3 +307,124 @@ GfsVariableClass * gfs_variable_residual_class (void)
 
   return klass;
 }
+
+/* GfsVariableFiltered: object */
+
+static void variable_filtered_read (GtsObject ** o, GtsFile * fp)
+{
+  GfsDomain * domain;
+
+  (* GTS_OBJECT_CLASS (gfs_variable_filtered_class ())->parent_class->read) (o, fp);
+  if (fp->type == GTS_ERROR)
+    return;
+
+  if (fp->type != GTS_STRING) {
+    gts_file_error (fp, "expecting a string (v)");
+    return;
+  }
+  domain = GFS_DOMAIN (gfs_object_simulation (*o));
+  if (!(GFS_VARIABLE_FILTERED (*o)->v = 
+	gfs_variable_from_name (domain->variables, fp->token->str))) {
+    gts_file_error (fp, "unknown variable `%s'", fp->token->str);
+    return;
+  }
+  gts_file_next_token (fp);
+
+  if (fp->type != GTS_INT) {
+    gts_file_error (fp, "expecting a number (niter)");
+    return;
+  }
+  GFS_VARIABLE_FILTERED (*o)->niter = atoi (fp->token->str);
+  gts_file_next_token (fp);
+}
+
+static void variable_filtered_write (GtsObject * o, FILE * fp)
+{
+  (* GTS_OBJECT_CLASS (gfs_variable_filtered_class ())->parent_class->write) (o, fp);
+
+  fprintf (fp, " %s %d", GFS_VARIABLE_FILTERED (o)->v->name, GFS_VARIABLE_FILTERED (o)->niter);
+}
+
+static void filter (FttCell * cell, gpointer * data)
+{
+  FttDirection d[4*(FTT_DIMENSION - 1)][FTT_DIMENSION] = {
+#if FTT_2D
+    {FTT_RIGHT, FTT_TOP}, {FTT_RIGHT, FTT_BOTTOM}, {FTT_LEFT, FTT_TOP}, {FTT_LEFT, FTT_BOTTOM}
+#else
+    {FTT_RIGHT, FTT_TOP, FTT_FRONT}, {FTT_RIGHT, FTT_BOTTOM, FTT_FRONT}, 
+    {FTT_LEFT, FTT_TOP, FTT_FRONT}, {FTT_LEFT, FTT_BOTTOM, FTT_FRONT},
+    {FTT_RIGHT, FTT_TOP, FTT_BACK}, {FTT_RIGHT, FTT_BOTTOM, FTT_BACK}, 
+    {FTT_LEFT, FTT_TOP, FTT_BACK}, {FTT_LEFT, FTT_BOTTOM, FTT_BACK}
+#endif
+  };
+  guint i;
+  gdouble val = 0.;
+  GfsVariable * a = data[0];
+  GfsVariable * b = data[1];
+
+  for (i = 0; i < 4*(FTT_DIMENSION - 1); i++)
+    val += gfs_cell_corner_value (cell, d[i], a, -1);
+  GFS_VARIABLE (cell, b->i) = val/(4*(FTT_DIMENSION - 1));
+}
+
+static void variable_filtered_event_half (GfsEvent * event, GfsSimulation * sim)
+{
+  guint n, niter = 2*GFS_VARIABLE_FILTERED (event)->niter;
+  gpointer data[2], tmp;
+
+  data[0] = GFS_VARIABLE_FILTERED (event)->v;
+  data[1] = event;
+  gfs_domain_cell_traverse (GFS_DOMAIN (sim), FTT_PRE_ORDER, FTT_TRAVERSE_LEAFS, -1,
+			    (FttCellTraverseFunc) filter, data);
+  gfs_domain_copy_bc (GFS_DOMAIN (sim), FTT_TRAVERSE_LEAFS, -1,
+		      GFS_VARIABLE_FILTERED (event)->v, data[1]);
+  data[0] = event;
+  data[1] = gfs_temporary_variable (GFS_DOMAIN (sim));
+  for (n = 0; n < niter; n++) {
+    gfs_domain_cell_traverse (GFS_DOMAIN (sim), FTT_PRE_ORDER, FTT_TRAVERSE_LEAFS, -1,
+			      (FttCellTraverseFunc) filter, data);
+    gfs_domain_copy_bc (GFS_DOMAIN (sim), FTT_TRAVERSE_LEAFS, -1, 
+			GFS_VARIABLE_FILTERED (event)->v, data[1]);
+    tmp = data[0]; data[0] = data[1]; data[1] = tmp;
+  }
+  gts_object_destroy (data[1]);  
+}
+
+static gboolean variable_filtered_event (GfsEvent * event, GfsSimulation * sim)
+{
+  if ((* GFS_EVENT_CLASS (GTS_OBJECT_CLASS (gfs_variable_filtered_class ())->parent_class)->event)
+      (event, sim)) {
+    variable_filtered_event_half (event, sim);
+    return TRUE;
+  }
+  return FALSE;
+}
+
+static void variable_filtered_class_init (GtsObjectClass * klass)
+{
+  klass->read = variable_filtered_read;
+  klass->write = variable_filtered_write;
+  GFS_EVENT_CLASS (klass)->event = variable_filtered_event;
+  GFS_EVENT_CLASS (klass)->event_half = variable_filtered_event_half;
+}
+
+GfsVariableClass * gfs_variable_filtered_class (void)
+{
+  static GfsVariableClass * klass = NULL;
+
+  if (klass == NULL) {
+    GtsObjectClassInfo gfs_variable_filtered_info = {
+      "GfsVariableFiltered",
+      sizeof (GfsVariableFiltered),
+      sizeof (GfsVariableClass),
+      (GtsObjectClassInitFunc) variable_filtered_class_init,
+      (GtsObjectInitFunc) NULL,
+      (GtsArgSetFunc) NULL,
+      (GtsArgGetFunc) NULL
+    };
+    klass = gts_object_class_new (GTS_OBJECT_CLASS (gfs_variable_class ()), 
+				  &gfs_variable_filtered_info);
+  }
+
+  return klass;
+}
diff --git a/src/variable.h b/src/variable.h
index b992ba2..f02dfa0 100644
--- a/src/variable.h
+++ b/src/variable.h
@@ -107,6 +107,27 @@ GfsVariableClass * gfs_variable_tracer_class  (void);
 
 GfsVariableClass * gfs_variable_residual_class  (void);
 
+/* GfsVariableFiltered: header */
+
+typedef struct _GfsVariableFiltered                GfsVariableFiltered;
+
+struct _GfsVariableFiltered {
+  /*< private >*/
+  GfsVariable parent;
+
+  /*< public >*/
+  GfsVariable * v;
+  guint niter;
+};
+
+#define GFS_VARIABLE_FILTERED(obj)            GTS_OBJECT_CAST (obj,\
+					           GfsVariableFiltered,\
+					           gfs_variable_filtered_class ())
+#define GFS_IS_VARIABLE_FILTERED(obj)         (gts_object_is_from_class (obj,\
+					     gfs_variable_filtered_class ()))
+
+GfsVariableClass * gfs_variable_filtered_class  (void);
+
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */

-- 
Gerris Flow Solver



More information about the debian-science-commits mailing list