From c1ad4295644e8b38479d00013b14e90e322974b6 Mon Sep 17 00:00:00 2001
From: Mark Olesen <Mark.Olesen@esi-group.com>
Date: Thu, 8 Oct 2020 18:23:54 +0200
Subject: [PATCH] BUG: parallel foamToEnsight fails depending on lagrangian
 order (fixes #1873)

- the problem arises when output fields are missing on some
  processors.

  When the information is combined, the resulting HashTables can have
  different insertion orders. This poses an issue when there are hash
  key collisions and thus different chaining.

- Use sorted order.
---
 .../dataConversion/foamToEnsight/convertLagrangian.H   | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/applications/utilities/postProcessing/dataConversion/foamToEnsight/convertLagrangian.H b/applications/utilities/postProcessing/dataConversion/foamToEnsight/convertLagrangian.H
index 143f9f226f7..101debd6a08 100644
--- a/applications/utilities/postProcessing/dataConversion/foamToEnsight/convertLagrangian.H
+++ b/applications/utilities/postProcessing/dataConversion/foamToEnsight/convertLagrangian.H
@@ -67,10 +67,10 @@ if (doLagrangian)
             }
         }
 
-        forAllConstIters(theseCloudFields, fieldIter)
+        // Field order may differ on individual processors, so sort by name
+        for (const word& fieldName : theseCloudFields.sortedToc())
         {
-            const word& fieldName = fieldIter.key();
-            const word& fieldType = fieldIter.val();
+            const word& fieldType = theseCloudFields[fieldName];
 
             IOobject fieldObject
             (
@@ -88,9 +88,13 @@ if (doLagrangian)
                 // but that combination does not work.
                 // So check the header and sync globally
 
+                const bool parRun = Pstream::parRun();
+                Pstream::parRun() = false;
+
                 fieldExists =
                     fieldObject.typeHeaderOk<IOField<scalar>>(false);
 
+                Pstream::parRun() = parRun;
                 reduce(fieldExists, orOp<bool>());
             }
 
-- 
GitLab