From 2fa0c7520c32afc344d4ae212672fbaa6f1f426f Mon Sep 17 00:00:00 2001
From: Mark Olesen <Mark.Olesen@esi-group.com>
Date: Sun, 10 Dec 2023 17:08:40 +0100
Subject: [PATCH] ENH: provide faMesh static accessors for registry and
 single-region

- the fields for finite-area are currently stored directly on the
  polyMesh registry, but for future relocation to a sub-registry
  provide a uniform accessor.

ENH: use thisDb() for faMatrix access and extrapolatedCalculated
---
 src/finiteArea/faMatrices/faMatrix/faMatrix.C | 14 +++------
 src/finiteArea/faMesh/faMesh.C                | 19 ++++++++++++
 src/finiteArea/faMesh/faMesh.H                |  8 +++++
 .../utilities/areaWrite/areaWrite.C           | 29 +++++++++++++------
 .../utilities/areaWrite/areaWrite.H           |  8 ++---
 5 files changed, 55 insertions(+), 23 deletions(-)

diff --git a/src/finiteArea/faMatrices/faMatrix/faMatrix.C b/src/finiteArea/faMatrices/faMatrix/faMatrix.C
index 55aa863bf71..074cc0693a8 100644
--- a/src/finiteArea/faMatrices/faMatrix/faMatrix.C
+++ b/src/finiteArea/faMatrices/faMatrix/faMatrix.C
@@ -2108,18 +2108,12 @@ Foam::operator&
     const DimensionedField<Type, areaMesh>& psi
 )
 {
-    auto tMphi = tmp<GeometricField<Type, faPatchField, areaMesh>>::New
+    auto tMphi = GeometricField<Type, faPatchField, areaMesh>::New
     (
-        IOobject
-        (
-            "M&" + psi.name(),
-            psi.instance(),
-            psi.mesh().mesh(),
-            IOobject::NO_READ,
-            IOobject::NO_WRITE
-        ),
+        "M&" + psi.name(),
         psi.mesh(),
-        M.dimensions()/dimArea
+        M.dimensions()/dimArea,
+        faPatchFieldBase::extrapolatedCalculatedType()
     );
     auto& Mphi = tMphi.ref();
 
diff --git a/src/finiteArea/faMesh/faMesh.C b/src/finiteArea/faMesh/faMesh.C
index 7a0efb3f9f0..8e095062728 100644
--- a/src/finiteArea/faMesh/faMesh.C
+++ b/src/finiteArea/faMesh/faMesh.C
@@ -68,6 +68,25 @@ Foam::word Foam::faMesh::meshSubDir = "faMesh";
 const int Foam::faMesh::quadricsFit_ = 0;  // Tuning (experimental)
 
 
+// * * * * * * * * * * * * * Static Member Functions * * * * * * * * * * * * //
+
+const Foam::objectRegistry* Foam::faMesh::registry(const polyMesh& pMesh)
+{
+    // This will change in the near future
+    return &static_cast<const objectRegistry&>(pMesh);
+}
+
+
+const Foam::faMesh& Foam::faMesh::mesh
+(
+    const polyMesh& pMesh
+)
+{
+    // This will change in the near future
+    return pMesh.lookupObject<faMesh>("faMesh");
+}
+
+
 // * * * * * * * * * * * * * * * Local Functions * * * * * * * * * * * * * * //
 
 namespace Foam
diff --git a/src/finiteArea/faMesh/faMesh.H b/src/finiteArea/faMesh/faMesh.H
index c6443000813..49d35817f21 100644
--- a/src/finiteArea/faMesh/faMesh.H
+++ b/src/finiteArea/faMesh/faMesh.H
@@ -625,6 +625,14 @@ public:
 
     // Database
 
+        //- The parent registry containing all finite-area meshes
+        //- on the polyMesh.
+        static const objectRegistry* registry(const polyMesh& pMesh);
+
+        //- The single-region finite-area region on the polyMesh.
+        //- Uses lookupObject semantics - Fatal if non-existent
+        static const faMesh& mesh(const polyMesh& pMesh);
+
         //- Return access to polyMesh
         inline const polyMesh& mesh() const;
 
diff --git a/src/functionObjects/utilities/areaWrite/areaWrite.C b/src/functionObjects/utilities/areaWrite/areaWrite.C
index 424471ddc72..cecb0e2fac3 100644
--- a/src/functionObjects/utilities/areaWrite/areaWrite.C
+++ b/src/functionObjects/utilities/areaWrite/areaWrite.C
@@ -148,18 +148,24 @@ bool Foam::areaWrite::read(const dictionary& dict)
 
     verbose_ = dict.getOrDefault("verbose", false);
 
+    // Registry containing all finite-area meshes on the polyMesh
+    const auto* faRegistry = faMesh::registry(mesh_);
+
     dict.readIfPresent("areas", selectAreas_);
 
     if (selectAreas_.empty())
     {
         word areaName;
+
         if (!dict.readIfPresent("area", areaName))
         {
-            wordList available = obr().sortedNames<faMesh>();
-
-            if (available.size())
+            if (faRegistry)
             {
-                areaName = available.front();
+                wordList available = faRegistry->sortedNames<faMesh>();
+                if (!available.empty())
+                {
+                    areaName = available.front();
+                }
             }
         }
 
@@ -171,7 +177,12 @@ bool Foam::areaWrite::read(const dictionary& dict)
     }
 
     // Restrict to specified meshes
-    meshes_ = obr().csorted<faMesh>(selectAreas_);
+    meshes_.clear();
+
+    if (faRegistry)
+    {
+        meshes_ = faRegistry->csorted<faMesh>(selectAreas_);
+    }
 
     dict.readEntry("fields", fieldSelection_);
     fieldSelection_.uniq();
@@ -252,7 +263,7 @@ bool Foam::areaWrite::write()
 
         selected.clear();
 
-        IOobjectList objects(0);
+        IOobjectList objects;
 
         if (loadFromFiles_)
         {
@@ -279,7 +290,7 @@ bool Foam::areaWrite::write()
         {
             if (!ListOps::found(allFields, fieldSelection_[i]))
             {
-                missed.append(i);
+                missed.push_back(i);
             }
         }
 
@@ -304,8 +315,8 @@ bool Foam::areaWrite::write()
 
             if
             (
-                fieldTypes::area.found(clsName)
-             || fieldTypes::area_internal.found(clsName)
+                fieldTypes::area.contains(clsName)
+             || fieldTypes::area_internal.contains(clsName)
             )
             {
                 nAreaFields += n;
diff --git a/src/functionObjects/utilities/areaWrite/areaWrite.H b/src/functionObjects/utilities/areaWrite/areaWrite.H
index 4c261640708..4974f9f56b1 100644
--- a/src/functionObjects/utilities/areaWrite/areaWrite.H
+++ b/src/functionObjects/utilities/areaWrite/areaWrite.H
@@ -75,8 +75,8 @@ SourceFiles
 
 \*---------------------------------------------------------------------------*/
 
-#ifndef areaWrite_H
-#define areaWrite_H
+#ifndef Foam_areaWrite_H
+#define Foam_areaWrite_H
 
 #include "fvMeshFunctionObject.H"
 #include "polyMesh.H"
@@ -191,8 +191,8 @@ public:
             const dictionary& dict
         );
 
-        //- Construct for given objectRegistry and dictionary
-        //  allow the possibility to load fields from files
+        //- Construct for given objectRegistry and dictionary.
+        //- Allow the possibility to load fields from files
         areaWrite
         (
             const word& name,
-- 
GitLab