[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