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

Stephane Popinet popinet at users.sf.net
Fri May 15 02:53:03 UTC 2009


The following commit has been merged in the upstream branch:
commit e8280c4ad25e144ad5698285df82a4861774e2fc
Author: Stephane Popinet <popinet at users.sf.net>
Date:   Sat Jan 28 12:23:57 2006 +1100

    New object GfsVariableCurvature
    
    darcs-hash:20060128012357-d4795-589048b20ee0c5b6ce7c4bbff3d5b91b71bc39ea.gz

diff --git a/src/init.c b/src/init.c
index 176e1d9..8c8da03 100644
--- a/src/init.c
+++ b/src/init.c
@@ -144,6 +144,7 @@ void gfs_init (int * argc, char *** argv)
     gfs_variable_tracer_class ();
     gfs_variable_residual_class ();
     gfs_variable_filtered_class ();
+    gfs_variable_curvature_class ();
 
   gfs_surface_bc_class ();
 
diff --git a/src/variable.c b/src/variable.c
index cc6c342..cf5443d 100644
--- a/src/variable.c
+++ b/src/variable.c
@@ -448,3 +448,139 @@ GfsVariableClass * gfs_variable_filtered_class (void)
 
   return klass;
 }
+
+/* GfsVariableCurvature: object */
+
+static void variable_curvature_read (GtsObject ** o, GtsFile * fp)
+{
+  GfsDomain * domain;
+
+  (* GTS_OBJECT_CLASS (gfs_variable_curvature_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_CURVATURE (*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 != '\n') {
+    if (fp->type != GTS_INT && fp->type != GTS_FLOAT) {
+      gts_file_error (fp, "expecting a number (sigma)");
+      return;
+    }
+    GFS_VARIABLE_CURVATURE (*o)->sigma = atof (fp->token->str);
+    gts_file_next_token (fp);
+  }
+}
+
+static void variable_curvature_write (GtsObject * o, FILE * fp)
+{
+  GfsVariableCurvature * v = GFS_VARIABLE_CURVATURE (o);
+
+  (* GTS_OBJECT_CLASS (gfs_variable_curvature_class ())->parent_class->write) (o, fp);
+
+  fprintf (fp, " %s", v->v->name);
+  if (v->sigma != 1.)
+    fprintf (fp, " %g", v->sigma);
+}
+
+static void normal (FttCell * cell, gpointer * data)
+{
+  GfsVariable ** nv = data[0];
+  GfsVariable * v = GFS_VARIABLE_CURVATURE (data[1])->v;
+  GtsVector n = { 0., 0., 0. };
+  FttComponent c;
+
+  gfs_youngs_normal (cell, v, (FttVector *) n);
+  gts_vector_normalize (n);
+  for (c = 0; c < FTT_DIMENSION; c++)
+    GFS_VARIABLE (cell, nv[c]->i) = n[c];
+}
+
+static void curvature (FttCell * cell, gpointer * data)
+{
+  GfsVariable ** nv = data[0];
+  GfsVariable * v = data[1];
+  gdouble kappa = 0.;
+  FttComponent c;
+  
+  for (c = 0; c < FTT_DIMENSION; c++)
+    kappa += gfs_center_gradient (cell, c, nv[c]->i);
+  GFS_VARIABLE (cell, v->i) = GFS_VARIABLE_CURVATURE (v)->sigma*kappa/ftt_cell_size (cell);
+}
+
+static void variable_curvature_event_half (GfsEvent * event, GfsSimulation * sim)
+{
+  GfsVariable * n[FTT_DIMENSION];
+  GfsDomain * domain = GFS_DOMAIN (sim);
+  gpointer data[2];
+  FttComponent c;
+
+  for (c = 0; c < FTT_DIMENSION; c++) {
+    n[c] = gfs_temporary_variable (domain);
+    gfs_variable_set_vector (n[c], c);
+  }
+  data[0] = n;
+  data[1] = event;
+  gfs_domain_cell_traverse (domain, FTT_PRE_ORDER, FTT_TRAVERSE_LEAFS, -1,
+			    (FttCellTraverseFunc) normal, data);
+  for (c = 0; c < FTT_DIMENSION; c++)
+    gfs_domain_bc (domain, FTT_TRAVERSE_LEAFS, -1, n[c]);
+  gfs_domain_cell_traverse (domain, FTT_PRE_ORDER, FTT_TRAVERSE_LEAFS, -1,
+			    (FttCellTraverseFunc) curvature, data);
+  gfs_domain_bc (domain, FTT_TRAVERSE_LEAFS, -1, GFS_VARIABLE1 (event));
+  for (c = 0; c < FTT_DIMENSION; c++)
+    gts_object_destroy (GTS_OBJECT (n[c]));
+}
+
+static gboolean variable_curvature_event (GfsEvent * event, GfsSimulation * sim)
+{
+  if ((* GFS_EVENT_CLASS (GTS_OBJECT_CLASS (gfs_variable_curvature_class ())->parent_class)->event)
+      (event, sim)) {
+    variable_curvature_event_half (event, sim);
+    return TRUE;
+  }
+  return FALSE;
+}
+
+static void variable_curvature_class_init (GtsObjectClass * klass)
+{
+  klass->read = variable_curvature_read;
+  klass->write = variable_curvature_write;
+  GFS_EVENT_CLASS (klass)->event = variable_curvature_event;
+  GFS_EVENT_CLASS (klass)->event_half = variable_curvature_event_half;
+}
+
+static void variable_curvature_init (GfsVariableCurvature * v)
+{
+  v->sigma = 1.;
+}
+
+GfsVariableClass * gfs_variable_curvature_class (void)
+{
+  static GfsVariableClass * klass = NULL;
+
+  if (klass == NULL) {
+    GtsObjectClassInfo gfs_variable_curvature_info = {
+      "GfsVariableCurvature",
+      sizeof (GfsVariableCurvature),
+      sizeof (GfsVariableClass),
+      (GtsObjectClassInitFunc) variable_curvature_class_init,
+      (GtsObjectInitFunc) variable_curvature_init,
+      (GtsArgSetFunc) NULL,
+      (GtsArgGetFunc) NULL
+    };
+    klass = gts_object_class_new (GTS_OBJECT_CLASS (gfs_variable_class ()), 
+				  &gfs_variable_curvature_info);
+  }
+
+  return klass;
+}
diff --git a/src/variable.h b/src/variable.h
index 4d25b08..05bba70 100644
--- a/src/variable.h
+++ b/src/variable.h
@@ -129,6 +129,28 @@ struct _GfsVariableFiltered {
 
 GfsVariableClass * gfs_variable_filtered_class  (void);
 
+
+/* GfsVariableCurvature: header */
+
+typedef struct _GfsVariableCurvature                GfsVariableCurvature;
+
+struct _GfsVariableCurvature {
+  /*< private >*/
+  GfsVariable parent;
+
+  /*< public >*/
+  GfsVariable * v;
+  gdouble sigma;
+};
+
+#define GFS_VARIABLE_CURVATURE(obj)            GTS_OBJECT_CAST (obj,\
+					           GfsVariableCurvature,\
+					           gfs_variable_curvature_class ())
+#define GFS_IS_VARIABLE_CURVATURE(obj)         (gts_object_is_from_class (obj,\
+					     gfs_variable_curvature_class ()))
+
+GfsVariableClass * gfs_variable_curvature_class  (void);
+
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */

-- 
Gerris Flow Solver



More information about the debian-science-commits mailing list