[SCM] Gerris Flow Solver branch, upstream, updated. b3aa46814a06c9cb2912790b23916ffb44f1f203
Stephane Popinet
popinet at users.sf.net
Fri May 15 02:54:57 UTC 2009
The following commit has been merged in the upstream branch:
commit 9a656a925a2cd5a7e5f7a5bca4126c933f648f80
Author: Stephane Popinet <popinet at users.sf.net>
Date: Wed Jan 16 07:55:55 2008 +1100
RemoveDroplets takes an extra optional argument
Which allows flexible selection of the "droplet" criterion.
darcs-hash:20080115205555-d4795-50b5189c9e178e65af8bfa99c4923e3cb5fd49bf.gz
diff --git a/src/domain.c b/src/domain.c
index 4d97d59..de68c0e 100644
--- a/src/domain.c
+++ b/src/domain.c
@@ -2968,25 +2968,28 @@ static int greater (const void * a, const void * b)
* gfs_domain_remove_droplets:
* @domain: a #GfsDomain.
* @c: a #GfsVariable.
+ * @v: a #GfsVariable.
* @min: the minimum size (in cells) of the droplets.
*
- * Removes all the droplets of @domain smaller than @min cells
- * if @min is positive, or all the droplets but the -$min largest ones
- * if @min is negative.
+ * Resets the @v variable of all the droplets (defined by the @c
+ * variable) smaller than @min cells if @min is positive, or all the
+ * droplets but the -$min largest ones if @min is negative.
*/
void gfs_domain_remove_droplets (GfsDomain * domain,
GfsVariable * c,
+ GfsVariable * v,
gint min)
{
RemoveDropletsPar p;
g_return_if_fail (domain != NULL);
g_return_if_fail (c != NULL);
+ g_return_if_fail (v != NULL);
p.c = c;
p.tag = gfs_temporary_variable (domain);
p.n = gfs_domain_tag_droplets (domain, c, p.tag);
- if (p.n > 0 && -min < p.n) {
+ if (p.n > 0 && -min < (gint) p.n) {
p.sizes = g_malloc0 (p.n*sizeof (guint));
gfs_domain_cell_traverse (domain, FTT_PRE_ORDER, FTT_TRAVERSE_LEAFS, -1,
(FttCellTraverseFunc) compute_droplet_size, &p);
@@ -2999,6 +3002,7 @@ void gfs_domain_remove_droplets (GfsDomain * domain,
p.min = tmp[-1 - min];
g_free (tmp);
}
+ p.c = v;
gfs_domain_cell_traverse (domain, FTT_PRE_ORDER, FTT_TRAVERSE_LEAFS, -1,
(FttCellTraverseFunc) reset_small_fraction, &p);
g_free (p.sizes);
diff --git a/src/domain.h b/src/domain.h
index b84a7fd..14e080f 100644
--- a/src/domain.h
+++ b/src/domain.h
@@ -253,6 +253,7 @@ guint gfs_domain_tag_droplets (GfsDomain * domain,
GfsVariable * tag);
void gfs_domain_remove_droplets (GfsDomain * domain,
GfsVariable * c,
+ GfsVariable * v,
gint min);
void gfs_domain_remove_ponds (GfsDomain * domain,
gint min,
diff --git a/src/event.c b/src/event.c
index 8b011a0..a7b3af4 100644
--- a/src/event.c
+++ b/src/event.c
@@ -1726,13 +1726,35 @@ GfsInitFractionClass * gfs_init_fraction_class (void)
/* GfsRemoveDroplets: Object */
+static void gfs_remove_droplets_destroy (GtsObject * object)
+{
+ GfsRemoveDroplets * d = GFS_REMOVE_DROPLETS (object);
+ if (d->fc)
+ gts_object_destroy (GTS_OBJECT (d->fc));
+ (* GTS_OBJECT_CLASS (gfs_remove_droplets_class ())->parent_class->destroy) (object);
+}
+
+static void compute_v (FttCell * cell, GfsRemoveDroplets * d)
+{
+ GFS_VALUE (cell, d->v) = gfs_function_value (d->fc, cell);
+}
+
static gboolean gfs_remove_droplets_event (GfsEvent * event, GfsSimulation * sim)
{
if ((* GFS_EVENT_CLASS (GTS_OBJECT_CLASS (gfs_remove_droplets_class ())->parent_class)->event)
(event, sim)) {
- gfs_domain_remove_droplets (GFS_DOMAIN (sim),
- GFS_REMOVE_DROPLETS (event)->c,
- GFS_REMOVE_DROPLETS (event)->min);
+ GfsRemoveDroplets * d = GFS_REMOVE_DROPLETS (event);
+ GfsDomain * domain = GFS_DOMAIN (sim);
+ d->v = d->fc ? gfs_function_get_variable (d->fc) : d->c;
+ if (d->v)
+ gfs_domain_remove_droplets (domain, d->v, d->c, d->min);
+ else {
+ d->v = gfs_temporary_variable (domain);
+ gfs_domain_cell_traverse (domain, FTT_PRE_ORDER, FTT_TRAVERSE_LEAFS, -1,
+ (FttCellTraverseFunc) compute_v, d);
+ gfs_domain_remove_droplets (domain, d->v, d->c, d->min);
+ gts_object_destroy (GTS_OBJECT (d->v));
+ }
return TRUE;
}
return FALSE;
@@ -1740,8 +1762,6 @@ static gboolean gfs_remove_droplets_event (GfsEvent * event, GfsSimulation * sim
static void gfs_remove_droplets_read (GtsObject ** o, GtsFile * fp)
{
- GfsDomain * domain;
-
if (GTS_OBJECT_CLASS (gfs_remove_droplets_class ())->parent_class->read)
(* GTS_OBJECT_CLASS (gfs_remove_droplets_class ())->parent_class->read)
(o, fp);
@@ -1752,9 +1772,9 @@ static void gfs_remove_droplets_read (GtsObject ** o, GtsFile * fp)
gts_file_error (fp, "expecting a string (variable)");
return;
}
- domain = GFS_DOMAIN (gfs_object_simulation (*o));
- if ((GFS_REMOVE_DROPLETS (*o)->c = gfs_variable_from_name (domain->variables, fp->token->str))
- == NULL) {
+ GfsDomain * domain = GFS_DOMAIN (gfs_object_simulation (*o));
+ GfsRemoveDroplets * r = GFS_REMOVE_DROPLETS (*o);
+ if ((r->c = gfs_variable_from_name (domain->variables, fp->token->str)) == NULL) {
gts_file_error (fp, "unknown variable `%s'", fp->token->str);
return;
}
@@ -1766,6 +1786,11 @@ static void gfs_remove_droplets_read (GtsObject ** o, GtsFile * fp)
}
GFS_REMOVE_DROPLETS (*o)->min = atoi (fp->token->str);
gts_file_next_token (fp);
+
+ if (fp->type != '\n') {
+ r->fc = gfs_function_new (gfs_function_class (), 0.);
+ gfs_function_read (r->fc, gfs_object_simulation (r), fp);
+ }
}
static void gfs_remove_droplets_write (GtsObject * o, FILE * fp)
@@ -1773,12 +1798,16 @@ static void gfs_remove_droplets_write (GtsObject * o, FILE * fp)
if (GTS_OBJECT_CLASS (gfs_remove_droplets_class ())->parent_class->write)
(* GTS_OBJECT_CLASS (gfs_remove_droplets_class ())->parent_class->write)
(o, fp);
- fprintf (fp, " %s %d", GFS_REMOVE_DROPLETS (o)->c->name, GFS_REMOVE_DROPLETS (o)->min);
+ GfsRemoveDroplets * r = GFS_REMOVE_DROPLETS (o);
+ fprintf (fp, " %s %d", r->c->name, r->min);
+ if (r->fc)
+ gfs_function_write (r->fc, fp);
}
static void gfs_remove_droplets_class_init (GfsEventClass * klass)
{
GFS_EVENT_CLASS (klass)->event = gfs_remove_droplets_event;
+ GTS_OBJECT_CLASS (klass)->destroy = gfs_remove_droplets_destroy;
GTS_OBJECT_CLASS (klass)->read = gfs_remove_droplets_read;
GTS_OBJECT_CLASS (klass)->write = gfs_remove_droplets_write;
}
diff --git a/src/event.h b/src/event.h
index 06dea2a..873561f 100644
--- a/src/event.h
+++ b/src/event.h
@@ -284,8 +284,10 @@ typedef struct _GfsRemoveDroplets GfsRemoveDroplets;
struct _GfsRemoveDroplets {
/*< private >*/
GfsEvent parent;
+ GfsVariable * v;
/*< public >*/
+ GfsFunction * fc;
GfsVariable * c;
gint min;
};
diff --git a/src/variable.h b/src/variable.h
index 55dffb7..b2700a6 100644
--- a/src/variable.h
+++ b/src/variable.h
@@ -65,6 +65,7 @@ struct _GfsVariableClass {
gfs_variable_class())
#define GFS_IS_VARIABLE(obj) (gts_object_is_from_class (obj,\
gfs_variable_class ()))
+#define GFS_VALUE(cell,v) ((&GFS_STATE (cell)->place_holder)[(v)->i])
GfsVariableClass * gfs_variable_class (void);
GfsVariable * gfs_variable_new (GfsVariableClass * klass,
--
Gerris Flow Solver
More information about the debian-science-commits
mailing list