From 96f2e3f394004e6cc5dd6d2f55defe2a74398de6 Mon Sep 17 00:00:00 2001
From: Henry Weller <http://cfd.direct>
Date: Mon, 8 Feb 2016 11:06:28 +0000
Subject: [PATCH] DataEntry/Sine: New DataEntryType which evaluates a sin
 function with offset

Description
    Templated sine function with support for an offset level.

        \f[
            a sin(2 \pi f (t - t_0)) s + l
        \f]

    where

    \vartable
        a       | Amplitude
        f       | Frequency [1/s]
        s       | Type scale factor
        l       | Type offset level
        t_0     | Start time [s]
        t       | Time [s]
    \endvartable

    Example for a scalar:
    \verbatim
        <entryName> sine;
        <entryName>Coeffs
        {
            frequency 10;
            amplitude 0.1;
            scale     2e-6;
            level     2e-6;
        }
    \endverbatim

    Example for a vector:
    \verbatim
        <entryName> sine;
        <entryName>Coeffs
        {
            frequency 10;
            amplitude 1;
            scale     (1 0.1 0);
            level     (10 1 0);
        }
    \endverbatim
---
 .../functions/DataEntry/Sine/Sine.C           | 102 +++++++++
 .../functions/DataEntry/Sine/Sine.H           | 200 ++++++++++++++++++
 .../functions/DataEntry/Sine/SineIO.C         |  70 ++++++
 .../functions/DataEntry/makeDataEntries.C     |  11 +-
 4 files changed, 378 insertions(+), 5 deletions(-)
 create mode 100644 src/OpenFOAM/primitives/functions/DataEntry/Sine/Sine.C
 create mode 100644 src/OpenFOAM/primitives/functions/DataEntry/Sine/Sine.H
 create mode 100644 src/OpenFOAM/primitives/functions/DataEntry/Sine/SineIO.C

diff --git a/src/OpenFOAM/primitives/functions/DataEntry/Sine/Sine.C b/src/OpenFOAM/primitives/functions/DataEntry/Sine/Sine.C
new file mode 100644
index 00000000000..8bedc6324d4
--- /dev/null
+++ b/src/OpenFOAM/primitives/functions/DataEntry/Sine/Sine.C
@@ -0,0 +1,102 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016 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 "Sine.H"
+#include "mathematicalConstants.H"
+
+// * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
+
+template<class Type>
+void Foam::DataEntryTypes::Sine<Type>::read(const dictionary& coeffs)
+{
+    t0_ = coeffs.lookupOrDefault<scalar>("t0", 0);
+    amplitude_ = coeffs.lookupOrDefault<scalar>("amplitude", 1);
+    frequency_ = readScalar(coeffs.lookup("frequency"));
+    scale_ = pTraits<Type>(coeffs.lookup("scale"));
+    level_ = pTraits<Type>(coeffs.lookup("level"));
+}
+
+
+template<class Type>
+Foam::DataEntryTypes::Sine<Type>::Sine
+(
+    const word& entryName,
+    const dictionary& dict,
+    const word& ext
+)
+:
+    DataEntry<Type>(entryName)
+{
+    read(dict.subDict(entryName + ext));
+}
+
+
+template<class Type>
+Foam::DataEntryTypes::Sine<Type>::Sine(const Sine<Type>& se)
+:
+    DataEntry<Type>(se),
+    t0_(se.t0_),
+    amplitude_(se.amplitude_),
+    frequency_(se.frequency_),
+    level_(se.level_)
+{}
+
+
+// * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
+
+template<class Type>
+Foam::DataEntryTypes::Sine<Type>::~Sine()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
+
+template<class Type>
+Type Foam::DataEntryTypes::Sine<Type>::value(const scalar t) const
+{
+    return
+        amplitude_*sin(constant::mathematical::twoPi*frequency_*(t - t0_))
+       *scale_
+      + level_;
+}
+
+
+template<class Type>
+Type Foam::DataEntryTypes::Sine<Type>::integrate
+(
+    const scalar t1,
+    const scalar t2
+) const
+{
+    NotImplemented;
+    return level_;
+}
+
+
+// * * * * * * * * * * * * * *  IOStream operators * * * * * * * * * * * * * //
+
+#include "SineIO.C"
+
+// ************************************************************************* //
diff --git a/src/OpenFOAM/primitives/functions/DataEntry/Sine/Sine.H b/src/OpenFOAM/primitives/functions/DataEntry/Sine/Sine.H
new file mode 100644
index 00000000000..fb082688140
--- /dev/null
+++ b/src/OpenFOAM/primitives/functions/DataEntry/Sine/Sine.H
@@ -0,0 +1,200 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016 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::DataEntryTypes::Sine
+
+Description
+    Templated sine function with support for an offset level.
+
+        \f[
+            a sin(2 \pi f (t - t_0)) s + l
+        \f]
+
+    where
+
+    \vartable
+        a       | Amplitude
+        f       | Frequency [1/s]
+        s       | Type scale factor
+        l       | Type offset level
+        t_0     | Start time [s]
+        t       | Time [s]
+    \endvartable
+
+    Example for a scalar:
+    \verbatim
+        <entryName> sine;
+        <entryName>Coeffs
+        {
+            frequency 10;
+            amplitude 0.1;
+            scale     2e-6;
+            level     2e-6;
+        }
+    \endverbatim
+
+    Example for a vector:
+    \verbatim
+        <entryName> sine;
+        <entryName>Coeffs
+        {
+            frequency 10;
+            amplitude 1;
+            scale     (1 0.1 0);
+            level     (10 1 0);
+        }
+    \endverbatim
+
+SourceFiles
+    Sine.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef Sine_H
+#define Sine_H
+
+#include "DataEntry.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+// Forward declaration of friend functions and operators
+namespace DataEntryTypes
+{
+    template<class Type> class Sine;
+};
+
+template<class Type>
+Ostream& operator<<(Ostream&, const DataEntryTypes::Sine<Type>&);
+
+namespace DataEntryTypes
+{
+
+/*---------------------------------------------------------------------------*\
+                           Class Sine Declaration
+\*---------------------------------------------------------------------------*/
+
+template<class Type>
+class Sine
+:
+    public DataEntry<Type>
+{
+    // Private data
+
+        //- Start-time for the sin function
+        scalar t0_;
+
+        //- Scalar amplitude of the sin function
+        scalar amplitude_;
+
+        //- Frequency of the sin function
+        scalar frequency_;
+
+        //- Scaling factor of the sin function
+        Type scale_;
+
+        //- Level to which the sin function is added
+        Type level_;
+
+
+    // Private Member Functions
+
+        //- Read the coefficients from the given dictionary
+        void read(const dictionary& coeffs);
+
+        //- Disallow default bitwise assignment
+        void operator===(const Sine<Type>&);
+
+
+public:
+
+    // Runtime type information
+    TypeName("sine");
+
+
+    // Constructors
+
+        //- Construct from entry name and dictionary
+        Sine
+        (
+            const word& entryName,
+            const dictionary& dict,
+            const word& ext = "Coeffs"
+        );
+
+        //- Copy constructor
+        Sine(const Sine<Type>& se);
+
+        //- Construct and return a clone
+        virtual tmp<DataEntry<Type>> clone() const
+        {
+            return tmp<DataEntry<Type>>(new Sine<Type>(*this));
+        }
+
+
+    //- Destructor
+    virtual ~Sine();
+
+
+    // Member Functions
+
+        //- Return value for time t
+        Type value(const scalar t) const;
+
+        //- Integrate between the two time values t1 and t2
+        Type integrate(const scalar t1, const scalar t2) const;
+
+
+    // I/O
+
+        //- Ostream Operator
+        friend Ostream& operator<< <Type>
+        (
+            Ostream& os,
+            const Sine<Type>& cnst
+        );
+
+        //- Write in dictionary format
+        virtual void writeData(Ostream& os) const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace DataEntryTypes
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#ifdef NoRepository
+#   include "Sine.C"
+#endif
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/OpenFOAM/primitives/functions/DataEntry/Sine/SineIO.C b/src/OpenFOAM/primitives/functions/DataEntry/Sine/SineIO.C
new file mode 100644
index 00000000000..afbaba8deee
--- /dev/null
+++ b/src/OpenFOAM/primitives/functions/DataEntry/Sine/SineIO.C
@@ -0,0 +1,70 @@
+/*---------------------------------------------------------------------------*\
+  =========                 |
+  \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
+   \\    /   O peration     |
+    \\  /    A nd           | Copyright (C) 2016 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 "Sine.H"
+
+// * * * * * * * * * * * * * * * IOstream Operators  * * * * * * * * * * * * //
+
+template<class Type>
+Foam::Ostream& Foam::operator<<
+(
+    Ostream& os,
+    const DataEntryTypes::Sine<Type>& se
+)
+{
+    os  << static_cast<const DataEntry<Type>& >(se)
+        << token::SPACE << se.t0_
+        << token::SPACE << se.amplitude_
+        << token::SPACE << se.frequency_
+        << token::SPACE << se.scale_
+        << token::SPACE << se.level_;
+
+    // Check state of Ostream
+    os.check
+    (
+        "Ostream& operator<<(Ostream&, const Sine<Type>&)"
+    );
+
+    return os;
+}
+
+
+template<class Type>
+void Foam::DataEntryTypes::Sine<Type>::writeData(Ostream& os) const
+{
+    DataEntry<Type>::writeData(os);
+    os  << token::END_STATEMENT << nl;
+    os  << indent << word(this->name() + "Coeffs") << nl;
+    os  << indent << token::BEGIN_BLOCK << incrIndent << nl;
+    os.writeKeyword("t0") << t0_ << token::END_STATEMENT << nl;
+    os.writeKeyword("amplitude") << amplitude_ << token::END_STATEMENT << nl;
+    os.writeKeyword("frequency") << frequency_ << token::END_STATEMENT << nl;
+    os.writeKeyword("scale") << scale_ << token::END_STATEMENT << nl;
+    os.writeKeyword("level") << level_ << token::END_STATEMENT << nl;
+    os  << decrIndent << indent << token::END_BLOCK << endl;
+}
+
+
+// ************************************************************************* //
diff --git a/src/OpenFOAM/primitives/functions/DataEntry/makeDataEntries.C b/src/OpenFOAM/primitives/functions/DataEntry/makeDataEntries.C
index 06ce416331a..db8f3f7490c 100644
--- a/src/OpenFOAM/primitives/functions/DataEntry/makeDataEntries.C
+++ b/src/OpenFOAM/primitives/functions/DataEntry/makeDataEntries.C
@@ -25,6 +25,7 @@ License
 
 #include "Constant.H"
 #include "PolynomialEntry.H"
+#include "Sine.H"
 #include "CSV.H"
 #include "Table.H"
 #include "TableFile.H"
@@ -40,17 +41,13 @@ namespace Foam
 {
     makeDataEntry(label);
     makeDataEntryType(Constant, label);
-
     // Polynomial functions and interpolation do evaluate to label
     // Instead evaluate a scalar and convert to label as appropriate
-    // makeDataEntryType(Polynomial, label);
-    // makeDataEntryType(CSV, label);
-    // makeDataEntryType(Table, label);
-    // makeDataEntryType(TableFile, label);
 
     makeDataEntry(scalar);
     makeDataEntryType(Constant, scalar);
     makeDataEntryType(Polynomial, scalar);
+    makeDataEntryType(Sine, scalar);
     makeDataEntryType(CSV, scalar);
     makeDataEntryType(Table, scalar);
     makeDataEntryType(TableFile, scalar);
@@ -58,6 +55,7 @@ namespace Foam
     makeDataEntry(vector);
     makeDataEntryType(Constant, vector);
     makeDataEntryType(Polynomial, vector);
+    makeDataEntryType(Sine, vector);
     makeDataEntryType(CSV, vector);
     makeDataEntryType(Table, vector);
     makeDataEntryType(TableFile, vector);
@@ -65,6 +63,7 @@ namespace Foam
     makeDataEntry(sphericalTensor);
     makeDataEntryType(Constant, sphericalTensor);
     makeDataEntryType(Polynomial, sphericalTensor);
+    makeDataEntryType(Sine, sphericalTensor);
     makeDataEntryType(CSV, sphericalTensor);
     makeDataEntryType(Table, sphericalTensor);
     makeDataEntryType(TableFile, sphericalTensor);
@@ -72,6 +71,7 @@ namespace Foam
     makeDataEntry(symmTensor);
     makeDataEntryType(Constant, symmTensor);
     makeDataEntryType(Polynomial, symmTensor);
+    makeDataEntryType(Sine, symmTensor);
     makeDataEntryType(CSV, symmTensor);
     makeDataEntryType(Table, symmTensor);
     makeDataEntryType(TableFile, symmTensor);
@@ -79,6 +79,7 @@ namespace Foam
     makeDataEntry(tensor);
     makeDataEntryType(Constant, tensor);
     makeDataEntryType(Polynomial, tensor);
+    makeDataEntryType(Sine, tensor);
     makeDataEntryType(CSV, tensor);
     makeDataEntryType(Table, tensor);
     makeDataEntryType(TableFile, tensor);
-- 
GitLab