[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