From 880c136af4de8026545788c98b33eb26341e0c5e Mon Sep 17 00:00:00 2001
From: Andrew Heather <a.heather@opencfd.co.uk>
Date: Wed, 2 Nov 2016 13:06:53 +0000
Subject: [PATCH] ENH: applyBoundaryLayer - simplified setting of internal
 velocity field

---
 .../applyBoundaryLayer/applyBoundaryLayer.C   | 83 +++++++------------
 1 file changed, 28 insertions(+), 55 deletions(-)

diff --git a/applications/utilities/preProcessing/applyBoundaryLayer/applyBoundaryLayer.C b/applications/utilities/preProcessing/applyBoundaryLayer/applyBoundaryLayer.C
index ffeef922f42..851f018c8b5 100644
--- a/applications/utilities/preProcessing/applyBoundaryLayer/applyBoundaryLayer.C
+++ b/applications/utilities/preProcessing/applyBoundaryLayer/applyBoundaryLayer.C
@@ -57,57 +57,37 @@ static const scalar Cmu(0.09);
 static const scalar kappa(0.41);
 
 
-Foam::tmp<Foam::volVectorField> createSimplifiedU(const volVectorField& U)
-{
-    tmp<volVectorField> tU
-    (
-        new volVectorField
-        (
-            IOobject
-            (
-                "Udash",
-                U.mesh().time().timeName(),
-                U.mesh(),
-                IOobject::NO_READ
-            ),
-            U.mesh(),
-            dimensionedVector("0", dimVelocity, vector::zero),
-            zeroGradientFvPatchField<vector>::typeName
-        )
-    );
-
-    // Assign the internal value to the original field
-    tU.ref() = U;
-
-    return tU;
-}
-
-
-void correctProcessorPatches(volScalarField& vf)
+template<class Type>
+void correctProcessorPatches
+(
+    GeometricField<Type, fvPatchField, volMesh>& vf
+)
 {
     if (!Pstream::parRun())
     {
         return;
     }
 
+    typedef GeometricField<Type, fvPatchField, volMesh> volFieldType;
+
     // Not possible to use correctBoundaryConditions on fields as they may
     // use local info as opposed to the constraint values employed here,
     // but still need to update processor patches
-    volScalarField::Boundary& bf = vf.boundaryFieldRef();
+    typename volFieldType::Boundary& bf = vf.boundaryFieldRef();
 
-    forAll(bf, patchI)
+    forAll(bf, patchi)
     {
-        if (isA<processorFvPatchField<scalar>>(bf[patchI]))
+        if (isA<processorFvPatchField<Type>>(bf[patchi]))
         {
-            bf[patchI].initEvaluate();
+            bf[patchi].initEvaluate();
         }
     }
 
-    forAll(bf, patchI)
+    forAll(bf, patchi)
     {
-        if (isA<processorFvPatchField<scalar>>(bf[patchI]))
+        if (isA<processorFvPatchField<Type>>(bf[patchi]))
         {
-            bf[patchI].evaluate();
+            bf[patchi].evaluate();
         }
     }
 }
@@ -142,7 +122,7 @@ void blendField
         // - operation may use inconsistent fields wrt these local
         //   manipulations
         //fld.correctBoundaryConditions();
-        correctProcessorPatches(fld);
+        correctProcessorPatches<scalar>(fld);
 
         Info<< "Writing " << fieldName << nl << endl;
         fld.write();
@@ -181,7 +161,7 @@ void calcOmegaField
         // - operation may use inconsistent fields wrt these local
         //   manipulations
         // omega.correctBoundaryConditions();
-        correctProcessorPatches(omega);
+        correctProcessorPatches<scalar>(omega);
 
         Info<< "Writing omega\n" << endl;
         omega.write();
@@ -215,7 +195,7 @@ void setField
         // - operation may use inconsistent fields wrt these local
         //   manipulations
         // fld.correctBoundaryConditions();
-        correctProcessorPatches(fld);
+        correctProcessorPatches<scalar>(fld);
 
         Info<< "Writing " << fieldName << nl << endl;
         fld.write();
@@ -267,7 +247,8 @@ tmp<volScalarField> calcNut
         //       case for the Templated Turbulence models.  The call to correct
         //       below will evolve the turbulence model equations and update nut,
         //       whereas only nut update is required.  Need to revisit.
-        turbulence->correct();
+//        turbulence->correct();
+        turbulence->correctEnergyTransport();
 
         return tmp<volScalarField>(new volScalarField(turbulence->nut()));
     }
@@ -290,8 +271,8 @@ tmp<volScalarField> calcNut
         // Note: in previous versions of the code, nut was initialised on
         //       construction of the turbulence model.  This is no longer the
         //       case for the Templated Turbulence models.  The call to correct
-        //       below will evolve the turbulence model equations and update nut,
-        //       whereas only nut update is required.  Need to revisit.
+        //       below will evolve the turbulence model equations and update
+        //       nut, whereas only nut update is required.  Need to revisit.
         turbulence->correct();
 
         return tmp<volScalarField>(new volScalarField(turbulence->nut()));
@@ -347,38 +328,32 @@ int main(int argc, char *argv[])
 
     // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
 
-    // Create a copy of the U field where BCs are simplified to  zeroGradient
-    // to enable boundary condition update without requiring other fields,
-    // e.g. phi.  We can then call correctBoundaryConditions on this field to
-    // enable appropriate behaviour for processor patches.
-    volVectorField Udash(createSimplifiedU(U));
-
     // Modify velocity by applying a 1/7th power law boundary-layer
     // u/U0 = (y/ybl)^(1/7)
     // assumes U0 is the same as the current cell velocity
     Info<< "Setting boundary layer velocity" << nl << endl;
     scalar yblv = ybl.value();
-    forAll(Udash, celli)
+    forAll(U, celli)
     {
         if (y[celli] <= yblv)
         {
             mask[celli] = 1;
-            Udash[celli] *= ::pow(y[celli]/yblv, (1.0/7.0));
+            U[celli] *= ::pow(y[celli]/yblv, (1.0/7.0));
         }
     }
     mask.correctBoundaryConditions();
-    Udash.correctBoundaryConditions();
+    correctProcessorPatches<vector>(U);
 
     // Retrieve nut from turbulence model
-    volScalarField nut(calcNut(mesh, Udash));
+    volScalarField nut(calcNut(mesh, U));
 
     // Blend nut using boundary layer profile
-    volScalarField S("S", mag(dev(symm(fvc::grad(Udash)))));
+    volScalarField S("S", mag(dev(symm(fvc::grad(U)))));
     nut = (1 - mask)*nut + mask*sqr(kappa*min(y, ybl))*::sqrt(2)*S;
 
     // Do not correct BC - wall functions will 'undo' manipulation above
     // by using nut from turbulence model
-    correctProcessorPatches(nut);
+    correctProcessorPatches<scalar>(nut);
     nut.write();
 
     // Boundary layer turbulence kinetic energy
@@ -395,10 +370,8 @@ int main(int argc, char *argv[])
     calcOmegaField(mesh, mask, kBL, epsilonBL);
     setField(mesh, "nuTilda", nut);
 
-
-    // Copy internal field Udash into U before writing
+    // Write the updated U field
     Info<< "Writing U\n" << endl;
-    U = Udash;
     U.write();
 
     Info<< nl << "ExecutionTime = " << runTime.elapsedCpuTime() << " s"
-- 
GitLab