From 75e19c31160d557685be4c53e897c6c217881641 Mon Sep 17 00:00:00 2001
From: Mark Olesen <Mark.Olesen@esi-group.com>
Date: Mon, 15 Apr 2024 12:44:56 +0200
Subject: [PATCH] REGRESSION: distributedTriSurfaceMesh:::findLocalInstance
 failure (#3135)

- after the modification of d578d48a4f8c, the parent was now actually
  searched. However, should be returning "constant" and not trigger a
  FatalError if the file/directory is not found.
---
 .../distributedTriSurfaceMesh.C               | 40 ++++++++++++-------
 1 file changed, 25 insertions(+), 15 deletions(-)

diff --git a/src/parallel/distributed/distributedTriSurfaceMesh/distributedTriSurfaceMesh.C b/src/parallel/distributed/distributedTriSurfaceMesh/distributedTriSurfaceMesh.C
index d982b7a8634..647b5ce1126 100644
--- a/src/parallel/distributed/distributedTriSurfaceMesh/distributedTriSurfaceMesh.C
+++ b/src/parallel/distributed/distributedTriSurfaceMesh/distributedTriSurfaceMesh.C
@@ -230,6 +230,7 @@ Foam::word Foam::distributedTriSurfaceMesh::findLocalInstance
 )
 {
     // Modified findInstance which also looks in parent directory
+
     word instance
     (
         io.time().findInstance
@@ -237,8 +238,8 @@ Foam::word Foam::distributedTriSurfaceMesh::findLocalInstance
             io.local(),
             word::null,
             IOobject::READ_IF_PRESENT,
-            word::null,  // No stop instance
-            false        // No "constant" fallback (word::null instead)
+            word::null,             // No stop instance
+            !UPstream::parRun()     // Fallback to "constant" for non-parallel
         )
     );
 
@@ -248,6 +249,8 @@ Foam::word Foam::distributedTriSurfaceMesh::findLocalInstance
     }
 
 
+    // The rest of this code is only when parRun == true ...
+
     // Replicate findInstance operation but now on parent directory
 
     // Search in parent directory
@@ -262,24 +265,27 @@ Foam::word Foam::distributedTriSurfaceMesh::findLocalInstance
         return io.instance();
     }
 
-    instantList ts = io.time().times();
-    label instanceI;
 
     const scalar startValue = io.time().timeOutputValue();
 
-    for (instanceI = ts.size()-1; instanceI >= 0; --instanceI)
+    instantList ts = io.time().times();
+
+    label instIndex = ts.size()-1;
+
+    // Backward search for first time that is <= startValue
+    for (; instIndex >= 0; --instIndex)
     {
-        if (ts[instanceI].value() <= startValue)
+        if (ts[instIndex].value() <= startValue)
         {
             break;
         }
     }
 
-    // continue searching from here
-    for (; instanceI >= 0; --instanceI)
+    // Continue searching from here
+    for (; instIndex >= 0; --instIndex)
     {
         // Shortcut: if actual directory is the timeName we've already tested it
-        if (ts[instanceI].name() == io.instance())
+        if (ts[instIndex].name() == io.instance())
         {
             continue;
         }
@@ -287,12 +293,12 @@ Foam::word Foam::distributedTriSurfaceMesh::findLocalInstance
         parentDir =
         (
             io.rootPath()/io.globalCaseName()
-           /ts[instanceI].name()/io.db().dbDir()/io.local()/io.name()
+           /ts[instIndex].name()/io.db().dbDir()/io.local()/io.name()
         );
 
         if (fileHandler().isDir(parentDir))
         {
-            return ts[instanceI].name();
+            return ts[instIndex].name();
         }
     }
 
@@ -319,11 +325,15 @@ Foam::word Foam::distributedTriSurfaceMesh::findLocalInstance
         }
     }
 
-    FatalErrorInFunction
-        << "Cannot find directory " << io.local() << " in times " << ts
-        << exit(FatalError);
+    // FatalErrorInFunction
+    //     << "Cannot find directory " << io.local() << " in times " << ts
+    //     << exit(FatalError);
+    //
+    // return word::null;
 
-    return word::null;
+    // Nothing found in parent?
+    // - treat like regular findInstance with "constant" fallback
+    return io.time().constant();
 }
 
 
-- 
GitLab