From 776e82f34bcf51507bf21bf10231a69732f931a6 Mon Sep 17 00:00:00 2001
From: Henry <Henry>
Date: Thu, 28 May 2015 15:25:22 +0100
Subject: [PATCH] tabulatedAccelerationSource: New fvOption to support 6-DoF
 solid-body motion

Example usage:

SBM
{
    type            tabulatedAccelerationSource;
    active          true;
    selectionMode   all;

    tabulatedAccelerationSourceCoeffs
    {
        timeDataFileName "constant/acceleration.dat";
    }
}

Where the file constant/acceleration.dat contains a list of tuples
containing time and a vector of the linear acceleration, angular
velocity and angular acceleration e.g.

100
(
(0 ((0 0 0) (0 0 0) (0 0 0)))
(0.001 ((-0.0001 0 4e-05) (5e-5 -0.0002 -3e-8) (0.24 -0.8 -1e-4)))
.
.
.
)
---
 src/fvOptions/Make/files                      |   2 +
 .../tabulated6DoFAcceleration.C               | 153 ++++++++++++++++
 .../tabulated6DoFAcceleration.H               | 122 +++++++++++++
 .../tabulatedAccelerationSource.C             | 117 ++++++++++++
 .../tabulatedAccelerationSource.H             | 171 ++++++++++++++++++
 .../tabulatedAccelerationSourceTemplates.C    | 103 +++++++++++
 6 files changed, 668 insertions(+)
 create mode 100644 src/fvOptions/sources/derived/tabulatedAccelerationSource/tabulated6DoFAcceleration/tabulated6DoFAcceleration.C
 create mode 100644 src/fvOptions/sources/derived/tabulatedAccelerationSource/tabulated6DoFAcceleration/tabulated6DoFAcceleration.H
 create mode 100644 src/fvOptions/sources/derived/tabulatedAccelerationSource/tabulatedAccelerationSource.C
 create mode 100644 src/fvOptions/sources/derived/tabulatedAccelerationSource/tabulatedAccelerationSource.H
 create mode 100644 src/fvOptions/sources/derived/tabulatedAccelerationSource/tabulatedAccelerationSourceTemplates.C

diff --git a/src/fvOptions/Make/files b/src/fvOptions/Make/files
index b85aac6d2c4..6c4245d773c 100644
--- a/src/fvOptions/Make/files
+++ b/src/fvOptions/Make/files
@@ -30,6 +30,8 @@ $(derivedSources)/rotorDiskSource/trimModel/fixed/fixedTrim.C
 $(derivedSources)/rotorDiskSource/trimModel/targetCoeff/targetCoeffTrim.C
 $(derivedSources)/solidificationMeltingSource/solidificationMeltingSource.C
 $(derivedSources)/solidificationMeltingSource/solidificationMeltingSourceIO.C
+$(derivedSources)/tabulatedAccelerationSource/tabulatedAccelerationSource.C
+$(derivedSources)/tabulatedAccelerationSource/tabulated6DoFAcceleration/tabulated6DoFAcceleration.C
 
 interRegion = sources/interRegion
 $(interRegion)/interRegionHeatTransferModel/constantHeatTransfer/constantHeatTransfer.C
diff --git a/src/fvOptions/sources/derived/tabulatedAccelerationSource/tabulated6DoFAcceleration/tabulated6DoFAcceleration.C b/src/fvOptions/sources/derived/tabulatedAccelerationSource/tabulated6DoFAcceleration/tabulated6DoFAcceleration.C
new file mode 100644
index 00000000000..9a482b7012b
--- /dev/null
+++ b/src/fvOptions/sources/derived/tabulatedAccelerationSource/tabulated6DoFAcceleration/tabulated6DoFAcceleration.C
@@ -0,0 +1,153 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2015 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 "tabulated6DoFAcceleration.H"
+#include "Tuple2.H"
+#include "IFstream.H"
+#include "interpolateSplineXY.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+    defineTypeNameAndDebug(tabulated6DoFAcceleration, 0);
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::tabulated6DoFAcceleration::tabulated6DoFAcceleration
+(
+    const dictionary& accelerationCoeffs,
+    const Time& runTime
+)
+:
+    time_(runTime),
+    accelerationCoeffs_(accelerationCoeffs)
+{
+    read(accelerationCoeffs);
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+Foam::tabulated6DoFAcceleration::~tabulated6DoFAcceleration()
+{}
+
+
+// * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * * //
+
+Foam::tabulated6DoFAcceleration::accelerationVectors
+Foam::tabulated6DoFAcceleration::acceleration() const
+{
+    scalar t = time_.value();
+
+    if (t < times_[0])
+    {
+        FatalErrorIn
+        (
+            "tabulated6DoFAcceleration::acceleration()"
+        )   << "current time (" << t
+            << ") is less than the minimum in the data table ("
+            << times_[0] << ')'
+            << exit(FatalError);
+    }
+
+    if (t > times_.last())
+    {
+        FatalErrorIn
+        (
+            "tabulated6DoFAcceleration::acceleration()"
+        )   << "current time (" << t
+            << ") is greater than the maximum in the data table ("
+            << times_.last() << ')'
+            << exit(FatalError);
+    }
+
+    accelerationVectors avs = interpolateSplineXY
+    (
+        t,
+        times_,
+        values_
+    );
+
+    Info<< "tabulated6DoFAcceleration::acceleration(): "
+        << "Time = " << t << " accelerations: " << avs << endl;
+
+    return avs;
+}
+
+
+bool Foam::tabulated6DoFAcceleration::read
+(
+    const dictionary& accelerationCoeffs
+)
+{
+    accelerationCoeffs_ = accelerationCoeffs;
+
+    // If the timeDataFileName has changed read the file
+
+    fileName newTimeDataFileName
+    (
+        fileName(accelerationCoeffs_.lookup("timeDataFileName")).expand()
+    );
+
+    if (newTimeDataFileName != timeDataFileName_)
+    {
+        timeDataFileName_ = newTimeDataFileName;
+
+        IFstream dataStream(timeDataFileName_);
+
+        if (dataStream.good())
+        {
+            List<Tuple2<scalar, accelerationVectors> > timeValues
+            (
+                dataStream
+            );
+
+            times_.setSize(timeValues.size());
+            values_.setSize(timeValues.size());
+
+            forAll(timeValues, i)
+            {
+                times_[i] = timeValues[i].first();
+                values_[i] = timeValues[i].second();
+            }
+        }
+        else
+        {
+            FatalErrorIn
+            (
+                "tabulated6DoFAcceleration::read(const dictionary&)"
+            )   << "Cannot open time data file " << timeDataFileName_
+                << exit(FatalError);
+        }
+    }
+
+    return true;
+}
+
+
+// ************************************************************************* //
diff --git a/src/fvOptions/sources/derived/tabulatedAccelerationSource/tabulated6DoFAcceleration/tabulated6DoFAcceleration.H b/src/fvOptions/sources/derived/tabulatedAccelerationSource/tabulated6DoFAcceleration/tabulated6DoFAcceleration.H
new file mode 100644
index 00000000000..80f956efcf9
--- /dev/null
+++ b/src/fvOptions/sources/derived/tabulatedAccelerationSource/tabulated6DoFAcceleration/tabulated6DoFAcceleration.H
@@ -0,0 +1,122 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2015 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::tabulated6DoFAcceleration
+
+Description
+    Tabulated 6DoF acceleration.
+
+    Obtained by interpolating tabulated data for linear acceleration,
+    angular velocity and angular acceleration.
+
+SourceFiles
+    tabulated6DoFAcceleration.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef tabulated6DoFAcceleration_H
+#define tabulated6DoFAcceleration_H
+
+#include "primitiveFields.H"
+#include "Vector2D.H"
+#include "Time.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+                 Class tabulated6DoFAcceleration Declaration
+\*---------------------------------------------------------------------------*/
+
+class tabulated6DoFAcceleration
+{
+    // Private data
+
+        const Time& time_;
+
+        dictionary accelerationCoeffs_;
+
+        //- Time data file name read from dictionary
+        fileName timeDataFileName_;
+
+        //- Type used to read in the acceleration "vectors"
+        typedef Vector<vector> accelerationVectors;
+
+        //- Field of times
+        scalarField times_;
+
+        //- Field of acceleration "vectors"
+        Field<accelerationVectors> values_;
+
+
+    // Private Member Functions
+
+        //- Disallow copy construct
+        tabulated6DoFAcceleration(const tabulated6DoFAcceleration&);
+
+        //- Disallow default bitwise assignment
+        void operator=(const tabulated6DoFAcceleration&);
+
+
+public:
+
+    //- Runtime type information
+    TypeName("tabulated6DoFAcceleration");
+
+
+    // Constructors
+
+        //- Construct from components
+        tabulated6DoFAcceleration
+        (
+            const dictionary& accelerationCoeffs,
+            const Time& runTime
+        );
+
+
+    //- Destructor
+    virtual ~tabulated6DoFAcceleration();
+
+
+    // Member Functions
+
+        //- Return the solid-body accelerations
+        virtual Vector<vector> acceleration() const;
+
+        //- Update properties from given dictionary
+        virtual bool read(const dictionary& accelerationCoeffs);
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/fvOptions/sources/derived/tabulatedAccelerationSource/tabulatedAccelerationSource.C b/src/fvOptions/sources/derived/tabulatedAccelerationSource/tabulatedAccelerationSource.C
new file mode 100644
index 00000000000..914e751e71a
--- /dev/null
+++ b/src/fvOptions/sources/derived/tabulatedAccelerationSource/tabulatedAccelerationSource.C
@@ -0,0 +1,117 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2015 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 "tabulatedAccelerationSource.H"
+#include "fvMesh.H"
+#include "fvMatrices.H"
+#include "geometricOneField.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace fv
+{
+    defineTypeNameAndDebug(tabulatedAccelerationSource, 0);
+    addToRunTimeSelectionTable
+    (
+        option,
+        tabulatedAccelerationSource,
+        dictionary
+    );
+}
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+Foam::fv::tabulatedAccelerationSource::tabulatedAccelerationSource
+(
+    const word& name,
+    const word& modelType,
+    const dictionary& dict,
+    const fvMesh& mesh
+)
+:
+    option(name, modelType, dict, mesh),
+    motion_(coeffs_, mesh.time()),
+    UName_(coeffs_.lookupOrDefault<word>("UName", "U")),
+    g0_("g0", dimAcceleration, vector::zero)
+{
+    fieldNames_.setSize(1, UName_);
+    applied_.setSize(1, false);
+
+    if (mesh.foundObject<uniformDimensionedVectorField>("g"))
+    {
+        g0_ = mesh.lookupObject<uniformDimensionedVectorField>("g");
+    }
+}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+void Foam::fv::tabulatedAccelerationSource::addSup
+(
+    fvMatrix<vector>& eqn,
+    const label fieldi
+)
+{
+    addSup<geometricOneField>(geometricOneField(), eqn, fieldi);
+}
+
+
+void Foam::fv::tabulatedAccelerationSource::addSup
+(
+    const volScalarField& rho,
+    fvMatrix<vector>& eqn,
+    const label fieldi
+)
+{
+    addSup<volScalarField>(rho, eqn, fieldi);
+}
+
+
+void Foam::fv::tabulatedAccelerationSource::writeData(Ostream& os) const
+{
+    os  << indent << name_ << endl;
+    dict_.write(os);
+}
+
+
+bool Foam::fv::tabulatedAccelerationSource::read(const dictionary& dict)
+{
+    if (option::read(dict))
+    {
+        return motion_.read(coeffs_);
+    }
+    else
+    {
+        return false;
+    }
+}
+
+
+// ************************************************************************* //
diff --git a/src/fvOptions/sources/derived/tabulatedAccelerationSource/tabulatedAccelerationSource.H b/src/fvOptions/sources/derived/tabulatedAccelerationSource/tabulatedAccelerationSource.H
new file mode 100644
index 00000000000..f24e853e458
--- /dev/null
+++ b/src/fvOptions/sources/derived/tabulatedAccelerationSource/tabulatedAccelerationSource.H
@@ -0,0 +1,171 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2015 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::fv::tabulatedAccelerationSource
+
+Description
+    Solid-body 6-DoF acceleration source
+
+    \heading Source usage
+
+    Example usage:
+    \verbatim
+    SBM
+    {
+        type            tabulatedAccelerationSource;
+        active          true;
+        selectionMode   all;
+
+        tabulatedAccelerationSourceCoeffs
+        {
+            timeDataFileName "constant/acceleration-terms.dat";
+        }
+    }
+    \endverbatim
+
+
+SourceFiles
+    tabulatedAccelerationSource.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef tabulatedAccelerationSource_H
+#define tabulatedAccelerationSource_H
+
+#include "fvOption.H"
+#include "tabulated6DoFAcceleration.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace fv
+{
+
+/*---------------------------------------------------------------------------*\
+                          Class tabulatedAccelerationSource Declaration
+\*---------------------------------------------------------------------------*/
+
+class tabulatedAccelerationSource
+:
+    public option
+{
+
+protected:
+
+    // Protected data
+
+        //- Run-time selectable acceleration model
+        tabulated6DoFAcceleration motion_;
+
+        //- Velocity field name, default = U
+        word UName_;
+
+        dimensionedVector g0_;
+
+private:
+
+    // Private Member Functions
+
+        //- Disallow default bitwise copy construct
+        tabulatedAccelerationSource(const tabulatedAccelerationSource&);
+
+        //- Disallow default bitwise assignment
+        void operator=(const tabulatedAccelerationSource&);
+
+
+        //- Source term to momentum equation
+        template<class RhoFieldType>
+        void addSup
+        (
+            const RhoFieldType& rho,
+            fvMatrix<vector>& eqn,
+            const label fieldi
+        );
+
+
+public:
+
+    //- Runtime type information
+    TypeName("tabulatedAccelerationSource");
+
+
+    // Constructors
+
+        //- Construct from components
+        tabulatedAccelerationSource
+        (
+            const word& name,
+            const word& modelType,
+            const dictionary& dict,
+            const fvMesh& mesh
+        );
+
+
+    //- Destructor
+    virtual ~tabulatedAccelerationSource()
+    {}
+
+
+    // Member Functions
+
+        //- Source term to momentum equation
+        virtual void addSup
+        (
+            fvMatrix<vector>& eqn,
+            const label fieldi
+        );
+
+        //- Source term to compressible momentum equation
+        virtual void addSup
+        (
+            const volScalarField& rho,
+            fvMatrix<vector>& eqn,
+            const label fieldi
+        );
+
+        //- Write data
+        virtual void writeData(Ostream&) const;
+
+        //- Read dictionary
+        virtual bool read(const dictionary& dict);
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace fv
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#ifdef NoRepository
+    #include "tabulatedAccelerationSourceTemplates.C"
+#endif
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/fvOptions/sources/derived/tabulatedAccelerationSource/tabulatedAccelerationSourceTemplates.C b/src/fvOptions/sources/derived/tabulatedAccelerationSource/tabulatedAccelerationSourceTemplates.C
new file mode 100644
index 00000000000..af03ba7ae1a
--- /dev/null
+++ b/src/fvOptions/sources/derived/tabulatedAccelerationSource/tabulatedAccelerationSourceTemplates.C
@@ -0,0 +1,103 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2015 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 "tabulatedAccelerationSource.H"
+#include "fvMesh.H"
+#include "fvMatrices.H"
+#include "uniformDimensionedFields.H"
+
+// * * * * * * * * * * * * * Private Member Functions  * * * * * * * * * * * //
+
+template<class RhoFieldType>
+void Foam::fv::tabulatedAccelerationSource::addSup
+(
+    const RhoFieldType& rho,
+    fvMatrix<vector>& eqn,
+    const label fieldi
+)
+{
+    Vector<vector> acceleration(motion_.acceleration());
+
+    // If gravitational force is present combine with the linear acceleration
+    if (mesh_.foundObject<uniformDimensionedVectorField>("g"))
+    {
+        uniformDimensionedVectorField& g =
+            const_cast<uniformDimensionedVectorField&>
+            (
+                mesh_.lookupObject<uniformDimensionedVectorField>("g")
+            );
+
+        const uniformDimensionedScalarField& hRef =
+            mesh_.lookupObject<uniformDimensionedScalarField>("hRef");
+
+        g = g0_ - dimensionedVector("a", dimAcceleration, acceleration.x());
+
+        dimensionedScalar ghRef
+        (
+            mag(g.value()) > SMALL
+          ? g & (cmptMag(g.value())/mag(g.value()))*hRef
+          : dimensionedScalar("ghRef", g.dimensions()*dimLength, 0)
+        );
+
+        const_cast<volScalarField&>
+        (
+            mesh_.lookupObject<volScalarField>("gh")
+        ) = (g & mesh_.C()) - ghRef;
+
+        const_cast<surfaceScalarField&>
+        (
+            mesh_.lookupObject<surfaceScalarField>("ghf")
+        ) = (g & mesh_.Cf()) - ghRef;
+    }
+    // ... otherwise include explicitly in the momentum equation
+    else
+    {
+        eqn -= rho*dimensionedVector("a", dimAcceleration, acceleration.x());
+    }
+
+    dimensionedVector Omega
+    (
+        "Omega",
+        dimensionSet(0, 0, -1, 0, 0),
+        acceleration.y()
+    );
+
+    dimensionedVector dOmegaDT
+    (
+        "dOmegaDT",
+        dimensionSet(0, 0, -2, 0, 0),
+        acceleration.z()
+    );
+
+    eqn -=
+    (
+        rho*(2*Omega ^ eqn.psi())         // Coriolis force
+      + rho*(Omega ^ (Omega ^ mesh_.C())) // Centrifugal force
+      + rho*(dOmegaDT ^ mesh_.C())        // Angular tabulatedAcceleration force
+    );
+}
+
+
+// ************************************************************************* //
-- 
GitLab