diff --git a/applications/solvers/multiphase/interFoam/Make/options b/applications/solvers/multiphase/interFoam/Make/options
index cfe4a92072..21e9667b83 100644
--- a/applications/solvers/multiphase/interFoam/Make/options
+++ b/applications/solvers/multiphase/interFoam/Make/options
@@ -17,4 +17,5 @@ EXE_LIBS = \
-lfiniteVolume \
-lfvOptions \
-lmeshTools \
- -lsampling
+ -lsampling \
+ -lwaveModels
diff --git a/applications/solvers/multiphase/interFoam/interDyMFoam/Make/options b/applications/solvers/multiphase/interFoam/interDyMFoam/Make/options
index bceea20c81..9792cb9b85 100644
--- a/applications/solvers/multiphase/interFoam/interDyMFoam/Make/options
+++ b/applications/solvers/multiphase/interFoam/interDyMFoam/Make/options
@@ -24,4 +24,5 @@ EXE_LIBS = \
-ltopoChangerFvMesh \
-lmeshTools \
-lfvOptions \
- -lsampling
+ -lsampling \
+ -lwaveModels
diff --git a/applications/solvers/multiphase/interFoam/interMixingFoam/Make/options b/applications/solvers/multiphase/interFoam/interMixingFoam/Make/options
index ce7222ff1b..3d2ce063a5 100644
--- a/applications/solvers/multiphase/interFoam/interMixingFoam/Make/options
+++ b/applications/solvers/multiphase/interFoam/interMixingFoam/Make/options
@@ -23,4 +23,5 @@ EXE_LIBS = \
-lfiniteVolume \
-lmeshTools \
-lfvOptions \
- -lsampling
+ -lsampling \
+ -lwaveModels
diff --git a/src/Allwmake b/src/Allwmake
index 96b82df71a..949c32b5da 100755
--- a/src/Allwmake
+++ b/src/Allwmake
@@ -70,6 +70,7 @@ lagrangian/Allwmake $targetType $*
mesh/Allwmake $targetType $*
renumber/Allwmake $targetType $*
fvAgglomerationMethods/Allwmake $targetType $*
+wmake $targetType waveModels
wmake $targetType engine
wmake $targetType fvOptions
diff --git a/src/waveModels/Make/files b/src/waveModels/Make/files
new file mode 100644
index 0000000000..67333fa821
--- /dev/null
+++ b/src/waveModels/Make/files
@@ -0,0 +1,20 @@
+waveModel/waveModel.C
+waveModel/waveModelNew.C
+
+waveGenerationModels/base/waveGenerationModel/waveGenerationModel.C
+waveGenerationModels/base/regularWaveModel/regularWaveModel.C
+waveGenerationModels/base/solitaryWaveModel/solitaryWaveModel.C
+waveGenerationModels/derived/Boussinesq/BoussinesqWaveModel.C
+waveGenerationModels/derived/cnoidal/cnoidalWaveModel.C
+waveGenerationModels/derived/StokesII/StokesIIWaveModel.C
+waveGenerationModels/derived/StokesI/StokesIWaveModel.C
+waveGenerationModels/derived/StokesV/StokesVWaveModel.C
+
+
+waveAbsorptionModels/base/waveAbsorptionModel/waveAbsorptionModel.C
+waveAbsorptionModels/derived/shallowWaterAbsorption/shallowWaterAbsorption.C
+
+derivedFvPatchFields/waveVelocity/waveVelocityFvPatchVectorField.C
+derivedFvPatchFields/waveAlpha/waveAlphaFvPatchScalarField.C
+
+LIB = $(FOAM_LIBBIN)/libwaveModels
diff --git a/src/waveModels/Make/options b/src/waveModels/Make/options
new file mode 100644
index 0000000000..71b7873964
--- /dev/null
+++ b/src/waveModels/Make/options
@@ -0,0 +1,5 @@
+EXE_INC = \
+ -I$(LIB_SRC)/finiteVolume/lnInclude
+
+LIB_LIBS = \
+ -lfiniteVolume
diff --git a/src/waveModels/derivedFvPatchFields/waveAlpha/waveAlphaFvPatchScalarField.C b/src/waveModels/derivedFvPatchFields/waveAlpha/waveAlphaFvPatchScalarField.C
new file mode 100644
index 0000000000..6117513bc9
--- /dev/null
+++ b/src/waveModels/derivedFvPatchFields/waveAlpha/waveAlphaFvPatchScalarField.C
@@ -0,0 +1,142 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2016 OpenCFD Ltd.
+ \\/ M anipulation | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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 .
+
+\*---------------------------------------------------------------------------*/
+
+#include "waveAlphaFvPatchScalarField.H"
+#include "addToRunTimeSelectionTable.H"
+#include "fvPatchFieldMapper.H"
+#include "waveModel.H"
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::waveAlphaFvPatchScalarField::waveAlphaFvPatchScalarField
+(
+ const fvPatch& p,
+ const DimensionedField& iF
+)
+:
+ fixedValueFvPatchField(p, iF),
+ waveDictName_(waveModel::dictName)
+{}
+
+
+Foam::waveAlphaFvPatchScalarField::waveAlphaFvPatchScalarField
+(
+ const waveAlphaFvPatchScalarField& ptf,
+ const fvPatch& p,
+ const DimensionedField& iF,
+ const fvPatchFieldMapper& mapper
+)
+:
+ fixedValueFvPatchField(ptf, p, iF, mapper),
+ waveDictName_(ptf.waveDictName_)
+{}
+
+
+Foam::waveAlphaFvPatchScalarField::waveAlphaFvPatchScalarField
+(
+ const fvPatch& p,
+ const DimensionedField& iF,
+ const dictionary& dict
+)
+:
+ fixedValueFvPatchField(p, iF, dict),
+ waveDictName_(dict.lookupOrDefault("waveDict", waveModel::dictName))
+{}
+
+
+Foam::waveAlphaFvPatchScalarField::waveAlphaFvPatchScalarField
+(
+ const waveAlphaFvPatchScalarField& ptf
+)
+:
+ fixedValueFvPatchField(ptf),
+ waveDictName_(ptf.waveDictName_)
+{}
+
+
+Foam::waveAlphaFvPatchScalarField::waveAlphaFvPatchScalarField
+(
+ const waveAlphaFvPatchScalarField& ptf,
+ const DimensionedField& iF
+)
+:
+ fixedValueFvPatchField(ptf, iF),
+ waveDictName_(ptf.waveDictName_)
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+void Foam::waveAlphaFvPatchScalarField::updateCoeffs()
+{
+ if (updated())
+ {
+ return;
+ }
+
+ tmp tmodel
+ (
+ waveModel::lookupOrCreate
+ (
+ patch().patch(),
+ internalField().mesh(),
+ waveDictName_
+ )
+ );
+
+ waveModel& model = const_cast(tmodel());
+
+ model.correct(db().time().value());
+
+ operator == (model.alpha());
+
+ fixedValueFvPatchField::updateCoeffs();
+}
+
+
+void Foam::waveAlphaFvPatchScalarField::write(Ostream& os) const
+{
+ fvPatchField::write(os);
+
+ os.writeKeyword("waveDictName") << waveDictName_
+ << token::END_STATEMENT << nl;
+
+ writeEntry("value", os);
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+ makePatchTypeField
+ (
+ fvPatchScalarField,
+ waveAlphaFvPatchScalarField
+ );
+}
+
+
+// ************************************************************************* //
diff --git a/src/waveModels/derivedFvPatchFields/waveAlpha/waveAlphaFvPatchScalarField.H b/src/waveModels/derivedFvPatchFields/waveAlpha/waveAlphaFvPatchScalarField.H
new file mode 100644
index 0000000000..4286d15a7a
--- /dev/null
+++ b/src/waveModels/derivedFvPatchFields/waveAlpha/waveAlphaFvPatchScalarField.H
@@ -0,0 +1,165 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2016 OpenCFD Ltd.
+ \\/ 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 .
+
+Class
+ Foam::waveAlphaFvPatchScalarField
+
+Description
+
+ Example of the boundary condition specification:
+ \verbatim
+ inlet
+ {
+ type waveAlpha;
+ value uniform (0 0 0);
+ }
+ \endverbatim
+
+Usage
+ \table
+ Property | Description | Required | Default value
+ type | type: waveAlpha | yes |
+ waveDict | Dictionary specifying wave variables | no | waveProperties
+ \endtable
+
+Note
+ - The value is positive inwards
+ - May not work correctly for transonic inlets
+ - Strange behaviour with potentialFoam since the U equation is not solved
+
+SourceFiles
+ waveAlphaFvPatchScalarField.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef waveAlphaFvPatchScalarField_H
+#define waveAlphaFvPatchScalarField_H
+
+#include "fixedValueFvPatchFields.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+/*---------------------------------------------------------------------------*\
+ class waveAlphaFvPatchScalarField Declaration
+\*---------------------------------------------------------------------------*/
+
+class waveAlphaFvPatchScalarField
+:
+ public fixedValueFvPatchScalarField
+{
+ // Private data
+
+ //- Dictionary name
+ word waveDictName_;
+
+
+public:
+
+ //- Runtime type information
+ TypeName("waveAlpha");
+
+
+ // Constructors
+
+ //- Construct from patch and internal field
+ waveAlphaFvPatchScalarField
+ (
+ const fvPatch&,
+ const DimensionedField&
+ );
+
+ //- Construct from patch, internal field and dictionary
+ waveAlphaFvPatchScalarField
+ (
+ const fvPatch&,
+ const DimensionedField&,
+ const dictionary&
+ );
+
+ //- Construct by mapping given
+ // waveAlphaFvPatchScalarField
+ // onto a new patch
+ waveAlphaFvPatchScalarField
+ (
+ const waveAlphaFvPatchScalarField&,
+ const fvPatch&,
+ const DimensionedField&,
+ const fvPatchFieldMapper&
+ );
+
+ //- Construct as copy
+ waveAlphaFvPatchScalarField
+ (
+ const waveAlphaFvPatchScalarField&
+ );
+
+ //- Construct and return a clone
+ virtual tmp clone() const
+ {
+ return tmp
+ (
+ new waveAlphaFvPatchScalarField(*this)
+ );
+ }
+
+ //- Construct as copy setting internal field reference
+ waveAlphaFvPatchScalarField
+ (
+ const waveAlphaFvPatchScalarField&,
+ const DimensionedField&
+ );
+
+ //- Construct and return a clone setting internal field reference
+ virtual tmp clone
+ (
+ const DimensionedField& iF
+ ) const
+ {
+ return tmp
+ (
+ new waveAlphaFvPatchScalarField(*this, iF)
+ );
+ }
+
+
+ // Member functions
+
+ //- Update the coefficients associated with the patch field
+ virtual void updateCoeffs();
+
+ //- Write
+ virtual void write(Ostream&) const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/waveModels/derivedFvPatchFields/waveVelocity/waveVelocityFvPatchVectorField.C b/src/waveModels/derivedFvPatchFields/waveVelocity/waveVelocityFvPatchVectorField.C
new file mode 100644
index 0000000000..a237aabbc1
--- /dev/null
+++ b/src/waveModels/derivedFvPatchFields/waveVelocity/waveVelocityFvPatchVectorField.C
@@ -0,0 +1,142 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2016 OpenCFD Ltd.
+ \\/ M anipulation | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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 .
+
+\*---------------------------------------------------------------------------*/
+
+#include "waveVelocityFvPatchVectorField.H"
+#include "addToRunTimeSelectionTable.H"
+#include "fvPatchFieldMapper.H"
+#include "waveModel.H"
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::waveVelocityFvPatchVectorField::waveVelocityFvPatchVectorField
+(
+ const fvPatch& p,
+ const DimensionedField& iF
+)
+:
+ fixedValueFvPatchField(p, iF),
+ waveDictName_(waveModel::dictName)
+{}
+
+
+Foam::waveVelocityFvPatchVectorField::waveVelocityFvPatchVectorField
+(
+ const waveVelocityFvPatchVectorField& ptf,
+ const fvPatch& p,
+ const DimensionedField& iF,
+ const fvPatchFieldMapper& mapper
+)
+:
+ fixedValueFvPatchField(ptf, p, iF, mapper),
+ waveDictName_(ptf.waveDictName_)
+{}
+
+
+Foam::waveVelocityFvPatchVectorField::waveVelocityFvPatchVectorField
+(
+ const fvPatch& p,
+ const DimensionedField& iF,
+ const dictionary& dict
+)
+:
+ fixedValueFvPatchField(p, iF, dict),
+ waveDictName_(dict.lookupOrDefault("waveDict", waveModel::dictName))
+{}
+
+
+Foam::waveVelocityFvPatchVectorField::waveVelocityFvPatchVectorField
+(
+ const waveVelocityFvPatchVectorField& ptf
+)
+:
+ fixedValueFvPatchField(ptf),
+ waveDictName_(ptf.waveDictName_)
+{}
+
+
+Foam::waveVelocityFvPatchVectorField::waveVelocityFvPatchVectorField
+(
+ const waveVelocityFvPatchVectorField& ptf,
+ const DimensionedField& iF
+)
+:
+ fixedValueFvPatchField(ptf, iF),
+ waveDictName_(ptf.waveDictName_)
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+void Foam::waveVelocityFvPatchVectorField::updateCoeffs()
+{
+ if (updated())
+ {
+ return;
+ }
+
+ tmp tmodel
+ (
+ waveModel::lookupOrCreate
+ (
+ patch().patch(),
+ internalField().mesh(),
+ waveDictName_
+ )
+ );
+
+ waveModel& model = const_cast(tmodel());
+
+ model.correct(db().time().value());
+
+ operator == (model.U());
+
+ fixedValueFvPatchField::updateCoeffs();
+}
+
+
+void Foam::waveVelocityFvPatchVectorField::write(Ostream& os) const
+{
+ fvPatchField::write(os);
+
+ os.writeKeyword("waveDictName") << waveDictName_
+ << token::END_STATEMENT << nl;
+
+ writeEntry("value", os);
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+ makePatchTypeField
+ (
+ fvPatchVectorField,
+ waveVelocityFvPatchVectorField
+ );
+}
+
+
+// ************************************************************************* //
diff --git a/src/waveModels/derivedFvPatchFields/waveVelocity/waveVelocityFvPatchVectorField.H b/src/waveModels/derivedFvPatchFields/waveVelocity/waveVelocityFvPatchVectorField.H
new file mode 100644
index 0000000000..5098102dd1
--- /dev/null
+++ b/src/waveModels/derivedFvPatchFields/waveVelocity/waveVelocityFvPatchVectorField.H
@@ -0,0 +1,165 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2016 OpenCFD Ltd.
+ \\/ 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 .
+
+Class
+ Foam::waveVelocityFvPatchVectorField
+
+Description
+ Example of the boundary condition specification:
+ \verbatim
+ inlet
+ {
+ type waveVelocity;
+ value uniform (0 0 0);
+ }
+ \endverbatim
+
+Usage
+ \table
+ Property | Description | Required | Default value
+ type | type: waveVelocity | yes |
+ waveDict | Dictionary specifying wave variables | no | waveProperties
+ \endtable
+
+Note
+ - The value is positive inwards
+ - May not work correctly for transonic inlets
+ - Strange behaviour with potentialFoam since the U equation is not solved
+
+SourceFiles
+ waveVelocityFvPatchVectorField.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef waveVelocityFvPatchVectorField_H
+#define waveVelocityFvPatchVectorField_H
+
+#include "fixedValueFvPatchFields.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+ Class waveVelocityFvPatchVectorField Declaration
+\*---------------------------------------------------------------------------*/
+
+class waveVelocityFvPatchVectorField
+:
+ public fixedValueFvPatchVectorField
+{
+ // Private data
+
+ //- Dictionary name
+ word waveDictName_;
+
+
+public:
+
+ //- Runtime type information
+ TypeName("waveVelocity");
+
+
+ // Constructors
+
+ //- Construct from patch and internal field
+ waveVelocityFvPatchVectorField
+ (
+ const fvPatch&,
+ const DimensionedField&
+ );
+
+ //- Construct from patch, internal field and dictionary
+ waveVelocityFvPatchVectorField
+ (
+ const fvPatch&,
+ const DimensionedField&,
+ const dictionary&
+ );
+
+ //- Construct by mapping given
+ // waveVelocityFvPatchVectorField
+ // onto a new patch
+ waveVelocityFvPatchVectorField
+ (
+ const waveVelocityFvPatchVectorField&,
+ const fvPatch&,
+ const DimensionedField&,
+ const fvPatchFieldMapper&
+ );
+
+ //- Construct as copy
+ waveVelocityFvPatchVectorField
+ (
+ const waveVelocityFvPatchVectorField&
+ );
+
+ //- Construct and return a clone
+ virtual tmp clone() const
+ {
+ return tmp
+ (
+ new waveVelocityFvPatchVectorField(*this)
+ );
+ }
+
+ //- Construct as copy setting internal field reference
+ waveVelocityFvPatchVectorField
+ (
+ const waveVelocityFvPatchVectorField&,
+ const DimensionedField&
+ );
+
+ //- Construct and return a clone setting internal field reference
+ virtual tmp clone
+ (
+ const DimensionedField& iF
+ ) const
+ {
+ return tmp
+ (
+ new waveVelocityFvPatchVectorField(*this, iF)
+ );
+ }
+
+
+ // Member functions
+
+ //- Update the coefficients associated with the patch field
+ virtual void updateCoeffs();
+
+ //- Write
+ virtual void write(Ostream&) const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/waveModels/waveAbsorptionModels/base/waveAbsorptionModel/waveAbsorptionModel.C b/src/waveModels/waveAbsorptionModels/base/waveAbsorptionModel/waveAbsorptionModel.C
new file mode 100644
index 0000000000..a0f47ef919
--- /dev/null
+++ b/src/waveModels/waveAbsorptionModels/base/waveAbsorptionModel/waveAbsorptionModel.C
@@ -0,0 +1,92 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2016 OpenCFD Ltd.
+ \\/ M anipulation | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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 .
+
+\*---------------------------------------------------------------------------*/
+
+#include "waveAbsorptionModel.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace waveModels
+{
+ defineTypeNameAndDebug(waveAbsorptionModel, 0);
+}
+}
+
+
+// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
+
+Foam::scalar Foam::waveModels::waveAbsorptionModel::timeCoeff
+(
+ const scalar t
+) const
+{
+ // No time ramping applied applied for absorption
+ return 1;
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::waveModels::waveAbsorptionModel::waveAbsorptionModel
+(
+ const dictionary& dict,
+ const fvMesh& mesh,
+ const polyPatch& patch,
+ const bool readFields
+)
+:
+ waveModel(dict, mesh, patch, false)
+{
+ if (readFields)
+ {
+ read(dict);
+ }
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::waveModels::waveAbsorptionModel::~waveAbsorptionModel()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+bool Foam::waveModels::waveAbsorptionModel::read(const dictionary& overrideDict)
+{
+ if (waveModel::read(overrideDict))
+ {
+ // Note: always set to true
+ activeAbsorption_ = true;
+
+ return true;
+ }
+
+ return false;
+}
+
+
+// ************************************************************************* //
diff --git a/src/waveModels/waveAbsorptionModels/base/waveAbsorptionModel/waveAbsorptionModel.H b/src/waveModels/waveAbsorptionModels/base/waveAbsorptionModel/waveAbsorptionModel.H
new file mode 100644
index 0000000000..0201aaaab7
--- /dev/null
+++ b/src/waveModels/waveAbsorptionModels/base/waveAbsorptionModel/waveAbsorptionModel.H
@@ -0,0 +1,93 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2016 OpenCFD Ltd.
+ \\/ M anipulation | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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 .
+
+Class
+ Foam::waveAbsorptionModel
+
+Description
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef waveModels_waveAbsorptionModel_H
+#define waveModels_waveAbsorptionModel_H
+
+#include "waveModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace waveModels
+{
+
+/*---------------------------------------------------------------------------*\
+ Class waveAbsorptionModel Declaration
+\*---------------------------------------------------------------------------*/
+
+class waveAbsorptionModel
+:
+ public waveModel
+{
+protected:
+
+ // Protected Member Functions
+
+ //- Return the time scaling coefficient
+ virtual scalar timeCoeff(const scalar t) const;
+
+
+public:
+
+ //- Runtime type information
+ TypeName("waveAbsorptionModel");
+
+ //- Constructor
+ waveAbsorptionModel
+ (
+ const dictionary& dict,
+ const fvMesh& mesh,
+ const polyPatch& patch,
+ const bool readFields = true
+ );
+
+ //- Destructor
+ virtual ~waveAbsorptionModel();
+
+
+ // Public Member Functions
+
+ //- Read from dictionary
+ virtual bool read(const dictionary& overrideDict);
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace waveModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/waveModels/waveAbsorptionModels/derived/shallowWaterAbsorption/shallowWaterAbsorption.C b/src/waveModels/waveAbsorptionModels/derived/shallowWaterAbsorption/shallowWaterAbsorption.C
new file mode 100644
index 0000000000..471ac164bc
--- /dev/null
+++ b/src/waveModels/waveAbsorptionModels/derived/shallowWaterAbsorption/shallowWaterAbsorption.C
@@ -0,0 +1,117 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2016 OpenCFD Ltd.
+ \\/ M anipulation | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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 .
+
+\*---------------------------------------------------------------------------*/
+
+#include "shallowWaterAbsorption.H"
+#include "volFields.H"
+#include "fvPatchFields.H"
+#include "addToRunTimeSelectionTable.H"
+
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace waveModels
+{
+ defineTypeNameAndDebug(shallowWaterAbsorption, 0);
+ addToRunTimeSelectionTable(waveModel, shallowWaterAbsorption, patch);
+}
+}
+
+
+// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
+
+void Foam::waveModels::shallowWaterAbsorption::setLevel
+(
+ const scalar t,
+ const scalar tCoeff,
+ scalarField& level
+) const
+{
+ level = waterDepthRef_;
+}
+
+
+void Foam::waveModels::shallowWaterAbsorption::setVelocity
+(
+ const scalar t,
+ const scalar tCoeff,
+ const scalarField& level
+)
+{
+ U_ = vector::zero;
+}
+
+
+void Foam::waveModels::shallowWaterAbsorption::setAlpha
+(
+ const scalarField& level
+)
+{
+ // Set alpha as zero-gradient
+ const volScalarField& alpha =
+ mesh_.lookupObject(alphaName_);
+
+ alpha_ = alpha.boundaryField()[patch_.index()].patchInternalField();
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::waveModels::shallowWaterAbsorption::shallowWaterAbsorption
+(
+ const dictionary& dict,
+ const fvMesh& mesh,
+ const polyPatch& patch,
+ const bool readFields
+)
+:
+ waveAbsorptionModel(dict, mesh, patch, false)
+{
+ if (readFields)
+ {
+ read(dict);
+ }
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::waveModels::shallowWaterAbsorption::~shallowWaterAbsorption()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+bool Foam::waveModels::shallowWaterAbsorption::read
+(
+ const dictionary& overrideDict
+)
+{
+ return waveAbsorptionModel::read(overrideDict);
+}
+
+
+// ************************************************************************* //
diff --git a/src/waveModels/waveAbsorptionModels/derived/shallowWaterAbsorption/shallowWaterAbsorption.H b/src/waveModels/waveAbsorptionModels/derived/shallowWaterAbsorption/shallowWaterAbsorption.H
new file mode 100644
index 0000000000..bbc31f7878
--- /dev/null
+++ b/src/waveModels/waveAbsorptionModels/derived/shallowWaterAbsorption/shallowWaterAbsorption.H
@@ -0,0 +1,110 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2016 OpenCFD Ltd.
+ \\/ M anipulation | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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 .
+
+Class
+ Foam::shallowWaterAbsorption
+
+Description
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef waveModels_shallowWaterAbsorption_H
+#define waveModels_shallowWaterAbsorption_H
+
+#include "waveAbsorptionModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace waveModels
+{
+
+/*---------------------------------------------------------------------------*\
+ Class shallowWaterAbsorption Declaration
+\*---------------------------------------------------------------------------*/
+
+class shallowWaterAbsorption
+:
+ public waveAbsorptionModel
+{
+protected:
+
+ // Protected Member Functions
+
+
+ //- Set the water level
+ virtual void setLevel
+ (
+ const scalar t,
+ const scalar tCoeff,
+ scalarField& level
+ ) const;
+
+ //- Calculate the wave model velocity
+ virtual void setVelocity
+ (
+ const scalar t,
+ const scalar tCoeff,
+ const scalarField& level
+ );
+
+ //- Set the alpha field based on the water level
+ virtual void setAlpha(const scalarField& level);
+
+
+public:
+
+ //- Runtime type information
+ TypeName("shallowWaterAbsorption");
+
+ //- Constructor
+ shallowWaterAbsorption
+ (
+ const dictionary& dict,
+ const fvMesh& mesh,
+ const polyPatch& patch,
+ const bool readFields = true
+ );
+
+ //- Destructor
+ virtual ~shallowWaterAbsorption();
+
+
+ // Public Member Functions
+
+ //- Read from dictionary
+ virtual bool read(const dictionary& overrideDict);
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace waveModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/waveModels/waveGenerationModels/base/regularWaveModel/regularWaveModel.C b/src/waveModels/waveGenerationModels/base/regularWaveModel/regularWaveModel.C
new file mode 100644
index 0000000000..efaa83b552
--- /dev/null
+++ b/src/waveModels/waveGenerationModels/base/regularWaveModel/regularWaveModel.C
@@ -0,0 +1,139 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2016 OpenCFD Ltd.
+ \\/ M anipulation | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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 .
+
+\*---------------------------------------------------------------------------*/
+
+#include "regularWaveModel.H"
+#include "mathematicalConstants.H"
+
+using namespace Foam::constant;
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace waveModels
+{
+ defineTypeNameAndDebug(regularWaveModel, 0);
+}
+}
+
+
+// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
+
+Foam::scalar Foam::waveModels::regularWaveModel::timeCoeff
+(
+ const scalar t
+) const
+{
+ return max(0, min(t/rampTime_, 1));
+}
+
+
+Foam::word Foam::waveModels::regularWaveModel::waveType() const
+{
+ scalar waveK = 2.0*mathematical::pi/waveLength_;
+
+ word generation = "Intermediate";
+ if (waveK*waterDepthRef_ > mathematical::pi)
+ {
+ generation = "Deep";
+ }
+ else if (waveK*waterDepthRef_ < 0.1*mathematical::pi)
+ {
+ generation = "Shallow";
+ }
+
+ return generation;
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::waveModels::regularWaveModel::regularWaveModel
+(
+ const dictionary& dict,
+ const fvMesh& mesh,
+ const polyPatch& patch,
+ const bool readFields
+)
+:
+ waveGenerationModel(dict, mesh, patch, false),
+ rampTime_(VSMALL),
+ wavePeriod_(0),
+ waveLength_(0),
+ wavePhase_(1.5*mathematical::pi)
+{
+ if (readFields)
+ {
+ read(dict);
+ }
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::waveModels::regularWaveModel::~regularWaveModel()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+bool Foam::waveModels::regularWaveModel::read(const dictionary& overrideDict)
+{
+ if (waveGenerationModel::read(overrideDict))
+ {
+ lookup("rampTime") >> rampTime_;
+
+ lookup("wavePeriod") >> wavePeriod_;
+ if (wavePeriod_ < 0)
+ {
+ FatalIOErrorInFunction(*this)
+ << "Wave period must be greater than zero. Supplied"
+ << " value wavePeriod = " << wavePeriod_
+ << exit(FatalIOError);
+ }
+
+ readIfPresent("wavePhase", wavePhase_);
+
+ // Note: waveLength to be set in derived classes
+
+ return true;
+ }
+
+ return false;
+}
+
+
+void Foam::waveModels::regularWaveModel::info(Ostream& os) const
+{
+ waveGenerationModel::info(os);
+
+ os << " Ramp time : " << rampTime_ << nl
+ << " Wave period : " << wavePeriod_ << nl
+ << " Wave length : " << waveLength_ << nl
+ << " Wave phase : " << wavePhase_ << nl;
+}
+
+
+// ************************************************************************* //
diff --git a/src/waveModels/waveGenerationModels/base/regularWaveModel/regularWaveModel.H b/src/waveModels/waveGenerationModels/base/regularWaveModel/regularWaveModel.H
new file mode 100644
index 0000000000..13b6bfda73
--- /dev/null
+++ b/src/waveModels/waveGenerationModels/base/regularWaveModel/regularWaveModel.H
@@ -0,0 +1,123 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2016 OpenCFD Ltd.
+ \\/ M anipulation | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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 .
+
+Class
+ Foam::waveModels::regularWaveModel
+
+Description
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef waveModels_reguarWaveModel_H
+#define waveModels_reguarWaveModel_H
+
+#include "waveGenerationModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace waveModels
+{
+
+/*---------------------------------------------------------------------------*\
+ Class regularWaveModel Declaration
+\*---------------------------------------------------------------------------*/
+
+class regularWaveModel
+:
+ public waveGenerationModel
+{
+ // Private Member Functions
+
+ //- Disallow default bitwise copy construct
+ regularWaveModel(const regularWaveModel&);
+
+ //- Disallow default bitwise assignment
+ void operator=(const regularWaveModel&);
+
+
+protected:
+
+ // Protected data
+
+ //- Ramp time
+ scalar rampTime_;
+
+ //- Wave period
+ scalar wavePeriod_;
+
+ //- Wavelength
+ scalar waveLength_;
+
+ //- Wave phase
+ scalar wavePhase_;
+
+
+ // Protected Member Functions
+
+ //- Return the time scaling coefficient
+ virtual scalar timeCoeff(const scalar t) const;
+
+ //- Return word description of wave type
+ virtual word waveType() const;
+
+
+public:
+
+ //- Runtime type information
+ TypeName("regularWaveModel");
+
+
+ //- Constructor
+ regularWaveModel
+ (
+ const dictionary& dict,
+ const fvMesh& mesh,
+ const polyPatch& patch,
+ const bool readFields = true
+ );
+
+ //- Destructor
+ virtual ~regularWaveModel();
+
+
+ // Public Member Functions
+
+ //- Read from dictionary
+ virtual bool read(const dictionary& overrideDict);
+
+ //- Info
+ virtual void info(Ostream& os) const;
+};
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace waveModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/waveModels/waveGenerationModels/base/solitaryWaveModel/solitaryWaveModel.C b/src/waveModels/waveGenerationModels/base/solitaryWaveModel/solitaryWaveModel.C
new file mode 100644
index 0000000000..332d7e0304
--- /dev/null
+++ b/src/waveModels/waveGenerationModels/base/solitaryWaveModel/solitaryWaveModel.C
@@ -0,0 +1,105 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2016 OpenCFD Ltd.
+ \\/ M anipulation | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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 .
+
+\*---------------------------------------------------------------------------*/
+
+#include "solitaryWaveModel.H"
+#include "polyPatch.H"
+#include "SubField.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace waveModels
+{
+ defineTypeNameAndDebug(solitaryWaveModel, 0);
+}
+}
+
+
+// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
+
+Foam::scalar Foam::waveModels::solitaryWaveModel::timeCoeff
+(
+ const scalar t
+) const
+{
+ // Ramping not applicable to solitary waves
+ return 1;
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::waveModels::solitaryWaveModel::solitaryWaveModel
+(
+ const dictionary& dict,
+ const fvMesh& mesh,
+ const polyPatch& patch,
+ const bool readFields
+)
+:
+ waveGenerationModel(dict, mesh, patch, false),
+ x_
+ (
+ patch.faceCentres().component(0)*cos(waveAngle_)
+ + patch.faceCentres().component(1)*sin(waveAngle_)
+ ),
+ x0_(gMin(x_))
+{
+ if (readFields)
+ {
+ read(dict);
+ }
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::waveModels::solitaryWaveModel::~solitaryWaveModel()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+bool Foam::waveModels::solitaryWaveModel::read(const dictionary& overrideDict)
+{
+ if (waveGenerationModel::read(overrideDict))
+ {
+ return true;
+ }
+
+ return false;
+}
+
+
+void Foam::waveModels::solitaryWaveModel::info(Ostream& os) const
+{
+ waveGenerationModel::info(os);
+
+ os << " x0: " << x0_ << nl;
+}
+
+
+// ************************************************************************* //
diff --git a/src/waveModels/waveGenerationModels/base/solitaryWaveModel/solitaryWaveModel.H b/src/waveModels/waveGenerationModels/base/solitaryWaveModel/solitaryWaveModel.H
new file mode 100644
index 0000000000..f01dff404c
--- /dev/null
+++ b/src/waveModels/waveGenerationModels/base/solitaryWaveModel/solitaryWaveModel.H
@@ -0,0 +1,105 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2016 OpenCFD Ltd.
+ \\/ M anipulation | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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 .
+
+Class
+ Foam::waveModels::solitaryWaveModel
+
+Description
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef waveModels_solitaryWaveModel_H
+#define waveModels_solitaryWaveModel_H
+
+#include "waveGenerationModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace waveModels
+{
+
+/*---------------------------------------------------------------------------*\
+ Class solitaryWaveModel Declaration
+\*---------------------------------------------------------------------------*/
+
+class solitaryWaveModel
+:
+ public waveGenerationModel
+{
+
+protected:
+
+ // Protected data
+
+ //-
+ const scalarField& x_;
+
+ const scalar x0_;
+
+
+ // Protected Member Functions
+
+ //- Return the time scaling coefficient
+ virtual scalar timeCoeff(const scalar t) const;
+
+
+public:
+
+ //- Runtime type information
+ TypeName("solitaryWaveModel");
+
+
+ //- Constructor
+ solitaryWaveModel
+ (
+ const dictionary& dict,
+ const fvMesh& mesh,
+ const polyPatch& patch,
+ const bool readFields = true
+ );
+
+ //- Destructor
+ virtual ~solitaryWaveModel();
+
+
+ // Public Member Functions
+
+ //- Read from dictionary
+ virtual bool read(const dictionary& overrideDict);
+
+ //- Info
+ virtual void info(Ostream& os) const;
+};
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace waveModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/waveModels/waveGenerationModels/base/waveGenerationModel/waveGenerationModel.C b/src/waveModels/waveGenerationModels/base/waveGenerationModel/waveGenerationModel.C
new file mode 100644
index 0000000000..44cf01006b
--- /dev/null
+++ b/src/waveModels/waveGenerationModels/base/waveGenerationModel/waveGenerationModel.C
@@ -0,0 +1,105 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2016 OpenCFD Ltd.
+ \\/ M anipulation | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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 .
+
+\*---------------------------------------------------------------------------*/
+
+#include "waveGenerationModel.H"
+#include "mathematicalConstants.H"
+
+using namespace Foam::constant;
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace waveModels
+{
+ defineTypeNameAndDebug(waveGenerationModel, 0);
+}
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::waveModels::waveGenerationModel::waveGenerationModel
+(
+ const dictionary& dict,
+ const fvMesh& mesh,
+ const polyPatch& patch,
+ const bool readFields
+)
+:
+ waveModel(dict, mesh, patch, false),
+ waveHeight_(0),
+ waveAngle_(0)
+{
+ if (readFields)
+ {
+ read(dict);
+ }
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::waveModels::waveGenerationModel::~waveGenerationModel()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+bool Foam::waveModels::waveGenerationModel::read(const dictionary& overrideDict)
+{
+ if (waveModel::read(overrideDict))
+ {
+ lookup("activeAbsorption") >> activeAbsorption_;
+
+ lookup("waveHeight") >> waveHeight_;
+ if (waveHeight_ < 0)
+ {
+ FatalIOErrorInFunction(*this)
+ << "Wave height must be greater than zero. Supplied"
+ << " value waveHeight = " << waveHeight_
+ << exit(FatalIOError);
+ }
+
+ lookup("waveAngle") >> waveAngle_;
+ waveAngle_ *= mathematical::pi/180;
+
+ return true;
+ }
+
+ return false;
+}
+
+
+void Foam::waveModels::waveGenerationModel::info(Ostream& os) const
+{
+ waveModel::info(os);
+
+ os << " Wave height : " << waveHeight_ << nl
+ << " Wave angle : " << 180/mathematical::pi*waveAngle_ << nl;
+}
+
+
+// ************************************************************************* //
diff --git a/src/waveModels/waveGenerationModels/base/waveGenerationModel/waveGenerationModel.H b/src/waveModels/waveGenerationModels/base/waveGenerationModel/waveGenerationModel.H
new file mode 100644
index 0000000000..c0ed643e7b
--- /dev/null
+++ b/src/waveModels/waveGenerationModels/base/waveGenerationModel/waveGenerationModel.H
@@ -0,0 +1,98 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2016 OpenCFD Ltd.
+ \\/ M anipulation | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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 .
+
+Class
+ Foam::waveGenerationModel
+
+Description
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef waveModels_waveGenerationModel_H
+#define waveModels_waveGenerationModel_H
+
+#include "waveModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace waveModels
+{
+
+/*---------------------------------------------------------------------------*\
+ Class waveGenerationModel Declaration
+\*---------------------------------------------------------------------------*/
+
+class waveGenerationModel
+:
+ public waveModel
+{
+protected:
+
+ // Protected data
+
+ //- Wave height / [m]
+ scalar waveHeight_;
+
+ //- Wave angle / [rad] (read in degrees)
+ scalar waveAngle_;
+
+
+public:
+
+ //- Runtime type information
+ TypeName("waveGenerationModel");
+
+ //- Constructor
+ waveGenerationModel
+ (
+ const dictionary& dict,
+ const fvMesh& mesh,
+ const polyPatch& patch,
+ const bool readFields = true
+ );
+
+ //- Destructor
+ virtual ~waveGenerationModel();
+
+
+ // Public Member Functions
+
+ //- Read from dictionary
+ virtual bool read(const dictionary& overrideDict);
+
+ //- Info
+ virtual void info(Ostream& os) const;
+};
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace waveModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/waveModels/waveGenerationModels/derived/Boussinesq/BoussinesqWaveModel.C b/src/waveModels/waveGenerationModels/derived/Boussinesq/BoussinesqWaveModel.C
new file mode 100644
index 0000000000..d7e4dca2fc
--- /dev/null
+++ b/src/waveModels/waveGenerationModels/derived/Boussinesq/BoussinesqWaveModel.C
@@ -0,0 +1,251 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2016 OpenCFD Ltd.
+ \\/ M anipulation | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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 .
+
+\*---------------------------------------------------------------------------*/
+
+#include "BoussinesqWaveModel.H"
+#include "addToRunTimeSelectionTable.H"
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace waveModels
+{
+ defineTypeNameAndDebug(Boussinesq, 0);
+ addToRunTimeSelectionTable
+ (
+ waveModel,
+ Boussinesq,
+ patch
+ );
+}
+}
+
+
+// * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * //
+
+Foam::scalar Foam::waveModels::Boussinesq::eta
+(
+ const scalar H,
+ const scalar h,
+ const scalar x,
+ const scalar y,
+ const scalar theta,
+ const scalar t,
+ const scalar X0
+) const
+{
+ scalar C = sqrt(mag(g_)*(H + h));
+ scalar ts = 3.5*h/sqrt(H/h);
+ scalar aux = sqrt(3.0*H/(4.0*h))/h;
+ scalar Xa = -C*t + ts - X0 + x*cos(theta) + y*sin(theta);
+
+ return H*1.0/sqr(cosh(aux*Xa));
+}
+
+
+Foam::vector Foam::waveModels::Boussinesq::Deta
+(
+ const scalar H,
+ const scalar h,
+ const scalar x,
+ const scalar y,
+ const scalar theta,
+ const scalar t,
+ const scalar X0
+) const
+{
+ vector deta(vector::zero);
+
+ scalar C = sqrt(mag(g_)*(H + h));
+ scalar ts = 3.5*h/sqrt(H/h);
+ scalar a = sqrt(3*H/(4*h))/h;
+ scalar Xa = -C*t + ts - X0 + x*cos(theta) + y*sin(theta);
+ scalar expTerm = exp(2*a*Xa);
+ scalar b = 8*a*h*expTerm;
+
+ deta[0] =
+ b*(1 - expTerm)
+ /pow3(1 + expTerm);
+
+ deta[1] =
+ 2*a*b*(exp(4*a*Xa) - 4*expTerm + 1)
+ /pow4(1 + expTerm);
+
+ deta[2] =
+ -4*sqr(a)*b*(exp(6*a*Xa) - 11*exp(4*a*Xa) + 11*expTerm - 1)
+ /pow5(1 + expTerm);
+
+ return deta;
+}
+
+
+Foam::vector Foam::waveModels::Boussinesq::U
+(
+ const scalar H,
+ const scalar h,
+ const scalar x,
+ const scalar y,
+ const scalar theta,
+ const scalar t,
+ const scalar X0,
+ const scalar z
+) const
+{
+ scalar C = sqrt(mag(g_)*(H + h));
+ scalar eta = this->eta(H, h, x, y, theta, t, X0);
+ vector Deta = this->Deta(H, h, x, y, theta, t, X0);
+
+ scalar u =
+ C*eta/h
+ *(
+ 1.0
+ - eta/(4.0*h)
+ + sqr(h)/(3.0*eta)*(1.0 - 3.0/2.0*sqr(z/h))*Deta[1]
+ );
+
+ scalar w =
+ -C*z/h
+ *(
+ (1.0 - eta/(2.0*h))*Deta[0]
+ + sqr(h)/3.0*(1.0 - 1.0/2.0*sqr(z/h))*Deta[2]
+ );
+
+ scalar v = u*sin(waveAngle_);
+ u *= cos(waveAngle_);
+
+ return vector(u, v, w);
+}
+
+
+void Foam::waveModels::Boussinesq::setLevel
+(
+ const scalar t,
+ const scalar tCoeff,
+ scalarField& level
+) const
+{
+ forAll(level, paddlei)
+ {
+ const scalar eta =
+ this->eta
+ (
+ waveHeight_,
+ waterDepthRef_,
+ xPaddle_[paddlei],
+ yPaddle_[paddlei],
+ waveAngle_,
+ t,
+ x0_
+ );
+
+ level[paddlei] = waterDepthRef_ + tCoeff*eta;
+ }
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::waveModels::Boussinesq::Boussinesq
+(
+ const dictionary& dict,
+ const fvMesh& mesh,
+ const polyPatch& patch,
+ const bool readFields
+)
+:
+ solitaryWaveModel(dict, mesh, patch, false)
+{
+ if (readFields)
+ {
+ read(dict);
+ }
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::waveModels::Boussinesq::~Boussinesq()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+bool Foam::waveModels::Boussinesq::read(const dictionary& overrideDict)
+{
+ if (solitaryWaveModel::read(overrideDict))
+ {
+ return true;
+ }
+
+ return false;
+}
+
+
+void Foam::waveModels::Boussinesq::setVelocity
+(
+ const scalar t,
+ const scalar tCoeff,
+ const scalarField& level
+)
+{
+ forAll(U_, facei)
+ {
+ // Fraction of geometry represented by paddle - to be set
+ scalar fraction = 1;
+
+ // Height - to be set
+ scalar z = 0;
+
+ setPaddlePropeties(level, facei, fraction, z);
+
+ if (fraction > 0)
+ {
+ const label paddlei = faceToPaddle_[facei];
+
+ const vector Uf = U
+ (
+ waveHeight_,
+ waterDepthRef_,
+ xPaddle_[paddlei],
+ yPaddle_[paddlei],
+ waveAngle_,
+ t,
+ x0_,
+ z
+ );
+
+ U_[facei] = fraction*Uf*tCoeff;
+ }
+ }
+}
+
+
+void Foam::waveModels::Boussinesq::info(Ostream& os) const
+{
+ solitaryWaveModel::info(os);
+}
+
+
+// ************************************************************************* //
diff --git a/src/waveModels/waveGenerationModels/derived/Boussinesq/BoussinesqWaveModel.H b/src/waveModels/waveGenerationModels/derived/Boussinesq/BoussinesqWaveModel.H
new file mode 100644
index 0000000000..ff76841a81
--- /dev/null
+++ b/src/waveModels/waveGenerationModels/derived/Boussinesq/BoussinesqWaveModel.H
@@ -0,0 +1,146 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2016 OpenCFD Ltd.
+ \\/ M anipulation | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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 .
+
+Class
+ Foam::waveModels::Boussinesq
+
+Description
+ Boussinesq wave model
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef waveModels_Boussinesq_H
+#define waveModels_Boussinesq_H
+
+#include "solitaryWaveModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace waveModels
+{
+
+/*---------------------------------------------------------------------------*\
+ Class Boussinesq Declaration
+\*---------------------------------------------------------------------------*/
+
+class Boussinesq
+:
+ public solitaryWaveModel
+{
+protected:
+
+ // Protected Member Functions
+
+ //- Wave height
+ virtual scalar eta
+ (
+ const scalar H,
+ const scalar h,
+ const scalar x,
+ const scalar y,
+ const scalar theta,
+ const scalar t,
+ const scalar X0
+ ) const;
+
+ //- Wave
+ virtual vector Deta
+ (
+ const scalar H,
+ const scalar h,
+ const scalar x,
+ const scalar y,
+ const scalar theta,
+ const scalar t,
+ const scalar X0
+ ) const;
+
+ //- Wave velocity
+ virtual vector U
+ (
+ const scalar H,
+ const scalar h,
+ const scalar x,
+ const scalar y,
+ const scalar theta,
+ const scalar t,
+ const scalar X0,
+ const scalar z
+ ) const;
+
+ //- Set the water level
+ virtual void setLevel
+ (
+ const scalar t,
+ const scalar tCoeff,
+ scalarField& level
+ ) const;
+
+ //- Calculate the wave model velocity
+ virtual void setVelocity
+ (
+ const scalar t,
+ const scalar tCoeff,
+ const scalarField& level
+ );
+
+
+public:
+
+ //- Runtime type information
+ TypeName("Boussinesq");
+
+ //- Constructor
+ Boussinesq
+ (
+ const dictionary& dict,
+ const fvMesh& mesh,
+ const polyPatch& patch,
+ const bool readFields = true
+ );
+
+ //- Destructor
+ virtual ~Boussinesq();
+
+
+ // Public Member Functions
+
+ //- Read from dictionary
+ virtual bool read(const dictionary& overrideDict);
+
+ //- Info
+ virtual void info(Ostream& os) const;
+};
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace waveModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/waveModels/waveGenerationModels/derived/StokesI/StokesIWaveModel.C b/src/waveModels/waveGenerationModels/derived/StokesI/StokesIWaveModel.C
new file mode 100644
index 0000000000..8a67ea2a2d
--- /dev/null
+++ b/src/waveModels/waveGenerationModels/derived/StokesI/StokesIWaveModel.C
@@ -0,0 +1,238 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2016 OpenCFD Ltd.
+ \\/ M anipulation | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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 .
+
+\*---------------------------------------------------------------------------*/
+
+#include "StokesIWaveModel.H"
+#include "mathematicalConstants.H"
+#include "addToRunTimeSelectionTable.H"
+
+using namespace Foam::constant;
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace waveModels
+{
+ defineTypeNameAndDebug(StokesI, 0);
+ addToRunTimeSelectionTable
+ (
+ waveModel,
+ StokesI,
+ patch
+ );
+}
+}
+
+
+// * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * //
+
+Foam::scalar Foam::waveModels::StokesI::waveLength
+(
+ const scalar h,
+ const scalar T
+) const
+{
+ scalar L0 = mag(g_)*T*T/(2.0*mathematical::pi);
+ scalar L = L0;
+
+ for (int i=1; i<=100; i++)
+ {
+ L = L0*tanh(2.0*mathematical::pi*h/L);
+ }
+
+ return L;
+}
+
+
+Foam::scalar Foam::waveModels::StokesI::eta
+(
+ const scalar H,
+ const scalar Kx,
+ const scalar x,
+ const scalar Ky,
+ const scalar y,
+ const scalar omega,
+ const scalar t,
+ const scalar phase
+) const
+{
+ scalar phaseTot = Kx*x + Ky*y - omega*t + phase;
+
+ return H*0.5*cos(phaseTot);
+}
+
+Foam::vector Foam::waveModels::StokesI::U
+(
+ const scalar H,
+ const scalar h,
+ const scalar Kx,
+ const scalar x,
+ const scalar Ky,
+ const scalar y,
+ const scalar omega,
+ const scalar t,
+ const scalar phase,
+ const scalar z
+) const
+{
+ scalar k = sqrt(Kx*Kx + Ky*Ky);
+ scalar phaseTot = Kx*x + Ky*y - omega*t + phase;
+
+ scalar u = H*0.5*omega*cos(phaseTot)*cosh(k*z)/sinh(k*h);
+ scalar w = H*0.5*omega*sin(phaseTot)*sinh(k*z)/sinh(k*h);
+ scalar v = u*sin(waveAngle_);
+ u *= cos(waveAngle_);
+
+ return vector(u, v, w);
+}
+
+
+void Foam::waveModels::StokesI::setLevel
+(
+ const scalar t,
+ const scalar tCoeff,
+ scalarField& level
+) const
+{
+ const scalar waveOmega = mathematical::twoPi/wavePeriod_;
+ const scalar waveK = mathematical::twoPi/waveLength_;
+ const scalar waveKx = waveK*cos(waveAngle_);
+ const scalar waveKy = waveK*sin(waveAngle_);
+
+ forAll(level, paddlei)
+ {
+ const scalar eta =
+ this->eta
+ (
+ waveHeight_,
+ waveKx,
+ xPaddle_[paddlei],
+ waveKy,
+ yPaddle_[paddlei],
+ waveOmega,
+ t,
+ wavePhase_
+ );
+
+ level[paddlei] = waterDepthRef_ + tCoeff*eta;
+ }
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::waveModels::StokesI::StokesI
+(
+ const dictionary& dict,
+ const fvMesh& mesh,
+ const polyPatch& patch,
+ const bool readFields
+)
+:
+ regularWaveModel(dict, mesh, patch, false)
+{
+ if (readFields)
+ {
+ read(dict);
+ }
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::waveModels::StokesI::~StokesI()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+bool Foam::waveModels::StokesI::read(const dictionary& overrideDict)
+{
+ if (regularWaveModel::read(overrideDict))
+ {
+ waveLength_ = waveLength(waterDepthRef_, wavePeriod_);
+
+ return true;
+ }
+
+ return false;
+}
+
+
+void Foam::waveModels::StokesI::setVelocity
+(
+ const scalar t,
+ const scalar tCoeff,
+ const scalarField& level
+)
+{
+ const scalar waveOmega = mathematical::twoPi/wavePeriod_;
+ const scalar waveK = mathematical::twoPi/waveLength_;
+ const scalar waveKx = waveK*cos(waveAngle_);
+ const scalar waveKy = waveK*sin(waveAngle_);
+
+ forAll(U_, facei)
+ {
+ // Fraction of geometry represented by paddle - to be set
+ scalar fraction = 1;
+
+ // Height - to be set
+ scalar z = 0;
+
+ setPaddlePropeties(level, facei, fraction, z);
+
+ if (fraction > 0)
+ {
+ const label paddlei = faceToPaddle_[facei];
+
+ const vector Uf = U
+ (
+ waveHeight_,
+ waterDepthRef_,
+ waveKx,
+ xPaddle_[paddlei],
+ waveKy,
+ yPaddle_[paddlei],
+ waveOmega,
+ t,
+ wavePhase_,
+ z
+ );
+
+ U_[facei] = fraction*Uf*tCoeff;
+ }
+ }
+}
+
+
+void Foam::waveModels::StokesI::info(Ostream& os) const
+{
+ regularWaveModel::info(os);
+
+ os << " Wave type: " << waveType() << nl;
+}
+
+
+// ************************************************************************* //
diff --git a/src/waveModels/waveGenerationModels/derived/StokesI/StokesIWaveModel.H b/src/waveModels/waveGenerationModels/derived/StokesI/StokesIWaveModel.H
new file mode 100644
index 0000000000..82213261bf
--- /dev/null
+++ b/src/waveModels/waveGenerationModels/derived/StokesI/StokesIWaveModel.H
@@ -0,0 +1,141 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2016 OpenCFD Ltd.
+ \\/ M anipulation | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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 .
+
+Class
+ Foam::waveModels::StokesI
+
+Description
+ Stokes I wave model
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef waveModels_StokesI_H
+#define waveModels_StokesI_H
+
+#include "regularWaveModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace waveModels
+{
+
+/*---------------------------------------------------------------------------*\
+ Class StokesI Declaration
+\*---------------------------------------------------------------------------*/
+
+class StokesI
+:
+ public regularWaveModel
+{
+protected:
+
+ // Protected Member Functions
+
+ //- Return the wavelength
+ virtual scalar waveLength(const scalar h, const scalar T) const;
+
+ //- Wave height
+ virtual scalar eta
+ (
+ const scalar H,
+ const scalar Kx,
+ const scalar x,
+ const scalar Ky,
+ const scalar y,
+ const scalar omega,
+ const scalar t,
+ const scalar phase
+ ) const;
+
+ //- Wave velocity
+ virtual vector U
+ (
+ const scalar H,
+ const scalar h,
+ const scalar Kx,
+ const scalar x,
+ const scalar Ky,
+ const scalar y,
+ const scalar omega,
+ const scalar t,
+ const scalar phase,
+ const scalar z
+ ) const;
+
+
+ //- Set the water level
+ virtual void setLevel
+ (
+ const scalar t,
+ const scalar tCoeff,
+ scalarField& level
+ ) const;
+
+ //- Calculate the wave model velocity
+ virtual void setVelocity
+ (
+ const scalar t,
+ const scalar tCoeff,
+ const scalarField& level
+ );
+
+
+public:
+
+ //- Runtime type information
+ TypeName("StokesI");
+
+ //- Constructor
+ StokesI
+ (
+ const dictionary& dict,
+ const fvMesh& mesh,
+ const polyPatch& patch,
+ const bool readFields = true
+ );
+
+ //- Destructor
+ virtual ~StokesI();
+
+
+ // Public Member Functions
+
+ //- Read from dictionary
+ virtual bool read(const dictionary& overrideDict);
+
+ //- Info
+ virtual void info(Ostream& os) const;
+};
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace waveModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/waveModels/waveGenerationModels/derived/StokesII/StokesIIWaveModel.C b/src/waveModels/waveGenerationModels/derived/StokesII/StokesIIWaveModel.C
new file mode 100644
index 0000000000..b867959f8c
--- /dev/null
+++ b/src/waveModels/waveGenerationModels/derived/StokesII/StokesIIWaveModel.C
@@ -0,0 +1,181 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2016 OpenCFD Ltd.
+ \\/ M anipulation | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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 .
+
+\*---------------------------------------------------------------------------*/
+
+#include "StokesIIWaveModel.H"
+#include "mathematicalConstants.H"
+#include "addToRunTimeSelectionTable.H"
+
+using namespace Foam::constant;
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace waveModels
+{
+ defineTypeNameAndDebug(StokesII, 0);
+ addToRunTimeSelectionTable
+ (
+ waveModel,
+ StokesII,
+ patch
+ );
+}
+}
+
+
+// * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * //
+
+Foam::scalar Foam::waveModels::StokesII::eta
+(
+ const scalar H,
+ const scalar h,
+ const scalar Kx,
+ const scalar x,
+ const scalar Ky,
+ const scalar y,
+ const scalar omega,
+ const scalar t,
+ const scalar phase
+) const
+{
+ const scalar k = sqrt(Kx*Kx + Ky*Ky);
+ const scalar sigma = tanh(k*h);
+ const scalar phaseTot = Kx*x + Ky*y - omega*t + phase;
+
+ return
+ H*0.5*cos(phaseTot)
+ + k*H*H/4.0*(3.0 - sigma*sigma)/(4.0*pow3(sigma))*cos(2.0*phaseTot);
+}
+
+
+Foam::vector Foam::waveModels::StokesII::U
+(
+ const scalar H,
+ const scalar h,
+ const scalar Kx,
+ const scalar x,
+ const scalar Ky,
+ const scalar y,
+ const scalar omega,
+ const scalar t,
+ const scalar phase,
+ const scalar z
+) const
+{
+ const scalar k = sqrt(Kx*Kx + Ky*Ky);
+ const scalar phaseTot = Kx*x + Ky*y - omega*t + phase;
+
+ scalar u =
+ H*0.5*omega*cos(phaseTot)*cosh(k*z)/sinh(k*h)
+ + 3.0/4.0*H*H/4.0*omega*k*cosh(2.0*k*z)/pow4(sinh(k*h))*cos(2.0*phaseTot);
+ scalar w =
+ H*0.5*omega*sin(phaseTot)*sinh(k*z)/sinh(k*h)
+ + 3.0/4.0*H*H/4.0*omega*k*sinh(2.0*k*z)/pow4(sinh(k*h))*sin(2.0*phaseTot);
+ scalar v = u*sin(waveAngle_);
+ u *= cos(waveAngle_);
+
+ return vector(u, v, w);
+}
+
+
+void Foam::waveModels::StokesII::setLevel
+(
+ const scalar t,
+ const scalar tCoeff,
+ scalarField& level
+) const
+{
+ const scalar waveOmega = mathematical::twoPi/wavePeriod_;
+ const scalar waveK = mathematical::twoPi/waveLength_;
+ const scalar waveKx = waveK*cos(waveAngle_);
+ const scalar waveKy = waveK*sin(waveAngle_);
+
+ forAll(level, paddlei)
+ {
+ const scalar eta =
+ this->eta
+ (
+ waveHeight_,
+ waterDepthRef_,
+ waveKx,
+ xPaddle_[paddlei],
+ waveKy,
+ yPaddle_[paddlei],
+ waveOmega,
+ t,
+ wavePhase_
+ );
+
+ level[paddlei] = waterDepthRef_ + tCoeff*eta;
+ }
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::waveModels::StokesII::StokesII
+(
+ const dictionary& dict,
+ const fvMesh& mesh,
+ const polyPatch& patch,
+ const bool readFields
+)
+:
+ StokesI(dict, mesh, patch, false)
+{
+ if (readFields)
+ {
+ read(dict);
+ }
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::waveModels::StokesII::~StokesII()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+bool Foam::waveModels::StokesII::read(const dictionary& overrideDict)
+{
+ if (StokesI::read(overrideDict))
+ {
+ return true;
+ }
+
+ return false;
+}
+
+
+void Foam::waveModels::StokesII::info(Ostream& os) const
+{
+ StokesI::info(os);
+}
+
+
+// ************************************************************************* //
diff --git a/src/waveModels/waveGenerationModels/derived/StokesII/StokesIIWaveModel.H b/src/waveModels/waveGenerationModels/derived/StokesII/StokesIIWaveModel.H
new file mode 100644
index 0000000000..044eba4bc5
--- /dev/null
+++ b/src/waveModels/waveGenerationModels/derived/StokesII/StokesIIWaveModel.H
@@ -0,0 +1,130 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2016 OpenCFD Ltd.
+ \\/ M anipulation | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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 .
+
+Class
+ Foam::waveModels::StokesII
+
+Description
+ Stokes II wave model
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef waveModels_StokesII_H
+#define waveModels_StokesII_H
+
+#include "StokesIWaveModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace waveModels
+{
+
+/*---------------------------------------------------------------------------*\
+ Class StokesII Declaration
+\*---------------------------------------------------------------------------*/
+
+class StokesII
+:
+ public StokesI
+{
+protected:
+
+ // Protected Member Functions
+
+ //- Wave height
+ virtual scalar eta
+ (
+ const scalar H,
+ const scalar h,
+ const scalar Kx,
+ const scalar x,
+ const scalar Ky,
+ const scalar y,
+ const scalar omega,
+ const scalar t,
+ const scalar phase
+ ) const;
+
+ //- Wave velocity
+ virtual vector U
+ (
+ const scalar H,
+ const scalar h,
+ const scalar Kx,
+ const scalar x,
+ const scalar Ky,
+ const scalar y,
+ const scalar omega,
+ const scalar t,
+ const scalar phase,
+ const scalar z
+ ) const;
+
+ //- Set the water level
+ virtual void setLevel
+ (
+ const scalar t,
+ const scalar tCoeff,
+ scalarField& level
+ ) const;
+
+
+public:
+
+ //- Runtime type information
+ TypeName("StokesII");
+
+ //- Constructor
+ StokesII
+ (
+ const dictionary& dict,
+ const fvMesh& mesh,
+ const polyPatch& patch,
+ const bool readFields = true
+ );
+
+ //- Destructor
+ virtual ~StokesII();
+
+
+ // Public Member Functions
+
+ //- Read from dictionary
+ virtual bool read(const dictionary& overrideDict);
+
+ //- Info
+ virtual void info(Ostream& os) const;
+};
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace waveModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/waveModels/waveGenerationModels/derived/StokesV/StokesVWaveModel.C b/src/waveModels/waveGenerationModels/derived/StokesV/StokesVWaveModel.C
new file mode 100644
index 0000000000..643acedeb2
--- /dev/null
+++ b/src/waveModels/waveGenerationModels/derived/StokesV/StokesVWaveModel.C
@@ -0,0 +1,895 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2016 OpenCFD Ltd.
+ \\/ M anipulation | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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 .
+
+\*---------------------------------------------------------------------------*/
+
+#include "StokesVWaveModel.H"
+#include "mathematicalConstants.H"
+#include "addToRunTimeSelectionTable.H"
+
+using namespace Foam::constant;
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace waveModels
+{
+ defineTypeNameAndDebug(StokesV, 0);
+ addToRunTimeSelectionTable
+ (
+ waveModel,
+ StokesV,
+ patch
+ );
+}
+}
+
+
+// * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * //
+
+Foam::scalar Foam::waveModels::StokesV::A11
+(
+ const scalar h,
+ const scalar k
+) const
+{
+ const scalar s = sinh(k*h);
+ return 1.0/s;
+}
+
+
+Foam::scalar Foam::waveModels::StokesV::A13
+(
+ const scalar h,
+ const scalar k
+) const
+{
+ const scalar s = sinh(k*h);
+ const scalar c = cosh(k*h);
+ return -sqr(c)*(5*sqr(c) + 1)/(8*pow5(s));
+}
+
+
+Foam::scalar Foam::waveModels::StokesV::A15
+(
+ const scalar h,
+ const scalar k
+) const
+{
+ const scalar s = sinh(k*h);
+ const scalar c = cosh(k*h);
+
+ return
+ -(
+ 1184*pow(c, 10)
+ - 1440*pow(c, 8)
+ - 1992*pow6(c)
+ + 2641*pow4(c)
+ - 249*sqr(c) + 18
+ )
+ /(1536*pow(s, 11));
+}
+
+
+Foam::scalar Foam::waveModels::StokesV::A22
+(
+ const scalar h,
+ const scalar k
+) const
+{
+ const scalar s = sinh(k*h);
+ return 3/(8*pow4(s));
+}
+
+
+Foam::scalar Foam::waveModels::StokesV::A24
+(
+ const scalar h,
+ const scalar k
+) const
+{
+ const scalar s = sinh(k*h);
+ const scalar c = cosh(k*h);
+
+ return
+ (192*pow(c, 8) - 424*pow(c, 6) - 312*pow4(c) + 480*sqr(c) - 17)
+ /(768*pow(s, 10));
+}
+
+
+Foam::scalar Foam::waveModels::StokesV::A33
+(
+ const scalar h,
+ const scalar k
+) const
+{
+ const scalar s = sinh(k*h);
+ const scalar c = cosh(k*h);
+
+ return (13 - 4*sqr(c))/(64*pow(s, 7));
+}
+
+
+Foam::scalar Foam::waveModels::StokesV::A35
+(
+ const scalar h,
+ const scalar k
+) const
+{
+ const scalar s = sinh(k*h);
+ const scalar c = cosh(k*h);
+
+ return
+ (
+ 512*pow(c, 12)
+ + 4224*pow(c, 10)
+ - 6800*pow(c, 8)
+ - 12808*pow(c, 6)
+ + 16704.0*pow4(c)
+ - 3154*sqr(c)
+ + 107
+ )
+ /(4096*pow(s, 13)*(6*sqr(c) - 1));
+}
+
+
+Foam::scalar Foam::waveModels::StokesV::A44
+(
+ const scalar h,
+ const scalar k
+) const
+{
+ const scalar s = sinh(k*h);
+ const scalar c = cosh(k*h);
+
+ return
+ (80*pow(c, 6) - 816*pow4(c) + 1338*sqr(c) - 197)
+ /(1536*pow(s, 10)*(6*sqr(c) - 1));
+}
+
+
+Foam::scalar Foam::waveModels::StokesV::A55
+(
+ const scalar h,
+ const scalar k
+) const
+{
+ const scalar s = sinh(k*h);
+ const scalar c = cosh(k*h);
+
+ return
+ -(
+ 2880*pow(c, 10)
+ - 72480*pow(c, 8)
+ + 324000*pow(c, 6)
+ - 432000*pow4(c)
+ + 163470*sqr(c)
+ - 16245
+ )
+ /(61440*pow(s, 11)*(6*sqr(c) - 1)*(8*pow4(c) - 11*sqr(c) + 3));
+}
+
+
+Foam::scalar Foam::waveModels::StokesV::B22
+(
+ const scalar h,
+ const scalar k
+) const
+{
+ const scalar s = sinh(k*h);
+ const scalar c = cosh(k*h);
+
+ return (2*sqr(c) + 1)*c/(4*pow3(s));
+}
+
+
+Foam::scalar Foam::waveModels::StokesV::B24
+(
+ const scalar h,
+ const scalar k
+) const
+{
+ const scalar s = sinh(k*h);
+ const scalar c = cosh(k*h);
+
+ return
+ (272*pow(c, 8) - 504*pow(c, 6) - 192*pow4(c) + 322*sqr(c) + 21)*c
+ /(384*pow(s, 9));
+}
+
+
+Foam::scalar Foam::waveModels::StokesV::B33
+(
+ const scalar h,
+ const scalar k
+) const
+{
+ const scalar s = sinh(k*h);
+ const scalar c = cosh(k*h);
+
+ return (8*pow6(c) + 1)*3/(64*pow6(s));
+}
+
+
+Foam::scalar Foam::waveModels::StokesV::B33k
+(
+ const scalar h,
+ const scalar k
+) const // d B33 / d k
+{
+ const scalar s = sinh(k*h);
+ const scalar c = cosh(k*h);
+
+ const scalar sk = h*s;
+ const scalar ck = h*c;
+
+ return 9.*pow5(c)*ck/(4*pow6(s)) - (9*(8*pow6(c) + 1))/(32*pow(s, 7))*sk;
+}
+
+
+Foam::scalar Foam::waveModels::StokesV::B35
+(
+ const scalar h,
+ const scalar k
+) const
+{
+ const scalar s = sinh(k*h);
+ const scalar c = cosh(k*h);
+
+ return
+ (
+ 88128*pow(c, 14)
+ - 208224*pow(c, 12)
+ + 70848*pow(c, 10)
+ + 54000*pow(c, 8)
+ - 21816*pow6(c)
+ + 6264*pow4(c)
+ - 54*sqr(c)
+ - 81
+ )
+ /(12288*pow(s, 12)*(6*sqr(c) - 1));
+}
+
+
+Foam::scalar Foam::waveModels::StokesV::B35k
+(
+ const scalar h,
+ const scalar k
+) const // d B35 / d k
+{
+ const scalar s = sinh(k*h);
+ const scalar c = cosh(k*h);
+
+ const scalar sk = h*s;
+ const scalar ck = h*c;
+
+ return
+ (
+ 14*88128*pow(c, 13)*ck
+ - 12*208224*pow(c, 11)*ck
+ + 10*70848*pow(c, 9)*ck
+ + 8*54000.0*pow(c, 7)*ck
+ - 6*21816*pow5(c)*ck
+ + 4*6264*pow3(c)*ck
+ - 2*54*c*ck
+ )
+ /(12288*pow(s, 12)*(6*sqr(c) - 1))
+ - (
+ 88128*pow(c, 14)
+ - 208224*pow(c, 12)
+ + 70848*pow(c, 10)
+ + 54000*pow(c, 8)
+ - 21816*pow6(c)
+ + 6264*pow4(c)
+ - 54*sqr(c)
+ - 81
+ )*12
+ /(12288*pow(s, 13)*(6*sqr(c) - 1))*sk
+ - (
+ 88128*pow(c,14)
+ - 208224*pow(c, 12)
+ + 70848*pow(c, 10)
+ + 54000*pow(c, 8)
+ - 21816*pow6(c)
+ + 6264*pow4(c)
+ - 54*sqr(c)
+ - 81
+ )*12*c*ck
+ /(12288*pow(s, 12)*sqr(6*sqr(c) - 1));
+}
+
+
+Foam::scalar Foam::waveModels::StokesV::B44
+(
+ const scalar h,
+ const scalar k
+) const
+{
+ const scalar s = sinh(k*h);
+ const scalar c = cosh(k*h);
+
+ return
+ (
+ 768*pow(c, 10)
+ - 448*pow(c, 8)
+ - 48*pow6(c)
+ + 48*pow4(c)
+ + 106*sqr(c)
+ - 21
+ )*c
+ /(384*pow(s, 9)*(6*sqr(c) - 1));
+}
+
+
+Foam::scalar Foam::waveModels::StokesV::B55
+(
+ const scalar h,
+ const scalar k
+) const
+{
+ const scalar s = sinh(k*h);
+ const scalar c = cosh(k*h);
+
+ return
+ (
+ 192000*pow(c, 16)
+ - 262720*pow(c, 14)
+ + 83680*pow(c, 12)
+ + 20160*pow(c, 10)
+ - 7280*pow(c, 8)
+ + 7160*pow(c, 6)
+ - 1800*pow(c, 4)
+ - 1050*sqr(c)
+ + 225
+ )
+ /(12288*pow(s, 10)*(6*sqr(c) - 1)*(8*pow4(c) - 11*sqr(c) + 3));
+}
+
+
+Foam::scalar Foam::waveModels::StokesV::B55k
+(
+ const scalar h,
+ const scalar k
+) const // d B55 / d k
+{
+ const scalar s = sinh(k*h);
+ const scalar c = cosh(k*h);
+
+ const scalar sk = h*s;
+ const scalar ck = h*c;
+
+ return
+ (
+ 16*192000*pow(c, 15)*ck
+ - 14*262720*pow(c, 13)*ck
+ + 12*83680*pow(c, 11)*ck
+ + 10*20160*pow(c, 9)*ck
+ - 8*7280*pow(c, 7)*ck
+ + 6*7160*pow(c, 5)*ck
+ - 4*1800*pow(c, 3)*ck
+ - 2*1050*pow(c, 1)*ck
+ )
+ /(12288*pow(s, 10)*(6*sqr(c) - 1)*(8*pow(c, 4) - 11*sqr(c) + 3))
+ - (
+ 192000*pow(c, 16)
+ - 262720*pow(c, 14)
+ + 83680*pow(c, 12)
+ + 20160*pow(c, 10)
+ - 7280*pow(c, 8)
+ + 7160*pow(c, 6)
+ - 1800*pow(c, 4)
+ - 1050*pow(c, 2)
+ + 225
+ )*10.0
+ /(12288*pow(s, 11)*(6*sqr(c) - 1)*(8*pow4(c) - 11*sqr(c) + 3))*sk
+ - (
+ 192000*pow(c, 16)
+ - 262720*pow(c, 14)
+ + 83680*pow(c, 12)
+ + 20160*pow(c,10)
+ - 7280*pow(c, 8)
+ + 7160*pow(c, 6)
+ - 1800*pow(c,4)
+ - 1050*pow(c, 2)
+ + 225
+ )*12*c*ck
+ /(12288*pow(s, 10)*sqr(6*sqr(c) - 1)*(8*pow4(c) - 11*sqr(c) + 3))
+ - (
+ 192000*pow(c, 16)
+ - 262720*pow(c, 14)
+ + 83680*pow(c, 12)
+ + 20160*pow(c, 10)
+ - 7280*pow(c, 8)
+ + 7160*pow(c, 6)
+ - 1800*pow(c, 4)
+ - 1050*pow(c, 2)
+ + 225
+ )*(32*pow3(c) - 22*c)*ck
+ /(12288*pow(s, 10)*(6*sqr(c) - 1)*sqr(8*pow4(c) - 11*sqr(c) + 3));
+}
+
+
+Foam::scalar Foam::waveModels::StokesV::C1
+(
+ const scalar h,
+ const scalar k
+) const
+{
+ const scalar s = sinh(k*h);
+ const scalar c = cosh(k*h);
+
+ return (8*pow4(c) - 8*sqr(c) + 9)/(8*pow4(s));
+}
+
+
+Foam::scalar Foam::waveModels::StokesV::C1k
+(
+ const scalar h,
+ const scalar k
+) const
+{
+ const scalar s = sinh(k*h);
+ const scalar c = cosh(k*h);
+
+ const scalar sk = h*s;
+ const scalar ck = h*c;
+
+ return
+ (4*8*pow3(c)*ck - 2*8*c*ck)/(8*pow4(s))
+ - (8*pow4(c) - 8*sqr(c) + 9)*4*sk/(8*pow5(s));
+}
+
+
+Foam::scalar Foam::waveModels::StokesV::C2
+(
+ const scalar h,
+ const scalar k
+) const
+{
+ const scalar s = sinh(k*h);
+ const scalar c = cosh(k*h);
+
+ return
+ (
+ 3840*pow(c, 12)
+ - 4096*pow(c, 10)
+ + 2592*pow(c, 8)
+ - 1008*pow(c, 6)
+ + 5944*pow(c, 4)
+ - 1830*pow(c, 2)
+ + 147
+ ) // - 2592
+ /(512*pow(s, 10)*(6*sqr(c) - 1));
+}
+
+
+Foam::scalar Foam::waveModels::StokesV::C2k
+(
+ const scalar h,
+ const scalar k
+) const
+{
+ const scalar s = sinh(k*h);
+ const scalar c = cosh(k*h);
+
+ const scalar sk = h*s;
+ const scalar ck = h*c;
+
+ return
+ (
+ 12*3840*pow(c, 11)*ck
+ - 10*4096*pow(c,9)*ck
+ + 8*2592*pow(c, 7)*ck
+ - 6*1008*pow(c, 5)*ck
+ + 4*5944*pow(c, 3)*ck
+ - 2*1830*c*ck
+ )
+ /(512*pow(s, 10)*(6*sqr(c) - 1))
+ - (
+ 3840*pow(c, 12)
+ - 4096*pow(c, 10)
+ + 2592*pow(c, 8)
+ - 1008*pow(c, 6)
+ + 5944*pow(c, 4)
+ - 1830*pow(c, 2)
+ + 147
+ )*10*sk
+ /(512*pow(s, 11)*(6*sqr(c) - 1))
+ - (
+ 3840*pow(c, 12)
+ - 4096*pow(c, 10)
+ + 2592*pow(c, 8)
+ - 1008*pow(c, 6)
+ + 5944*pow(c, 4)
+ - 1830*pow(c, 2)
+ + 147
+ )*12*c*ck
+ /(512*pow(s, 10)*sqr(6*sqr(c) - 1));
+}
+
+
+Foam::scalar Foam::waveModels::StokesV::C3
+(
+ const scalar h,
+ const scalar k
+) const
+{
+ const scalar s = sinh(k*h);
+ const scalar c = cosh(k*h);
+
+ return -1/(4*s*c);
+}
+
+
+Foam::scalar Foam::waveModels::StokesV::C4
+(
+ const scalar h,
+ const scalar k
+) const
+{
+ const scalar s = sinh(k*h);
+ const scalar c = cosh(k*h);
+
+ return
+ (12*pow(c, 8) + 36*pow(c, 6) - 162*pow(c, 4) + 141*sqr(c) - 27)
+ /(192*c*pow(s, 9));
+}
+
+
+void Foam::waveModels::StokesV::initialise
+(
+ const scalar H,
+ const scalar d,
+ const scalar T,
+ scalar& kOut,
+ scalar& LambdaOut,
+ scalar& f1Out,
+ scalar& f2Out
+) const
+{
+ scalar f1 = 1;
+ scalar f2 = 1;
+
+ const scalar pi = mathematical::pi;
+ scalar k = 2.0*pi/(sqrt(mag(g_)*d)*T);
+ scalar lambda = H/2.0*k;
+
+ label n = 0;
+
+ static const scalar tolerance = 1e-12;
+ static const label iterMax = 10000;
+
+ while ((mag(f1) > tolerance || mag(f2) > tolerance) && (n < iterMax))
+ {
+ const scalar b33 = B33(d, k);
+ const scalar b35 = B35(d, k);
+ const scalar b55 = B55(d, k);
+ const scalar c1 = C1(d, k);
+ const scalar c2 = C2(d, k);
+
+ const scalar b33k = B33k(d, k);
+ const scalar b35k = B35k(d, k);
+ const scalar b55k = B55k(d, k);
+ const scalar c1k = C1k(d, k);
+ const scalar c2k = C2k(d, k);
+
+ const scalar l2 = sqr(lambda);
+ const scalar l3 = l2*lambda;
+ const scalar l4 = l3*lambda;
+ const scalar l5 = l4*lambda;
+
+ const scalar Bmat11 =
+ 2*pi/(sqr(k)*d)*(lambda + l3*b33 + l5*(b35 + b55))
+ - 2*pi/(k*d)*(l3*b33k + l5*(b35k + b55k));
+
+ const scalar Bmat12 =
+ - 2*pi/(k*d)*(1 + 3*l2*b33 + 5*l4*(b35 + b55));
+
+ const scalar Bmat21 =
+ - d/(2*pi)*tanh(k*d)*(1 + l2*c1 + l4*c2)
+ - k*d/(2*pi)*(1 - sqr(tanh(k*d)))*d*(1 + l2*c1 + l4*c2)
+ - k*d/(2*pi)*tanh(k*d)*(l2*c1k + l4*c2k);
+
+ const scalar Bmat22 = - k*d/(2.0*pi)*tanh(k*d)*(2*lambda*c1 + 4*l3*c2);
+
+ f1 = pi*H/d - 2*pi/(k*d)*(lambda + l3*b33 + l5*(b35 + b55));
+
+ f2 = (2*pi*d)/(mag(g_)*sqr(T)) - k*d/(2*pi)*tanh(k*d)*(1 + l2*c1 + l4*c2);
+
+ const scalar lambdaPr =
+ (f1*Bmat21 - f2*Bmat11)/(Bmat11*Bmat22 - Bmat12*Bmat21);
+ const scalar kPr =
+ (f2*Bmat12 - f1*Bmat22)/(Bmat11*Bmat22 - Bmat12*Bmat21);
+
+ lambda += lambdaPr;
+ k += kPr;
+
+ n++;
+ }
+
+ kOut = k;
+ LambdaOut = lambda;
+
+ f1Out = mag(f1);
+ f2Out = mag(f2);
+}
+
+
+Foam::scalar Foam::waveModels::StokesV::eta
+(
+ const scalar h,
+ const scalar kx,
+ const scalar ky,
+ const scalar lambda,
+ const scalar T,
+ const scalar x,
+ const scalar y,
+ const scalar t,
+ const scalar phase
+) const
+{
+ const scalar k = sqrt(kx*kx + ky*ky);
+
+ const scalar b22 = B22(h, k);
+ const scalar b24 = B24(h, k);
+ const scalar b33 = B33(h, k);
+ const scalar b35 = B35(h, k);
+ const scalar b44 = B44(h, k);
+ const scalar b55 = B55(h, k);
+
+ const scalar l2 = sqr(lambda);
+ const scalar l3 = l2*lambda;
+ const scalar l4 = l3*lambda;
+ const scalar l5 = l4*lambda;
+
+ const scalar amp1 = lambda/k;
+ const scalar amp2 = (b22*l2 + b24*l4)/k;
+ const scalar amp3 = (b33*l3 + b35*l5)/k;
+ const scalar amp4 = b44*l4/k;
+ const scalar amp5 = b55*l5/k;
+
+ const scalar theta = kx*x + ky*y - 2.0*mathematical::pi/T*t + phase;
+
+ return
+ amp1*cos(theta)
+ + amp2*cos(2*theta)
+ + amp3*cos(3*theta)
+ + amp4*cos(4*theta)
+ + amp5*cos(5*theta);
+}
+
+
+Foam::vector Foam::waveModels::StokesV::U
+(
+ const scalar d,
+ const scalar kx,
+ const scalar ky,
+ const scalar lambda,
+ const scalar T,
+ const scalar x,
+ const scalar y,
+ const scalar t,
+ const scalar phase,
+ const scalar z
+) const
+{
+ const scalar k = sqrt(kx*kx + ky*ky);
+
+ const scalar a11 = A11(d, k);
+ const scalar a13 = A13(d, k);
+ const scalar a15 = A15(d, k);
+ const scalar a22 = A22(d, k);
+ const scalar a24 = A24(d, k);
+ const scalar a33 = A33(d, k);
+ const scalar a35 = A35(d, k);
+ const scalar a44 = A44(d, k);
+ const scalar a55 = A55(d, k);
+
+ const scalar pi = mathematical::pi;
+ const scalar l2 = sqr(lambda);
+ const scalar l3 = l2*lambda;
+ const scalar l4 = l3*lambda;
+ const scalar l5 = l4*lambda;
+
+ const scalar a1u = 2*pi/T/k*(lambda*a11 + l3*a13 + l5*a15);
+ const scalar a2u = 2*2*pi/T/k*(l2*a22 + l4*a24);
+ const scalar a3u = 3*2*pi/T/k*(l3*a33 + l5*a35);
+ const scalar a4u = 4*2*pi/T/k*(l4*a44);
+ const scalar a5u = 5*2*pi/T/k*(l5*a55);
+
+ const scalar theta = kx*x + ky*y - 2*pi/T*t + phase;
+
+ scalar u =
+ a1u*cosh(k*z)*cos(theta)
+ + a2u*cosh(2.0*k*z)*cos(2.0*(theta))
+ + a3u*cosh(3.0*k*z)*cos(3.0*(theta))
+ + a4u*cosh(4.0*k*z)*cos(4.0*(theta))
+ + a5u*cosh(5.0*k*z)*cos(5.0*(theta));
+
+ scalar w =
+ a1u*sinh(k*z)*sin(theta)
+ + a2u*sinh(2.0*k*z)*sin(2.0*(theta))
+ + a3u*sinh(3.0*k*z)*sin(3.0*(theta))
+ + a4u*sinh(4.0*k*z)*sin(4.0*(theta))
+ + a5u*sinh(5.0*k*z)*sin(5.0*(theta));
+
+ scalar v = u*sin(waveAngle_);
+ u *= cos(waveAngle_);
+
+ return vector(u, v, w);
+}
+
+
+void Foam::waveModels::StokesV::setLevel
+(
+ const scalar t,
+ const scalar tCoeff,
+ scalarField& level
+) const
+{
+ const scalar waveK = mathematical::twoPi/waveLength_;
+ const scalar waveKx = waveK*cos(waveAngle_);
+ const scalar waveKy = waveK*sin(waveAngle_);
+
+ forAll(level, paddlei)
+ {
+ const scalar eta =
+ this->eta
+ (
+ waterDepthRef_,
+ waveKx,
+ waveKy,
+ lambda_,
+ wavePeriod_,
+ xPaddle_[paddlei],
+ yPaddle_[paddlei],
+ t,
+ wavePhase_
+ );
+
+ level[paddlei] = waterDepthRef_ + tCoeff*eta;
+ }
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::waveModels::StokesV::StokesV
+(
+ const dictionary& dict,
+ const fvMesh& mesh,
+ const polyPatch& patch,
+ const bool readFields
+)
+:
+ regularWaveModel(dict, mesh, patch, false),
+ lambda_(0)
+{
+ if (readFields)
+ {
+ read(dict);
+ }
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::waveModels::StokesV::~StokesV()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+bool Foam::waveModels::StokesV::read(const dictionary& overrideDict)
+{
+ if (regularWaveModel::read(overrideDict))
+ {
+ scalar f1;
+ scalar f2;
+ scalar waveK;
+
+ initialise
+ (
+ waveHeight_,
+ waterDepthRef_,
+ wavePeriod_,
+ waveK,
+ lambda_,
+ f1,
+ f2
+ );
+
+ if (f1 > 0.001 || f2 > 0.001)
+ {
+ FatalErrorInFunction
+ << "No convergence for Stokes V wave theory" << nl
+ << " f1: " << f1 << nl
+ << " f2: " << f2 << nl
+ << exit(FatalError);
+ }
+
+ waveLength_ = 2.0*mathematical::pi/waveK;
+
+ return true;
+ }
+
+ return false;
+}
+
+
+void Foam::waveModels::StokesV::setVelocity
+(
+ const scalar t,
+ const scalar tCoeff,
+ const scalarField& level
+)
+{
+ const scalar waveK = mathematical::twoPi/waveLength_;
+ const scalar waveKx = waveK*cos(waveAngle_);
+ const scalar waveKy = waveK*sin(waveAngle_);
+
+ forAll(U_, facei)
+ {
+ // Fraction of geometry represented by paddle - to be set
+ scalar fraction = 1;
+
+ // Height - to be set
+ scalar z = 0;
+
+ setPaddlePropeties(level, facei, fraction, z);
+
+ if (fraction > 0)
+ {
+ const label paddlei = faceToPaddle_[facei];
+
+ const vector Uf = U
+ (
+ waterDepthRef_,
+ waveKx,
+ waveKy,
+ lambda_,
+ wavePeriod_,
+ xPaddle_[paddlei],
+ yPaddle_[paddlei],
+ t,
+ wavePhase_,
+ z
+ );
+
+ U_[facei] = fraction*Uf*tCoeff;
+ }
+ }
+}
+
+
+void Foam::waveModels::StokesV::info(Ostream& os) const
+{
+ regularWaveModel::info(os);
+
+ os << " Lambda : " << lambda_ << nl
+ << " Wave type : " << waveType() << nl;
+}
+
+
+// ************************************************************************* //
diff --git a/src/waveModels/waveGenerationModels/derived/StokesV/StokesVWaveModel.H b/src/waveModels/waveGenerationModels/derived/StokesV/StokesVWaveModel.H
new file mode 100644
index 0000000000..225bb9bf1f
--- /dev/null
+++ b/src/waveModels/waveGenerationModels/derived/StokesV/StokesVWaveModel.H
@@ -0,0 +1,214 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2016 OpenCFD Ltd.
+ \\/ M anipulation | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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 .
+
+Class
+ Foam::waveModels::StokesV
+
+Description
+ Stokes V wave model
+
+ Reference
+ \verbatim
+ Skjelbreia, L., Hendrickson, J. (1960).
+ Fifth order gravity wave theory.
+ Proc. Coastal Engineering Conf., pp. 184-196.
+ \endverbatim
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef waveModels_StokesV_H
+#define waveModels_StokesV_H
+
+#include "regularWaveModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace waveModels
+{
+
+/*---------------------------------------------------------------------------*\
+ Class StokesV Declaration
+\*---------------------------------------------------------------------------*/
+
+class StokesV
+:
+ public regularWaveModel
+{
+protected:
+
+ // Proteced Data
+
+ //-
+ scalar lambda_;
+
+
+ // Protected Member Functions
+
+ // Model coefficients
+
+ virtual scalar A11(const scalar h, const scalar k) const;
+
+ virtual scalar A13(const scalar h, const scalar k) const;
+
+ virtual scalar A15(const scalar h, const scalar k) const;
+
+ virtual scalar A22(const scalar h, const scalar k) const;
+
+ virtual scalar A24(const scalar h, const scalar k) const;
+
+ virtual scalar A33(const scalar h, const scalar k) const;
+
+ virtual scalar A35(const scalar h, const scalar k) const;
+
+ virtual scalar A44(const scalar h, const scalar k) const;
+
+ virtual scalar A55(const scalar h, const scalar k) const;
+
+ virtual scalar B22(const scalar h, const scalar k) const;
+
+ virtual scalar B24(const scalar h, const scalar k) const;
+
+ virtual scalar B33(const scalar h, const scalar k) const;
+
+ virtual scalar B33k(const scalar h, const scalar k) const;
+
+ virtual scalar B35(const scalar h, const scalar k) const;
+
+ virtual scalar B35k(const scalar h, const scalar k) const;
+
+ virtual scalar B44(const scalar h, const scalar k) const;
+
+ virtual scalar B55(const scalar h, const scalar k) const;
+
+ virtual scalar B55k(const scalar h, const scalar k) const;
+
+ virtual scalar C1(const scalar h, const scalar k) const;
+
+ virtual scalar C1k(const scalar h, const scalar k) const;
+
+ virtual scalar C2(const scalar h, const scalar k) const;
+
+ virtual scalar C2k(const scalar h, const scalar k) const;
+
+ virtual scalar C3(const scalar h, const scalar k) const;
+
+ virtual scalar C4(const scalar h, const scalar k) const;
+
+
+ //- Model intialisation
+ virtual void initialise
+ (
+ const scalar H,
+ const scalar d,
+ const scalar T,
+ scalar& kOut,
+ scalar& LambdaOut,
+ scalar& f1Out,
+ scalar& f2Out
+ ) const;
+
+ //- Wave height
+ virtual scalar eta
+ (
+ const scalar h,
+ const scalar kx,
+ const scalar ky,
+ const scalar lambda,
+ const scalar T,
+ const scalar x,
+ const scalar y,
+ const scalar t,
+ const scalar phase
+ ) const;
+
+ //- Wave velocity
+ virtual vector U
+ (
+ const scalar d,
+ const scalar kx,
+ const scalar ky,
+ const scalar lambda,
+ const scalar T,
+ const scalar x,
+ const scalar y,
+ const scalar t,
+ const scalar phase,
+ const scalar z
+ ) const;
+
+ //- Set the water level
+ virtual void setLevel
+ (
+ const scalar t,
+ const scalar tCoeff,
+ scalarField& level
+ ) const;
+
+ //- Calculate the wave model velocity
+ virtual void setVelocity
+ (
+ const scalar t,
+ const scalar tCoeff,
+ const scalarField& level
+ );
+
+
+public:
+
+ //- Runtime type information
+ TypeName("StokesV");
+
+ //- Constructor
+ StokesV
+ (
+ const dictionary& dict,
+ const fvMesh& mesh,
+ const polyPatch& patch,
+ const bool readFields = true
+ );
+
+ //- Destructor
+ virtual ~StokesV();
+
+
+ // Public Member Functions
+
+ //- Read from dictionary
+ virtual bool read(const dictionary& overrideDict);
+
+ //- Info
+ virtual void info(Ostream& os) const;
+};
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace waveModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/waveModels/waveGenerationModels/derived/cnoidal/Elliptic.H b/src/waveModels/waveGenerationModels/derived/cnoidal/Elliptic.H
new file mode 100644
index 0000000000..83effacac9
--- /dev/null
+++ b/src/waveModels/waveGenerationModels/derived/cnoidal/Elliptic.H
@@ -0,0 +1,152 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2016 OpenCFD Ltd.
+ \\/ M anipulation | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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 .
+
+Namespace
+ Foam::Elliptic
+
+Description
+
+\*---------------------------------------------------------------------------*/
+
+#include "mathematicalConstants.H"
+
+using namespace Foam::constant;
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace Elliptic
+{
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+void ellipticIntegralsKE(const scalar m, scalar& K, scalar& E)
+{
+ if (m == 0)
+ {
+ K = 0.5*mathematical::pi;
+ E = 0.5*mathematical::pi;
+ return;
+ }
+
+ scalar a = 1;
+ scalar g = Foam::sqrt(1 - m);
+ scalar ga = g*a;
+ scalar aux = 1;
+ scalar sum = 2 - m;
+
+ while (true)
+ {
+ scalar aOld = a;
+ scalar gOld = g;
+ ga = gOld*aOld;
+ a = 0.5*(gOld + aOld);
+ aux += aux;
+ sum -= aux*(a*a - ga);
+
+ if (mag(aOld - gOld) < SMALL)
+ {
+ break;
+ }
+
+ g = sqrt(ga);
+ }
+
+ K = 0.5*mathematical::pi/a;
+ E = 0.25*mathematical::pi/a*sum;
+}
+
+
+Foam::scalar JacobiAmp(const scalar u, const scalar mIn)
+{
+ static const label ITER = 25;
+ FixedList a, g, c;
+ scalar aux, amp;
+ label n;
+
+ const scalar m = mag(mIn);
+
+ if (m == 0)
+ {
+ return u;
+ }
+
+ if (m == 1)
+ {
+ return 2*atan(exp(u)) - mathematical::pi/2;
+ }
+
+ a[0] = 1.0;
+ g[0] = Foam::sqrt(1.0 - m);
+ c[0] = Foam::sqrt(m);
+
+ aux = 1.0;
+
+ for (n = 0; n < ITER; n++)
+ {
+ if (mag(a[n] - g[n]) < SMALL)
+ {
+ break;
+ }
+
+ aux += aux;
+ a[n+1] = 0.5*(a[n] + g[n]);
+ g[n+1] = Foam::sqrt(a[n]*g[n]);
+ c[n+1] = 0.5*(a[n] - g[n]);
+ }
+
+ amp = aux*a[n]*u;
+
+ for (; n > 0; n--)
+ {
+ amp = 0.5*(amp + asin(c[n]*sin(amp)/a[n]));
+ }
+
+ return scalar(amp);
+}
+
+
+void JacobiSnCnDn
+(
+ const scalar u,
+ const scalar m,
+ scalar& Sn,
+ scalar& Cn,
+ scalar& Dn
+)
+{
+ const scalar amp = Elliptic::JacobiAmp(u, m);
+
+ Sn = sin(amp);
+ Cn = cos(amp);
+ Dn = sqrt(1.0 - m*sin(amp)*sin(amp));
+ return;
+}
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Elliptic
+} // End namespace Foam
+
+// ************************************************************************* //
diff --git a/src/waveModels/waveGenerationModels/derived/cnoidal/cnoidalWaveModel.C b/src/waveModels/waveGenerationModels/derived/cnoidal/cnoidalWaveModel.C
new file mode 100644
index 0000000000..98c3873451
--- /dev/null
+++ b/src/waveModels/waveGenerationModels/derived/cnoidal/cnoidalWaveModel.C
@@ -0,0 +1,367 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2016 OpenCFD Ltd.
+ \\/ M anipulation | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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 .
+
+\*---------------------------------------------------------------------------*/
+
+#include "cnoidalWaveModel.H"
+#include "mathematicalConstants.H"
+#include "addToRunTimeSelectionTable.H"
+#include "Elliptic.H"
+
+using namespace Foam::constant;
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace waveModels
+{
+ defineTypeNameAndDebug(cnoidal, 0);
+ addToRunTimeSelectionTable
+ (
+ waveModel,
+ cnoidal,
+ patch
+ );
+}
+}
+
+
+// * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * //
+
+void Foam::waveModels::cnoidal::initialise
+(
+ const scalar H,
+ const scalar d,
+ const scalar T,
+ scalar& mOut,
+ scalar& LOut
+) const
+{
+ const scalar mTolerance = 0.0001;
+ scalar mElliptic = 0.5;
+ scalar LElliptic = 0;
+ scalar phaseSpeed = 0;
+
+ scalar mError = 0.0;
+ scalar mMinError = GREAT;
+
+ while (mElliptic < 1.0)
+ {
+ scalar KElliptic, EElliptic;
+ Elliptic::ellipticIntegralsKE(mElliptic, KElliptic, EElliptic);
+
+ LElliptic = KElliptic*sqrt(16.0*pow3(d)*mElliptic/(3.0*H));
+
+ phaseSpeed =
+ sqrt(mag(g_)*d)
+ *(1.0 - H/d/2.0 + H/d/mElliptic*(1.0 - 3.0/2.0*EElliptic/KElliptic));
+
+ mError = mag(T - LElliptic/phaseSpeed);
+
+ if (mError <= mMinError)
+ {
+ mOut = mElliptic;
+ LOut = LElliptic;
+ mMinError = mError;
+ }
+
+ mElliptic += mTolerance;
+ }
+}
+
+
+Foam::scalar Foam::waveModels::cnoidal::eta
+(
+ const scalar H,
+ const scalar m,
+ const scalar kx,
+ const scalar ky,
+ const scalar T,
+ const scalar x,
+ const scalar y,
+ const scalar t
+) const
+{
+ scalar K, E;
+ Elliptic::ellipticIntegralsKE(m, K, E);
+
+ const scalar uCnoidal =
+ K/mathematical::pi*(kx*x + ky*y - 2.0*mathematical::pi*t/T);
+
+ scalar sn, cn, dn;
+ Elliptic::JacobiSnCnDn(uCnoidal, m, sn, cn, dn);
+
+ return H*((1.0 - E/K)/m - 1.0 + sqr(cn));
+}
+
+
+Foam::scalar Foam::waveModels::cnoidal::eta1D
+(
+ const scalar H,
+ const scalar m,
+ const scalar t,
+ const scalar T
+) const
+{
+ scalar K, E;
+ Elliptic::ellipticIntegralsKE(m, K, E);
+
+ const scalar uCnoidal = -2.0*K*(t/T);
+
+ scalar sn, cn, dn;
+ Elliptic::JacobiSnCnDn(uCnoidal, m, sn, cn, dn);
+
+ return H*((1.0 - E/K)/m - 1.0 + sqr(cn));
+}
+
+
+Foam::scalar Foam::waveModels::cnoidal::etaMeanSq
+(
+ const scalar H,
+ const scalar m,
+ const scalar T
+) const
+{
+ scalar eta = 0;
+ scalar etaSumSq = 0;
+
+ for (int i=0; i<1000; i++)
+ {
+ eta = eta1D(H, m, i*T/(1000.0), T);
+ etaSumSq += eta*eta;
+ }
+
+ etaSumSq /= 1000.0;
+ return etaSumSq;
+}
+
+
+Foam::vector Foam::waveModels::cnoidal::dEtaDx
+(
+ const scalar H,
+ const scalar m,
+ const scalar uCnoidal,
+ const scalar L,
+ const scalar K,
+ const scalar E
+) const
+{
+ const scalar dudx = 2.0*K/L;
+ const scalar dudxx = 2.0*K/L*dudx;
+ const scalar dudxxx = 2.0*K/L*dudxx;
+
+ scalar sn, cn, dn;
+ Elliptic::JacobiSnCnDn(uCnoidal, m, sn, cn, dn);
+
+ scalar d1 = -2.0*H*cn*dn*sn*dudx;
+ scalar d2 = 2.0*H*(dn*dn*sn*sn - cn*cn*dn*dn + m*cn*cn*sn*sn)*dudxx;
+ scalar d3 =
+ 8.0*H
+ *(
+ cn*sn*dn*dn*dn*(-4.0 - 2.0*m)
+ + 4.0*m*cn*sn*sn*sn*dn
+ - 2.0*m*cn*cn*cn*sn*dn
+ )
+ *dudxxx;
+
+ return vector(d1, d2, d3);
+}
+
+
+Foam::vector Foam::waveModels::cnoidal::U
+(
+ const scalar H,
+ const scalar h,
+ const scalar m,
+ const scalar kx,
+ const scalar ky,
+ const scalar T,
+ const scalar x,
+ const scalar y,
+ const scalar t,
+ const scalar z
+) const
+{
+ scalar K, E;
+ Elliptic::ellipticIntegralsKE(m, K, E);
+
+ const scalar uCnoidal =
+ K/mathematical::pi*(kx*x + ky*y - 2.0*mathematical::pi*t/T);
+ const scalar k = sqrt(kx*kx + ky*ky);
+ const scalar L = 2.0*mathematical::pi/k;
+ const scalar c = L/T;
+
+ const scalar etaCN = eta(H, m, kx, ky, T, x, y, t);
+ const vector etaX = this->dEtaDx(H, m, uCnoidal, L, K, E);
+ const scalar etaMS = etaMeanSq(H, m, T);
+
+ scalar u =
+ c*etaCN/h
+ - c*(etaCN*etaCN/h/h + etaMS*etaMS/h/h)
+ + 1.0/2.0*c*h*(1.0/3.0 - z*z/h/h)*etaX[1];
+
+ scalar w =
+ -c*z*(etaX[0]/h*(1.0 - 2.0*etaCN/h) + 1.0/6.0*h*(1.0 - z*z/h/h)*etaX[2]);
+
+ scalar v = u*sin(waveAngle_);
+ u *= cos(waveAngle_);
+
+ return vector(u, v, w);
+}
+
+
+void Foam::waveModels::cnoidal::setLevel
+(
+ const scalar t,
+ const scalar tCoeff,
+ scalarField& level
+) const
+{
+ const scalar waveK = mathematical::twoPi/waveLength_;
+ const scalar waveKx = waveK*cos(waveAngle_);
+ const scalar waveKy = waveK*sin(waveAngle_);
+
+ forAll(level, paddlei)
+ {
+ const scalar eta =
+ this->eta
+ (
+ waveHeight_,
+ m_,
+ waveKx,
+ waveKy,
+ wavePeriod_,
+ xPaddle_[paddlei],
+ yPaddle_[paddlei],
+ t
+ );
+
+ level[paddlei] = waterDepthRef_ + tCoeff*eta;
+ }
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::waveModels::cnoidal::cnoidal
+(
+ const dictionary& dict,
+ const fvMesh& mesh,
+ const polyPatch& patch,
+ const bool readFields
+)
+:
+ regularWaveModel(dict, mesh, patch, false),
+ m_(0)
+{
+ if (readFields)
+ {
+ read(dict);
+ }
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::waveModels::cnoidal::~cnoidal()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+bool Foam::waveModels::cnoidal::read(const dictionary& overrideDict)
+{
+ if (regularWaveModel::read(overrideDict))
+ {
+ // Initialise m parameter and wavelength
+ initialise
+ (
+ waveHeight_,
+ waterDepthRef_,
+ wavePeriod_,
+ m_,
+ waveLength_
+ );
+
+ return true;
+ }
+
+ return false;
+}
+
+
+void Foam::waveModels::cnoidal::setVelocity
+(
+ const scalar t,
+ const scalar tCoeff,
+ const scalarField& level
+)
+{
+ const scalar waveK = mathematical::twoPi/waveLength_;
+ const scalar waveKx = waveK*cos(waveAngle_);
+ const scalar waveKy = waveK*sin(waveAngle_);
+
+ forAll(U_, facei)
+ {
+ // Fraction of geometry represented by paddle - to be set
+ scalar fraction = 1;
+
+ // Height - to be set
+ scalar z = 0;
+
+ setPaddlePropeties(level, facei, fraction, z);
+
+ if (fraction > 0)
+ {
+ const label paddlei = faceToPaddle_[facei];
+
+ const vector Uf = U
+ (
+ waveHeight_,
+ waterDepthRef_,
+ m_,
+ waveKx,
+ waveKy,
+ wavePeriod_,
+ xPaddle_[paddlei],
+ yPaddle_[paddlei],
+ t,
+ z
+ );
+
+ U_[facei] = fraction*Uf*tCoeff;
+ }
+ }
+}
+
+
+void Foam::waveModels::cnoidal::info(Ostream& os) const
+{
+ regularWaveModel::info(os);
+
+ os << " Cnoidal m parameter : " << m_ << nl;
+}
+
+
+// ************************************************************************* //
diff --git a/src/waveModels/waveGenerationModels/derived/cnoidal/cnoidalWaveModel.H b/src/waveModels/waveGenerationModels/derived/cnoidal/cnoidalWaveModel.H
new file mode 100644
index 0000000000..3c78658154
--- /dev/null
+++ b/src/waveModels/waveGenerationModels/derived/cnoidal/cnoidalWaveModel.H
@@ -0,0 +1,177 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2016 OpenCFD Ltd.
+ \\/ M anipulation | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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 .
+
+Class
+ Foam::waveModels::cnoidal
+
+Description
+ Cnoidal wave model
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef waveModels_cnoidal_H
+#define waveModels_cnoidal_H
+
+#include "regularWaveModel.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+namespace waveModels
+{
+
+/*---------------------------------------------------------------------------*\
+ Class cnoidal Declaration
+\*---------------------------------------------------------------------------*/
+
+class cnoidal
+:
+ public regularWaveModel
+{
+protected:
+
+ // Protected data
+
+ //- `m' coefficient
+ scalar m_;
+
+
+ // Protected Member Functions
+
+ void initialise
+ (
+ const scalar H,
+ const scalar d,
+ const scalar T,
+ scalar& mOut,
+ scalar& LOut
+ ) const;
+
+ //- Wave height
+ virtual scalar eta
+ (
+ const scalar H,
+ const scalar Kx,
+ const scalar x,
+ const scalar Ky,
+ const scalar y,
+ const scalar omega,
+ const scalar t,
+ const scalar phase
+ ) const;
+
+ scalar eta1D
+ (
+ const scalar H,
+ const scalar m,
+ const scalar t,
+ const scalar T
+ ) const;
+
+ scalar etaMeanSq
+ (
+ const scalar H,
+ const scalar m,
+ const scalar T
+ ) const;
+
+ vector dEtaDx
+ (
+ const scalar H,
+ const scalar m,
+ const scalar uCnoidal,
+ const scalar L,
+ const scalar K,
+ const scalar E
+ ) const;
+
+ //- Wave velocity
+ virtual vector U
+ (
+ const scalar H,
+ const scalar h,
+ const scalar Kx,
+ const scalar x,
+ const scalar Ky,
+ const scalar y,
+ const scalar omega,
+ const scalar t,
+ const scalar phase,
+ const scalar z
+ ) const;
+
+ //- Set the water level
+ virtual void setLevel
+ (
+ const scalar t,
+ const scalar tCoeff,
+ scalarField& level
+ ) const;
+
+ //- Calculate the wave model velocity
+ virtual void setVelocity
+ (
+ const scalar t,
+ const scalar tCoeff,
+ const scalarField& level
+ );
+
+
+public:
+
+ //- Runtime type information
+ TypeName("cnoidal");
+
+ //- Constructor
+ cnoidal
+ (
+ const dictionary& dict,
+ const fvMesh& mesh,
+ const polyPatch& patch,
+ const bool readFields = true
+ );
+
+ //- Destructor
+ virtual ~cnoidal();
+
+
+ // Public Member Functions
+
+ //- Read from dictionary
+ virtual bool read(const dictionary& overrideDict);
+
+ //- Info
+ virtual void info(Ostream& os) const;
+};
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace waveModels
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/waveModels/waveModel/waveModel.C b/src/waveModels/waveModel/waveModel.C
new file mode 100644
index 0000000000..01f5749b9b
--- /dev/null
+++ b/src/waveModels/waveModel/waveModel.C
@@ -0,0 +1,433 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2016 OpenCFD Ltd.
+ \\/ M anipulation | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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 .
+
+\*---------------------------------------------------------------------------*/
+
+#include "waveModel.H"
+#include "fvMesh.H"
+#include "polyPatch.H"
+#include "uniformDimensionedFields.H"
+#include "volFields.H"
+#include "fvPatchFields.H"
+
+using namespace Foam::constant;
+
+// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
+
+namespace Foam
+{
+ defineTypeNameAndDebug(waveModel, 0);
+ defineRunTimeSelectionTable(waveModel, patch);
+}
+
+const Foam::word Foam::waveModel::dictName("waveProperties");
+
+
+Foam::word Foam::waveModel::modelName(const word& patchName)
+{
+ return dictName + '.' + patchName;
+}
+
+
+// * * * * * * * * * * * * Protected Member Functions * * * * * * * * * * * //
+
+void Foam::waveModel::initialiseGeometry()
+{
+ // Determine local patch co-ordinate system given by:
+ // - X: streamwise: patch normal
+ // - Y: spanwise: Z^X
+ // - Z: up: (negative) gravity direction
+ vector x(-gAverage(patch_.faceAreas()));
+ x /= mag(x) + ROOTVSMALL;
+ vector z = -g_/mag(g_);
+ vector y = z^x;
+
+ // Rotation from global<->local about global origin
+ Rlg_ = tensor(x, y, z);
+ Rgl_ = Rlg_.T();
+
+ // Global patch extents
+ const vectorField& Cp = patch_.localPoints();
+ const vectorField CpLocal(Rgl_ & Cp);
+ boundBox bb(CpLocal, true);
+ const scalar xMin = bb.min().x();
+ const scalar xMax = bb.max().x();
+ const scalar yMin = bb.min().y();
+ const scalar yMax = bb.max().y();
+ zSpan_ = bb.max().z() - bb.min().z();
+
+ // Global x, y positions of the paddle centres
+ xPaddle_.setSize(nPaddle_, 0);
+ yPaddle_.setSize(nPaddle_, 0);
+ const scalar xMid = xMin + 0.5*(xMax - xMin);
+ const scalar paddleDy = (yMax - yMin)/scalar(nPaddle_);
+ for (label paddlei = 0; paddlei < nPaddle_; ++paddlei)
+ {
+ xPaddle_[paddlei] = xMid;
+ yPaddle_[paddlei] = paddlei*paddleDy + yMin + 0.5*paddleDy;;
+ }
+
+ // Local face centres
+ const vectorField& Cf = patch_.faceCentres();
+ const vectorField CfLocal(Rgl_ & Cf);
+ z_ = CfLocal.component(2);
+
+ // Local face extents in z-direction
+ zMin_.setSize(patch_.size());
+ zMax_.setSize(patch_.size());
+ const faceList& faces = patch_.localFaces();
+ forAll(faces, facei)
+ {
+ const face& f = faces[facei];
+ const label nPoint = f.size();
+ zMin_[facei] = CpLocal[f[0]].z();
+ zMax_[facei] = CpLocal[f[0]].z();
+
+ for (label fpi = 1; fpi < nPoint; ++fpi)
+ {
+ const label pointi = f[fpi];
+ zMin_[facei] = min(zMin_[facei], CpLocal[pointi].z());
+ zMax_[facei] = max(zMax_[facei], CpLocal[pointi].z());
+ }
+ }
+
+ // Local paddle-to-face addressing
+ faceToPaddle_.setSize(patch_.size(), -1);
+ forAll(faceToPaddle_, facei)
+ {
+ faceToPaddle_[facei] = floor((CfLocal[facei].y() - yMin)/paddleDy);
+ }
+}
+
+
+Foam::tmp Foam::waveModel::waterLevel() const
+{
+ // Note: initialising as initial depth
+ tmp tlevel(new scalarField(nPaddle_, initialDepth_));
+ scalarField& level = tlevel.ref();
+
+ const volScalarField& alpha =
+ mesh_.lookupObject(alphaName_);
+ const fvPatchScalarField& alphap = alpha.boundaryField()[patch_.index()];
+ const scalarField alphac(alphap.patchInternalField());
+
+ const scalarField& magSf = alphap.patch().magSf();
+ scalarList paddleMagSf(nPaddle_, 0.0);
+ scalarList paddleWettedMagSf(nPaddle_, 0.0);
+
+ forAll(alphac, facei)
+ {
+ label paddlei = faceToPaddle_[facei];
+ paddleMagSf[paddlei] += magSf[facei];
+ paddleWettedMagSf[paddlei] += magSf[facei]*alphac[facei];
+ }
+
+ forAll(paddleMagSf, paddlei)
+ {
+ reduce(paddleMagSf[paddlei], sumOp());
+ reduce(paddleWettedMagSf[paddlei], sumOp());
+ level[paddlei] +=
+ paddleWettedMagSf[paddlei]
+ /(paddleMagSf[paddlei]*zSpan_ + ROOTVSMALL);
+ }
+
+ return tlevel;
+}
+
+
+void Foam::waveModel::setAlpha(const scalarField& level)
+{
+ forAll(alpha_, facei)
+ {
+ const label paddlei = faceToPaddle_[facei];
+ const scalar paddleCalc = level[paddlei];
+
+ if (zMax_[facei] < paddleCalc)
+ {
+ alpha_[facei] = 1.0;
+ }
+ else if (zMin_[facei] > paddleCalc)
+ {
+ alpha_[facei] = 0.0;
+ }
+ else
+ {
+ scalar dz = paddleCalc - zMin_[facei];
+ alpha_[facei] = dz/zSpan_;
+ }
+ }
+}
+
+
+void Foam::waveModel::setPaddlePropeties
+(
+ const scalarField& level,
+ const label facei,
+ scalar& fraction,
+ scalar& z
+) const
+{
+ const label paddlei = faceToPaddle_[facei];
+ const scalar paddleCalc = level[paddlei];
+ const scalar paddleHeight = min(paddleCalc, waterDepthRef_);
+ const scalar zMin = zMin_[facei];
+ const scalar zMax = zMax_[facei];
+
+ fraction = 1;
+ z = 0;
+
+ if (zMax < paddleHeight)
+ {
+ z = z_[facei];
+ }
+ else if (zMin > paddleCalc)
+ {
+ fraction = -1;
+ }
+ else
+ {
+ if (paddleCalc < waterDepthRef_)
+ {
+ if ((zMax > paddleCalc) && (zMin < paddleCalc))
+ {
+ scalar dz = paddleCalc - zMin;
+ fraction = dz/zSpan_;
+ z = z_[facei];
+ }
+ }
+ else
+ {
+ if (zMax < paddleCalc)
+ {
+ z = waterDepthRef_;
+ }
+ else if ((zMax > paddleCalc) && (zMin < paddleCalc))
+ {
+ scalar dz = paddleCalc - zMin;
+ fraction = dz/zSpan_;
+ z = waterDepthRef_;
+ }
+ }
+ }
+}
+
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::waveModel::waveModel
+(
+ const dictionary& dict,
+ const fvMesh& mesh,
+ const polyPatch& patch,
+ const bool readFields
+)
+:
+ IOdictionary
+ (
+ IOobject
+ (
+ modelName(patch.name()),
+ Time::timeName(mesh.time().startTime().value()),
+ "uniform",
+ mesh,
+ IOobject::NO_READ,
+ IOobject::AUTO_WRITE
+ )
+ ),
+ mesh_(mesh),
+ patch_(patch),
+ g_(mesh.lookupObject("g").value()),
+ UName_("U"),
+ alphaName_("alpha"),
+ Rgl_(tensor::I),
+ Rlg_(tensor::I),
+ nPaddle_(1),
+ xPaddle_(),
+ yPaddle_(),
+ z_(),
+ zSpan_(0),
+ zMin_(),
+ zMax_(),
+ waterDepthRef_(0),
+ initialDepth_(0),
+ currTimeIndex_(-1),
+ activeAbsorption_(false),
+ U_(patch.size(), vector::zero),
+ alpha_(patch.size(), 0)
+{
+ if (readFields)
+ {
+ read(dict);
+ }
+}
+
+
+// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
+
+Foam::waveModel::~waveModel()
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+bool Foam::waveModel::read(const dictionary& overrideDict)
+{
+ readOpt() = IOobject::READ_IF_PRESENT;
+ if (headerOk())
+ {
+ IOdictionary::regIOobject::read();
+ }
+
+ merge(overrideDict);
+
+ readIfPresent("U", UName_);
+ readIfPresent("alpha", alphaName_);
+
+ lookup("nPaddle") >> nPaddle_;
+ if (nPaddle_ < 1)
+ {
+ FatalIOErrorInFunction(*this)
+ << "Number of paddles must be greater than zero. Supplied"
+ << " value nPaddles = " << nPaddle_
+ << exit(FatalIOError);
+ }
+
+ readIfPresent("initialDepth", initialDepth_);
+
+ // Need to intialise the geometry before calling waterLevel()
+ initialiseGeometry();
+
+ // Set the reference water depth
+ if (!readIfPresent("waterDepthRef", waterDepthRef_))
+ {
+ scalar waterDepth = 0;
+ if (readIfPresent("waterDepth", waterDepth))
+ {
+ waterDepthRef_ = waterDepth;
+ }
+ else
+ {
+ const scalarField level(waterLevel());
+ if (level.size())
+ {
+ waterDepthRef_ = level.first();
+ }
+ }
+
+ // Avoid potential zero...
+ waterDepthRef_ += SMALL;
+
+ // Insert the reference water depth into [this] to enable restart
+ add("waterDepthRef", waterDepthRef_);
+ }
+
+ return true;
+}
+
+
+void Foam::waveModel::correct(const scalar t)
+{
+ if (mesh_.time().timeIndex() != currTimeIndex_)
+ {
+ Info<< "Updating " << type() << " wave model for patch "
+ << patch_.name() << endl;
+
+ // Time ramp weight
+ const scalar tCoeff = timeCoeff(t);
+
+ // Reset the velocity and phase fraction fields
+ U_ = vector::zero;
+ alpha_ = 0;
+
+ // Update the calculated water level field
+ scalarField calculatedLevel(nPaddle_, 0);
+
+ if (patch_.size())
+ {
+ // Set wave level
+ setLevel(t, tCoeff, calculatedLevel);
+
+ // Update the velocity field
+ setVelocity(t, tCoeff, calculatedLevel);
+
+ // Update the phase fraction field
+ setAlpha(calculatedLevel);
+ }
+
+ if (activeAbsorption_)
+ {
+ const scalarField activeLevel(this->waterLevel());
+
+ forAll(U_, facei)
+ {
+ const label paddlei = faceToPaddle_[facei];
+
+ if (zMin_[facei] < activeLevel[paddlei])
+ {
+ scalar UCorr =
+ (calculatedLevel[paddlei] - activeLevel[paddlei])
+ *sqrt(mag(g_)/activeLevel[paddlei]);
+
+ U_[facei].x() += UCorr;
+ }
+ else
+ {
+ U_[facei].x() = 0;
+ }
+ }
+ }
+
+ // Transform velocity into global co-ordinate system
+ U_ = Rlg_ & U_;
+
+ currTimeIndex_ = mesh_.time().timeIndex();
+ }
+}
+
+
+const Foam::vectorField& Foam::waveModel::U() const
+{
+ return U_;
+}
+
+
+const Foam::scalarField& Foam::waveModel::alpha() const
+{
+ return alpha_;
+}
+
+
+void Foam::waveModel::info(Ostream& os) const
+{
+ os << "Wave model: patch " << patch_.name() << nl
+ << " Type : " << type() << nl
+ << " Velocity field name : " << UName_ << nl
+ << " Phase fraction field name : " << alphaName_ << nl
+ << " Transformation from local to global system : " << Rlg_ << nl
+ << " Number of paddles: " << nPaddle_ << nl
+ << " Reference water depth : " << waterDepthRef_ << nl
+ << " Active absorption: " << activeAbsorption_ << nl;
+}
+
+
+// ************************************************************************* //
diff --git a/src/waveModels/waveModel/waveModel.H b/src/waveModels/waveModel/waveModel.H
new file mode 100644
index 0000000000..7a0efd4570
--- /dev/null
+++ b/src/waveModels/waveModel/waveModel.H
@@ -0,0 +1,258 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2016 OpenCFD Ltd.
+ \\/ M anipulation | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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 .
+
+Class
+ Foam::waveModel
+
+Description
+ Base class for waveModels
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef waveModel_H
+#define waveModel_H
+
+#include "autoPtr.H"
+#include "runTimeSelectionTables.H"
+
+#include "IOdictionary.H"
+#include "dictionary.H"
+#include "scalarField.H"
+#include "vectorField.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+class fvMesh;
+class polyPatch;
+
+/*---------------------------------------------------------------------------*\
+ Class waveModel Declaration
+\*---------------------------------------------------------------------------*/
+
+class waveModel
+:
+ public refCount,
+ public IOdictionary
+{
+protected:
+
+ // Protected data
+
+ //- Reference to the mesh database
+ const fvMesh& mesh_;
+
+ //- Reference to the polyPatch
+ const polyPatch& patch_;
+
+ //- Gravity
+ const vector& g_;
+
+ //- Name of velocity field, default = "U"
+ word UName_;
+
+ //- Name of phase fraction field, default = "alpha"
+ word alphaName_;
+
+ //- Rotation tensor from global to local system
+ tensor Rgl_;
+
+ //- Rotation tensor from local to global system
+ tensor Rlg_;
+
+ //- Number of paddles
+ label nPaddle_;
+
+ //- Paddle x co-ordinates / [m]
+ scalarField xPaddle_;
+
+ //- Paddle y co-ordinates / [m]
+ scalarField yPaddle_;
+
+ //- Addressing from patch face index to paddle index
+ labelList faceToPaddle_;
+
+ //- Patch face centre z co-ordinates / [m]
+ scalarField z_;
+
+ //- Overall (point) span in z-direction / [m]
+ scalar zSpan_;
+
+ //- Minimum z (point) height per patch face / [m]
+ scalarField zMin_;
+
+ //- Maximum z (point) height per patch face / [m]
+ scalarField zMax_;
+
+ //- Reference water depth / [m]
+ scalar waterDepthRef_;
+
+ //- Initial depth / [m]
+ scalar initialDepth_;
+
+ //- Time index used for updating
+ label currTimeIndex_;
+
+ //- Active wave absorption switch
+ bool activeAbsorption_;
+
+
+ // Current values
+
+ //- Velocity field
+ vectorField U_;
+
+ //- Wave indicator field
+ scalarField alpha_;
+
+
+ // Protected Member Functions
+
+ //- Initialise
+ virtual void initialiseGeometry();
+
+ //- Water level
+ virtual tmp waterLevel() const;
+
+ //- Return the time scaling coefficient
+ virtual scalar timeCoeff(const scalar t) const = 0;
+
+ //- Set the water level
+ virtual void setLevel
+ (
+ const scalar t,
+ const scalar tCoeff,
+ scalarField& level
+ ) const = 0;
+
+ //- Calculate the wave model velocity
+ virtual void setVelocity
+ (
+ const scalar t,
+ const scalar tCoeff,
+ const scalarField& level
+ ) = 0;
+
+ //- Set the alpha field based on the water level
+ virtual void setAlpha(const scalarField& level);
+
+ //- Set the paddle coverage fraction and reference height
+ virtual void setPaddlePropeties
+ (
+ const scalarField& level,
+ const label facei,
+ scalar& fraction,
+ scalar& z
+ ) const;
+
+
+public:
+
+ //- Runtime type information
+ TypeName("waveModel");
+
+ // Declare runtime constructor selection table
+
+ declareRunTimeSelectionTable
+ (
+ autoPtr,
+ waveModel,
+ patch,
+ (
+ const dictionary& dict,
+ const fvMesh& mesh,
+ const polyPatch& patch
+ ),
+ (dict, mesh, patch)
+ );
+
+
+ //- Constructor
+ waveModel
+ (
+ const dictionary& dict,
+ const fvMesh& mesh,
+ const polyPatch& patch,
+ const bool readFields = true
+ );
+
+
+ // Selectors
+
+ //- Return a reference to the selected wave model
+ static autoPtr New
+ (
+ const word& dictName,
+ const fvMesh& mesh,
+ const polyPatch& patch
+ );
+
+ //- Lookup waveModel from database, or create new
+ static tmp lookupOrCreate
+ (
+ const polyPatch& patch,
+ const fvMesh& mesh,
+ const word& waveDictName
+ );
+
+
+ //- Destructor
+ virtual ~waveModel();
+
+ //- Dictionary name
+ static const word dictName;
+
+
+ // Public Member Functions
+
+ //- Utility function to construct the model name
+ static word modelName(const word& patchName);
+
+ //- Read from dictionary
+ virtual bool read(const dictionary& overrideDict);
+
+ //- Return the latest wave velocity prediction
+ virtual const vectorField& U() const;
+
+ //- Return the latest wave indicator field prediction
+ virtual const scalarField& alpha() const;
+
+ //- Correct the model for time, t[s]
+ virtual void correct(const scalar t);
+
+ //- Info
+ virtual void info(Ostream& os) const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //
diff --git a/src/waveModels/waveModel/waveModelNew.C b/src/waveModels/waveModel/waveModelNew.C
new file mode 100644
index 0000000000..60446418e5
--- /dev/null
+++ b/src/waveModels/waveModel/waveModelNew.C
@@ -0,0 +1,103 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2016 OpenCFD Ltd.
+ \\/ M anipulation | Copyright (C) 2015 IH-Cantabria
+-------------------------------------------------------------------------------
+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 .
+
+\*---------------------------------------------------------------------------*/
+
+#include "waveModel.H"
+#include "fvMesh.H"
+
+Foam::autoPtr Foam::waveModel::New
+(
+ const word& dictName,
+ const fvMesh& mesh,
+ const polyPatch& patch
+)
+{
+ IOdictionary waveDict
+ (
+ IOobject
+ (
+ dictName,
+ mesh.time().constant(),
+ mesh,
+ IOobject::MUST_READ,
+ IOobject::NO_WRITE,
+ false // Not registering
+ )
+ );
+
+ word modelType = "none";
+ dictionary patchDict;
+ if (waveDict.found(patch.name()))
+ {
+ patchDict = waveDict.subDict(patch.name());
+ patchDict.lookup("waveModel") >> modelType;
+ }
+ else
+ {
+ FatalIOErrorInFunction(waveDict)
+ << "Dictionary entry for patch " << patch.name() << " not found"
+ << exit(FatalIOError);
+ }
+
+ Info<< "Selecting waveModel " << modelType << endl;
+
+ patchConstructorTable::iterator cstrIter =
+ patchConstructorTablePtr_->find(modelType);
+
+ if (cstrIter == patchConstructorTablePtr_->end())
+ {
+ FatalIOErrorInFunction(waveDict)
+ << "Unknown waveModel type "
+ << modelType << nl << nl
+ << "Valid waveModel types are:" << nl
+ << patchConstructorTablePtr_->sortedToc()
+ << exit(FatalIOError);
+ }
+
+ return autoPtr(cstrIter()(patchDict, mesh, patch));
+}
+
+
+Foam::tmp Foam::waveModel::lookupOrCreate
+(
+ const polyPatch& patch,
+ const fvMesh& mesh,
+ const word& waveDictName
+)
+{
+ const word modelName = waveModel::modelName(patch.name());
+
+ if (!mesh.foundObject(modelName))
+ {
+ autoPtr model(waveModel::New(waveDictName, mesh, patch));
+ waveModel* waveModelPtr = model.ptr();
+ waveModelPtr->store();
+ waveModelPtr->info(Info);
+ }
+
+ return mesh.lookupObject(modelName);
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleCnoidal/0.orig/U b/tutorials/multiphase/interFoam/laminar/waveExampleCnoidal/0.orig/U
new file mode 100644
index 0000000000..097dae5bea
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleCnoidal/0.orig/U
@@ -0,0 +1,54 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volVectorField;
+ location "0";
+ object U;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 1 -1 0 0 0 0];
+
+internalField uniform (0 0 0);
+
+boundaryField
+{
+ inlet
+ {
+ type waveVelocity;
+ value uniform (0 0 0);
+ }
+
+ outlet
+ {
+ type waveVelocity;
+ value uniform (0 0 0);
+ }
+
+ sides
+ {
+ type empty;
+ }
+
+ ground
+ {
+ type fixedValue;
+ value uniform (0 0 0);
+ }
+
+ top
+ {
+ type pressureInletOutletVelocity;
+ value uniform (0 0 0);
+ }
+}
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleCnoidal/0.orig/alpha.water b/tutorials/multiphase/interFoam/laminar/waveExampleCnoidal/0.orig/alpha.water
new file mode 100644
index 0000000000..424d475902
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleCnoidal/0.orig/alpha.water
@@ -0,0 +1,52 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: http://www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object alpha.water;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 0 0 0 0 0 0];
+
+internalField uniform 0;
+
+boundaryField
+{
+ inlet
+ {
+ type waveAlpha;
+ value uniform 0;
+ }
+
+ outlet
+ {
+ type zeroGradient;
+ }
+
+ ground
+ {
+ type zeroGradient;
+ }
+
+ sides
+ {
+ type empty;
+ }
+
+ top
+ {
+ type inletOutlet;
+ inletValue uniform 0;
+ value uniform 0;
+ }
+}
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleCnoidal/0.orig/p_rgh b/tutorials/multiphase/interFoam/laminar/waveExampleCnoidal/0.orig/p_rgh
new file mode 100644
index 0000000000..7ad5729cbf
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleCnoidal/0.orig/p_rgh
@@ -0,0 +1,60 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: http://www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object p_rgh;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [1 -1 -2 0 0 0 0];
+
+internalField uniform 0;
+
+boundaryField
+{
+ inlet
+ {
+ type fixedFluxPressure;
+ value uniform 0;
+ }
+
+ outlet
+ {
+ type fixedFluxPressure;
+ value uniform 0;
+ }
+
+ ground
+ {
+ type fixedFluxPressure;
+ value uniform 0;
+ }
+
+ sides
+ {
+ type empty;
+ }
+
+ top
+ {
+ type totalPressure;
+ U U;
+ phi phi;
+ rho rho;
+ psi none;
+ gamma 1;
+ p0 uniform 0;
+ value uniform 0;
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleCnoidal/Allclean b/tutorials/multiphase/interFoam/laminar/waveExampleCnoidal/Allclean
new file mode 100755
index 0000000000..705f91474c
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleCnoidal/Allclean
@@ -0,0 +1,10 @@
+#!/bin/sh
+cd ${0%/*} || exit 1 # run from this directory
+
+# Source tutorial run functions
+. $WM_PROJECT_DIR/bin/tools/CleanFunctions
+
+rm -rf 0
+
+cleanCase
+
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleCnoidal/Allrun b/tutorials/multiphase/interFoam/laminar/waveExampleCnoidal/Allrun
new file mode 100755
index 0000000000..9f0c668029
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleCnoidal/Allrun
@@ -0,0 +1,15 @@
+#!/bin/sh
+cd ${0%/*} || exit 1 # run from this directory
+
+# Source tutorial run functions
+. $WM_PROJECT_DIR/bin/tools/RunFunctions
+
+restore0Dir
+
+runApplication blockMesh
+
+runApplication decomposePar
+
+runParallel setFields
+
+runParallel $(getApplication)
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleCnoidal/constant/g b/tutorials/multiphase/interFoam/laminar/waveExampleCnoidal/constant/g
new file mode 100644
index 0000000000..3ec2141e5c
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleCnoidal/constant/g
@@ -0,0 +1,22 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class uniformDimensionedVectorField;
+ location "constant";
+ object g;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 1 -2 0 0 0 0];
+value ( 0 0 -9.81 );
+
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleCnoidal/constant/transportProperties b/tutorials/multiphase/interFoam/laminar/waveExampleCnoidal/constant/transportProperties
new file mode 100644
index 0000000000..019225dd4f
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleCnoidal/constant/transportProperties
@@ -0,0 +1,37 @@
+/*---------------------------------------------------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: http://www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ location "constant";
+ object transportProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+phases (water air);
+
+water
+{
+ transportModel Newtonian;
+ nu [0 2 -1 0 0 0 0] 1e-06;
+ rho [1 -3 0 0 0 0 0] 1000;
+}
+
+air
+{
+ transportModel Newtonian;
+ nu [0 2 -1 0 0 0 0] 1.48e-05;
+ rho [1 -3 0 0 0 0 0] 1;
+}
+
+sigma [1 0 -2 0 0 0 0] 0.07;
+
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleCnoidal/constant/turbulenceProperties b/tutorials/multiphase/interFoam/laminar/waveExampleCnoidal/constant/turbulenceProperties
new file mode 100644
index 0000000000..115a9830c1
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleCnoidal/constant/turbulenceProperties
@@ -0,0 +1,20 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ location "constant";
+ object turbulenceProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+simulationType laminar;
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleCnoidal/constant/waveProperties b/tutorials/multiphase/interFoam/laminar/waveExampleCnoidal/constant/waveProperties
new file mode 100644
index 0000000000..34a5dbc9da
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleCnoidal/constant/waveProperties
@@ -0,0 +1,47 @@
+/*---------------------------------------------------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: http://www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ location "constant";
+ object wavesProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+inlet
+{
+ alpha alpha.water;
+
+ waveModel cnoidal;
+
+ nPaddle 1;
+
+ waveHeight 0.1;
+
+ waveAngle 0.0;
+
+ rampTime 6.0;
+
+ activeAbsorption yes;
+
+ wavePeriod 4.0;
+}
+
+outlet
+{
+ alpha alpha.water;
+
+ waveModel shallowWaterAbsorption;
+
+ nPaddle 1;
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleCnoidal/system/blockMeshDict b/tutorials/multiphase/interFoam/laminar/waveExampleCnoidal/system/blockMeshDict
new file mode 100644
index 0000000000..3b84f93af7
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleCnoidal/system/blockMeshDict
@@ -0,0 +1,90 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object blockMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+convertToMeters 1;
+
+vertices
+(
+ ( 0.0 0.0 0.0)
+ ( 30.0 0.0 0.0)
+ ( 30.0 0.04 0.0)
+ ( 0.0 0.04 0.0)
+ ( 0.0 0.0 0.7)
+ ( 30.0 0.0 0.7)
+ ( 30.0 0.04 0.7)
+ ( 0.0 0.04 0.7)
+);
+
+blocks
+(
+ hex (0 1 2 3 4 5 6 7) (750 1 70) simpleGrading (1 1 1)
+);
+
+edges
+(
+);
+
+boundary
+(
+ inlet
+ {
+ type patch;
+ faces
+ (
+ (0 4 7 3)
+ );
+ }
+ outlet
+ {
+ type patch;
+ faces
+ (
+ (1 5 6 2)
+ );
+ }
+ ground
+ {
+ type wall;
+ faces
+ (
+ (0 1 2 3)
+ );
+ }
+ top
+ {
+ type patch;
+ faces
+ (
+ (4 5 6 7)
+ );
+ }
+ sides
+ {
+ type empty;
+ faces
+ (
+ (0 1 5 4)
+ (3 2 6 7)
+ );
+ }
+);
+
+mergePatchPairs
+(
+);
+
+// ************************************************************************* //
+
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleCnoidal/system/controlDict b/tutorials/multiphase/interFoam/laminar/waveExampleCnoidal/system/controlDict
new file mode 100644
index 0000000000..92a1a646e9
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleCnoidal/system/controlDict
@@ -0,0 +1,146 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ location "system";
+ object controlDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+application interFoam;
+
+startFrom latestTime;
+
+startTime 0;
+
+stopAt endTime;
+
+endTime 50.0;
+
+deltaT 0.01;
+
+writeControl adjustableRunTime;
+
+writeInterval 0.033;
+
+purgeWrite 0;
+
+writeFormat ascii;
+
+writePrecision 6;
+
+writeCompression uncompressed;
+
+timeFormat general;
+
+timePrecision 6;
+
+runTimeModifiable yes;
+
+adjustTimeStep yes;
+
+maxCo 0.65;
+maxAlphaCo 0.65;
+
+maxDeltaT 0.05;
+
+
+functions
+{
+ line
+ {
+ type sets;
+ libs ("libsampling.so");
+ enabled true;
+ writeControl writeTime;
+ writeInterval 1;
+
+ interpolationScheme cellPoint;
+ setFormat raw;
+ sets
+ (
+ line1
+ {
+ type uniform;
+ axis distance;
+ start ( 1.0 0.005 0.0 );
+ end ( 1.0 0.005 0.8 );
+ nPoints 1001;
+ }
+ line2
+ {
+ type uniform;
+ axis distance;
+ start ( 2.0 0.005 0.0 );
+ end ( 2.0 0.005 0.8 );
+ nPoints 1001;
+ }
+ line3
+ {
+ type uniform;
+ axis distance;
+ start ( 3.0 0.005 0.0 );
+ end ( 3.0 0.005 0.8 );
+ nPoints 1001;
+ }
+ line4
+ {
+ type uniform;
+ axis distance;
+ start ( 5.0 0.005 0.0 );
+ end ( 5.0 0.005 0.8 );
+ nPoints 1001;
+ }
+ line5
+ {
+ type uniform;
+ axis distance;
+ start ( 7.5 0.005 0.0 );
+ end ( 7.5 0.005 0.8 );
+ nPoints 1001;
+ }
+
+ line6
+ {
+ type uniform;
+ axis distance;
+ start ( 10.0 0.005 0.0 );
+ end ( 10.0 0.005 0.8 );
+ nPoints 1001;
+ }
+ line7
+ {
+ type uniform;
+ axis distance;
+ start ( 12.0 0.005 0.0 );
+ end ( 12.0 0.005 0.8 );
+ nPoints 1001;
+ }
+ line8
+ {
+ type uniform;
+ axis distance;
+ start ( 14.0 0.005 0.0 );
+ end ( 14.0 0.005 0.8 );
+ nPoints 1001;
+ }
+ );
+
+ fixedLocations false;
+ fields
+ (
+ U alpha.water
+ );
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleCnoidal/system/decomposeParDict b/tutorials/multiphase/interFoam/laminar/waveExampleCnoidal/system/decomposeParDict
new file mode 100644
index 0000000000..301d97027b
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleCnoidal/system/decomposeParDict
@@ -0,0 +1,29 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object decomposeParDict;
+}
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+numberOfSubdomains 2;
+
+method hierarchical;
+
+hierarchicalCoeffs
+{
+ n (2 1 1);
+ delta 0.001;
+ order xyz;
+}
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleCnoidal/system/fvSchemes b/tutorials/multiphase/interFoam/laminar/waveExampleCnoidal/system/fvSchemes
new file mode 100644
index 0000000000..eeff89271f
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleCnoidal/system/fvSchemes
@@ -0,0 +1,54 @@
+
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ location "system";
+ object fvSchemes;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+ddtSchemes
+{
+ default Euler;
+}
+
+gradSchemes
+{
+ default Gauss linear;
+}
+
+divSchemes
+{
+ div(rhoPhi,U) Gauss linearUpwind grad(U);
+ div(phi,alpha) Gauss vanLeer;
+ div(phirb,alpha) Gauss linear;
+ div(((rho*nuEff)*dev2(T(grad(U))))) Gauss linear;
+}
+
+laplacianSchemes
+{
+ default Gauss linear orthogonal;
+}
+
+interpolationSchemes
+{
+ default linear;
+}
+
+snGradSchemes
+{
+ default orthogonal;
+}
+
+
+// ************************************************************************* //
+
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleCnoidal/system/fvSolution b/tutorials/multiphase/interFoam/laminar/waveExampleCnoidal/system/fvSolution
new file mode 100644
index 0000000000..a6d6b31154
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleCnoidal/system/fvSolution
@@ -0,0 +1,93 @@
+
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ location "system";
+ object fvSolution;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+solvers
+{
+ "alpha.water.*"
+ {
+ nAlphaCorr 1;
+ nAlphaSubCycles 3;
+ alphaOuterCorrectors yes;
+ cAlpha 1;
+
+ MULESCorr no;
+ nLimiterIter 3;
+
+ solver smoothSolver;
+ smoother symGaussSeidel;
+ tolerance 1e-8;
+ relTol 0;
+ }
+
+ pcorr
+ {
+ solver PCG;
+ preconditioner DIC;
+ tolerance 1e-6;
+ relTol 0;
+ }
+
+ p_rgh
+ {
+ solver PCG;
+ preconditioner DIC;
+ tolerance 1e-6;
+ relTol 0.1;
+ }
+
+ p_rghFinal
+ {
+ solver GAMG;
+ smoother GaussSeidel;
+ nPreSweeps 0;
+ nPostSweeps 2;
+ cacheAgglomeration on;
+ agglomerator faceAreaPair;
+ nCellsInCoarsestLevel 10;
+ mergeLevels 1;
+ tolerance 1e-7;
+ relTol 0;
+ }
+
+ U
+ {
+ solver PBiCG;
+ preconditioner DILU;
+ tolerance 1e-6;
+ relTol 0.1;
+ }
+
+ UFinal
+ {
+ solver PBiCG;
+ preconditioner DILU;
+ tolerance 1e-6;
+ relTol 0;
+ }
+}
+
+PIMPLE
+{
+ momentumPredictor no;
+ nCorrectors 2;
+ nNonOrthogonalCorrectors 0;
+}
+
+
+// ************************************************************************* //
+
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleCnoidal/system/setFieldsDict b/tutorials/multiphase/interFoam/laminar/waveExampleCnoidal/system/setFieldsDict
new file mode 100644
index 0000000000..9d2a8bcb80
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleCnoidal/system/setFieldsDict
@@ -0,0 +1,36 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ location "system";
+ object setFieldsDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+defaultFieldValues
+(
+ volScalarFieldValue alpha.water 0
+);
+
+regions
+(
+ boxToCell
+ {
+ box (0 0 0) (30.0 1.0 0.4);
+ fieldValues
+ (
+ volScalarFieldValue alpha.water 1
+ );
+ }
+);
+
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleSolitary/0.orig/U b/tutorials/multiphase/interFoam/laminar/waveExampleSolitary/0.orig/U
new file mode 100644
index 0000000000..95453554e5
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleSolitary/0.orig/U
@@ -0,0 +1,54 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volVectorField;
+ location "0";
+ object U;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 1 -1 0 0 0 0];
+
+internalField uniform (0 0 0);
+
+boundaryField
+{
+ inlet
+ {
+ type waveVelocity;
+ value uniform (0 0 0);
+ }
+
+ outlet
+ {
+ type waveVelocity;
+ value uniform (0 0 0);
+ }
+
+ sides
+ {
+ type empty;
+ }
+
+ ground
+ {
+ type fixedValue;
+ value uniform (0 0 0);
+ }
+
+ top
+ {
+ type pressureInletOutletVelocity;
+ value uniform (0 0 0);
+ }
+}
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleSolitary/0.orig/alpha.water b/tutorials/multiphase/interFoam/laminar/waveExampleSolitary/0.orig/alpha.water
new file mode 100644
index 0000000000..424d475902
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleSolitary/0.orig/alpha.water
@@ -0,0 +1,52 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: http://www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object alpha.water;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 0 0 0 0 0 0];
+
+internalField uniform 0;
+
+boundaryField
+{
+ inlet
+ {
+ type waveAlpha;
+ value uniform 0;
+ }
+
+ outlet
+ {
+ type zeroGradient;
+ }
+
+ ground
+ {
+ type zeroGradient;
+ }
+
+ sides
+ {
+ type empty;
+ }
+
+ top
+ {
+ type inletOutlet;
+ inletValue uniform 0;
+ value uniform 0;
+ }
+}
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleSolitary/0.orig/p_rgh b/tutorials/multiphase/interFoam/laminar/waveExampleSolitary/0.orig/p_rgh
new file mode 100644
index 0000000000..7ad5729cbf
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleSolitary/0.orig/p_rgh
@@ -0,0 +1,60 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: http://www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object p_rgh;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [1 -1 -2 0 0 0 0];
+
+internalField uniform 0;
+
+boundaryField
+{
+ inlet
+ {
+ type fixedFluxPressure;
+ value uniform 0;
+ }
+
+ outlet
+ {
+ type fixedFluxPressure;
+ value uniform 0;
+ }
+
+ ground
+ {
+ type fixedFluxPressure;
+ value uniform 0;
+ }
+
+ sides
+ {
+ type empty;
+ }
+
+ top
+ {
+ type totalPressure;
+ U U;
+ phi phi;
+ rho rho;
+ psi none;
+ gamma 1;
+ p0 uniform 0;
+ value uniform 0;
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleSolitary/Allclean b/tutorials/multiphase/interFoam/laminar/waveExampleSolitary/Allclean
new file mode 100755
index 0000000000..705f91474c
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleSolitary/Allclean
@@ -0,0 +1,10 @@
+#!/bin/sh
+cd ${0%/*} || exit 1 # run from this directory
+
+# Source tutorial run functions
+. $WM_PROJECT_DIR/bin/tools/CleanFunctions
+
+rm -rf 0
+
+cleanCase
+
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleSolitary/Allrun b/tutorials/multiphase/interFoam/laminar/waveExampleSolitary/Allrun
new file mode 100755
index 0000000000..9f0c668029
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleSolitary/Allrun
@@ -0,0 +1,15 @@
+#!/bin/sh
+cd ${0%/*} || exit 1 # run from this directory
+
+# Source tutorial run functions
+. $WM_PROJECT_DIR/bin/tools/RunFunctions
+
+restore0Dir
+
+runApplication blockMesh
+
+runApplication decomposePar
+
+runParallel setFields
+
+runParallel $(getApplication)
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleSolitary/constant/g b/tutorials/multiphase/interFoam/laminar/waveExampleSolitary/constant/g
new file mode 100644
index 0000000000..3ec2141e5c
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleSolitary/constant/g
@@ -0,0 +1,22 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class uniformDimensionedVectorField;
+ location "constant";
+ object g;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 1 -2 0 0 0 0];
+value ( 0 0 -9.81 );
+
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleSolitary/constant/transportProperties b/tutorials/multiphase/interFoam/laminar/waveExampleSolitary/constant/transportProperties
new file mode 100644
index 0000000000..019225dd4f
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleSolitary/constant/transportProperties
@@ -0,0 +1,37 @@
+/*---------------------------------------------------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: http://www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ location "constant";
+ object transportProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+phases (water air);
+
+water
+{
+ transportModel Newtonian;
+ nu [0 2 -1 0 0 0 0] 1e-06;
+ rho [1 -3 0 0 0 0 0] 1000;
+}
+
+air
+{
+ transportModel Newtonian;
+ nu [0 2 -1 0 0 0 0] 1.48e-05;
+ rho [1 -3 0 0 0 0 0] 1;
+}
+
+sigma [1 0 -2 0 0 0 0] 0.07;
+
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleSolitary/constant/turbulenceProperties b/tutorials/multiphase/interFoam/laminar/waveExampleSolitary/constant/turbulenceProperties
new file mode 100644
index 0000000000..115a9830c1
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleSolitary/constant/turbulenceProperties
@@ -0,0 +1,20 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ location "constant";
+ object turbulenceProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+simulationType laminar;
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleSolitary/constant/waveProperties b/tutorials/multiphase/interFoam/laminar/waveExampleSolitary/constant/waveProperties
new file mode 100644
index 0000000000..b2568d8bda
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleSolitary/constant/waveProperties
@@ -0,0 +1,45 @@
+/*---------------------------------------------------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: http://www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ location "constant";
+ object wavesProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+inlet
+{
+ alpha alpha.water;
+
+ waveModel Boussinesq;
+
+ nPaddle 1;
+
+ waveHeight 0.3;
+
+ waveAngle 0.0;
+
+ activeAbsorption yes;
+
+ wavePeriod 0.0;
+}
+
+outlet
+{
+ alpha alpha.water;
+
+ waveModel shallowWaterAbsorption;
+
+ nPaddle 1;
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleSolitary/system/blockMeshDict b/tutorials/multiphase/interFoam/laminar/waveExampleSolitary/system/blockMeshDict
new file mode 100644
index 0000000000..175bb83f20
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleSolitary/system/blockMeshDict
@@ -0,0 +1,90 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object blockMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+convertToMeters 1;
+
+vertices
+(
+ ( 0.0 0.0 0.0)
+ ( 10.0 0.0 0.0)
+ ( 10.0 0.02 0.0)
+ ( 0.0 0.02 0.0)
+ ( 0.0 0.0 1.5)
+ ( 10.0 0.0 1.5)
+ ( 10.0 0.02 1.5)
+ ( 0.0 0.02 1.5)
+);
+
+blocks
+(
+ hex (0 1 2 3 4 5 6 7) (500 1 150) simpleGrading (1 1 1)
+);
+
+edges
+(
+);
+
+boundary
+(
+ inlet
+ {
+ type patch;
+ faces
+ (
+ (0 4 7 3)
+ );
+ }
+ outlet
+ {
+ type patch;
+ faces
+ (
+ (1 5 6 2)
+ );
+ }
+ ground
+ {
+ type wall;
+ faces
+ (
+ (0 1 2 3)
+ );
+ }
+ top
+ {
+ type patch;
+ faces
+ (
+ (4 5 6 7)
+ );
+ }
+ sides
+ {
+ type empty;
+ faces
+ (
+ (0 1 5 4)
+ (3 2 6 7)
+ );
+ }
+);
+
+mergePatchPairs
+(
+);
+
+// ************************************************************************* //
+
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleSolitary/system/controlDict b/tutorials/multiphase/interFoam/laminar/waveExampleSolitary/system/controlDict
new file mode 100644
index 0000000000..87022a24ce
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleSolitary/system/controlDict
@@ -0,0 +1,130 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ location "system";
+ object controlDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+application interFoam;
+
+startFrom latestTime;
+
+startTime 0;
+
+stopAt endTime;
+
+endTime 7.0;
+
+deltaT 0.01;
+
+writeControl adjustableRunTime;
+
+writeInterval 0.033;
+
+purgeWrite 0;
+
+writeFormat ascii;
+
+writePrecision 6;
+
+writeCompression uncompressed;
+
+timeFormat general;
+
+timePrecision 6;
+
+runTimeModifiable yes;
+
+adjustTimeStep yes;
+
+maxCo 0.65;
+maxAlphaCo 0.65;
+
+maxDeltaT 0.05;
+
+
+functions
+{
+ line
+ {
+ type sets;
+ libs ("libsampling.so");
+ enabled true;
+ writeControl writeTime;
+ writeInterval 1;
+
+ interpolationScheme cellPoint;
+ setFormat raw;
+ sets
+ (
+ line1
+ {
+ type uniform;
+ axis distance;
+ start ( 1.0 0.01 0.0 );
+ end ( 1.0 0.01 1.5 );
+ nPoints 1001;
+ }
+ line2
+ {
+ type uniform;
+ axis distance;
+ start ( 2.0 0.01 0.0 );
+ end ( 2.0 0.01 1.5 );
+ nPoints 1001;
+ }
+ line3
+ {
+ type uniform;
+ axis distance;
+ start ( 3.0 0.01 0.0 );
+ end ( 3.0 0.01 1.5 );
+ nPoints 1001;
+ }
+ line4
+ {
+ type uniform;
+ axis distance;
+ start ( 5.0 0.01 0.0 );
+ end ( 5.0 0.01 1.5 );
+ nPoints 1001;
+ }
+ line5
+ {
+ type uniform;
+ axis distance;
+ start ( 7.5 0.01 0.0 );
+ end ( 7.5 0.01 1.5 );
+ nPoints 1001;
+ }
+
+ line6
+ {
+ type uniform;
+ axis distance;
+ start ( 9.0 0.01 0.0 );
+ end ( 9.0 0.01 1.5 );
+ nPoints 1001;
+ }
+ );
+
+ fixedLocations false;
+ fields
+ (
+ U alpha.water
+ );
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleSolitary/system/decomposeParDict b/tutorials/multiphase/interFoam/laminar/waveExampleSolitary/system/decomposeParDict
new file mode 100644
index 0000000000..301d97027b
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleSolitary/system/decomposeParDict
@@ -0,0 +1,29 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object decomposeParDict;
+}
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+numberOfSubdomains 2;
+
+method hierarchical;
+
+hierarchicalCoeffs
+{
+ n (2 1 1);
+ delta 0.001;
+ order xyz;
+}
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleSolitary/system/fvSchemes b/tutorials/multiphase/interFoam/laminar/waveExampleSolitary/system/fvSchemes
new file mode 100644
index 0000000000..eeff89271f
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleSolitary/system/fvSchemes
@@ -0,0 +1,54 @@
+
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ location "system";
+ object fvSchemes;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+ddtSchemes
+{
+ default Euler;
+}
+
+gradSchemes
+{
+ default Gauss linear;
+}
+
+divSchemes
+{
+ div(rhoPhi,U) Gauss linearUpwind grad(U);
+ div(phi,alpha) Gauss vanLeer;
+ div(phirb,alpha) Gauss linear;
+ div(((rho*nuEff)*dev2(T(grad(U))))) Gauss linear;
+}
+
+laplacianSchemes
+{
+ default Gauss linear orthogonal;
+}
+
+interpolationSchemes
+{
+ default linear;
+}
+
+snGradSchemes
+{
+ default orthogonal;
+}
+
+
+// ************************************************************************* //
+
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleSolitary/system/fvSolution b/tutorials/multiphase/interFoam/laminar/waveExampleSolitary/system/fvSolution
new file mode 100644
index 0000000000..a6d6b31154
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleSolitary/system/fvSolution
@@ -0,0 +1,93 @@
+
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ location "system";
+ object fvSolution;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+solvers
+{
+ "alpha.water.*"
+ {
+ nAlphaCorr 1;
+ nAlphaSubCycles 3;
+ alphaOuterCorrectors yes;
+ cAlpha 1;
+
+ MULESCorr no;
+ nLimiterIter 3;
+
+ solver smoothSolver;
+ smoother symGaussSeidel;
+ tolerance 1e-8;
+ relTol 0;
+ }
+
+ pcorr
+ {
+ solver PCG;
+ preconditioner DIC;
+ tolerance 1e-6;
+ relTol 0;
+ }
+
+ p_rgh
+ {
+ solver PCG;
+ preconditioner DIC;
+ tolerance 1e-6;
+ relTol 0.1;
+ }
+
+ p_rghFinal
+ {
+ solver GAMG;
+ smoother GaussSeidel;
+ nPreSweeps 0;
+ nPostSweeps 2;
+ cacheAgglomeration on;
+ agglomerator faceAreaPair;
+ nCellsInCoarsestLevel 10;
+ mergeLevels 1;
+ tolerance 1e-7;
+ relTol 0;
+ }
+
+ U
+ {
+ solver PBiCG;
+ preconditioner DILU;
+ tolerance 1e-6;
+ relTol 0.1;
+ }
+
+ UFinal
+ {
+ solver PBiCG;
+ preconditioner DILU;
+ tolerance 1e-6;
+ relTol 0;
+ }
+}
+
+PIMPLE
+{
+ momentumPredictor no;
+ nCorrectors 2;
+ nNonOrthogonalCorrectors 0;
+}
+
+
+// ************************************************************************* //
+
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleSolitary/system/setFieldsDict b/tutorials/multiphase/interFoam/laminar/waveExampleSolitary/system/setFieldsDict
new file mode 100644
index 0000000000..755936dbe4
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleSolitary/system/setFieldsDict
@@ -0,0 +1,36 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ location "system";
+ object setFieldsDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+defaultFieldValues
+(
+ volScalarFieldValue alpha.water 0
+);
+
+regions
+(
+ boxToCell
+ {
+ box (0 0 0) (30.0 1.0 0.7);
+ fieldValues
+ (
+ volScalarFieldValue alpha.water 1
+ );
+ }
+);
+
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStokesI/0.orig/U b/tutorials/multiphase/interFoam/laminar/waveExampleStokesI/0.orig/U
new file mode 100644
index 0000000000..95453554e5
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStokesI/0.orig/U
@@ -0,0 +1,54 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volVectorField;
+ location "0";
+ object U;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 1 -1 0 0 0 0];
+
+internalField uniform (0 0 0);
+
+boundaryField
+{
+ inlet
+ {
+ type waveVelocity;
+ value uniform (0 0 0);
+ }
+
+ outlet
+ {
+ type waveVelocity;
+ value uniform (0 0 0);
+ }
+
+ sides
+ {
+ type empty;
+ }
+
+ ground
+ {
+ type fixedValue;
+ value uniform (0 0 0);
+ }
+
+ top
+ {
+ type pressureInletOutletVelocity;
+ value uniform (0 0 0);
+ }
+}
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStokesI/0.orig/alpha.water b/tutorials/multiphase/interFoam/laminar/waveExampleStokesI/0.orig/alpha.water
new file mode 100644
index 0000000000..424d475902
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStokesI/0.orig/alpha.water
@@ -0,0 +1,52 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: http://www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object alpha.water;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 0 0 0 0 0 0];
+
+internalField uniform 0;
+
+boundaryField
+{
+ inlet
+ {
+ type waveAlpha;
+ value uniform 0;
+ }
+
+ outlet
+ {
+ type zeroGradient;
+ }
+
+ ground
+ {
+ type zeroGradient;
+ }
+
+ sides
+ {
+ type empty;
+ }
+
+ top
+ {
+ type inletOutlet;
+ inletValue uniform 0;
+ value uniform 0;
+ }
+}
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStokesI/0.orig/p_rgh b/tutorials/multiphase/interFoam/laminar/waveExampleStokesI/0.orig/p_rgh
new file mode 100644
index 0000000000..7ad5729cbf
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStokesI/0.orig/p_rgh
@@ -0,0 +1,60 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: http://www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object p_rgh;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [1 -1 -2 0 0 0 0];
+
+internalField uniform 0;
+
+boundaryField
+{
+ inlet
+ {
+ type fixedFluxPressure;
+ value uniform 0;
+ }
+
+ outlet
+ {
+ type fixedFluxPressure;
+ value uniform 0;
+ }
+
+ ground
+ {
+ type fixedFluxPressure;
+ value uniform 0;
+ }
+
+ sides
+ {
+ type empty;
+ }
+
+ top
+ {
+ type totalPressure;
+ U U;
+ phi phi;
+ rho rho;
+ psi none;
+ gamma 1;
+ p0 uniform 0;
+ value uniform 0;
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStokesI/Allclean b/tutorials/multiphase/interFoam/laminar/waveExampleStokesI/Allclean
new file mode 100755
index 0000000000..705f91474c
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStokesI/Allclean
@@ -0,0 +1,10 @@
+#!/bin/sh
+cd ${0%/*} || exit 1 # run from this directory
+
+# Source tutorial run functions
+. $WM_PROJECT_DIR/bin/tools/CleanFunctions
+
+rm -rf 0
+
+cleanCase
+
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStokesI/Allrun b/tutorials/multiphase/interFoam/laminar/waveExampleStokesI/Allrun
new file mode 100755
index 0000000000..9f0c668029
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStokesI/Allrun
@@ -0,0 +1,15 @@
+#!/bin/sh
+cd ${0%/*} || exit 1 # run from this directory
+
+# Source tutorial run functions
+. $WM_PROJECT_DIR/bin/tools/RunFunctions
+
+restore0Dir
+
+runApplication blockMesh
+
+runApplication decomposePar
+
+runParallel setFields
+
+runParallel $(getApplication)
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStokesI/constant/g b/tutorials/multiphase/interFoam/laminar/waveExampleStokesI/constant/g
new file mode 100644
index 0000000000..3ec2141e5c
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStokesI/constant/g
@@ -0,0 +1,22 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class uniformDimensionedVectorField;
+ location "constant";
+ object g;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 1 -2 0 0 0 0];
+value ( 0 0 -9.81 );
+
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStokesI/constant/transportProperties b/tutorials/multiphase/interFoam/laminar/waveExampleStokesI/constant/transportProperties
new file mode 100644
index 0000000000..019225dd4f
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStokesI/constant/transportProperties
@@ -0,0 +1,37 @@
+/*---------------------------------------------------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: http://www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ location "constant";
+ object transportProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+phases (water air);
+
+water
+{
+ transportModel Newtonian;
+ nu [0 2 -1 0 0 0 0] 1e-06;
+ rho [1 -3 0 0 0 0 0] 1000;
+}
+
+air
+{
+ transportModel Newtonian;
+ nu [0 2 -1 0 0 0 0] 1.48e-05;
+ rho [1 -3 0 0 0 0 0] 1;
+}
+
+sigma [1 0 -2 0 0 0 0] 0.07;
+
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStokesI/constant/turbulenceProperties b/tutorials/multiphase/interFoam/laminar/waveExampleStokesI/constant/turbulenceProperties
new file mode 100644
index 0000000000..115a9830c1
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStokesI/constant/turbulenceProperties
@@ -0,0 +1,20 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ location "constant";
+ object turbulenceProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+simulationType laminar;
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStokesI/constant/waveProperties b/tutorials/multiphase/interFoam/laminar/waveExampleStokesI/constant/waveProperties
new file mode 100644
index 0000000000..7597533efd
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStokesI/constant/waveProperties
@@ -0,0 +1,47 @@
+/*---------------------------------------------------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: http://www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ location "constant";
+ object wavesProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+inlet
+{
+ alpha alpha.water;
+
+ waveModel StokesI;
+
+ nPaddle 1;
+
+ waveHeight 0.05;
+
+ waveAngle 0.0;
+
+ rampTime 3.0;
+
+ activeAbsorption yes;
+
+ wavePeriod 3.0;
+}
+
+outlet
+{
+ alpha alpha.water;
+
+ waveModel shallowWaterAbsorption;
+
+ nPaddle 1;
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStokesI/system/blockMeshDict b/tutorials/multiphase/interFoam/laminar/waveExampleStokesI/system/blockMeshDict
new file mode 100644
index 0000000000..2a16096fd6
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStokesI/system/blockMeshDict
@@ -0,0 +1,90 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object blockMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+convertToMeters 1;
+
+vertices
+(
+ ( 0.0 0.0 0.0)
+ ( 20.0 0.0 0.0)
+ ( 20.0 0.04 0.0)
+ ( 0.0 0.04 0.0)
+ ( 0.0 0.0 0.75)
+ ( 20.0 0.0 0.75)
+ ( 20.0 0.04 0.75)
+ ( 0.0 0.04 0.75)
+);
+
+blocks
+(
+ hex (0 1 2 3 4 5 6 7) (500 1 75) simpleGrading (1 1 1)
+);
+
+edges
+(
+);
+
+boundary
+(
+ inlet
+ {
+ type patch;
+ faces
+ (
+ (0 4 7 3)
+ );
+ }
+ outlet
+ {
+ type patch;
+ faces
+ (
+ (1 5 6 2)
+ );
+ }
+ ground
+ {
+ type wall;
+ faces
+ (
+ (0 1 2 3)
+ );
+ }
+ top
+ {
+ type patch;
+ faces
+ (
+ (4 5 6 7)
+ );
+ }
+ sides
+ {
+ type empty;
+ faces
+ (
+ (0 1 5 4)
+ (3 2 6 7)
+ );
+ }
+);
+
+mergePatchPairs
+(
+);
+
+// ************************************************************************* //
+
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStokesI/system/controlDict b/tutorials/multiphase/interFoam/laminar/waveExampleStokesI/system/controlDict
new file mode 100644
index 0000000000..91f0a8a144
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStokesI/system/controlDict
@@ -0,0 +1,146 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ location "system";
+ object controlDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+application interFoam;
+
+startFrom latestTime;
+
+startTime 0;
+
+stopAt endTime;
+
+endTime 20.0;
+
+deltaT 0.01;
+
+writeControl adjustableRunTime;
+
+writeInterval 0.033;
+
+purgeWrite 0;
+
+writeFormat ascii;
+
+writePrecision 6;
+
+writeCompression uncompressed;
+
+timeFormat general;
+
+timePrecision 6;
+
+runTimeModifiable yes;
+
+adjustTimeStep yes;
+
+maxCo 0.65;
+maxAlphaCo 0.65;
+
+maxDeltaT 0.05;
+
+
+functions
+{
+ line
+ {
+ type sets;
+ libs ("libsampling.so");
+ enabled true;
+ writeControl writeTime;
+ writeInterval 1;
+
+ interpolationScheme cellPoint;
+ setFormat raw;
+ sets
+ (
+ line1
+ {
+ type uniform;
+ axis distance;
+ start ( 1.0 0.02 0.0 );
+ end ( 1.0 0.02 0.75 );
+ nPoints 1001;
+ }
+ line2
+ {
+ type uniform;
+ axis distance;
+ start ( 2.0 0.02 0.0 );
+ end ( 2.0 0.02 0.75 );
+ nPoints 1001;
+ }
+ line3
+ {
+ type uniform;
+ axis distance;
+ start ( 3.0 0.02 0.0 );
+ end ( 3.0 0.02 0.75 );
+ nPoints 1001;
+ }
+ line4
+ {
+ type uniform;
+ axis distance;
+ start ( 5.0 0.02 0.0 );
+ end ( 5.0 0.02 0.75 );
+ nPoints 1001;
+ }
+ line5
+ {
+ type uniform;
+ axis distance;
+ start ( 7.5 0.02 0.0 );
+ end ( 7.5 0.02 0.75 );
+ nPoints 1001;
+ }
+
+ line6
+ {
+ type uniform;
+ axis distance;
+ start ( 10.0 0.02 0.0 );
+ end ( 10.0 0.02 0.75 );
+ nPoints 1001;
+ }
+ line7
+ {
+ type uniform;
+ axis distance;
+ start ( 12.0 0.005 0.0 );
+ end ( 12.0 0.005 0.75 );
+ nPoints 1001;
+ }
+ line8
+ {
+ type uniform;
+ axis distance;
+ start ( 14.0 0.005 0.0 );
+ end ( 14.0 0.005 0.75 );
+ nPoints 1001;
+ }
+ );
+
+ fixedLocations false;
+ fields
+ (
+ U alpha.water
+ );
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStokesI/system/decomposeParDict b/tutorials/multiphase/interFoam/laminar/waveExampleStokesI/system/decomposeParDict
new file mode 100644
index 0000000000..301d97027b
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStokesI/system/decomposeParDict
@@ -0,0 +1,29 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object decomposeParDict;
+}
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+numberOfSubdomains 2;
+
+method hierarchical;
+
+hierarchicalCoeffs
+{
+ n (2 1 1);
+ delta 0.001;
+ order xyz;
+}
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStokesI/system/fvSchemes b/tutorials/multiphase/interFoam/laminar/waveExampleStokesI/system/fvSchemes
new file mode 100644
index 0000000000..eeff89271f
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStokesI/system/fvSchemes
@@ -0,0 +1,54 @@
+
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ location "system";
+ object fvSchemes;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+ddtSchemes
+{
+ default Euler;
+}
+
+gradSchemes
+{
+ default Gauss linear;
+}
+
+divSchemes
+{
+ div(rhoPhi,U) Gauss linearUpwind grad(U);
+ div(phi,alpha) Gauss vanLeer;
+ div(phirb,alpha) Gauss linear;
+ div(((rho*nuEff)*dev2(T(grad(U))))) Gauss linear;
+}
+
+laplacianSchemes
+{
+ default Gauss linear orthogonal;
+}
+
+interpolationSchemes
+{
+ default linear;
+}
+
+snGradSchemes
+{
+ default orthogonal;
+}
+
+
+// ************************************************************************* //
+
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStokesI/system/fvSolution b/tutorials/multiphase/interFoam/laminar/waveExampleStokesI/system/fvSolution
new file mode 100644
index 0000000000..a6d6b31154
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStokesI/system/fvSolution
@@ -0,0 +1,93 @@
+
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ location "system";
+ object fvSolution;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+solvers
+{
+ "alpha.water.*"
+ {
+ nAlphaCorr 1;
+ nAlphaSubCycles 3;
+ alphaOuterCorrectors yes;
+ cAlpha 1;
+
+ MULESCorr no;
+ nLimiterIter 3;
+
+ solver smoothSolver;
+ smoother symGaussSeidel;
+ tolerance 1e-8;
+ relTol 0;
+ }
+
+ pcorr
+ {
+ solver PCG;
+ preconditioner DIC;
+ tolerance 1e-6;
+ relTol 0;
+ }
+
+ p_rgh
+ {
+ solver PCG;
+ preconditioner DIC;
+ tolerance 1e-6;
+ relTol 0.1;
+ }
+
+ p_rghFinal
+ {
+ solver GAMG;
+ smoother GaussSeidel;
+ nPreSweeps 0;
+ nPostSweeps 2;
+ cacheAgglomeration on;
+ agglomerator faceAreaPair;
+ nCellsInCoarsestLevel 10;
+ mergeLevels 1;
+ tolerance 1e-7;
+ relTol 0;
+ }
+
+ U
+ {
+ solver PBiCG;
+ preconditioner DILU;
+ tolerance 1e-6;
+ relTol 0.1;
+ }
+
+ UFinal
+ {
+ solver PBiCG;
+ preconditioner DILU;
+ tolerance 1e-6;
+ relTol 0;
+ }
+}
+
+PIMPLE
+{
+ momentumPredictor no;
+ nCorrectors 2;
+ nNonOrthogonalCorrectors 0;
+}
+
+
+// ************************************************************************* //
+
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStokesI/system/setFieldsDict b/tutorials/multiphase/interFoam/laminar/waveExampleStokesI/system/setFieldsDict
new file mode 100644
index 0000000000..7ef9bb06a1
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStokesI/system/setFieldsDict
@@ -0,0 +1,36 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ location "system";
+ object setFieldsDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+defaultFieldValues
+(
+ volScalarFieldValue alpha.water 0
+);
+
+regions
+(
+ boxToCell
+ {
+ box (0 0 0) (20.0 1.0 0.6);
+ fieldValues
+ (
+ volScalarFieldValue alpha.water 1
+ );
+ }
+);
+
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStokesII/0.orig/U b/tutorials/multiphase/interFoam/laminar/waveExampleStokesII/0.orig/U
new file mode 100644
index 0000000000..95453554e5
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStokesII/0.orig/U
@@ -0,0 +1,54 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volVectorField;
+ location "0";
+ object U;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 1 -1 0 0 0 0];
+
+internalField uniform (0 0 0);
+
+boundaryField
+{
+ inlet
+ {
+ type waveVelocity;
+ value uniform (0 0 0);
+ }
+
+ outlet
+ {
+ type waveVelocity;
+ value uniform (0 0 0);
+ }
+
+ sides
+ {
+ type empty;
+ }
+
+ ground
+ {
+ type fixedValue;
+ value uniform (0 0 0);
+ }
+
+ top
+ {
+ type pressureInletOutletVelocity;
+ value uniform (0 0 0);
+ }
+}
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStokesII/0.orig/alpha.water b/tutorials/multiphase/interFoam/laminar/waveExampleStokesII/0.orig/alpha.water
new file mode 100644
index 0000000000..424d475902
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStokesII/0.orig/alpha.water
@@ -0,0 +1,52 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: http://www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object alpha.water;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 0 0 0 0 0 0];
+
+internalField uniform 0;
+
+boundaryField
+{
+ inlet
+ {
+ type waveAlpha;
+ value uniform 0;
+ }
+
+ outlet
+ {
+ type zeroGradient;
+ }
+
+ ground
+ {
+ type zeroGradient;
+ }
+
+ sides
+ {
+ type empty;
+ }
+
+ top
+ {
+ type inletOutlet;
+ inletValue uniform 0;
+ value uniform 0;
+ }
+}
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStokesII/0.orig/p_rgh b/tutorials/multiphase/interFoam/laminar/waveExampleStokesII/0.orig/p_rgh
new file mode 100644
index 0000000000..7ad5729cbf
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStokesII/0.orig/p_rgh
@@ -0,0 +1,60 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: http://www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object p_rgh;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [1 -1 -2 0 0 0 0];
+
+internalField uniform 0;
+
+boundaryField
+{
+ inlet
+ {
+ type fixedFluxPressure;
+ value uniform 0;
+ }
+
+ outlet
+ {
+ type fixedFluxPressure;
+ value uniform 0;
+ }
+
+ ground
+ {
+ type fixedFluxPressure;
+ value uniform 0;
+ }
+
+ sides
+ {
+ type empty;
+ }
+
+ top
+ {
+ type totalPressure;
+ U U;
+ phi phi;
+ rho rho;
+ psi none;
+ gamma 1;
+ p0 uniform 0;
+ value uniform 0;
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStokesII/Allclean b/tutorials/multiphase/interFoam/laminar/waveExampleStokesII/Allclean
new file mode 100755
index 0000000000..705f91474c
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStokesII/Allclean
@@ -0,0 +1,10 @@
+#!/bin/sh
+cd ${0%/*} || exit 1 # run from this directory
+
+# Source tutorial run functions
+. $WM_PROJECT_DIR/bin/tools/CleanFunctions
+
+rm -rf 0
+
+cleanCase
+
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStokesII/Allrun b/tutorials/multiphase/interFoam/laminar/waveExampleStokesII/Allrun
new file mode 100755
index 0000000000..9f0c668029
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStokesII/Allrun
@@ -0,0 +1,15 @@
+#!/bin/sh
+cd ${0%/*} || exit 1 # run from this directory
+
+# Source tutorial run functions
+. $WM_PROJECT_DIR/bin/tools/RunFunctions
+
+restore0Dir
+
+runApplication blockMesh
+
+runApplication decomposePar
+
+runParallel setFields
+
+runParallel $(getApplication)
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStokesII/constant/g b/tutorials/multiphase/interFoam/laminar/waveExampleStokesII/constant/g
new file mode 100644
index 0000000000..3ec2141e5c
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStokesII/constant/g
@@ -0,0 +1,22 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class uniformDimensionedVectorField;
+ location "constant";
+ object g;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 1 -2 0 0 0 0];
+value ( 0 0 -9.81 );
+
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStokesII/constant/transportProperties b/tutorials/multiphase/interFoam/laminar/waveExampleStokesII/constant/transportProperties
new file mode 100644
index 0000000000..019225dd4f
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStokesII/constant/transportProperties
@@ -0,0 +1,37 @@
+/*---------------------------------------------------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: http://www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ location "constant";
+ object transportProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+phases (water air);
+
+water
+{
+ transportModel Newtonian;
+ nu [0 2 -1 0 0 0 0] 1e-06;
+ rho [1 -3 0 0 0 0 0] 1000;
+}
+
+air
+{
+ transportModel Newtonian;
+ nu [0 2 -1 0 0 0 0] 1.48e-05;
+ rho [1 -3 0 0 0 0 0] 1;
+}
+
+sigma [1 0 -2 0 0 0 0] 0.07;
+
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStokesII/constant/turbulenceProperties b/tutorials/multiphase/interFoam/laminar/waveExampleStokesII/constant/turbulenceProperties
new file mode 100644
index 0000000000..115a9830c1
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStokesII/constant/turbulenceProperties
@@ -0,0 +1,20 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ location "constant";
+ object turbulenceProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+simulationType laminar;
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStokesII/constant/waveProperties b/tutorials/multiphase/interFoam/laminar/waveExampleStokesII/constant/waveProperties
new file mode 100644
index 0000000000..2099df6ed5
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStokesII/constant/waveProperties
@@ -0,0 +1,47 @@
+/*---------------------------------------------------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: http://www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ location "constant";
+ object wavesProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+inlet
+{
+ alpha alpha.water;
+
+ waveModel StokesII;
+
+ nPaddle 1;
+
+ waveHeight 0.05;
+
+ waveAngle 0.0;
+
+ rampTime 3.0;
+
+ activeAbsorption yes;
+
+ wavePeriod 3.0;
+}
+
+outlet
+{
+ alpha alpha.water;
+
+ waveModel shallowWaterAbsorption;
+
+ nPaddle 1;
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStokesII/system/blockMeshDict b/tutorials/multiphase/interFoam/laminar/waveExampleStokesII/system/blockMeshDict
new file mode 100644
index 0000000000..afdb56d1bb
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStokesII/system/blockMeshDict
@@ -0,0 +1,90 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object blockMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+convertToMeters 1;
+
+vertices
+(
+ ( 0.0 0.0 0.0)
+ ( 20.0 0.0 0.0)
+ ( 20.0 0.04 0.0)
+ ( 0.0 0.04 0.0)
+ ( 0.0 0.0 0.55)
+ ( 20.0 0.0 0.55)
+ ( 20.0 0.04 0.55)
+ ( 0.0 0.04 0.55)
+);
+
+blocks
+(
+ hex (0 1 2 3 4 5 6 7) (500 1 55) simpleGrading (1 1 1)
+);
+
+edges
+(
+);
+
+boundary
+(
+ inlet
+ {
+ type patch;
+ faces
+ (
+ (0 4 7 3)
+ );
+ }
+ outlet
+ {
+ type patch;
+ faces
+ (
+ (1 5 6 2)
+ );
+ }
+ ground
+ {
+ type wall;
+ faces
+ (
+ (0 1 2 3)
+ );
+ }
+ top
+ {
+ type patch;
+ faces
+ (
+ (4 5 6 7)
+ );
+ }
+ sides
+ {
+ type empty;
+ faces
+ (
+ (0 1 5 4)
+ (3 2 6 7)
+ );
+ }
+);
+
+mergePatchPairs
+(
+);
+
+// ************************************************************************* //
+
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStokesII/system/controlDict b/tutorials/multiphase/interFoam/laminar/waveExampleStokesII/system/controlDict
new file mode 100644
index 0000000000..8c005190cc
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStokesII/system/controlDict
@@ -0,0 +1,146 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ location "system";
+ object controlDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+application interFoam;
+
+startFrom latestTime;
+
+startTime 0;
+
+stopAt endTime;
+
+endTime 20.0;
+
+deltaT 0.01;
+
+writeControl adjustableRunTime;
+
+writeInterval 0.033;
+
+purgeWrite 0;
+
+writeFormat ascii;
+
+writePrecision 6;
+
+writeCompression uncompressed;
+
+timeFormat general;
+
+timePrecision 6;
+
+runTimeModifiable yes;
+
+adjustTimeStep yes;
+
+maxCo 0.65;
+maxAlphaCo 0.65;
+
+maxDeltaT 0.05;
+
+
+functions
+{
+ line
+ {
+ type sets;
+ libs ("libsampling.so");
+ enabled true;
+ writeControl writeTime;
+ writeInterval 1;
+
+ interpolationScheme cellPoint;
+ setFormat raw;
+ sets
+ (
+ line1
+ {
+ type uniform;
+ axis distance;
+ start ( 1.0 0.02 0.0 );
+ end ( 1.0 0.02 0.55 );
+ nPoints 1001;
+ }
+ line2
+ {
+ type uniform;
+ axis distance;
+ start ( 2.0 0.02 0.0 );
+ end ( 2.0 0.02 0.55 );
+ nPoints 1001;
+ }
+ line3
+ {
+ type uniform;
+ axis distance;
+ start ( 3.0 0.02 0.0 );
+ end ( 3.0 0.02 0.55 );
+ nPoints 1001;
+ }
+ line4
+ {
+ type uniform;
+ axis distance;
+ start ( 5.0 0.02 0.0 );
+ end ( 5.0 0.02 0.55 );
+ nPoints 1001;
+ }
+ line5
+ {
+ type uniform;
+ axis distance;
+ start ( 7.5 0.02 0.0 );
+ end ( 7.5 0.02 0.55 );
+ nPoints 1001;
+ }
+
+ line6
+ {
+ type uniform;
+ axis distance;
+ start ( 10.0 0.02 0.0 );
+ end ( 10.0 0.02 0.55 );
+ nPoints 1001;
+ }
+ line7
+ {
+ type uniform;
+ axis distance;
+ start ( 12.0 0.005 0.0 );
+ end ( 12.0 0.005 0.55 );
+ nPoints 1001;
+ }
+ line8
+ {
+ type uniform;
+ axis distance;
+ start ( 14.0 0.005 0.0 );
+ end ( 14.0 0.005 0.55 );
+ nPoints 1001;
+ }
+ );
+
+ fixedLocations false;
+ fields
+ (
+ U alpha.water
+ );
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStokesII/system/decomposeParDict b/tutorials/multiphase/interFoam/laminar/waveExampleStokesII/system/decomposeParDict
new file mode 100644
index 0000000000..301d97027b
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStokesII/system/decomposeParDict
@@ -0,0 +1,29 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object decomposeParDict;
+}
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+numberOfSubdomains 2;
+
+method hierarchical;
+
+hierarchicalCoeffs
+{
+ n (2 1 1);
+ delta 0.001;
+ order xyz;
+}
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStokesII/system/fvSchemes b/tutorials/multiphase/interFoam/laminar/waveExampleStokesII/system/fvSchemes
new file mode 100644
index 0000000000..eeff89271f
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStokesII/system/fvSchemes
@@ -0,0 +1,54 @@
+
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ location "system";
+ object fvSchemes;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+ddtSchemes
+{
+ default Euler;
+}
+
+gradSchemes
+{
+ default Gauss linear;
+}
+
+divSchemes
+{
+ div(rhoPhi,U) Gauss linearUpwind grad(U);
+ div(phi,alpha) Gauss vanLeer;
+ div(phirb,alpha) Gauss linear;
+ div(((rho*nuEff)*dev2(T(grad(U))))) Gauss linear;
+}
+
+laplacianSchemes
+{
+ default Gauss linear orthogonal;
+}
+
+interpolationSchemes
+{
+ default linear;
+}
+
+snGradSchemes
+{
+ default orthogonal;
+}
+
+
+// ************************************************************************* //
+
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStokesII/system/fvSolution b/tutorials/multiphase/interFoam/laminar/waveExampleStokesII/system/fvSolution
new file mode 100644
index 0000000000..a6d6b31154
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStokesII/system/fvSolution
@@ -0,0 +1,93 @@
+
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ location "system";
+ object fvSolution;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+solvers
+{
+ "alpha.water.*"
+ {
+ nAlphaCorr 1;
+ nAlphaSubCycles 3;
+ alphaOuterCorrectors yes;
+ cAlpha 1;
+
+ MULESCorr no;
+ nLimiterIter 3;
+
+ solver smoothSolver;
+ smoother symGaussSeidel;
+ tolerance 1e-8;
+ relTol 0;
+ }
+
+ pcorr
+ {
+ solver PCG;
+ preconditioner DIC;
+ tolerance 1e-6;
+ relTol 0;
+ }
+
+ p_rgh
+ {
+ solver PCG;
+ preconditioner DIC;
+ tolerance 1e-6;
+ relTol 0.1;
+ }
+
+ p_rghFinal
+ {
+ solver GAMG;
+ smoother GaussSeidel;
+ nPreSweeps 0;
+ nPostSweeps 2;
+ cacheAgglomeration on;
+ agglomerator faceAreaPair;
+ nCellsInCoarsestLevel 10;
+ mergeLevels 1;
+ tolerance 1e-7;
+ relTol 0;
+ }
+
+ U
+ {
+ solver PBiCG;
+ preconditioner DILU;
+ tolerance 1e-6;
+ relTol 0.1;
+ }
+
+ UFinal
+ {
+ solver PBiCG;
+ preconditioner DILU;
+ tolerance 1e-6;
+ relTol 0;
+ }
+}
+
+PIMPLE
+{
+ momentumPredictor no;
+ nCorrectors 2;
+ nNonOrthogonalCorrectors 0;
+}
+
+
+// ************************************************************************* //
+
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStokesII/system/setFieldsDict b/tutorials/multiphase/interFoam/laminar/waveExampleStokesII/system/setFieldsDict
new file mode 100644
index 0000000000..9d2a8bcb80
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStokesII/system/setFieldsDict
@@ -0,0 +1,36 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ location "system";
+ object setFieldsDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+defaultFieldValues
+(
+ volScalarFieldValue alpha.water 0
+);
+
+regions
+(
+ boxToCell
+ {
+ box (0 0 0) (30.0 1.0 0.4);
+ fieldValues
+ (
+ volScalarFieldValue alpha.water 1
+ );
+ }
+);
+
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStokesV/0.orig/U b/tutorials/multiphase/interFoam/laminar/waveExampleStokesV/0.orig/U
new file mode 100644
index 0000000000..02f000b04a
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStokesV/0.orig/U
@@ -0,0 +1,54 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volVectorField;
+ location "0";
+ object U;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 1 -1 0 0 0 0];
+
+internalField uniform (0 0 0);
+
+boundaryField
+{
+ inlet
+ {
+ type waveVelocity;
+ value uniform (0 0 0);
+ }
+
+ outlet
+ {
+ type waveVelocity;
+ value uniform (0 0 0);
+ }
+
+ sides
+ {
+ type empty;
+ }
+
+ ground
+ {
+ type fixedValue;
+ value uniform (0 0 0);
+ }
+
+ top
+ {
+ type pressureInletOutletVelocity;
+ value uniform (0 0 0);
+ }
+}
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStokesV/0.orig/alpha.water b/tutorials/multiphase/interFoam/laminar/waveExampleStokesV/0.orig/alpha.water
new file mode 100644
index 0000000000..9069a26b66
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStokesV/0.orig/alpha.water
@@ -0,0 +1,52 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: http://www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object alpha.water;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 0 0 0 0 0 0];
+
+internalField uniform 0;
+
+boundaryField
+{
+ inlet
+ {
+ type waveAlpha;
+ value uniform 0;
+ }
+
+ outlet
+ {
+ type zeroGradient;
+ }
+
+ ground
+ {
+ type zeroGradient;
+ }
+
+ sides
+ {
+ type empty;
+ }
+
+ top
+ {
+ type inletOutlet;
+ inletValue uniform 0;
+ value uniform 0;
+ }
+}
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStokesV/0.orig/p_rgh b/tutorials/multiphase/interFoam/laminar/waveExampleStokesV/0.orig/p_rgh
new file mode 100644
index 0000000000..7ad5729cbf
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStokesV/0.orig/p_rgh
@@ -0,0 +1,60 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: http://www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class volScalarField;
+ object p_rgh;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [1 -1 -2 0 0 0 0];
+
+internalField uniform 0;
+
+boundaryField
+{
+ inlet
+ {
+ type fixedFluxPressure;
+ value uniform 0;
+ }
+
+ outlet
+ {
+ type fixedFluxPressure;
+ value uniform 0;
+ }
+
+ ground
+ {
+ type fixedFluxPressure;
+ value uniform 0;
+ }
+
+ sides
+ {
+ type empty;
+ }
+
+ top
+ {
+ type totalPressure;
+ U U;
+ phi phi;
+ rho rho;
+ psi none;
+ gamma 1;
+ p0 uniform 0;
+ value uniform 0;
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStokesV/Allclean b/tutorials/multiphase/interFoam/laminar/waveExampleStokesV/Allclean
new file mode 100755
index 0000000000..705f91474c
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStokesV/Allclean
@@ -0,0 +1,10 @@
+#!/bin/sh
+cd ${0%/*} || exit 1 # run from this directory
+
+# Source tutorial run functions
+. $WM_PROJECT_DIR/bin/tools/CleanFunctions
+
+rm -rf 0
+
+cleanCase
+
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStokesV/Allrun b/tutorials/multiphase/interFoam/laminar/waveExampleStokesV/Allrun
new file mode 100755
index 0000000000..9f0c668029
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStokesV/Allrun
@@ -0,0 +1,15 @@
+#!/bin/sh
+cd ${0%/*} || exit 1 # run from this directory
+
+# Source tutorial run functions
+. $WM_PROJECT_DIR/bin/tools/RunFunctions
+
+restore0Dir
+
+runApplication blockMesh
+
+runApplication decomposePar
+
+runParallel setFields
+
+runParallel $(getApplication)
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStokesV/constant/g b/tutorials/multiphase/interFoam/laminar/waveExampleStokesV/constant/g
new file mode 100644
index 0000000000..195dbea3f3
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStokesV/constant/g
@@ -0,0 +1,22 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class uniformDimensionedVectorField;
+ location "constant";
+ object g;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+dimensions [0 1 -2 0 0 0 0];
+value ( 0 0 -9.81 );
+
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStokesV/constant/transportProperties b/tutorials/multiphase/interFoam/laminar/waveExampleStokesV/constant/transportProperties
new file mode 100644
index 0000000000..019225dd4f
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStokesV/constant/transportProperties
@@ -0,0 +1,37 @@
+/*---------------------------------------------------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: http://www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ location "constant";
+ object transportProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+phases (water air);
+
+water
+{
+ transportModel Newtonian;
+ nu [0 2 -1 0 0 0 0] 1e-06;
+ rho [1 -3 0 0 0 0 0] 1000;
+}
+
+air
+{
+ transportModel Newtonian;
+ nu [0 2 -1 0 0 0 0] 1.48e-05;
+ rho [1 -3 0 0 0 0 0] 1;
+}
+
+sigma [1 0 -2 0 0 0 0] 0.07;
+
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStokesV/constant/turbulenceProperties b/tutorials/multiphase/interFoam/laminar/waveExampleStokesV/constant/turbulenceProperties
new file mode 100644
index 0000000000..e4ad75d18c
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStokesV/constant/turbulenceProperties
@@ -0,0 +1,20 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ location "constant";
+ object turbulenceProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+simulationType laminar;
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStokesV/constant/waveProperties b/tutorials/multiphase/interFoam/laminar/waveExampleStokesV/constant/waveProperties
new file mode 100644
index 0000000000..9192fe1161
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStokesV/constant/waveProperties
@@ -0,0 +1,47 @@
+/*---------------------------------------------------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: http://www.openfoam.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ location "constant";
+ object wavesProperties;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+inlet
+{
+ alpha alpha.water;
+
+ waveModel StokesV;
+
+ nPaddle 1;
+
+ waveHeight 0.1;
+
+ waveAngle 0.0;
+
+ rampTime 4.0;
+
+ activeAbsorption yes;
+
+ wavePeriod 2.0;
+}
+
+outlet
+{
+ alpha alpha.water;
+
+ waveModel shallowWaterAbsorption;
+
+ nPaddle 1;
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStokesV/system/blockMeshDict b/tutorials/multiphase/interFoam/laminar/waveExampleStokesV/system/blockMeshDict
new file mode 100644
index 0000000000..6f5bedb3be
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStokesV/system/blockMeshDict
@@ -0,0 +1,90 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object blockMeshDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+convertToMeters 1;
+
+vertices
+(
+ ( 0.0 0.0 0.0)
+ ( 30.0 0.0 0.0)
+ ( 30.0 0.04 0.0)
+ ( 0.0 0.04 0.0)
+ ( 0.0 0.0 0.7)
+ ( 30.0 0.0 0.7)
+ ( 30.0 0.04 0.7)
+ ( 0.0 0.04 0.7)
+);
+
+blocks
+(
+ hex (0 1 2 3 4 5 6 7) (750 1 70) simpleGrading (1 1 1)
+);
+
+edges
+(
+);
+
+boundary
+(
+ inlet
+ {
+ type patch;
+ faces
+ (
+ (0 4 7 3)
+ );
+ }
+ outlet
+ {
+ type patch;
+ faces
+ (
+ (1 5 6 2)
+ );
+ }
+ ground
+ {
+ type wall;
+ faces
+ (
+ (0 1 2 3)
+ );
+ }
+ top
+ {
+ type patch;
+ faces
+ (
+ (4 5 6 7)
+ );
+ }
+ sides
+ {
+ type empty;
+ faces
+ (
+ (0 1 5 4)
+ (3 2 6 7)
+ );
+ }
+);
+
+mergePatchPairs
+(
+);
+
+// ************************************************************************* //
+
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStokesV/system/controlDict b/tutorials/multiphase/interFoam/laminar/waveExampleStokesV/system/controlDict
new file mode 100644
index 0000000000..76911c1e87
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStokesV/system/controlDict
@@ -0,0 +1,144 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ location "system";
+ object controlDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+application interFoam;
+
+startFrom latestTime;
+
+startTime 0;
+
+stopAt endTime;
+
+endTime 30.0;
+
+deltaT 0.01;
+
+writeControl adjustableRunTime;
+
+writeInterval 0.033;
+
+purgeWrite 0;
+
+writeFormat ascii;
+
+writePrecision 6;
+
+writeCompression uncompressed;
+
+timeFormat general;
+
+timePrecision 6;
+
+runTimeModifiable yes;
+
+adjustTimeStep on;
+
+maxCo 0.65;
+maxAlphaCo 0.65;
+
+maxDeltaT 0.05;
+
+functions
+{
+ line
+ {
+ type sets;
+ libs ("libsampling.so");
+ enabled true;
+ writeControl writeTime;
+ writeInterval 1;
+
+ interpolationScheme cellPoint;
+ setFormat raw;
+ sets
+ (
+ line1
+ {
+ type uniform;
+ axis distance;
+ start ( 1.0 0.005 0.0 );
+ end ( 1.0 0.005 0.8 );
+ nPoints 1001;
+ }
+ line2
+ {
+ type uniform;
+ axis distance;
+ start ( 2.0 0.005 0.0 );
+ end ( 2.0 0.005 0.8 );
+ nPoints 1001;
+ }
+ line3
+ {
+ type uniform;
+ axis distance;
+ start ( 3.0 0.005 0.0 );
+ end ( 3.0 0.005 0.8 );
+ nPoints 1001;
+ }
+ line4
+ {
+ type uniform;
+ axis distance;
+ start ( 4.0 0.005 0.0 );
+ end ( 4.0 0.005 0.8 );
+ nPoints 1001;
+ }
+ line5
+ {
+ type uniform;
+ axis distance;
+ start ( 5 0.005 0.0 );
+ end ( 5 0.005 0.8 );
+ nPoints 1001;
+ }
+
+ line6
+ {
+ type uniform;
+ axis distance;
+ start ( 7.0 0.005 0.0 );
+ end ( 7.0 0.005 0.8 );
+ nPoints 1001;
+ }
+ line7
+ {
+ type uniform;
+ axis distance;
+ start ( 8.0 0.005 0.0 );
+ end ( 8.0 0.005 0.8 );
+ nPoints 1001;
+ }
+ line8
+ {
+ type uniform;
+ axis distance;
+ start ( 9.0 0.005 0.0 );
+ end ( 9.0 0.005 0.8 );
+ nPoints 1001;
+ }
+ );
+ fixedLocations false;
+ fields
+ (
+ U alpha.water
+ );
+ }
+}
+
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStokesV/system/decomposeParDict b/tutorials/multiphase/interFoam/laminar/waveExampleStokesV/system/decomposeParDict
new file mode 100644
index 0000000000..57c7bea5e3
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStokesV/system/decomposeParDict
@@ -0,0 +1,29 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ object decomposeParDict;
+}
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+numberOfSubdomains 2;
+
+method hierarchical;
+
+hierarchicalCoeffs
+{
+ n (2 1 1);
+ delta 0.001;
+ order xyz;
+}
+
+// ************************************************************************* //
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStokesV/system/fvSchemes b/tutorials/multiphase/interFoam/laminar/waveExampleStokesV/system/fvSchemes
new file mode 100644
index 0000000000..eeff89271f
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStokesV/system/fvSchemes
@@ -0,0 +1,54 @@
+
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ location "system";
+ object fvSchemes;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+ddtSchemes
+{
+ default Euler;
+}
+
+gradSchemes
+{
+ default Gauss linear;
+}
+
+divSchemes
+{
+ div(rhoPhi,U) Gauss linearUpwind grad(U);
+ div(phi,alpha) Gauss vanLeer;
+ div(phirb,alpha) Gauss linear;
+ div(((rho*nuEff)*dev2(T(grad(U))))) Gauss linear;
+}
+
+laplacianSchemes
+{
+ default Gauss linear orthogonal;
+}
+
+interpolationSchemes
+{
+ default linear;
+}
+
+snGradSchemes
+{
+ default orthogonal;
+}
+
+
+// ************************************************************************* //
+
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStokesV/system/fvSolution b/tutorials/multiphase/interFoam/laminar/waveExampleStokesV/system/fvSolution
new file mode 100644
index 0000000000..a6d6b31154
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStokesV/system/fvSolution
@@ -0,0 +1,93 @@
+
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ location "system";
+ object fvSolution;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+solvers
+{
+ "alpha.water.*"
+ {
+ nAlphaCorr 1;
+ nAlphaSubCycles 3;
+ alphaOuterCorrectors yes;
+ cAlpha 1;
+
+ MULESCorr no;
+ nLimiterIter 3;
+
+ solver smoothSolver;
+ smoother symGaussSeidel;
+ tolerance 1e-8;
+ relTol 0;
+ }
+
+ pcorr
+ {
+ solver PCG;
+ preconditioner DIC;
+ tolerance 1e-6;
+ relTol 0;
+ }
+
+ p_rgh
+ {
+ solver PCG;
+ preconditioner DIC;
+ tolerance 1e-6;
+ relTol 0.1;
+ }
+
+ p_rghFinal
+ {
+ solver GAMG;
+ smoother GaussSeidel;
+ nPreSweeps 0;
+ nPostSweeps 2;
+ cacheAgglomeration on;
+ agglomerator faceAreaPair;
+ nCellsInCoarsestLevel 10;
+ mergeLevels 1;
+ tolerance 1e-7;
+ relTol 0;
+ }
+
+ U
+ {
+ solver PBiCG;
+ preconditioner DILU;
+ tolerance 1e-6;
+ relTol 0.1;
+ }
+
+ UFinal
+ {
+ solver PBiCG;
+ preconditioner DILU;
+ tolerance 1e-6;
+ relTol 0;
+ }
+}
+
+PIMPLE
+{
+ momentumPredictor no;
+ nCorrectors 2;
+ nNonOrthogonalCorrectors 0;
+}
+
+
+// ************************************************************************* //
+
diff --git a/tutorials/multiphase/interFoam/laminar/waveExampleStokesV/system/setFieldsDict b/tutorials/multiphase/interFoam/laminar/waveExampleStokesV/system/setFieldsDict
new file mode 100644
index 0000000000..ea8c0c2ee3
--- /dev/null
+++ b/tutorials/multiphase/interFoam/laminar/waveExampleStokesV/system/setFieldsDict
@@ -0,0 +1,36 @@
+/*--------------------------------*- C++ -*----------------------------------*\
+| ========= | |
+| \\ / F ield | OpenFOAM: The Open Source CFD Toolbox |
+| \\ / O peration | Version: plus |
+| \\ / A nd | Web: www.OpenFOAM.com |
+| \\/ M anipulation | |
+\*---------------------------------------------------------------------------*/
+FoamFile
+{
+ version 2.0;
+ format ascii;
+ class dictionary;
+ location "system";
+ object setFieldsDict;
+}
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+defaultFieldValues
+(
+ volScalarFieldValue alpha.water 0
+);
+
+regions
+(
+ boxToCell
+ {
+ box (0 0 0) (30.0 1.0 0.4);
+ fieldValues
+ (
+ volScalarFieldValue alpha.water 1
+ );
+ }
+);
+
+
+// ************************************************************************* //