From 53e9c8eb5ab0eb3c715db2b4f76bf8319964afd1 Mon Sep 17 00:00:00 2001
From: Andrew Heather <>
Date: Fri, 3 Dec 2021 11:44:09 +0000
Subject: [PATCH] ENH: forces|Coeffs FO - updated coordinate system

---
 .../forces/forceCoeffs/forceCoeffs.C          | 21 ++++---
 src/functionObjects/forces/forces/forces.C    | 60 +++++++++----------
 src/functionObjects/forces/forces/forces.H    |  4 +-
 3 files changed, 44 insertions(+), 41 deletions(-)

diff --git a/src/functionObjects/forces/forceCoeffs/forceCoeffs.C b/src/functionObjects/forces/forceCoeffs/forceCoeffs.C
index b57bf9d2b8e..376df8038e3 100644
--- a/src/functionObjects/forces/forceCoeffs/forceCoeffs.C
+++ b/src/functionObjects/forces/forceCoeffs/forceCoeffs.C
@@ -89,17 +89,18 @@ void Foam::functionObjects::forceCoeffs::writeIntegratedHeader
     Ostream& os
 ) const
 {
+    const auto& coordSys = coordSysPtr_();
     writeHeader(os, "Force coefficients");
-    writeHeaderValue(os, "dragDir", coordSys_.e1());
-    writeHeaderValue(os, "sideDir", coordSys_.e2());
-    writeHeaderValue(os, "liftDir", coordSys_.e3());
-    writeHeaderValue(os, "rollAxis", coordSys_.e1());
-    writeHeaderValue(os, "pitchAxis", coordSys_.e2());
-    writeHeaderValue(os, "yawAxis", coordSys_.e3());
+    writeHeaderValue(os, "dragDir", coordSys.e1());
+    writeHeaderValue(os, "sideDir", coordSys.e2());
+    writeHeaderValue(os, "liftDir", coordSys.e3());
+    writeHeaderValue(os, "rollAxis", coordSys.e1());
+    writeHeaderValue(os, "pitchAxis", coordSys.e2());
+    writeHeaderValue(os, "yawAxis", coordSys.e3());
     writeHeaderValue(os, "magUInf", magUInf_);
     writeHeaderValue(os, "lRef", lRef_);
     writeHeaderValue(os, "Aref", Aref_);
-    writeHeaderValue(os, "CofR", coordSys_.origin());
+    writeHeaderValue(os, "CofR", coordSys.origin());
     writeHeader(os, "");
     writeCommented(os, "Time");
     writeTabbed(os, "Cd");
@@ -362,10 +363,12 @@ bool Foam::functionObjects::forceCoeffs::execute()
     const scalar momentScaling = 1.0/(Aref_*pDyn*lRef_ + SMALL);
     const scalar forceScaling = 1.0/(Aref_*pDyn + SMALL);
 
+    const auto& coordSys = coordSysPtr_();
+
     forAll(liftCoeffs, i)
     {
-        const Field<vector> localForce(coordSys_.localVector(force_[i]));
-        const Field<vector> localMoment(coordSys_.localVector(moment_[i]));
+        const Field<vector> localForce(coordSys.localVector(force_[i]));
+        const Field<vector> localMoment(coordSys.localVector(moment_[i]));
 
         dragCoeffs[i] = forceScaling*(localForce.component(0));
         sideCoeffs[i] = forceScaling*(localForce.component(1));
diff --git a/src/functionObjects/forces/forces/forces.C b/src/functionObjects/forces/forces/forces.C
index dbf2abe1e48..7d6b61f480a 100644
--- a/src/functionObjects/forces/forces/forces.C
+++ b/src/functionObjects/forces/forces/forces.C
@@ -77,7 +77,7 @@ void Foam::functionObjects::forces::writeIntegratedHeader
 ) const
 {
     writeHeader(os, header);
-    writeHeaderValue(os, "CofR", coordSys_.origin());
+    writeHeaderValue(os, "CofR", coordSysPtr_->origin());
     writeHeader(os, "");
     writeCommented(os, "Time");
     writeTabbed(os, "(total_x total_y total_z)");
@@ -156,17 +156,17 @@ void Foam::functionObjects::forces::setCoordinateSystem
     const word& e1Name
 )
 {
-    coordSys_.clear();
+    coordSysPtr_.clear();
 
-    if (dict.readIfPresent<point>("CofR", coordSys_.origin()))
+    point origin(Zero);
+    if (dict.readIfPresent<point>("CofR", origin))
     {
         const vector e3 = e3Name == word::null ?
             vector(0, 0, 1) : dict.get<vector>(e3Name);
         const vector e1 = e1Name == word::null ?
             vector(1, 0, 0) : dict.get<vector>(e1Name);
 
-        coordSys_ =
-            coordSystem::cartesian(coordSys_.origin(), e3, e1);
+        coordSysPtr_.reset(new coordSystem::cartesian(origin, e3, e1));
     }
     else
     {
@@ -176,7 +176,7 @@ void Foam::functionObjects::forces::setCoordinateSystem
         if (dict.found(coordinateSystem::typeName_()))
         {
             // New() for access to indirect (global) coordinate system
-            coordSys_ =
+            coordSysPtr_ =
                 coordinateSystem::New
                 (
                     obr_,
@@ -186,7 +186,7 @@ void Foam::functionObjects::forces::setCoordinateSystem
         }
         else
         {
-            coordSys_ = coordSystem::cartesian(dict);
+            coordSysPtr_.reset(new coordSystem::cartesian(dict));
         }
     }
 
@@ -604,21 +604,23 @@ void Foam::functionObjects::forces::writeForces()
 {
     Log << type() << " " << name() << " write:" << nl;
 
+    const auto& coordSys = coordSysPtr_();
+
     writeIntegratedForceMoment
     (
         "forces",
-        coordSys_.localVector(force_[0]),
-        coordSys_.localVector(force_[1]),
-        coordSys_.localVector(force_[2]),
+        coordSys.localVector(force_[0]),
+        coordSys.localVector(force_[1]),
+        coordSys.localVector(force_[2]),
         forceFilePtr_
     );
 
     writeIntegratedForceMoment
     (
         "moments",
-        coordSys_.localVector(moment_[0]),
-        coordSys_.localVector(moment_[1]),
-        coordSys_.localVector(moment_[2]),
+        coordSys.localVector(moment_[0]),
+        coordSys.localVector(moment_[1]),
+        coordSys.localVector(moment_[2]),
         momentFilePtr_
     );
 
@@ -673,14 +675,16 @@ void Foam::functionObjects::forces::writeBinnedForceMoment
 
 void Foam::functionObjects::forces::writeBins()
 {
+    const auto& coordSys = coordSysPtr_();
+
     List<Field<vector>> lf(3);
     List<Field<vector>> lm(3);
-    lf[0] = coordSys_.localVector(force_[0]);
-    lf[1] = coordSys_.localVector(force_[1]);
-    lf[2] = coordSys_.localVector(force_[2]);
-    lm[0] = coordSys_.localVector(moment_[0]);
-    lm[1] = coordSys_.localVector(moment_[1]);
-    lm[2] = coordSys_.localVector(moment_[2]);
+    lf[0] = coordSys.localVector(force_[0]);
+    lf[1] = coordSys.localVector(force_[1]);
+    lf[2] = coordSys.localVector(force_[2]);
+    lm[0] = coordSys.localVector(moment_[0]);
+    lm[1] = coordSys.localVector(moment_[1]);
+    lm[2] = coordSys.localVector(moment_[2]);
 
     writeBinnedForceMoment(lf, forceBinFilePtr_);
     writeBinnedForceMoment(lm, momentBinFilePtr_);
@@ -713,7 +717,7 @@ Foam::functionObjects::forces::forces
     fDName_("fD"),
     rhoRef_(VGREAT),
     pRef_(0),
-    coordSys_(),
+    coordSysPtr_(nullptr),
     porosity_(false),
     nBin_(1),
     binDir_(Zero),
@@ -758,7 +762,7 @@ Foam::functionObjects::forces::forces
     fDName_("fD"),
     rhoRef_(VGREAT),
     pRef_(0),
-    coordSys_(),
+    coordSysPtr_(nullptr),
     porosity_(false),
     nBin_(1),
     binDir_(Zero),
@@ -950,6 +954,8 @@ void Foam::functionObjects::forces::calcForcesMoment()
 
     resetFields();
 
+    const point& origin = coordSysPtr_->origin();
+
     if (directForceDensity_)
     {
         const volVectorField& fD = lookupObject<volVectorField>(fDName_);
@@ -958,10 +964,7 @@ void Foam::functionObjects::forces::calcForcesMoment()
 
         for (const label patchi : patchSet_)
         {
-            vectorField Md
-            (
-                mesh_.C().boundaryField()[patchi] - coordSys_.origin()
-            );
+            vectorField Md(mesh_.C().boundaryField()[patchi] - origin);
 
             scalarField sA(mag(Sfb[patchi]));
 
@@ -1000,10 +1003,7 @@ void Foam::functionObjects::forces::calcForcesMoment()
 
         for (const label patchi : patchSet_)
         {
-            vectorField Md
-            (
-                mesh_.C().boundaryField()[patchi] - coordSys_.origin()
-            );
+            vectorField Md(mesh_.C().boundaryField()[patchi] - origin);
 
             vectorField fN
             (
@@ -1052,7 +1052,7 @@ void Foam::functionObjects::forces::calcForcesMoment()
 
                 const vectorField d(mesh_.C(), cZone);
                 const vectorField fP(fPTot, cZone);
-                const vectorField Md(d - coordSys_.origin());
+                const vectorField Md(d - origin);
 
                 const vectorField fDummy(Md.size(), Zero);
 
diff --git a/src/functionObjects/forces/forces/forces.H b/src/functionObjects/forces/forces/forces.H
index 6abb8cec658..23dc50d05fd 100644
--- a/src/functionObjects/forces/forces/forces.H
+++ b/src/functionObjects/forces/forces/forces.H
@@ -141,7 +141,7 @@ SourceFiles
 
 #include "fvMeshFunctionObject.H"
 #include "writeFile.H"
-#include "cartesianCS.H"
+#include "coordinateSystem.H"
 #include "volFieldsFwd.H"
 #include "HashSet.H"
 #include "Tuple2.H"
@@ -217,7 +217,7 @@ protected:
             scalar pRef_;
 
             //- Coordinate system used when evaluating forces/moments
-            coordSystem::cartesian coordSys_;
+            autoPtr<coordinateSystem> coordSysPtr_;
 
             //- Flag to include porosity effects
             bool porosity_;
-- 
GitLab