From f1a8e6519a152322c8d824c4cb7e1b40f273abc3 Mon Sep 17 00:00:00 2001
From: Henry Weller <http://openfoam.org>
Date: Thu, 13 Jul 2017 16:08:30 +0100
Subject: [PATCH] swirlFlowRateInletVelocity: Added support for specifying the
 origin and axis of rotation

---
 ...lFlowRateInletVelocityFvPatchVectorField.C | 66 +++++++++++++------
 ...lFlowRateInletVelocityFvPatchVectorField.H | 10 ++-
 2 files changed, 54 insertions(+), 22 deletions(-)

diff --git a/src/finiteVolume/fields/fvPatchFields/derived/swirlFlowRateInletVelocity/swirlFlowRateInletVelocityFvPatchVectorField.C b/src/finiteVolume/fields/fvPatchFields/derived/swirlFlowRateInletVelocity/swirlFlowRateInletVelocityFvPatchVectorField.C
index 2576d5ef0e..beca9fea93 100644
--- a/src/finiteVolume/fields/fvPatchFields/derived/swirlFlowRateInletVelocity/swirlFlowRateInletVelocityFvPatchVectorField.C
+++ b/src/finiteVolume/fields/fvPatchFields/derived/swirlFlowRateInletVelocity/swirlFlowRateInletVelocityFvPatchVectorField.C
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
+    \\  /    A nd           | Copyright (C) 2011-2017 OpenFOAM Foundation
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -42,6 +42,8 @@ swirlFlowRateInletVelocityFvPatchVectorField
     fixedValueFvPatchField<vector>(p, iF),
     phiName_("phi"),
     rhoName_("rho"),
+    origin_(),
+    axis_(Zero),
     flowRate_(),
     rpm_()
 {}
@@ -50,33 +52,51 @@ swirlFlowRateInletVelocityFvPatchVectorField
 Foam::swirlFlowRateInletVelocityFvPatchVectorField::
 swirlFlowRateInletVelocityFvPatchVectorField
 (
-    const swirlFlowRateInletVelocityFvPatchVectorField& ptf,
     const fvPatch& p,
     const DimensionedField<vector, volMesh>& iF,
-    const fvPatchFieldMapper& mapper
+    const dictionary& dict
 )
 :
-    fixedValueFvPatchField<vector>(ptf, p, iF, mapper),
-    phiName_(ptf.phiName_),
-    rhoName_(ptf.rhoName_),
-    flowRate_(ptf.flowRate_, false),
-    rpm_(ptf.rpm_, false)
+    fixedValueFvPatchField<vector>(p, iF, dict),
+    phiName_(dict.lookupOrDefault<word>("phi", "phi")),
+    rhoName_(dict.lookupOrDefault<word>("rho", "rho")),
+    origin_
+    (
+        dict.lookupOrDefault
+        (
+            "origin",
+            gSum(patch().Cf()*patch().magSf())/gSum(patch().magSf())
+        )
+    ),
+    axis_
+    (
+        dict.lookupOrDefault
+        (
+            "axis",
+            -gSum(patch().Sf())/gSum(patch().magSf())
+        )
+    ),
+    flowRate_(Function1<scalar>::New("flowRate", dict)),
+    rpm_(Function1<scalar>::New("rpm", dict))
 {}
 
 
 Foam::swirlFlowRateInletVelocityFvPatchVectorField::
 swirlFlowRateInletVelocityFvPatchVectorField
 (
+    const swirlFlowRateInletVelocityFvPatchVectorField& ptf,
     const fvPatch& p,
     const DimensionedField<vector, volMesh>& iF,
-    const dictionary& dict
+    const fvPatchFieldMapper& mapper
 )
 :
-    fixedValueFvPatchField<vector>(p, iF, dict),
-    phiName_(dict.lookupOrDefault<word>("phi", "phi")),
-    rhoName_(dict.lookupOrDefault<word>("rho", "rho")),
-    flowRate_(Function1<scalar>::New("flowRate", dict)),
-    rpm_(Function1<scalar>::New("rpm", dict))
+    fixedValueFvPatchField<vector>(ptf, p, iF, mapper),
+    phiName_(ptf.phiName_),
+    rhoName_(ptf.rhoName_),
+    origin_(ptf.origin_),
+    axis_(ptf.axis_),
+    flowRate_(ptf.flowRate_, false),
+    rpm_(ptf.rpm_, false)
 {}
 
 
@@ -89,6 +109,8 @@ swirlFlowRateInletVelocityFvPatchVectorField
     fixedValueFvPatchField<vector>(ptf),
     phiName_(ptf.phiName_),
     rhoName_(ptf.rhoName_),
+    origin_(ptf.origin_),
+    axis_(ptf.axis_),
     flowRate_(ptf.flowRate_, false),
     rpm_(ptf.rpm_, false)
 {}
@@ -104,6 +126,8 @@ swirlFlowRateInletVelocityFvPatchVectorField
     fixedValueFvPatchField<vector>(ptf, iF),
     phiName_(ptf.phiName_),
     rhoName_(ptf.rhoName_),
+    origin_(ptf.origin_),
+    axis_(ptf.axis_),
     flowRate_(ptf.flowRate_, false),
     rpm_(ptf.rpm_, false)
 {}
@@ -122,18 +146,16 @@ void Foam::swirlFlowRateInletVelocityFvPatchVectorField::updateCoeffs()
     const scalar flowRate = flowRate_->value(t);
     const scalar rpm = rpm_->value(t);
 
-    const scalar totArea   = gSum(patch().magSf());
+    const scalar totArea = gSum(patch().magSf());
     const scalar avgU = -flowRate/totArea;
 
-    const vector avgCenter = gSum(patch().Cf()*patch().magSf())/totArea;
-    const vector avgNormal = gSum(patch().Sf())/totArea;
+    const vector axisHat = axis_/mag(axis_);
 
     // Update angular velocity - convert [rpm] to [rad/s]
     tmp<vectorField> tangentialVelocity
-        (
-            (rpm*constant::mathematical::pi/30.0)
-          * (patch().Cf() - avgCenter) ^ avgNormal
-        );
+    (
+        axisHat ^ (rpm*constant::mathematical::pi/30.0)*(patch().Cf() - origin_)
+    );
 
     tmp<vectorField> n = patch().nf();
 
@@ -175,6 +197,8 @@ void Foam::swirlFlowRateInletVelocityFvPatchVectorField::write
     fvPatchField<vector>::write(os);
     writeEntryIfDifferent<word>(os, "phi", "phi", phiName_);
     writeEntryIfDifferent<word>(os, "rho", "rho", rhoName_);
+    os.writeKeyword("origin") << origin_ << token::END_STATEMENT << nl;
+    os.writeKeyword("axis") << axis_ << token::END_STATEMENT << nl;
     flowRate_->writeData(os);
     rpm_->writeData(os);
     writeEntry("value", os);
diff --git a/src/finiteVolume/fields/fvPatchFields/derived/swirlFlowRateInletVelocity/swirlFlowRateInletVelocityFvPatchVectorField.H b/src/finiteVolume/fields/fvPatchFields/derived/swirlFlowRateInletVelocity/swirlFlowRateInletVelocityFvPatchVectorField.H
index 1bbc14668e..0c21c886ec 100644
--- a/src/finiteVolume/fields/fvPatchFields/derived/swirlFlowRateInletVelocity/swirlFlowRateInletVelocityFvPatchVectorField.H
+++ b/src/finiteVolume/fields/fvPatchFields/derived/swirlFlowRateInletVelocity/swirlFlowRateInletVelocityFvPatchVectorField.H
@@ -2,7 +2,7 @@
   =========                 |
   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
    \\    /   O peration     |
-    \\  /    A nd           | Copyright (C) 2011-2016 OpenFOAM Foundation
+    \\  /    A nd           | Copyright (C) 2011-2017 OpenFOAM Foundation
      \\/     M anipulation  |
 -------------------------------------------------------------------------------
 License
@@ -42,6 +42,8 @@ Usage
         Property     | Description             | Required    | Default value
         phi          | flux field name         | no          | phi
         rho          | density field name      | no          | rho
+        origin       | origin of rotation      | no          | patch centre
+        axis         | axis of rotation        | no          | -(patch normal)
         flowRate     | flow rate profile       | yes         |
         rpm          | rotational speed profile | yes        |
     \endtable
@@ -97,6 +99,12 @@ class swirlFlowRateInletVelocityFvPatchVectorField
         //- Name of the density field used to normalize the mass flux
         const word rhoName_;
 
+        //- Origin of the rotation
+        const vector origin_;
+
+        //- Axis of the rotation
+        const vector axis_;
+
         //- Inlet integral flow rate
         autoPtr<Function1<scalar>> flowRate_;
 
-- 
GitLab