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

Stephane Popinet popinet at users.sf.net
Fri May 15 02:56:04 UTC 2009


The following commit has been merged in the upstream branch:
commit a27401c6de2afc76527e5cb67a45a91e00077cc9
Author: Stephane Popinet <popinet at users.sf.net>
Date:   Tue Sep 18 08:06:46 2007 +1000

    New EventBalance object for parallel load-balancing
    
    darcs-hash:20070917220646-d4795-44296d28616a7cd40af68e62c740f10df036ed80.gz

diff --git a/src/event.c b/src/event.c
index 094ab3a..37d36c3 100644
--- a/src/event.c
+++ b/src/event.c
@@ -1687,6 +1687,93 @@ GfsEventClass * gfs_event_script_class (void)
   return klass;
 }
 
+/* GfsEventBalance: Object */
+
+static void gfs_event_balance_write (GtsObject * o, FILE * fp)
+{
+  GfsEventBalance * s = GFS_EVENT_BALANCE (o);
+
+  if (GTS_OBJECT_CLASS (gfs_event_balance_class ())->parent_class->write)
+    (* GTS_OBJECT_CLASS (gfs_event_balance_class ())->parent_class->write)
+      (o, fp);
+
+  fprintf (fp, " %g", s->max);
+}
+
+static void gfs_event_balance_read (GtsObject ** o, GtsFile * fp)
+{
+  GfsEventBalance * s = GFS_EVENT_BALANCE (*o);
+  GfsDomain * domain =  GFS_DOMAIN (gfs_object_simulation (s));
+
+  if (GTS_OBJECT_CLASS (gfs_event_balance_class ())->parent_class->read)
+    (* GTS_OBJECT_CLASS (gfs_event_balance_class ())->parent_class->read) 
+      (o, fp);
+  if (fp->type == GTS_ERROR)
+    return;
+  
+  s->max = gfs_read_constant (fp, domain);
+}
+
+static gboolean gfs_event_balance_event (GfsEvent * event, GfsSimulation * sim)
+{
+  if ((* GFS_EVENT_CLASS (GTS_OBJECT_CLASS (gfs_event_balance_class ())->parent_class)->event) 
+      (event, sim)) {
+    GfsDomain * domain = GFS_DOMAIN (sim);
+    GfsEventBalance * s = GFS_EVENT_BALANCE (event);
+    GtsRange size, boundary, mpiwait;
+
+    gfs_domain_stats_balance (domain, &size, &boundary, &mpiwait);
+    if (size.max/size.min > s->max) {
+      g_log (G_LOG_DOMAIN, G_LOG_LEVEL_MESSAGE, 
+	     "EventBalance: unbalance limit reached (exiting)");
+       g_slist_free (domain->variables_io);
+       domain->variables_io = NULL;
+       GSList * i = domain->variables;
+       while (i) {
+	 if (GFS_VARIABLE1 (i->data)->name)
+	   domain->variables_io = g_slist_append (domain->variables_io, i->data);
+	 i = i->next;
+       }
+       FILE * fp = fopen ("unbalanced.gfs", "w");
+       if (fp) {
+	 gfs_simulation_write (GFS_SIMULATION (domain), -1, fp);
+	 fclose (fp);
+       }
+       exit (2);
+    }
+    return TRUE;
+  }
+  return FALSE;
+}
+
+static void gfs_event_balance_class_init (GfsEventClass * klass)
+{
+  GTS_OBJECT_CLASS (klass)->read = gfs_event_balance_read;
+  GTS_OBJECT_CLASS (klass)->write = gfs_event_balance_write;
+  GFS_EVENT_CLASS (klass)->event = gfs_event_balance_event;
+}
+
+GfsEventClass * gfs_event_balance_class (void)
+{
+  static GfsEventClass * klass = NULL;
+
+  if (klass == NULL) {
+    GtsObjectClassInfo gfs_event_balance_info = {
+      "GfsEventBalance",
+      sizeof (GfsEventBalance),
+      sizeof (GfsEventClass),
+      (GtsObjectClassInitFunc) gfs_event_balance_class_init,
+      (GtsObjectInitFunc) NULL,
+      (GtsArgSetFunc) NULL,
+      (GtsArgGetFunc) NULL
+    };
+    klass = gts_object_class_new (GTS_OBJECT_CLASS (gfs_event_class ()),
+				  &gfs_event_balance_info);
+  }
+
+  return klass;
+}
+
 /* GfsInitFraction: Object */
 
 static void gfs_init_fraction_destroy (GtsObject * object)
diff --git a/src/event.h b/src/event.h
index ceaf86f..9d6a270 100644
--- a/src/event.h
+++ b/src/event.h
@@ -251,6 +251,24 @@ struct _GfsEventScript {
 
 GfsEventClass * gfs_event_script_class  (void);
 
+/* GfsEventBalance: Header */
+
+typedef struct _GfsEventBalance         GfsEventBalance;
+
+struct _GfsEventBalance {
+  GfsEvent parent;
+
+  gdouble max;
+};
+
+#define GFS_EVENT_BALANCE(obj)            GTS_OBJECT_CAST (obj,\
+					         GfsEventBalance,\
+					         gfs_event_balance_class ())
+#define GFS_IS_EVENT_BALANCE(obj)         (gts_object_is_from_class (obj,\
+						 gfs_event_balance_class ()))
+
+GfsEventClass * gfs_event_balance_class  (void);
+
 /* GfsInitFraction: Header */
 
 typedef struct _GfsInitFraction         GfsInitFraction;
diff --git a/src/init.c b/src/init.c
index eeb2d80..443e761 100644
--- a/src/init.c
+++ b/src/init.c
@@ -166,6 +166,7 @@ GtsObjectClass ** gfs_classes (void)
     gfs_event_harmonic_class (),
     gfs_event_stop_class (),
     gfs_event_script_class (),
+    gfs_event_balance_class (),
     gfs_source_generic_class (),
       gfs_source_scalar_class (),
         gfs_source_class (),

-- 
Gerris Flow Solver



More information about the debian-science-commits mailing list