From 4495db0302a7122860d65d778d4bf3822f5d7b77 Mon Sep 17 00:00:00 2001
From: Mark Olesen <Mark.Olesen@esi-group.com>
Date: Wed, 16 Mar 2022 14:06:46 +0100
Subject: [PATCH] ENH: avoid redundant IOobjectList use

- areaWrite and fileFieldSelection
---
 .../fileFieldSelection/fileFieldSelection.C   | 100 ++++++++++++++----
 .../fileFieldSelection/fileFieldSelection.H   |  63 +++++------
 .../fileFieldSelectionTemplates.C             |  83 ---------------
 .../utilities/areaWrite/areaWrite.C           |   5 +-
 4 files changed, 115 insertions(+), 136 deletions(-)
 delete mode 100644 src/finiteVolume/functionObjects/fieldSelections/fileFieldSelection/fileFieldSelectionTemplates.C

diff --git a/src/finiteVolume/functionObjects/fieldSelections/fileFieldSelection/fileFieldSelection.C b/src/finiteVolume/functionObjects/fieldSelections/fileFieldSelection/fileFieldSelection.C
index cc6a45699cf..308f4c802a4 100644
--- a/src/finiteVolume/functionObjects/fieldSelections/fileFieldSelection/fileFieldSelection.C
+++ b/src/finiteVolume/functionObjects/fieldSelections/fileFieldSelection/fileFieldSelection.C
@@ -5,7 +5,7 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2017-2019 OpenCFD Ltd.
+    Copyright (C) 2017-2022 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -27,45 +27,98 @@ License
 
 #include "fileFieldSelection.H"
 #include "objectRegistry.H"
+#include "IOobjectList.H"
+#include "fvMesh.H"
 #include "volMesh.H"
 #include "fvPatchField.H"
 #include "surfaceMesh.H"
 #include "fvsPatchField.H"
 #include "pointMesh.H"
 #include "pointPatchField.H"
+#include "GeometricField.H"
 #include "UniformDimensionedField.H"
 
-void Foam::functionObjects::fileFieldSelection::addInternalFieldTypes
+// * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
+
+template<class Type>
+void Foam::functionObjects::fileFieldSelection::addFromFile
 (
+    const IOobjectList& objects,
     DynamicList<fieldInfo>& set
 ) const
 {
-    const fvMesh& mesh = static_cast<const fvMesh&>(obr_);
+    for (const fieldInfo& fi : *this)
+    {
+        const wordList names(objects.sortedNames<Type>(fi.name()));
+
+        if (names.size())
+        {
+            for (const word& name : names)
+            {
+                set.append(fieldInfo(wordRe(name)));
+            }
+
+            fi.found() = true;
+        }
+    }
+}
 
-    const IOobjectList allObjects(mesh, mesh.time().timeName());
 
-    addFromFile<DimensionedField<scalar, volMesh>>(allObjects, set);
-    addFromFile<DimensionedField<vector, volMesh>>(allObjects, set);
-    addFromFile<DimensionedField<sphericalTensor, volMesh>>(allObjects, set);
-    addFromFile<DimensionedField<symmTensor, volMesh>>(allObjects, set);
-    addFromFile<DimensionedField<tensor, volMesh>>(allObjects, set);
+template<template<class> class PatchType, class MeshType>
+void Foam::functionObjects::fileFieldSelection::addGeoFieldTypes
+(
+    const IOobjectList& objects,
+    DynamicList<fieldInfo>& set
+) const
+{
+    #undef  doLocalCode
+    #define doLocalCode(DataType)                                             \
+    addFromFile<GeometricField<DataType, PatchType, MeshType>>(objects, set);
+
+    doLocalCode(scalar);
+    doLocalCode(vector);
+    doLocalCode(sphericalTensor);
+    doLocalCode(symmTensor);
+    doLocalCode(tensor);
+    #undef doLocalCode
 }
 
 
-void Foam::functionObjects::fileFieldSelection::addUniformFieldTypes
+void Foam::functionObjects::fileFieldSelection::addInternalFieldTypes
 (
+    const IOobjectList& objects,
     DynamicList<fieldInfo>& set
 ) const
 {
-    const fvMesh& mesh = static_cast<const fvMesh&>(obr_);
+    #undef  doLocalCode
+    #define doLocalCode(DataType)                                             \
+    addFromFile<DimensionedField<DataType, volMesh>>(objects, set);
+
+    doLocalCode(scalar);
+    doLocalCode(vector);
+    doLocalCode(sphericalTensor);
+    doLocalCode(symmTensor);
+    doLocalCode(tensor);
+    #undef doLocalCode
+}
 
-    const IOobjectList allObjects(mesh, mesh.time().timeName());
 
-    addFromFile<UniformDimensionedField<scalar>>(allObjects, set);
-    addFromFile<UniformDimensionedField<vector>>(allObjects, set);
-    addFromFile<UniformDimensionedField<sphericalTensor>>(allObjects, set);
-    addFromFile<UniformDimensionedField<symmTensor>>(allObjects, set);
-    addFromFile<UniformDimensionedField<tensor>>(allObjects, set);
+void Foam::functionObjects::fileFieldSelection::addUniformFieldTypes
+(
+    const IOobjectList& objects,
+    DynamicList<fieldInfo>& set
+) const
+{
+    #undef  doLocalCode
+    #define doLocalCode(DataType)                                             \
+    addFromFile<UniformDimensionedField<DataType>>(objects, set);
+
+    doLocalCode(scalar);
+    doLocalCode(vector);
+    doLocalCode(sphericalTensor);
+    doLocalCode(symmTensor);
+    doLocalCode(tensor);
+    #undef doLocalCode
 }
 
 
@@ -85,20 +138,23 @@ Foam::functionObjects::fileFieldSelection::fileFieldSelection
 
 bool Foam::functionObjects::fileFieldSelection::updateSelection()
 {
+    const fvMesh& mesh = static_cast<const fvMesh&>(obr_);
+    const IOobjectList objects(mesh, mesh.time().timeName());
+
     List<fieldInfo> oldSet(std::move(selection_));
 
     DynamicList<fieldInfo> newSelection(oldSet.size());
 
     // Geometric fields
-    addGeoFieldTypes<fvPatchField, volMesh>(newSelection);
-    addGeoFieldTypes<fvsPatchField, surfaceMesh>(newSelection);
-    addGeoFieldTypes<pointPatchField, pointMesh>(newSelection);
+    addGeoFieldTypes<fvPatchField, volMesh>(objects, newSelection);
+    addGeoFieldTypes<fvsPatchField, surfaceMesh>(objects, newSelection);
+    addGeoFieldTypes<pointPatchField, pointMesh>(objects, newSelection);
 
     // Internal fields
-    addInternalFieldTypes(newSelection);
+    addInternalFieldTypes(objects, newSelection);
 
     // Uniform fields
-    addUniformFieldTypes(newSelection);
+    addUniformFieldTypes(objects, newSelection);
 
     selection_.transfer(newSelection);
 
diff --git a/src/finiteVolume/functionObjects/fieldSelections/fileFieldSelection/fileFieldSelection.H b/src/finiteVolume/functionObjects/fieldSelections/fileFieldSelection/fileFieldSelection.H
index 28b0756d215..50d4d09df3a 100644
--- a/src/finiteVolume/functionObjects/fieldSelections/fileFieldSelection/fileFieldSelection.H
+++ b/src/finiteVolume/functionObjects/fieldSelections/fileFieldSelection/fileFieldSelection.H
@@ -5,7 +5,7 @@
     \\  /    A nd           | www.openfoam.com
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
-    Copyright (C) 2017-2019 OpenCFD Ltd.
+    Copyright (C) 2017-2022 OpenCFD Ltd.
 -------------------------------------------------------------------------------
 License
     This file is part of OpenFOAM.
@@ -44,6 +44,7 @@ SourceFiles
 namespace Foam
 {
 
+// Forward Declarations
 class IOobjectList;
 
 namespace functionObjects
@@ -57,45 +58,53 @@ class fileFieldSelection
 :
     public fieldSelection
 {
-private:
-
     // Private Member Functions
 
-        //- No copy construct
-        fileFieldSelection(const fileFieldSelection&) = delete;
-
-
-protected:
-
-    // Protected Member Functions
+        //- Add objects of a given type
+        template<class Type>
+        void addFromFile
+        (
+            const IOobjectList& objects,
+            DynamicList<fieldInfo>& set
+        ) const;
 
         //- Add registered GeometricField types to selection
         template<template<class> class PatchType, class MeshType>
-        void addGeoFieldTypes(DynamicList<fieldInfo>& set) const;
+        void addGeoFieldTypes
+        (
+            const IOobjectList& objects,
+            DynamicList<fieldInfo>& set
+        ) const;
 
         //- Add registered Internal types to selection
-        void addInternalFieldTypes(DynamicList<fieldInfo>& set) const;
+        void addInternalFieldTypes
+        (
+            const IOobjectList& objects,
+            DynamicList<fieldInfo>& set
+        ) const;
 
         //- Add registered uniform types to selection
-        void addUniformFieldTypes(DynamicList<fieldInfo>& set) const;
-
-        //- Add objects of a given type
-        template<class Type>
-        void addFromFile
+        void addUniformFieldTypes
         (
-            const IOobjectList& allFileObjects,
+            const IOobjectList& objects,
             DynamicList<fieldInfo>& set
         ) const;
 
 
+        //- No copy construct
+        fileFieldSelection(const fileFieldSelection&) = delete;
+
+
 public:
 
-    //- Construct from object registry
-    fileFieldSelection
-    (
-        const objectRegistry& obr,
-        const bool includeComponents = false
-    );
+    // Constructors
+
+        //- Construct from object registry
+        explicit fileFieldSelection
+        (
+            const objectRegistry& obr,
+            const bool includeComponents = false
+        );
 
 
     //- Destructor
@@ -116,12 +125,6 @@ public:
 
 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
-#ifdef NoRepository
-    #include "fileFieldSelectionTemplates.C"
-#endif
-
-// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
-
 #endif
 
 // ************************************************************************* //
diff --git a/src/finiteVolume/functionObjects/fieldSelections/fileFieldSelection/fileFieldSelectionTemplates.C b/src/finiteVolume/functionObjects/fieldSelections/fileFieldSelection/fileFieldSelectionTemplates.C
deleted file mode 100644
index 12801b87b26..00000000000
--- a/src/finiteVolume/functionObjects/fieldSelections/fileFieldSelection/fileFieldSelectionTemplates.C
+++ /dev/null
@@ -1,83 +0,0 @@
-/*---------------------------------------------------------------------------*\
-  =========                 |
-  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
-   \\    /   O peration     |
-    \\  /    A nd           | www.openfoam.com
-     \\/     M anipulation  |
--------------------------------------------------------------------------------
-    Copyright (C) 2017 OpenCFD Ltd.
--------------------------------------------------------------------------------
-License
-    This file is part of OpenFOAM.
-
-    OpenFOAM is free software: you can redistribute it and/or modify it
-    under the terms of the GNU General Public License as published by
-    the Free Software Foundation, either version 3 of the License, or
-    (at your option) any later version.
-
-    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
-    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
-    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
-    for more details.
-
-    You should have received a copy of the GNU General Public License
-    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
-
-\*---------------------------------------------------------------------------*/
-
-#include "IOobjectList.H"
-#include "GeometricField.H"
-#include "fvMesh.H"
-
-// * * * * * * * * * * * * * Protected Member Functions  * * * * * * * * * * //
-
-template<class Type>
-void Foam::functionObjects::fileFieldSelection::addFromFile
-(
-    const IOobjectList& allFileObjects,
-    DynamicList<fieldInfo>& set
-) const
-{
-    for (const fieldInfo& fi : *this)
-    {
-        const wordList names(allFileObjects.names(Type::typeName, fi.name()));
-        if (names.size())
-        {
-            for (const word& name : names)
-            {
-                set.append(fieldInfo(wordRe(name)));
-            }
-
-            fi.found() = true;
-        }
-    }
-}
-
-
-template<template<class> class PatchType, class MeshType>
-void Foam::functionObjects::fileFieldSelection::addGeoFieldTypes
-(
-    DynamicList<fieldInfo>& set
-) const
-{
-    const fvMesh& mesh = static_cast<const fvMesh&>(obr_);
-
-    const IOobjectList allObjects(mesh, mesh.time().timeName());
-
-    addFromFile<GeometricField<scalar, PatchType, MeshType>>(allObjects, set);
-    addFromFile<GeometricField<vector, PatchType, MeshType>>(allObjects, set);
-    addFromFile<GeometricField<sphericalTensor, PatchType, MeshType>>
-    (
-        allObjects,
-        set
-    );
-    addFromFile<GeometricField<symmTensor, PatchType, MeshType>>
-    (
-        allObjects,
-        set
-    );
-    addFromFile<GeometricField<tensor, PatchType, MeshType>>(allObjects, set);
-}
-
-
-// ************************************************************************* //
diff --git a/src/functionObjects/utilities/areaWrite/areaWrite.C b/src/functionObjects/utilities/areaWrite/areaWrite.C
index 50824c226fd..6c4a7bdaf3c 100644
--- a/src/functionObjects/utilities/areaWrite/areaWrite.C
+++ b/src/functionObjects/utilities/areaWrite/areaWrite.C
@@ -249,10 +249,13 @@ bool Foam::areaWrite::write()
 
         selected.clear();
 
-        const IOobjectList objects(areaMesh.thisDb(), obr_.time().timeName());
+        IOobjectList objects(0);
 
         if (loadFromFiles_)
         {
+            // Check files for a particular time
+            objects = IOobjectList(areaMesh.thisDb(), obr_.time().timeName());
+
             allFields = objects.names();
             selected = objects.classes(fieldSelection_);
         }
-- 
GitLab