mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
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
This commit is contained in:
@ -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 <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);
|
||||
}
|
||||
|
||||
|
||||
// ************************************************************************* //
|
||||
Reference in New Issue
Block a user