[SCM] Gerris Flow Solver branch, upstream, updated. b3aa46814a06c9cb2912790b23916ffb44f1f203
Stephane Popinet
popinet at users.sf.net
Fri May 15 02:54:55 UTC 2009
The following commit has been merged in the upstream branch:
commit bef7c055da495387bdcf767a4105385a7cbd594b
Author: Stephane Popinet <popinet at users.sf.net>
Date: Fri Jan 11 13:00:23 2008 +1100
New object GfsOutputDropletStats
darcs-hash:20080111020023-d4795-981df6ae9bfdc338a43d45a30bf2440574656cf1.gz
diff --git a/src/init.c b/src/init.c
index d64b095..68e6b22 100644
--- a/src/init.c
+++ b/src/init.c
@@ -197,6 +197,7 @@ GtsObjectClass ** gfs_classes (void)
gfs_output_scalar_sum_class (),
gfs_output_scalar_maxima_class (),
gfs_output_scalar_histogram_class (),
+ gfs_output_droplet_stats_class (),
gfs_output_error_norm_class (),
gfs_output_correlation_class (),
gfs_output_squares_class (),
diff --git a/src/output.c b/src/output.c
index a28829f..c5cf188 100644
--- a/src/output.c
+++ b/src/output.c
@@ -2221,6 +2221,119 @@ GfsOutputClass * gfs_output_scalar_histogram_class (void)
return klass;
}
+/* GfsOutputDropletStats: Object */
+
+static void gfs_output_droplet_stats_destroy (GtsObject * object)
+{
+ if (GFS_OUTPUT_DROPLET_STATS (object)->tag)
+ gts_object_destroy (GTS_OBJECT (GFS_OUTPUT_DROPLET_STATS (object)->tag));
+
+ (* GTS_OBJECT_CLASS (gfs_output_droplet_stats_class ())->parent_class->destroy) (object);
+}
+
+static void gfs_output_droplet_stats_read (GtsObject ** o, GtsFile * fp)
+{
+ (* GTS_OBJECT_CLASS (gfs_output_droplet_stats_class ())->parent_class->read) (o, fp);
+ if (fp->type == GTS_ERROR)
+ return;
+
+ if (fp->type != GTS_STRING) {
+ gts_file_error (fp, "expecting a string (c)");
+ return;
+ }
+ GfsDomain * domain = GFS_DOMAIN (gfs_object_simulation (*o));
+ GfsOutputDropletStats * d = GFS_OUTPUT_DROPLET_STATS (*o);
+ if ((d->c = gfs_variable_from_name (domain->variables, fp->token->str)) == NULL) {
+ gts_file_error (fp, "unknown variable `%s'", fp->token->str);
+ return;
+ }
+ gts_file_next_token (fp);
+
+ if (fp->type == GTS_STRING &&
+ ((d->tag = gfs_variable_from_name (domain->variables, fp->token->str)) ||
+ (d->tag = gfs_domain_add_variable (domain, fp->token->str, "Droplet index"))))
+ gts_file_next_token (fp);
+}
+
+static void gfs_output_droplet_stats_write (GtsObject * o, FILE * fp)
+{
+ GfsOutputDropletStats * d = GFS_OUTPUT_DROPLET_STATS (o);
+
+ (* GTS_OBJECT_CLASS (gfs_output_droplet_stats_class ())->parent_class->write) (o, fp);
+
+ fprintf (fp, " %s", d->c->name);
+ if (d->tag)
+ fprintf (fp, " %s", d->tag->name);
+}
+
+typedef struct {
+ GfsVariable * s, * c, * tag;
+ double * v;
+ guint n;
+} DropStatsPar;
+
+static void droplet_stats (FttCell * cell, DropStatsPar * p)
+{
+ guint i = GFS_VARIABLE (cell, p->tag->i);
+ if (i > 0)
+ p->v[i - 1] += ftt_cell_volume (cell)*GFS_VARIABLE (cell, p->c->i)*GFS_VARIABLE (cell, p->s->i);
+}
+
+static gboolean gfs_output_droplet_stats_event (GfsEvent * event, GfsSimulation * sim)
+{
+ if ((* GFS_EVENT_CLASS (GTS_OBJECT_CLASS (gfs_output_droplet_stats_class ())->parent_class)->event) (event, sim)) {
+ GfsOutputDropletStats * d = GFS_OUTPUT_DROPLET_STATS (event);
+ GfsDomain * domain = GFS_DOMAIN (sim);
+ DropStatsPar p;
+ p.s = GFS_OUTPUT_SCALAR (event)->v;
+ p.c = d->c;
+ p.tag = d->tag ? d->tag : gfs_temporary_variable (domain);
+ p.n = gfs_domain_tag_droplets (domain, d->c, p.tag);
+ if (p.n > 0) {
+ p.v = g_malloc0 (p.n*sizeof (double));
+ gfs_domain_cell_traverse (domain, FTT_PRE_ORDER, FTT_TRAVERSE_LEAFS, -1,
+ (FttCellTraverseFunc) droplet_stats, &p);
+ guint i;
+ for (i = 0; i < p.n; i++)
+ fprintf (GFS_OUTPUT (event)->file->fp, "%g %d %.12g\n", sim->time.t, i + 1, p.v[i]);
+ g_free (p.v);
+ }
+ if (p.tag != d->tag)
+ gts_object_destroy (GTS_OBJECT (p.tag));
+ return TRUE;
+ }
+ return FALSE;
+}
+
+static void gfs_output_droplet_stats_class_init (GfsOutputClass * klass)
+{
+ GFS_EVENT_CLASS (klass)->event = gfs_output_droplet_stats_event;
+ GTS_OBJECT_CLASS (klass)->read = gfs_output_droplet_stats_read;
+ GTS_OBJECT_CLASS (klass)->write = gfs_output_droplet_stats_write;
+ GTS_OBJECT_CLASS (klass)->destroy = gfs_output_droplet_stats_destroy;
+}
+
+GfsOutputClass * gfs_output_droplet_stats_class (void)
+{
+ static GfsOutputClass * klass = NULL;
+
+ if (klass == NULL) {
+ GtsObjectClassInfo gfs_output_droplet_stats_info = {
+ "GfsOutputDropletStats",
+ sizeof (GfsOutputDropletStats),
+ sizeof (GfsOutputClass),
+ (GtsObjectClassInitFunc) gfs_output_droplet_stats_class_init,
+ (GtsObjectInitFunc) NULL,
+ (GtsArgSetFunc) NULL,
+ (GtsArgGetFunc) NULL
+ };
+ klass = gts_object_class_new (GTS_OBJECT_CLASS (gfs_output_scalar_class ()),
+ &gfs_output_droplet_stats_info);
+ }
+
+ return klass;
+}
+
/* GfsOutputErrorNorm: Object */
static void output_error_norm_destroy (GtsObject * o)
diff --git a/src/output.h b/src/output.h
index a90c7cc..9c5d39a 100644
--- a/src/output.h
+++ b/src/output.h
@@ -252,6 +252,26 @@ struct _GfsOutputScalarHistogram {
GfsOutputClass * gfs_output_scalar_histogram_class (void);
+/* GfsOutputDropletStats: Header */
+
+typedef struct _GfsOutputDropletStats GfsOutputDropletStats;
+
+struct _GfsOutputDropletStats {
+ /*< private >*/
+ GfsOutputScalar parent;
+
+ /*< public >*/
+ GfsVariable * c, * tag;
+};
+
+#define GFS_OUTPUT_DROPLET_STATS(obj) GTS_OBJECT_CAST (obj,\
+ GfsOutputDropletStats,\
+ gfs_output_droplet_stats_class ())
+#define GFS_IS_OUTPUT_DROPLET_STATS(obj) (gts_object_is_from_class (obj,\
+ gfs_output_droplet_stats_class ()))
+
+GfsOutputClass * gfs_output_droplet_stats_class (void);
+
/* GfsOutputErrorNorm: Header */
typedef struct _GfsOutputErrorNorm GfsOutputErrorNorm;
--
Gerris Flow Solver
More information about the debian-science-commits
mailing list