[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