BUG: vtk write of uniform field in parallel (fixes #2349)
- used low-level MPI gather, but the wrapping routine contains an additional safety check for is_contiguous which is not defined for various std::pair<..> combination. So std::pair<label,vector> (which is actually contiguous, but not declared as is_contiguous) would falsely trip the check. Avoid by simply gathering unbundled values instead.
This commit is contained in:
parent
7a6891905e
commit
ddcc04dadc
@ -104,6 +104,8 @@ int main(int argc, char *argv[])
|
|||||||
printInfo<FixedList<word, 2>>();
|
printInfo<FixedList<word, 2>>();
|
||||||
printInfo<Pair<word>>();
|
printInfo<Pair<word>>();
|
||||||
|
|
||||||
|
printInfo<std::pair<int, vector>>();
|
||||||
|
|
||||||
printInfo<FixedList<FixedList<int, 2>, 2>>();
|
printInfo<FixedList<FixedList<int, 2>, 2>>();
|
||||||
printInfo<segment>();
|
printInfo<segment>();
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
\\ / A nd | www.openfoam.com
|
\\ / A nd | www.openfoam.com
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2021 OpenCFD Ltd.
|
Copyright (C) 2021-2022 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -180,6 +180,36 @@ int main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// This will likely fail - not declared as is_contiguous
|
||||||
|
// Cannot even catch since it triggers an abort()
|
||||||
|
|
||||||
|
#if 0
|
||||||
|
{
|
||||||
|
std::pair<label,vector> sendData(Pstream::myProcNo(), vector::one);
|
||||||
|
|
||||||
|
const bool oldThrowingError = FatalError.throwing(true);
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
List<std::pair<label,vector>> countValues
|
||||||
|
(
|
||||||
|
UPstream::listGatherValues<std::pair<label, vector>>
|
||||||
|
(
|
||||||
|
sendData
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
Pout<< "listGather: " << flatOutput(countValues) << nl;
|
||||||
|
}
|
||||||
|
catch (const Foam::error& err)
|
||||||
|
{
|
||||||
|
Info<< err.message().c_str() << nl;
|
||||||
|
}
|
||||||
|
|
||||||
|
FatalError.throwing(oldThrowingError);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
Info<< "\nEnd\n" << endl;
|
Info<< "\nEnd\n" << endl;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
\\ / A nd | www.openfoam.com
|
\\ / A nd | www.openfoam.com
|
||||||
\\/ M anipulation |
|
\\/ M anipulation |
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Copyright (C) 2016-2021 OpenCFD Ltd.
|
Copyright (C) 2016-2022 OpenCFD Ltd.
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
License
|
License
|
||||||
This file is part of OpenFOAM.
|
This file is part of OpenFOAM.
|
||||||
@ -140,20 +140,15 @@ void Foam::vtk::writeValueParallel
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Gather [count, value] tuples, including from master
|
// Gather [count, value] tuples, including from master
|
||||||
const List<std::pair<label, Type>> countValues
|
const List<label> counts(UPstream::listGatherValues(count));
|
||||||
(
|
const List<Type> values(UPstream::listGatherValues(val));
|
||||||
UPstream::listGatherValues<std::pair<label, Type>>
|
|
||||||
(
|
|
||||||
std::pair<label, Type>(count, val)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
if (Pstream::master())
|
if (Pstream::master())
|
||||||
{
|
{
|
||||||
for (const auto& countVal : countValues)
|
forAll(counts, i)
|
||||||
{
|
{
|
||||||
// Write [count, value] tuple
|
// Write [count, value] tuple
|
||||||
vtk::write(fmt, countVal.first, countVal.second);
|
vtk::write(fmt, counts[i], values[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user