From 2ac5df6f93223935a48af0d9a0422bd2c953dfe8 Mon Sep 17 00:00:00 2001
From: Mark Olesen <Mark.Olesen@esi-group.com>
Date: Mon, 12 Nov 2018 12:59:03 +0100
Subject: [PATCH] BUG: inconsistent field ordering in PDRMesh (fixes #1069)

---
 .../utilities/mesh/advanced/PDRMesh/PDRMesh.C | 239 ++++++++----------
 1 file changed, 110 insertions(+), 129 deletions(-)

diff --git a/applications/utilities/mesh/advanced/PDRMesh/PDRMesh.C b/applications/utilities/mesh/advanced/PDRMesh/PDRMesh.C
index 7fbeb17389c..b54edbda5b1 100644
--- a/applications/utilities/mesh/advanced/PDRMesh/PDRMesh.C
+++ b/applications/utilities/mesh/advanced/PDRMesh/PDRMesh.C
@@ -131,69 +131,69 @@ template<class Type>
 void subsetVolFields
 (
     const fvMeshSubset& subsetter,
-    const IOobjectList& objectsList,
+    const IOobjectList& objects,
     const label patchi,
     const Type& exposedValue,
-    const word GeomVolType,
     PtrList<GeometricField<Type, fvPatchField, volMesh>>& subFields
 )
 {
+    typedef GeometricField<Type, fvPatchField, volMesh> GeoField;
+
     const fvMesh& baseMesh = subsetter.baseMesh();
 
-    label i = 0;
+    label nFields = 0;
 
-    forAllConstIter(IOobjectList , objectsList, iter)
+    for (const word& fieldName : objects.sortedNames<GeoField>())
     {
-        if (iter()->headerClassName() == GeomVolType)
+        const IOobject* ioptr = objects.findObject(fieldName);
+
+        if (!nFields)
         {
-            const word fieldName = iter()->name();
+            Info<< "Subsetting " << GeoField::typeName << nl;
+        }
+        Info<< "    " << fieldName << endl;
 
-            Info<< "Subsetting field " << fieldName << endl;
+        GeoField origField(*ioptr, baseMesh);
 
-            GeometricField<Type, fvPatchField, volMesh> volField
-            (
-                *iter(),
-                baseMesh
-            );
+        subFields.set(nFields, subsetter.interpolate(origField));
+
+        // Explicitly set exposed faces (in patchi) to exposedValue.
+        if (patchi >= 0)
+        {
+            fvPatchField<Type>& fld =
+                subFields[nFields].boundaryFieldRef()[patchi];
 
-            subFields.set(i, subsetter.interpolate(volField));
+            const label newStart = fld.patch().patch().start();
+            const label oldPatchi = subsetter.patchMap()[patchi];
 
-            // Explicitly set exposed faces (in patchi) to exposedValue.
-            if (patchi >= 0)
+            if (oldPatchi == -1)
+            {
+                // New patch. Reset whole value.
+                fld = exposedValue;
+            }
+            else
             {
-                fvPatchField<Type>& fld =
-                    subFields[i++].boundaryFieldRef()[patchi];
+                // Reset faces that originate from different patch
+                // or internal faces.
 
-                label newStart = fld.patch().patch().start();
+                const fvPatchField<Type>& origPfld =
+                    origField.boundaryField()[oldPatchi];
 
-                label oldPatchi = subsetter.patchMap()[patchi];
+                const label oldSize = origPfld.size();
+                const label oldStart = origPfld.patch().patch().start();
 
-                if (oldPatchi == -1)
-                {
-                    // New patch. Reset whole value.
-                    fld = exposedValue;
-                }
-                else
+                forAll(fld, j)
                 {
-                    // Reset those faces that originate from different patch
-                    // or internal faces.
-                    label oldSize = volField.boundaryField()[oldPatchi].size();
-                    label oldStart = volField.boundaryField()
-                    [
-                        oldPatchi
-                    ].patch().patch().start();
-
-                    forAll(fld, j)
-                    {
-                        label oldFacei = subsetter.faceMap()[newStart+j];
+                    const label oldFacei = subsetter.faceMap()[newStart+j];
 
-                        if (oldFacei < oldStart || oldFacei >= oldStart+oldSize)
-                        {
-                            fld[j] = exposedValue;
-                        }
+                    if (oldFacei < oldStart || oldFacei >= oldStart+oldSize)
+                    {
+                        fld[j] = exposedValue;
                     }
                 }
             }
+
+            ++nFields;
         }
     }
 }
@@ -203,71 +203,70 @@ template<class Type>
 void subsetSurfaceFields
 (
     const fvMeshSubset& subsetter,
-    const IOobjectList& objectsList,
+    const IOobjectList& objects,
     const label patchi,
     const Type& exposedValue,
-    const word GeomSurfType,
     PtrList<GeometricField<Type, fvsPatchField, surfaceMesh>>& subFields
 )
 {
+    typedef GeometricField<Type, fvsPatchField, surfaceMesh> GeoField;
+
     const fvMesh& baseMesh = subsetter.baseMesh();
 
-    label i(0);
+    label nFields = 0;
 
-    forAllConstIter(IOobjectList , objectsList, iter)
+    for (const word& fieldName : objects.sortedNames<GeoField>())
     {
-        if (iter()->headerClassName() == GeomSurfType)
+        const IOobject* ioptr = objects.findObject(fieldName);
+
+        if (!nFields)
         {
-            const word& fieldName = iter.key();
+            Info<< "Subsetting " << GeoField::typeName << nl;
+        }
+        Info<< "    " << fieldName << endl;
 
-            Info<< "Subsetting field " << fieldName << endl;
+        GeoField origField(*ioptr, baseMesh);
 
-            GeometricField<Type, fvsPatchField, surfaceMesh> volField
-            (
-                *iter(),
-                baseMesh
-            );
+        subFields.set(nFields, subsetter.interpolate(origField));
 
-            subFields.set(i, subsetter.interpolate(volField));
+        // Explicitly set exposed faces (in patchi) to exposedValue.
+        if (patchi >= 0)
+        {
+            fvsPatchField<Type>& fld =
+                subFields[nFields].boundaryFieldRef()[patchi];
 
+            const label newStart = fld.patch().patch().start();
+            const label oldPatchi = subsetter.patchMap()[patchi];
 
-            // Explicitly set exposed faces (in patchi) to exposedValue.
-            if (patchi >= 0)
+            if (oldPatchi == -1)
             {
-                fvsPatchField<Type>& fld =
-                    subFields[i++].boundaryFieldRef()[patchi];
+                // New patch. Reset whole value.
+                fld = exposedValue;
+            }
+            else
+            {
+                // Reset faces that originate from different patch
+                // or internal faces.
 
-                label newStart = fld.patch().patch().start();
+                const fvsPatchField<Type>& origPfld =
+                    origField.boundaryField()[oldPatchi];
 
-                label oldPatchi = subsetter.patchMap()[patchi];
+                const label oldSize = origPfld.size();
+                const label oldStart = origPfld.patch().patch().start();
 
-                if (oldPatchi == -1)
-                {
-                    // New patch. Reset whole value.
-                    fld = exposedValue;
-                }
-                else
+                forAll(fld, j)
                 {
-                    // Reset those faces that originate from different patch
-                    // or internal faces.
-                    label oldSize = volField.boundaryField()[oldPatchi].size();
-                    label oldStart = volField.boundaryField()
-                    [
-                        oldPatchi
-                    ].patch().patch().start();
-
-                    forAll(fld, j)
-                    {
-                        label oldFacei = subsetter.faceMap()[newStart+j];
+                    const label oldFacei = subsetter.faceMap()[newStart+j];
 
-                        if (oldFacei < oldStart || oldFacei >= oldStart+oldSize)
-                        {
-                            fld[j] = exposedValue;
-                        }
+                    if (oldFacei < oldStart || oldFacei >= oldStart+oldSize)
+                    {
+                        fld[j] = exposedValue;
                     }
                 }
             }
         }
+
+        ++nFields;
     }
 }
 
@@ -287,18 +286,11 @@ void initCreatedPatches
         mesh.objectRegistry::lookupClass<GeoField>()
     );
 
-    for
-    (
-        typename HashTable<const GeoField*>::
-            iterator fieldIter = fields.begin();
-        fieldIter != fields.end();
-        ++fieldIter
-    )
+    forAllIters(fields, fieldIter)
     {
         GeoField& field = const_cast<GeoField&>(*fieldIter());
 
-        typename GeoField::Boundary& fieldBf =
-            field.boundaryFieldRef();
+        auto& fieldBf = field.boundaryFieldRef();
 
         forAll(fieldBf, patchi)
         {
@@ -321,7 +313,7 @@ template<class TopoSet>
 void subsetTopoSets
 (
     const fvMesh& mesh,
-    const IOobjectList& objectsList,
+    const IOobjectList& objects,
     const labelList& map,
     const fvMesh& subMesh,
     PtrList<TopoSet>& subSets
@@ -329,12 +321,12 @@ void subsetTopoSets
 {
     // Read original sets
     PtrList<TopoSet> sets;
-    ReadFields<TopoSet>(objectsList, sets);
+    ReadFields<TopoSet>(objects, sets);
 
-    subSets.setSize(sets.size());
-    forAll(sets, i)
+    subSets.resize(sets.size());
+    forAll(sets, seti)
     {
-        TopoSet& set = sets[i];
+        TopoSet& set = sets[seti];
 
         Info<< "Subsetting " << set.type() << " " << set.name() << endl;
 
@@ -356,10 +348,10 @@ void subsetTopoSets
 
         subSets.set
         (
-            i,
+            seti,
             new TopoSet(subMesh, set.name(), nSet, IOobject::AUTO_WRITE)
         );
-        TopoSet& subSet = subSets[i];
+        TopoSet& subSet = subSets[seti];
 
         forAll(map, i)
         {
@@ -847,7 +839,7 @@ int main(int argc, char *argv[])
     }
     // Read vol fields and subset.
 
-    wordList scalarNames(objects.names(volScalarField::typeName));
+    wordList scalarNames(objects.sortedNames<volScalarField>());
     PtrList<volScalarField> scalarFlds(scalarNames.size());
     subsetVolFields
     (
@@ -855,11 +847,10 @@ int main(int argc, char *argv[])
         objects,
         defaultPatchi,
         scalar(Zero),
-        volScalarField::typeName,
         scalarFlds
     );
 
-    wordList vectorNames(objects.names(volVectorField::typeName));
+    wordList vectorNames(objects.sortedNames<volVectorField>());
     PtrList<volVectorField> vectorFlds(vectorNames.size());
     subsetVolFields
     (
@@ -867,17 +858,16 @@ int main(int argc, char *argv[])
         objects,
         defaultPatchi,
         vector(Zero),
-        volVectorField::typeName,
         vectorFlds
     );
 
-    wordList sphericalTensorNames
+    wordList sphTensorNames
     (
-        objects.names(volSphericalTensorField::typeName)
+        objects.sortedNames<volSphericalTensorField>()
     );
-    PtrList<volSphericalTensorField> sphericalTensorFlds
+    PtrList<volSphericalTensorField> sphTensorFlds
     (
-        sphericalTensorNames.size()
+        sphTensorNames.size()
     );
     subsetVolFields
     (
@@ -885,11 +875,10 @@ int main(int argc, char *argv[])
         objects,
         defaultPatchi,
         sphericalTensor(Zero),
-        volSphericalTensorField::typeName,
-        sphericalTensorFlds
+        sphTensorFlds
     );
 
-    wordList symmTensorNames(objects.names(volSymmTensorField::typeName));
+    wordList symmTensorNames(objects.sortedNames<volSymmTensorField>());
     PtrList<volSymmTensorField> symmTensorFlds(symmTensorNames.size());
     subsetVolFields
     (
@@ -897,11 +886,10 @@ int main(int argc, char *argv[])
         objects,
         defaultPatchi,
         symmTensor(Zero),
-        volSymmTensorField::typeName,
         symmTensorFlds
     );
 
-    wordList tensorNames(objects.names(volTensorField::typeName));
+    wordList tensorNames(objects.sortedNames<volTensorField>());
     PtrList<volTensorField> tensorFlds(tensorNames.size());
     subsetVolFields
     (
@@ -909,13 +897,12 @@ int main(int argc, char *argv[])
         objects,
         defaultPatchi,
         tensor(Zero),
-        volTensorField::typeName,
         tensorFlds
     );
 
     // Read surface fields and subset.
 
-    wordList surfScalarNames(objects.names(surfaceScalarField::typeName));
+    wordList surfScalarNames(objects.sortedNames<surfaceScalarField>());
     PtrList<surfaceScalarField> surfScalarFlds(surfScalarNames.size());
     subsetSurfaceFields
     (
@@ -923,11 +910,10 @@ int main(int argc, char *argv[])
         objects,
         defaultPatchi,
         scalar(Zero),
-        surfaceScalarField::typeName,
         surfScalarFlds
     );
 
-    wordList surfVectorNames(objects.names(surfaceVectorField::typeName));
+    wordList surfVectorNames(objects.sortedNames<surfaceVectorField>());
     PtrList<surfaceVectorField> surfVectorFlds(surfVectorNames.size());
     subsetSurfaceFields
     (
@@ -935,17 +921,16 @@ int main(int argc, char *argv[])
         objects,
         defaultPatchi,
         vector(Zero),
-        surfaceVectorField::typeName,
         surfVectorFlds
     );
 
-    wordList surfSphericalTensorNames
+    wordList surfSphTensorNames
     (
-        objects.names(surfaceSphericalTensorField::typeName)
+        objects.sortedNames<surfaceSphericalTensorField>()
     );
     PtrList<surfaceSphericalTensorField> surfSphericalTensorFlds
     (
-        surfSphericalTensorNames.size()
+        surfSphTensorNames.size()
     );
     subsetSurfaceFields
     (
@@ -953,13 +938,12 @@ int main(int argc, char *argv[])
         objects,
         defaultPatchi,
         sphericalTensor(Zero),
-        surfaceSphericalTensorField::typeName,
         surfSphericalTensorFlds
     );
 
     wordList surfSymmTensorNames
     (
-        objects.names(surfaceSymmTensorField::typeName)
+        objects.sortedNames<surfaceSymmTensorField>()
     );
 
     PtrList<surfaceSymmTensorField> surfSymmTensorFlds
@@ -973,11 +957,10 @@ int main(int argc, char *argv[])
         objects,
         defaultPatchi,
         symmTensor(Zero),
-        surfaceSymmTensorField::typeName,
         surfSymmTensorFlds
     );
 
-    wordList surfTensorNames(objects.names(surfaceTensorField::typeName));
+    wordList surfTensorNames(objects.sortedNames<surfaceTensorField>());
     PtrList<surfaceTensorField> surfTensorFlds(surfTensorNames.size());
     subsetSurfaceFields
     (
@@ -985,7 +968,6 @@ int main(int argc, char *argv[])
         objects,
         defaultPatchi,
         tensor(Zero),
-        surfaceTensorField::typeName,
         surfTensorFlds
     );
 
@@ -1023,7 +1005,6 @@ int main(int argc, char *argv[])
     }
 
 
-
     if (!overwrite)
     {
         ++runTime;
@@ -1043,10 +1024,10 @@ int main(int argc, char *argv[])
         vectorFlds[i].rename(vectorNames[i]);
         vectorFlds[i].writeOpt() = IOobject::AUTO_WRITE;
     }
-    forAll(sphericalTensorFlds, i)
+    forAll(sphTensorFlds, i)
     {
-        sphericalTensorFlds[i].rename(sphericalTensorNames[i]);
-        sphericalTensorFlds[i].writeOpt() = IOobject::AUTO_WRITE;
+        sphTensorFlds[i].rename(sphTensorNames[i]);
+        sphTensorFlds[i].writeOpt() = IOobject::AUTO_WRITE;
     }
     forAll(symmTensorFlds, i)
     {
@@ -1072,7 +1053,7 @@ int main(int argc, char *argv[])
     }
     forAll(surfSphericalTensorFlds, i)
     {
-        surfSphericalTensorFlds[i].rename(surfSphericalTensorNames[i]);
+        surfSphericalTensorFlds[i].rename(surfSphTensorNames[i]);
         surfSphericalTensorFlds[i].writeOpt() = IOobject::AUTO_WRITE;
     }
     forAll(surfSymmTensorFlds, i)
@@ -1179,7 +1160,7 @@ int main(int argc, char *argv[])
     (
         subsetter.subMesh(),
         map,
-        0.0
+        Zero
     );
     initCreatedPatches<volVectorField>
     (
@@ -1210,7 +1191,7 @@ int main(int argc, char *argv[])
     (
         subsetter.subMesh(),
         map,
-        0.0
+        Zero
     );
     initCreatedPatches<surfaceVectorField>
     (
-- 
GitLab