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

Stephane Popinet popinet at users.sf.net
Fri May 15 02:55:07 UTC 2009


The following commit has been merged in the upstream branch:
commit 61914d59996c66cff2e34d9df569c5415277a83b
Author: Stephane Popinet <popinet at users.sf.net>
Date:   Thu Mar 13 08:54:50 2008 +1100

    Fix for MRS implementation in parallel
    
    darcs-hash:20080312215450-d4795-95eee81ff545c6cf79404e96bb9cf607fb3066ab.gz

diff --git a/src/domain.c b/src/domain.c
index c9d8ae7..f97731b 100644
--- a/src/domain.c
+++ b/src/domain.c
@@ -677,14 +677,7 @@ static gboolean domain_match (GfsDomain * domain)
   gts_container_foreach (GTS_CONTAINER (domain), (GtsFunc) box_receive_bc, datum);
   gts_container_foreach (GTS_CONTAINER (domain), (GtsFunc) box_synchronize, &c);
   gts_container_foreach (GTS_CONTAINER (domain), (GtsFunc) box_changed, &changed);
-#ifdef HAVE_MPI
-  if (domain->pid >= 0) {
-    guint global_changed;
-
-    MPI_Allreduce (&changed, &global_changed, 1, MPI_INT, MPI_MAX, MPI_COMM_WORLD);
-    changed = global_changed;
-  }
-#endif /* HAVE_MPI */
+  gfs_all_reduce (domain, changed, MPI_INT, MPI_MAX);
   return changed;
 }
 
@@ -1069,15 +1062,7 @@ guint gfs_domain_depth (GfsDomain * domain)
 
   gts_container_foreach (GTS_CONTAINER (domain),
 			 (GtsFunc) box_depth, &depth);
-#ifdef HAVE_MPI
-  if (domain->pid >= 0) {
-    guint global_depth;
-
-    MPI_Allreduce (&depth, &global_depth, 1, MPI_UNSIGNED, MPI_MAX, 
-		   MPI_COMM_WORLD);
-    depth = global_depth;
-  }
-#endif /* HAVE_MPI */
+  gfs_all_reduce (domain, depth, MPI_UNSIGNED, MPI_MAX);
   return depth;
 }
 
@@ -2177,14 +2162,7 @@ guint gfs_domain_size (GfsDomain * domain,
   
   gfs_domain_cell_traverse (domain, FTT_PRE_ORDER, flags, max_depth, 
 			   (FttCellTraverseFunc) count, &n);
-#ifdef HAVE_MPI
-  if (domain->pid >= 0) {
-    guint sn;
-
-    MPI_Allreduce (&n, &sn, 1, MPI_UNSIGNED, MPI_SUM, MPI_COMM_WORLD);
-    n = sn;
-  }
-#endif /* HAVE_MPI */
+  gfs_all_reduce (domain, n, MPI_UNSIGNED, MPI_SUM);
   return n;
 }
 
@@ -2253,14 +2231,7 @@ gdouble gfs_domain_cfl (GfsDomain * domain,
   p.v = gfs_domain_velocity (domain);
   gfs_domain_cell_traverse (domain, FTT_PRE_ORDER, flags, max_depth, 
 			    (FttCellTraverseFunc) minimum_cfl, &p);
-#ifdef HAVE_MPI
-  if (domain->pid >= 0) {
-    gdouble gcfl;
-
-    MPI_Allreduce (&p.cfl, &gcfl, 1, MPI_DOUBLE, MPI_MIN, MPI_COMM_WORLD);
-    p.cfl = gcfl;
-  }
-#endif /* HAVE_MPI */
+  gfs_all_reduce (domain, p.cfl, MPI_DOUBLE, MPI_MIN);
   return sqrt (p.cfl);
 }
 
diff --git a/src/ftt.h b/src/ftt.h
index a40de24..5645ea6 100644
--- a/src/ftt.h
+++ b/src/ftt.h
@@ -31,7 +31,7 @@ extern "C" {
 
 #include "gfsconfig.h"
 
-#define FTT_MAINTAINER "s.popinet at niwa.cri.nz"
+#define FTT_MAINTAINER "s.popinet at niwa.co.nz"
 
 #if (FTT_2D || FTT_2D3)
 # define FTT_CELLS     4
diff --git a/src/mpi_boundary.h b/src/mpi_boundary.h
index 737aef5..65ec8f7 100644
--- a/src/mpi_boundary.h
+++ b/src/mpi_boundary.h
@@ -23,6 +23,17 @@
 #include <mpi.h>
 #include "boundary.h"
 
+#ifdef gfs_all_reduce
+# undef gfs_all_reduce
+#endif
+#define gfs_all_reduce(domain, p, type, op) {				\
+    if ((domain)->pid >= 0) {						\
+      union { int a; float b; double c;} global;			\
+      MPI_Allreduce (&(p), &global, 1, type, op, MPI_COMM_WORLD);	\
+      memcpy (&(p), &global, sizeof (p));				\
+    }									\
+  }
+
 #ifdef __cplusplus
 extern "C" {
 #endif /* __cplusplus */
diff --git a/src/poisson.c b/src/poisson.c
index b74e33e..fff8510 100644
--- a/src/poisson.c
+++ b/src/poisson.c
@@ -23,6 +23,11 @@
 #include "source.h"
 #include "tension.h"
 
+#include "config.h"
+#ifdef HAVE_MPI
+#  include "mpi_boundary.h"
+#endif
+
 /**
  * gfs_multilevel_params_write:
  * @par: the multilevel parameters.
@@ -669,6 +674,8 @@ static void minimal_residual_smoothing (GfsDomain * domain,
   data.srs = data.rs2 = 0.;
   gfs_domain_cell_traverse (domain, FTT_PRE_ORDER, FTT_TRAVERSE_LEAFS, -1,
 			    (FttCellTraverseFunc) compute_beta, &data);
+  gfs_all_reduce (domain, data.srs, MPI_DOUBLE, MPI_SUM);
+  gfs_all_reduce (domain, data.rs2, MPI_DOUBLE, MPI_SUM);
   if (data.rs2 > 0.) {
     data.beta = data.srs/data.rs2;
     gfs_domain_cell_traverse (domain, FTT_PRE_ORDER, FTT_TRAVERSE_LEAFS, -1,
diff --git a/src/utils.h b/src/utils.h
index eb5b4a3..60d7230 100644
--- a/src/utils.h
+++ b/src/utils.h
@@ -27,6 +27,9 @@ extern "C" {
 #include <gmodule.h>
 #include "ftt.h"
 
+/* gfs_all_reduce() defaults to nothing without MPI */
+#define gfs_all_reduce(domain, p, type, op)
+
 #define GFS_DOUBLE_TO_POINTER(d)     (*((gpointer *) &(d)))
 
 gboolean gfs_char_in_string (char c, const char * s);
diff --git a/src/vof.c b/src/vof.c
index ecf0c19..834f66f 100644
--- a/src/vof.c
+++ b/src/vof.c
@@ -23,7 +23,7 @@
 
 #include "config.h"
 #ifdef HAVE_MPI
-#  include <mpi.h>
+#  include "mpi_boundary.h"
 #endif
 #include "variable.h"
 #include "adaptive.h"
@@ -1379,14 +1379,7 @@ static void fix_too_coarse (GfsDomain * domain, VofParms * p)
     gfs_domain_cell_traverse (domain,
 			      FTT_PRE_ORDER, FTT_TRAVERSE_LEAFS, -1,
 			      (FttCellTraverseFunc) refine_too_coarse, p);
-#ifdef HAVE_MPI
-  if (domain->pid >= 0) {
-    guint sum_too_coarse;
-      
-    MPI_Allreduce (&p->too_coarse, &sum_too_coarse, 1, MPI_UNSIGNED, MPI_SUM, MPI_COMM_WORLD);
-    p->too_coarse = sum_too_coarse;
-  }
-#endif /* HAVE_MPI */
+  gfs_all_reduce (domain, p->too_coarse, MPI_UNSIGNED, MPI_SUM);
   if (p->too_coarse > 0)
     gfs_domain_reshape (domain, p->depth);
   domain->cell_init = (FttCellInitFunc) gfs_cell_fine_init;

-- 
Gerris Flow Solver



More information about the debian-science-commits mailing list