From 21656d33475bf34eef38e9332a84a17eeb3fb103 Mon Sep 17 00:00:00 2001
From: andy <andy>
Date: Wed, 19 Sep 2012 16:37:15 +0100
Subject: [PATCH] ENH: Initial check-in of wallShearStress function object

---
 .../functionObjects/utilities/Make/files      |   3 +
 .../wallShearStress/IOwallShearStress.H       |  49 ++++
 .../wallShearStress/wallShearStress.C         | 251 ++++++++++++++++++
 .../wallShearStress/wallShearStress.H         | 163 ++++++++++++
 .../wallShearStressFunctionObject.C           |  42 +++
 .../wallShearStressFunctionObject.H           |  53 ++++
 6 files changed, 561 insertions(+)
 create mode 100644 src/postProcessing/functionObjects/utilities/wallShearStress/IOwallShearStress.H
 create mode 100644 src/postProcessing/functionObjects/utilities/wallShearStress/wallShearStress.C
 create mode 100644 src/postProcessing/functionObjects/utilities/wallShearStress/wallShearStress.H
 create mode 100644 src/postProcessing/functionObjects/utilities/wallShearStress/wallShearStressFunctionObject.C
 create mode 100644 src/postProcessing/functionObjects/utilities/wallShearStress/wallShearStressFunctionObject.H

diff --git a/src/postProcessing/functionObjects/utilities/Make/files b/src/postProcessing/functionObjects/utilities/Make/files
index f6e23536e04..e6fcedbb0d7 100644
--- a/src/postProcessing/functionObjects/utilities/Make/files
+++ b/src/postProcessing/functionObjects/utilities/Make/files
@@ -12,6 +12,9 @@ staticPressure/staticPressureFunctionObject.C
 timeActivatedFileUpdate/timeActivatedFileUpdate.C
 timeActivatedFileUpdate/timeActivatedFileUpdateFunctionObject.C
 
+wallShearStress/wallShearStress.C
+wallShearStress/wallShearStressFunctionObject.C
+
 yPlusLES/yPlusLES.C
 yPlusLES/yPlusLESFunctionObject.C
 
diff --git a/src/postProcessing/functionObjects/utilities/wallShearStress/IOwallShearStress.H b/src/postProcessing/functionObjects/utilities/wallShearStress/IOwallShearStress.H
new file mode 100644
index 00000000000..c7e453b1d86
--- /dev/null
+++ b/src/postProcessing/functionObjects/utilities/wallShearStress/IOwallShearStress.H
@@ -0,0 +1,49 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2012 OpenFOAM Foundation
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Typedef
+    Foam::IOwallShearStress
+
+Description
+    Instance of the generic IOOutputFilter for wallShearStress.
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef IOwallShearStress_H
+#define IOwallShearStress_H
+
+#include "wallShearStress.H"
+#include "IOOutputFilter.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+    typedef IOOutputFilter<wallShearStress> IOwallShearStress;
+}
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/postProcessing/functionObjects/utilities/wallShearStress/wallShearStress.C b/src/postProcessing/functionObjects/utilities/wallShearStress/wallShearStress.C
new file mode 100644
index 00000000000..c495cd97d1b
--- /dev/null
+++ b/src/postProcessing/functionObjects/utilities/wallShearStress/wallShearStress.C
@@ -0,0 +1,251 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2012 OpenFOAM Foundation
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "wallShearStress.H"
+#include "volFields.H"
+#include "surfaceFields.H"
+#include "incompressible/turbulenceModel/turbulenceModel.H"
+#include "compressible/turbulenceModel/turbulenceModel.H"
+#include "wallPolyPatch.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+defineTypeNameAndDebug(Foam::wallShearStress, 0);
+
+
+// * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
+
+void Foam::wallShearStress::makeFile()
+{
+    // Create the output file if not already created
+    if (outputFilePtr_.empty())
+    {
+        if (debug)
+        {
+            Info<< "Creating output file." << endl;
+        }
+
+        // File update
+        if (Pstream::master())
+        {
+            fileName outputDir;
+            word startTimeName =
+                obr_.time().timeName(obr_.time().startTime().value());
+
+            if (Pstream::parRun())
+            {
+                // Put in undecomposed case (Note: gives problems for
+                // distributed data running)
+                outputDir =
+                    obr_.time().path()/".."/name_/startTimeName;
+            }
+            else
+            {
+                outputDir = obr_.time().path()/name_/startTimeName;
+            }
+
+            // Create directory if does not exist
+            mkDir(outputDir);
+
+            // Open new file at start up
+            outputFilePtr_.reset(new OFstream(outputDir/(type() + ".dat")));
+
+            // Add headers to output data
+            outputFilePtr_() << "# Wall shear stress" << nl
+                << "# time " << token::TAB << "patch" << token::TAB
+                << "min" << token::TAB << "max" << endl;
+        }
+    }
+}
+
+
+void Foam::wallShearStress::calcShearStress
+(
+    const fvMesh& mesh,
+    const volSymmTensorField& Reff,
+    volVectorField& shearStress
+)
+{
+    forAll(shearStress.boundaryField(), patchI)
+    {
+        const polyPatch& pp = mesh.boundaryMesh()[patchI];
+
+        if (isA<wallPolyPatch>(pp))
+        {
+            vectorField& ssp = shearStress.boundaryField()[patchI];
+            const vectorField& Sfp = mesh.Sf().boundaryField()[patchI];
+            const scalarField& magSfp = mesh.magSf().boundaryField()[patchI];
+            const symmTensorField& Reffp = Reff.boundaryField()[patchI];
+
+            ssp = (-Sfp/magSfp) & Reffp;
+
+            vector minSsp = min(ssp);
+            vector maxSsp = max(ssp);
+
+            outputFilePtr_() << mesh.time().timeName() << token::TAB
+                << pp.name() << token::TAB << minSsp
+                << token::TAB << maxSsp << endl;
+
+            if (log_)
+            {
+                Info<< "   min/max(" << pp.name() << ") = "
+                    << minSsp << ", " << maxSsp << endl;
+            }
+        }
+    }
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::wallShearStress::wallShearStress
+(
+    const word& name,
+    const objectRegistry& obr,
+    const dictionary& dict,
+    const bool loadFromFiles
+)
+:
+    name_(name),
+    obr_(obr),
+    active_(true),
+    log_(false),
+    phiName_("phi"),
+    outputFilePtr_(NULL)
+{
+    // Check if the available mesh is an fvMesh, otherwise deactivate
+    if (!isA<fvMesh>(obr_))
+    {
+        active_ = false;
+        WarningIn
+        (
+            "wallShearStress::wallShearStress"
+            "("
+                "const word&, "
+                "const objectRegistry&, "
+                "const dictionary&, "
+                "const bool"
+            ")"
+        )   << "No fvMesh available, deactivating." << nl
+            << endl;
+    }
+
+    makeFile();
+
+    read(dict);
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+Foam::wallShearStress::~wallShearStress()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+void Foam::wallShearStress::read(const dictionary& dict)
+{
+    if (active_)
+    {
+        log_ = dict.lookupOrDefault<Switch>("log", false);
+        phiName_ = dict.lookupOrDefault<word>("phiName", "phi");
+    }
+}
+
+
+void Foam::wallShearStress::execute()
+{
+    // Do nothing - only valid on write
+}
+
+
+void Foam::wallShearStress::end()
+{
+    // Do nothing - only valid on write
+}
+
+
+void Foam::wallShearStress::write()
+{
+    typedef compressible::turbulenceModel cmpModel;
+    typedef incompressible::turbulenceModel icoModel;
+
+    if (active_)
+    {
+        const fvMesh& mesh = refCast<const fvMesh>(obr_);
+
+        volVectorField wallShearStress
+        (
+            IOobject
+            (
+                "wallShearStress",
+                mesh.time().timeName(),
+                mesh,
+                IOobject::NO_READ
+            ),
+            mesh,
+            dimensionedVector("0", sqr(dimLength)/sqr(dimTime), vector::zero)
+        );
+
+        if (log_)
+        {
+            Info<< type() << " output:" << nl;
+        }
+
+
+        const surfaceScalarField& phi =
+            obr_.lookupObject<surfaceScalarField>(phiName_);
+
+        tmp<volSymmTensorField> Reff;
+        if (phi.dimensions() == dimMass/dimTime)
+        {
+            const cmpModel& model =
+                mesh.lookupObject<cmpModel>("turbulenceModel");
+
+            Reff = model.devRhoReff();
+        }
+        else
+        {
+            const icoModel& model =
+                mesh.lookupObject<icoModel>("turbulenceModel");
+
+            Reff = model.devReff();
+        }
+
+    
+        calcShearStress(mesh, Reff(), wallShearStress);
+
+        if (log_)
+        {
+            Info<< endl;
+        }
+
+        wallShearStress.write();
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/src/postProcessing/functionObjects/utilities/wallShearStress/wallShearStress.H b/src/postProcessing/functionObjects/utilities/wallShearStress/wallShearStress.H
new file mode 100644
index 00000000000..b2cff373bec
--- /dev/null
+++ b/src/postProcessing/functionObjects/utilities/wallShearStress/wallShearStress.H
@@ -0,0 +1,163 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2012 OpenFOAM Foundation
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Class
+    Foam::wallShearStress
+
+Description
+    Evaluates and outputs wall shear stress.  Values written to time folders
+    as field 'wallShearStress'
+
+SourceFiles
+    wallShearStress.C
+    IOwallShearStress.H
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef wallShearStress_H
+#define wallShearStress_H
+
+#include "volFieldsFwd.H"
+#include "pointFieldFwd.H"
+#include "Switch.H"
+#include "OFstream.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// Forward declaration of classes
+class objectRegistry;
+class dictionary;
+class mapPolyMesh;
+class fvMesh;
+
+/*---------------------------------------------------------------------------*\
+                       Class wallShearStress Declaration
+\*---------------------------------------------------------------------------*/
+
+class wallShearStress
+{
+    // Private data
+
+        //- Name of this set of wallShearStress object
+        word name_;
+
+        const objectRegistry& obr_;
+
+        //- on/off switch
+        bool active_;
+
+        //- Switch to send output to Info as well as to file
+        Switch log_;
+
+        //- Name of mass/volume flux field (optional, default = phi)
+        word phiName_;
+
+        //- Output file pointer
+        autoPtr<OFstream> outputFilePtr_;
+
+
+    // Private Member Functions
+
+        //- Make the output file
+        virtual void makeFile();
+
+        //- Calculate the shear stress
+        void calcShearStress
+        (
+            const fvMesh& mesh,
+            const volSymmTensorField& Reff,
+            volVectorField& shearStress
+        );
+
+        //- Disallow default bitwise copy construct
+        wallShearStress(const wallShearStress&);
+
+        //- Disallow default bitwise assignment
+        void operator=(const wallShearStress&);
+
+
+public:
+
+    //- Runtime type information
+    TypeName("wallShearStress");
+
+
+    // Constructors
+
+        //- Construct for given objectRegistry and dictionary.
+        //  Allow the possibility to load fields from files
+        wallShearStress
+        (
+            const word& name,
+            const objectRegistry&,
+            const dictionary&,
+            const bool loadFromFiles = false
+        );
+
+
+    //- Destructor
+    virtual ~wallShearStress();
+
+
+    // Member Functions
+
+        //- Return name of the set of wallShearStress
+        virtual const word& name() const
+        {
+            return name_;
+        }
+
+        //- Read the wallShearStress data
+        virtual void read(const dictionary&);
+
+        //- Execute, currently does nothing
+        virtual void execute();
+
+        //- Execute at the final time-loop, currently does nothing
+        virtual void end();
+
+        //- Calculate the wallShearStress and write
+        virtual void write();
+
+        //- Update for changes of mesh
+        virtual void updateMesh(const mapPolyMesh&)
+        {}
+
+        //- Update for changes of mesh
+        virtual void movePoints(const pointField&)
+        {}
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/postProcessing/functionObjects/utilities/wallShearStress/wallShearStressFunctionObject.C b/src/postProcessing/functionObjects/utilities/wallShearStress/wallShearStressFunctionObject.C
new file mode 100644
index 00000000000..871e6b0373a
--- /dev/null
+++ b/src/postProcessing/functionObjects/utilities/wallShearStress/wallShearStressFunctionObject.C
@@ -0,0 +1,42 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2012 OpenFOAM Foundation
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+\*---------------------------------------------------------------------------*/
+
+#include "wallShearStressFunctionObject.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+    defineNamedTemplateTypeNameAndDebug(wallShearStressFunctionObject, 0);
+
+    addToRunTimeSelectionTable
+    (
+        functionObject,
+        wallShearStressFunctionObject,
+        dictionary
+    );
+}
+
+// ************************************************************************* //
diff --git a/src/postProcessing/functionObjects/utilities/wallShearStress/wallShearStressFunctionObject.H b/src/postProcessing/functionObjects/utilities/wallShearStress/wallShearStressFunctionObject.H
new file mode 100644
index 00000000000..75e6eba8b4b
--- /dev/null
+++ b/src/postProcessing/functionObjects/utilities/wallShearStress/wallShearStressFunctionObject.H
@@ -0,0 +1,53 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2012 OpenFOAM Foundation
+     \\/     M anipulation  |
+-------------------------------------------------------------------------------
+License
+    This file is part of OpenFOAM.
+
+    OpenFOAM is free software: you can redistribute it and/or modify it
+    under the terms of the GNU General Public License as published by
+    the Free Software Foundation, either version 3 of the License, or
+    (at your option) any later version.
+
+    OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+    ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+    FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+    for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
+
+Typedef
+    Foam::wallShearStressFunctionObject
+
+Description
+    FunctionObject wrapper around wallShearStress to allow it to be created
+    via the functions entry within controlDict.
+
+SourceFiles
+    wallShearStressFunctionObject.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef wallShearStressFunctionObject_H
+#define wallShearStressFunctionObject_H
+
+#include "wallShearStress.H"
+#include "OutputFilterFunctionObject.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+    typedef OutputFilterFunctionObject<wallShearStress> wallShearStressFunctionObject;
+}
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
-- 
GitLab