From 618bf48a61acacf8e44d9c5decc62e3e5bf1ecd6 Mon Sep 17 00:00:00 2001
From: Henry Weller <http://cfd.direct>
Date: Mon, 15 Feb 2016 15:52:33 +0000
Subject: [PATCH] MRFZone: Added patch-based "relative" function

---
 .../cfdTools/general/MRF/MRFZone.C            |  6 ++++
 .../cfdTools/general/MRF/MRFZone.H            | 13 +++++++
 .../cfdTools/general/MRF/MRFZoneList.C        | 18 ++++++++++
 .../cfdTools/general/MRF/MRFZoneList.H        |  8 +++++
 .../cfdTools/general/MRF/MRFZoneTemplates.C   | 36 ++++++++++++++++++-
 5 files changed, 80 insertions(+), 1 deletion(-)

diff --git a/src/finiteVolume/cfdTools/general/MRF/MRFZone.C b/src/finiteVolume/cfdTools/general/MRF/MRFZone.C
index c350d14a0c5..0c902d6faab 100644
--- a/src/finiteVolume/cfdTools/general/MRF/MRFZone.C
+++ b/src/finiteVolume/cfdTools/general/MRF/MRFZone.C
@@ -453,6 +453,12 @@ void Foam::MRFZone::makeRelative(FieldField<fvsPatchField, scalar>& phi) const
 }
 
 
+void Foam::MRFZone::makeRelative(Field<scalar>& phi, const label patchi) const
+{
+    makeRelativeRhoFlux(oneField(), phi, patchi);
+}
+
+
 void Foam::MRFZone::makeRelative
 (
     const surfaceScalarField& rho,
diff --git a/src/finiteVolume/cfdTools/general/MRF/MRFZone.H b/src/finiteVolume/cfdTools/general/MRF/MRFZone.H
index 9054d20d336..1600ac4e793 100644
--- a/src/finiteVolume/cfdTools/general/MRF/MRFZone.H
+++ b/src/finiteVolume/cfdTools/general/MRF/MRFZone.H
@@ -129,6 +129,15 @@ class MRFZone
             FieldField<fvsPatchField, scalar>& phi
         ) const;
 
+        //- Make the given absolute mass/vol flux relative within the MRF region
+        template<class RhoFieldType>
+        void makeRelativeRhoFlux
+        (
+            const RhoFieldType& rho,
+            Field<scalar>& phi,
+            const label patchi
+        ) const;
+
         //- Make the given relative mass/vol flux absolute within the MRF region
         template<class RhoFieldType>
         void makeAbsoluteRhoFlux
@@ -226,6 +235,10 @@ public:
             //  within the MRF region
             void makeRelative(FieldField<fvsPatchField, scalar>& phi) const;
 
+            //- Make the given absolute patch flux relative
+            //  within the MRF region
+            void makeRelative(Field<scalar>& phi, const label patchi) const;
+
             //- Make the given absolute mass-flux relative within the MRF region
             void makeRelative
             (
diff --git a/src/finiteVolume/cfdTools/general/MRF/MRFZoneList.C b/src/finiteVolume/cfdTools/general/MRF/MRFZoneList.C
index b9a64b2fb0b..3b045fa22b5 100644
--- a/src/finiteVolume/cfdTools/general/MRF/MRFZoneList.C
+++ b/src/finiteVolume/cfdTools/general/MRF/MRFZoneList.C
@@ -247,6 +247,24 @@ Foam::MRFZoneList::relative
 }
 
 
+Foam::tmp<Foam::Field<Foam::scalar>>
+Foam::MRFZoneList::relative
+(
+    const tmp<Field<scalar>>& phi,
+    const label patchi
+) const
+{
+    tmp<Field<scalar>> rphi(phi.ptr());
+
+    forAll(*this, i)
+    {
+        operator[](i).makeRelative(rphi(), patchi);
+    }
+
+    return rphi;
+}
+
+
 void Foam::MRFZoneList::makeRelative
 (
     const surfaceScalarField& rho,
diff --git a/src/finiteVolume/cfdTools/general/MRF/MRFZoneList.H b/src/finiteVolume/cfdTools/general/MRF/MRFZoneList.H
index 3139e7e76ba..fb36e689ea3 100644
--- a/src/finiteVolume/cfdTools/general/MRF/MRFZoneList.H
+++ b/src/finiteVolume/cfdTools/general/MRF/MRFZoneList.H
@@ -142,6 +142,14 @@ public:
             const tmp<FieldField<fvsPatchField, scalar>>& tphi
         ) const;
 
+        //- Return the given absolute patch flux relative within
+        //  the MRF region
+        tmp<Field<scalar>> relative
+        (
+            const tmp<Field<scalar>>& tphi,
+            const label patchi
+        ) const;
+
         //- Make the given absolute mass-flux relative within the MRF region
         void makeRelative
         (
diff --git a/src/finiteVolume/cfdTools/general/MRF/MRFZoneTemplates.C b/src/finiteVolume/cfdTools/general/MRF/MRFZoneTemplates.C
index ff056fb3b35..b4a59329df1 100644
--- a/src/finiteVolume/cfdTools/general/MRF/MRFZoneTemplates.C
+++ b/src/finiteVolume/cfdTools/general/MRF/MRFZoneTemplates.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2011-2013 OpenFOAM Foundation
+    \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -97,6 +97,40 @@ void Foam::MRFZone::makeRelativeRhoFlux
 }
 
 
+template<class RhoFieldType>
+void Foam::MRFZone::makeRelativeRhoFlux
+(
+    const RhoFieldType& rho,
+    Field<scalar>& phi,
+    const label patchi
+) const
+{
+    const surfaceVectorField& Cf = mesh_.Cf();
+    const surfaceVectorField& Sf = mesh_.Sf();
+
+    const vector Omega = omega_->value(mesh_.time().timeOutputValue())*axis_;
+
+    // Included patches
+    forAll(includedFaces_[patchi], i)
+    {
+        label patchFacei = includedFaces_[patchi][i];
+
+        phi[patchFacei] = 0.0;
+    }
+
+    // Excluded patches
+    forAll(excludedFaces_[patchi], i)
+    {
+        label patchFacei = excludedFaces_[patchi][i];
+
+        phi[patchFacei] -=
+            rho[patchFacei]
+          * (Omega ^ (Cf.boundaryField()[patchi][patchFacei] - origin_))
+          & Sf.boundaryField()[patchi][patchFacei];
+    }
+}
+
+
 template<class RhoFieldType>
 void Foam::MRFZone::makeAbsoluteRhoFlux
 (
-- 
GitLab