From 15911a90c08588d88dcbe906aa5ccd459a1096eb Mon Sep 17 00:00:00 2001
From: mattijs <mattijs>
Date: Tue, 10 Apr 2012 12:26:36 +0100
Subject: [PATCH] ENH: UPstream.C: use 2 scalars instead of user-defined data
 type

---
 src/Pstream/mpi/UPstream.C | 132 ++-----------------------------------
 1 file changed, 4 insertions(+), 128 deletions(-)

diff --git a/src/Pstream/mpi/UPstream.C b/src/Pstream/mpi/UPstream.C
index e5b2808ca61..3123aa47879 100644
--- a/src/Pstream/mpi/UPstream.C
+++ b/src/Pstream/mpi/UPstream.C
@@ -41,40 +41,6 @@ License
 #   define MPI_SCALAR MPI_DOUBLE
 #endif
 
-// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
-
-namespace Foam
-{
-    typedef struct
-    {
-        scalar value;
-        label count;
-    } CountAndValue;
-
-    void reduceSum
-    (
-        void *in,
-        void *inOut,
-        int *len,
-        MPI_Datatype *dptr
-    )
-    {
-        CountAndValue* inPtr =
-            reinterpret_cast<CountAndValue*>(in);
-        CountAndValue* inOutPtr =
-            reinterpret_cast<CountAndValue*>(inOut);
-
-        for (int i=0; i< *len; ++i)
-        {
-            inOutPtr->value += inPtr->value;
-            inOutPtr->count += inPtr->count;
-            inPtr++;
-            inOutPtr++;
-        }
-    }
-}
-
-
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
 // NOTE:
@@ -493,101 +459,11 @@ void Foam::sumReduce
     const int tag
 )
 {
-    static bool hasDataType_ = false;
-    static MPI_Datatype mesg_mpi_strct_;
-    static MPI_Op myOp_;
-
-    if (Pstream::debug)
-    {
-        Pout<< "Foam::sumReduce : value:" << Value
-            << " count:" << Count << endl;
-    }
-
-    if (!UPstream::parRun())
-    {
-        return;
-    }
-
-    if (UPstream::nProcs() <= UPstream::nProcsSimpleSum)
-    {
-        reduce(Value, sumOp<scalar>(), tag);
-        reduce(Count, sumOp<label>(), tag);
-    }
-    else
-    {
-        CountAndValue in,out;
+    vector2D twoScalars(Value, scalar(Count));
+    reduce(twoScalars, sumOp<vector2D>());
 
-        if (!hasDataType_)
-        {
-            int lengths[2];
-            lengths[0] = 1;
-            lengths[1] = 1;
-            MPI_Datatype types[2];
-            types[0] = MPI_DOUBLE;
-            types[1] = MPI_INT;
-            MPI_Aint addresses[2];
-            MPI_Address(&in.value, &addresses[0]);
-            MPI_Address(&in.count, &addresses[1]);
-            MPI_Aint offsets[2];
-            offsets[0] = 0;
-            offsets[1] = addresses[1]-addresses[0];
-
-            if
-            (
-                MPI_Type_create_struct
-                (
-                    2,
-                    lengths,
-                    offsets,
-                    types,
-                    &mesg_mpi_strct_
-                )
-            )
-            {
-                FatalErrorIn("Foam::sumReduce()")
-                    << "MPI_Type_create_struct" << abort(FatalError);
-            }
-            if (MPI_Type_commit(&mesg_mpi_strct_))
-            {
-                FatalErrorIn("Foam::sumReduce()")
-                    << "MPI_Type_commit" << abort(FatalError);
-            }
-            if (MPI_Op_create(reduceSum, true, &myOp_))
-            {
-                FatalErrorIn("Foam::sumReduce()")
-                    << "MPI_Op_create" << abort(FatalError);
-            }
-
-            hasDataType_ = true;
-        }
-
-        in.value = Value;
-        in.count = Count;
-        if
-        (
-            MPI_Allreduce
-            (
-                &in,
-                &out,
-                1,
-                mesg_mpi_strct_,
-                myOp_,
-                MPI_COMM_WORLD
-            )
-        )
-        {
-            FatalErrorIn("Foam::sumReduce(..)")
-                << "Problem." << abort(FatalError);
-        }
-        Value = out.value;
-        Count = out.count;
-    }
-
-    if (Pstream::debug)
-    {
-        Pout<< "Foam::reduce : reduced value:" << Value
-            << " reduced count:" << Count << endl;
-    }
+    Value = twoScalars.x();
+    Count = twoScalars.y();
 }
 
 
-- 
GitLab