Files
openfoam/integration/OpenCFD/code/waveModel/waveGenerationModels/derived/Boussinesq/BoussinesqWaveModel.C
Andrew Heather b3b0704202 ENH: Initial integration of IHCantrabria wave functionality
- Wave models significantly restructured and refactored into a hierarchy of run-time selecatable models
- Gravity no longer hard-coded
- Ability to use any direction as the gravity direction
- Boundary conditions simplified and take reference to the wave model
  - removes a lot of code duplication and new code is ~30% faster
- Removed unused functions

Requires further testing
- Restart behaviour needs to be addressed
2016-11-16 14:05:46 +00:00

252 lines
5.5 KiB
C

/*---------------------------------------------------------------------------*\
========= |
\\ / 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 <http://www.gnu.org/licenses/>.
\*---------------------------------------------------------------------------*/
#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*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();
}
}
// * * * * * * * * * * * * * * * * Destructor * * * * * * * * * * * * * * * //
Foam::waveModels::Boussinesq::~Boussinesq()
{}
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
bool Foam::waveModels::Boussinesq::read()
{
if (solitaryWaveModel::read())
{
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);
}
// ************************************************************************* //