Added template specialisation for reduce of bool
This commit is contained in:
parent
4306c96365
commit
19ab01acb8
2 changed files with 133 additions and 5 deletions
|
@ -682,8 +682,8 @@ void Foam::Pstream::abort()
|
|||
|
||||
void Foam::reduce
|
||||
(
|
||||
scalar& Value,
|
||||
const sumOp<scalar>& bop,
|
||||
bool& Value,
|
||||
const andOp<bool>& bop,
|
||||
const int tag,
|
||||
const label comm
|
||||
)
|
||||
|
@ -696,7 +696,67 @@ void Foam::reduce
|
|||
error::printStack(Pout);
|
||||
}
|
||||
|
||||
allReduce(Value, 1, MPI_SCALAR, MPI_SUM, bop, tag, comm);
|
||||
// Note: C++ bool is a type separate from C and cannot be cast
|
||||
// For safety and compatibility with compilers, convert bool to int
|
||||
// to comply with MPI types. HJ, 23/Sep/2016
|
||||
|
||||
int intBool = 0;
|
||||
|
||||
if (Value)
|
||||
{
|
||||
intBool = 1;
|
||||
}
|
||||
|
||||
allReduce(intBool, 1, MPI_INT, MPI_LAND, bop, tag, comm);
|
||||
|
||||
if (intBool > 0)
|
||||
{
|
||||
Value = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
Value = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void Foam::reduce
|
||||
(
|
||||
bool& Value,
|
||||
const orOp<bool>& bop,
|
||||
const int tag,
|
||||
const label comm
|
||||
)
|
||||
{
|
||||
if (Pstream::warnComm != -1 && comm != Pstream::warnComm)
|
||||
{
|
||||
Pout<< "** reducing:" << Value << " with comm:" << comm
|
||||
<< " warnComm:" << Pstream::warnComm
|
||||
<< endl;
|
||||
error::printStack(Pout);
|
||||
}
|
||||
|
||||
// Note: C++ bool is a type separate from C and cannot be cast
|
||||
// For safety and compatibility with compilers, convert bool to int
|
||||
// to comply with MPI types. HJ, 23/Sep/2016
|
||||
|
||||
int intBool = 0;
|
||||
|
||||
if (Value)
|
||||
{
|
||||
intBool = 1;
|
||||
}
|
||||
|
||||
allReduce(intBool, 1, MPI_INT, MPI_LOR, bop, tag, comm);
|
||||
|
||||
if (intBool > 0)
|
||||
{
|
||||
Value = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
Value = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -719,6 +779,45 @@ void Foam::reduce
|
|||
}
|
||||
|
||||
|
||||
void Foam::reduce
|
||||
(
|
||||
scalar& Value,
|
||||
const maxOp<scalar>& bop,
|
||||
const int tag,
|
||||
const label comm
|
||||
)
|
||||
{
|
||||
if (Pstream::warnComm != -1 && comm != Pstream::warnComm)
|
||||
{
|
||||
Pout<< "** reducing:" << Value << " with comm:" << comm
|
||||
<< " warnComm:" << Pstream::warnComm
|
||||
<< endl;
|
||||
error::printStack(Pout);
|
||||
}
|
||||
allReduce(Value, 1, MPI_SCALAR, MPI_MAX, bop, tag, comm);
|
||||
}
|
||||
|
||||
|
||||
void Foam::reduce
|
||||
(
|
||||
scalar& Value,
|
||||
const sumOp<scalar>& bop,
|
||||
const int tag,
|
||||
const label comm
|
||||
)
|
||||
{
|
||||
if (Pstream::warnComm != -1 && comm != Pstream::warnComm)
|
||||
{
|
||||
Pout<< "** reducing:" << Value << " with comm:" << comm
|
||||
<< " warnComm:" << Pstream::warnComm
|
||||
<< endl;
|
||||
error::printStack(Pout);
|
||||
}
|
||||
|
||||
allReduce(Value, 1, MPI_SCALAR, MPI_SUM, bop, tag, comm);
|
||||
}
|
||||
|
||||
|
||||
void Foam::reduce
|
||||
(
|
||||
vector2D& Value,
|
||||
|
@ -1050,7 +1149,7 @@ const Foam::debug::optimisationSwitch
|
|||
Foam::Pstream::nProcsSimpleSum
|
||||
(
|
||||
"nProcsSimpleSum",
|
||||
16
|
||||
0
|
||||
);
|
||||
|
||||
|
||||
|
|
|
@ -139,7 +139,28 @@ void reduce
|
|||
}
|
||||
|
||||
|
||||
// Insist there are specialisations for the common reductions of scalar(s)
|
||||
// Insist there are specialisations for the common reductions of bool
|
||||
// See implementation notes on casting of a C++ bool into MPI_INT in
|
||||
// Pstream.C HJ, 23/Sep/2016
|
||||
|
||||
void reduce
|
||||
(
|
||||
bool& Value,
|
||||
const andOp<bool>& bop,
|
||||
const int tag = Pstream::msgType(),
|
||||
const label comm = Pstream::worldComm
|
||||
);
|
||||
|
||||
void reduce
|
||||
(
|
||||
bool& Value,
|
||||
const orOp<bool>& bop,
|
||||
const int tag = Pstream::msgType(),
|
||||
const label comm = Pstream::worldComm
|
||||
);
|
||||
|
||||
// Insist there are specialisations for the common reductions of scalars
|
||||
|
||||
void reduce
|
||||
(
|
||||
scalar& Value,
|
||||
|
@ -156,6 +177,14 @@ void reduce
|
|||
const label comm = Pstream::worldComm
|
||||
);
|
||||
|
||||
void reduce
|
||||
(
|
||||
scalar& Value,
|
||||
const maxOp<scalar>& bop,
|
||||
const int tag = Pstream::msgType(),
|
||||
const label comm = Pstream::worldComm
|
||||
);
|
||||
|
||||
void reduce
|
||||
(
|
||||
vector2D& Value,
|
||||
|
|
Reference in a new issue