mirror of
https://develop.openfoam.com/Development/openfoam.git
synced 2025-11-28 03:28:01 +00:00
ENH: improve/verify atmBoundaryLayerInlet conditions
ENH: add generalised log-law type ground-normal inflow boundary conditions for wind velocity and turbulence quantities for homogeneous, two-dimensional, dry-air, equilibrium and neutral atmospheric boundary layer (ABL) modelling ENH: remove `zGround` entry, which is now automatically computed ENH: add `displacement height` entry, `d` ENH: add generalised atmBoundaryLayerInletOmega boundary condition ENH: add a verification case for atmBoundaryLayerInlet BCs DOC: improve atmBoundaryLayerInlet header documentation BUG: fix value-entry behaviour in atmBoundaryLayerInlet (fixes #1578) Without this change: - for serial-parallel computations, if `value` entry is available in an `atmBoundaryLayerInlet` BC, the theoretical ABL profile expressions are not computed, and the `value` entry content is used as a profile data - for parallel computations, if `value` entry is not available, `decomposePar` could not be executed. With this change: - assuming `value` entry is always be present, the use of `value` entry for the ABL profile specification is determined by a flag `initABL` - the default value of the optional flag `initABL` is `true`, but whenever `initABL=true` is executed, `initABL` is overwritten as `false` for the subsequent runs, so that `value` entry can be safely used. Thanks Per Jørgensen for the bug report. BUG: ensure atmBoundaryInlet conditions are Galilean-invariant (fixes #1692) Related references: The ground-normal profile expressions (tag:RH): Richards, P. J., & Hoxey, R. P. (1993). Appropriate boundary conditions for computational wind engineering models using the k-ε turbulence model. In Computational Wind Engineering 1 (pp. 145-153). DOI:10.1016/B978-0-444-81688-7.50018-8 Modifications to preserve the profiles downstream (tag:HW): Hargreaves, D. M., & Wright, N. G. (2007). On the use of the k–ε model in commercial CFD software to model the neutral atmospheric boundary layer. Journal of wind engineering and industrial aerodynamics, 95(5), 355-369. DOI:10.1016/j.jweia.2006.08.002 Expression generalisations to allow height variation for turbulence quantities (tag:YGCJ): Yang, Y., Gu, M., Chen, S., & Jin, X. (2009). New inflow boundary conditions for modelling the neutral equilibrium atmospheric boundary layer in computational wind engineering. J. of Wind Engineering and Industrial Aerodynamics, 97(2), 88-95. DOI:10.1016/j.jweia.2008.12.001 The generalised ground-normal profile expression for omega (tag:YGJ): Yang, Y., Gu, M., & Jin, X., (2009). New inflow boundary conditions for modelling the neutral equilibrium atmospheric boundary layer in SST k-ω model. In: The Seventh Asia-Pacific Conference on Wind Engineering, November 8-12, Taipei, Taiwan. Reproduced benchmark: Rectangular prism shown in FIG 1 of Hargreaves, D. M., & Wright, N. G. (2007). On the use of the k–ε model in commercial CFD software to model the neutral atmospheric boundary layer. Journal of wind engineering and industrial aerodynamics, 95(5), 355-369. DOI:10.1016/j.jweia.2006.08.002 Benchmark data: HW, 2007 FIG 6 TUT: update simpleFoam/turbineSiting tutorial accordingly
This commit is contained in:
committed by
Andrew Heather
parent
5863c94be0
commit
336fb3bddf
@ -1,10 +1,22 @@
|
||||
derivedFvPatchFields/atmBoundaryLayer/atmBoundaryLayer.C
|
||||
derivedFvPatchFields/atmBoundaryLayerInletVelocity/atmBoundaryLayerInletVelocityFvPatchVectorField.C
|
||||
derivedFvPatchFields/atmBoundaryLayerInletK/atmBoundaryLayerInletKFvPatchScalarField.C
|
||||
derivedFvPatchFields/atmBoundaryLayerInletEpsilon/atmBoundaryLayerInletEpsilonFvPatchScalarField.C
|
||||
derivedFvPatchFields/nutkAtmRoughWallFunction/nutkAtmRoughWallFunctionFvPatchScalarField.C
|
||||
/* Models */
|
||||
|
||||
atmosphericTurbulentTransportModels.C
|
||||
porosityModels/powerLawLopesdaCosta/powerLawLopesdaCosta.C
|
||||
|
||||
|
||||
/* Boundary conditions */
|
||||
|
||||
derivedFvPatchFields/atmBoundaryLayer/atmBoundaryLayer.C
|
||||
derivedFvPatchFields/atmBoundaryLayerInletVelocity/atmBoundaryLayerInletVelocityFvPatchVectorField.C
|
||||
derivedFvPatchFields/atmBoundaryLayerInletK/atmBoundaryLayerInletKFvPatchScalarField.C
|
||||
derivedFvPatchFields/atmBoundaryLayerInletEpsilon/atmBoundaryLayerInletEpsilonFvPatchScalarField.C
|
||||
derivedFvPatchFields/atmBoundaryLayerInletOmega/atmBoundaryLayerInletOmegaFvPatchScalarField.C
|
||||
derivedFvPatchFields/nutkAtmRoughWallFunction/nutkAtmRoughWallFunctionFvPatchScalarField.C
|
||||
|
||||
|
||||
/* Wall function BCs */
|
||||
|
||||
|
||||
/* fvOptions */
|
||||
|
||||
LIB = $(FOAM_LIBBIN)/libatmosphericModels
|
||||
|
||||
@ -37,16 +37,20 @@ namespace Foam
|
||||
|
||||
atmBoundaryLayer::atmBoundaryLayer(const Time& time, const polyPatch& pp)
|
||||
:
|
||||
initABL_(false),
|
||||
kappa_(0.41),
|
||||
Cmu_(0.09),
|
||||
C1_(0.0),
|
||||
C2_(1.0),
|
||||
ppMin_((boundBox(pp.points())).min()),
|
||||
time_(time),
|
||||
patch_(pp),
|
||||
flowDir_(time, "flowDir"),
|
||||
zDir_(time, "zDir"),
|
||||
kappa_(0.41),
|
||||
Cmu_(0.09),
|
||||
Uref_(time, "Uref"),
|
||||
Zref_(time, "Zref"),
|
||||
z0_(),
|
||||
zGround_()
|
||||
d_()
|
||||
{}
|
||||
|
||||
|
||||
@ -57,6 +61,15 @@ atmBoundaryLayer::atmBoundaryLayer
|
||||
const dictionary& dict
|
||||
)
|
||||
:
|
||||
initABL_(dict.getOrDefault<Switch>("initABL", true)),
|
||||
kappa_
|
||||
(
|
||||
dict.getCheckOrDefault<scalar>("kappa", 0.41, scalarMinMax::ge(SMALL))
|
||||
),
|
||||
Cmu_(dict.getCheckOrDefault<scalar>("Cmu", 0.09, scalarMinMax::ge(SMALL))),
|
||||
C1_(dict.getOrDefault("C1", 0.0)),
|
||||
C2_(dict.getOrDefault("C2", 1.0)),
|
||||
ppMin_((boundBox(pp.points())).min()),
|
||||
time_(time),
|
||||
patch_(pp),
|
||||
flowDir_(TimeFunction1<vector>(time, "flowDir", dict)),
|
||||
@ -66,7 +79,7 @@ atmBoundaryLayer::atmBoundaryLayer
|
||||
Uref_(TimeFunction1<scalar>(time, "Uref", dict)),
|
||||
Zref_(TimeFunction1<scalar>(time, "Zref", dict)),
|
||||
z0_(PatchFunction1<scalar>::New(pp, "z0", dict)),
|
||||
zGround_(PatchFunction1<scalar>::New(pp, "zGround", dict))
|
||||
d_(PatchFunction1<scalar>::New(pp, "d", dict))
|
||||
{}
|
||||
|
||||
|
||||
@ -77,31 +90,39 @@ atmBoundaryLayer::atmBoundaryLayer
|
||||
const fvPatchFieldMapper& mapper
|
||||
)
|
||||
:
|
||||
initABL_(abl.initABL_),
|
||||
kappa_(abl.kappa_),
|
||||
Cmu_(abl.Cmu_),
|
||||
C1_(abl.C1_),
|
||||
C2_(abl.C2_),
|
||||
ppMin_(abl.ppMin_),
|
||||
time_(abl.time_),
|
||||
patch_(patch.patch()),
|
||||
flowDir_(abl.flowDir_),
|
||||
zDir_(abl.zDir_),
|
||||
kappa_(abl.kappa_),
|
||||
Cmu_(abl.Cmu_),
|
||||
Uref_(abl.Uref_),
|
||||
Zref_(abl.Zref_),
|
||||
z0_(abl.z0_.clone(patch_)),
|
||||
zGround_(abl.zGround_.clone(patch_))
|
||||
d_(abl.d_.clone(patch_))
|
||||
{}
|
||||
|
||||
|
||||
atmBoundaryLayer::atmBoundaryLayer(const atmBoundaryLayer& abl)
|
||||
:
|
||||
initABL_(abl.initABL_),
|
||||
kappa_(abl.kappa_),
|
||||
Cmu_(abl.Cmu_),
|
||||
C1_(abl.C1_),
|
||||
C2_(abl.C2_),
|
||||
ppMin_(abl.ppMin_),
|
||||
time_(abl.time_),
|
||||
patch_(abl.patch_),
|
||||
flowDir_(abl.flowDir_),
|
||||
zDir_(abl.zDir_),
|
||||
kappa_(abl.kappa_),
|
||||
Cmu_(abl.Cmu_),
|
||||
Uref_(abl.Uref_),
|
||||
Zref_(abl.Zref_),
|
||||
z0_(abl.z0_.clone(patch_)),
|
||||
zGround_(abl.zGround_.clone(patch_))
|
||||
d_(abl.d_.clone(patch_))
|
||||
{}
|
||||
|
||||
|
||||
@ -110,13 +131,13 @@ atmBoundaryLayer::atmBoundaryLayer(const atmBoundaryLayer& abl)
|
||||
vector atmBoundaryLayer::flowDir() const
|
||||
{
|
||||
const scalar t = time_.timeOutputValue();
|
||||
vector dir(flowDir_.value(t));
|
||||
const vector dir(flowDir_.value(t));
|
||||
const scalar magDir = mag(dir);
|
||||
|
||||
if (magDir < SMALL)
|
||||
{
|
||||
FatalErrorInFunction
|
||||
<< "magnitude of " << flowDir_.name()
|
||||
<< "magnitude of " << flowDir_.name() << " = " << magDir
|
||||
<< " vector must be greater than zero"
|
||||
<< abort(FatalError);
|
||||
}
|
||||
@ -128,13 +149,13 @@ vector atmBoundaryLayer::flowDir() const
|
||||
vector atmBoundaryLayer::zDir() const
|
||||
{
|
||||
const scalar t = time_.timeOutputValue();
|
||||
vector dir(zDir_.value(t));
|
||||
const vector dir(zDir_.value(t));
|
||||
const scalar magDir = mag(dir);
|
||||
|
||||
if (magDir < SMALL)
|
||||
{
|
||||
FatalErrorInFunction
|
||||
<< "magnitude of " << zDir_.name()
|
||||
<< "magnitude of " << zDir_.name() << " = " << magDir
|
||||
<< " vector must be greater than zero"
|
||||
<< abort(FatalError);
|
||||
}
|
||||
@ -149,14 +170,22 @@ tmp<scalarField> atmBoundaryLayer::Ustar(const scalarField& z0) const
|
||||
const scalar Uref = Uref_.value(t);
|
||||
const scalar Zref = Zref_.value(t);
|
||||
|
||||
return kappa_*Uref/(log((Zref + z0)/z0));
|
||||
if (Zref < 0)
|
||||
{
|
||||
FatalErrorInFunction
|
||||
<< "Negative entry in " << Zref_.name() << " = " << Zref
|
||||
<< abort(FatalError);
|
||||
}
|
||||
|
||||
// (derived from RH:Eq. 6, HW:Eq. 5)
|
||||
return kappa_*Uref/log((Zref + z0)/z0);
|
||||
}
|
||||
|
||||
|
||||
void atmBoundaryLayer::autoMap(const fvPatchFieldMapper& mapper)
|
||||
{
|
||||
z0_->autoMap(mapper);
|
||||
zGround_->autoMap(mapper);
|
||||
d_->autoMap(mapper);
|
||||
}
|
||||
|
||||
|
||||
@ -167,51 +196,80 @@ void atmBoundaryLayer::rmap
|
||||
)
|
||||
{
|
||||
z0_->rmap(abl.z0_(), addr);
|
||||
zGround_->rmap(abl.zGround_(), addr);
|
||||
d_->rmap(abl.d_(), addr);
|
||||
}
|
||||
|
||||
|
||||
tmp<vectorField> atmBoundaryLayer::U(const vectorField& p) const
|
||||
tmp<vectorField> atmBoundaryLayer::U(const vectorField& pCf) const
|
||||
{
|
||||
const scalar t = time_.timeOutputValue();
|
||||
const scalarField zGround(zGround_->value(t));
|
||||
const scalarField d(d_->value(t));
|
||||
const scalarField z0(max(z0_->value(t), ROOTVSMALL));
|
||||
const scalar groundMin = zDir() & ppMin_;
|
||||
|
||||
scalarField Un((Ustar(z0)/kappa_)*log(((zDir() & p) - zGround + z0)/z0));
|
||||
// (YGCJ:Table 1, RH:Eq. 6, HW:Eq. 5)
|
||||
scalarField Un
|
||||
(
|
||||
(Ustar(z0)/kappa_)*log(((zDir() & pCf) - groundMin - d + z0)/z0)
|
||||
);
|
||||
|
||||
return flowDir()*Un;
|
||||
}
|
||||
|
||||
|
||||
tmp<scalarField> atmBoundaryLayer::k(const vectorField& p) const
|
||||
tmp<scalarField> atmBoundaryLayer::k(const vectorField& pCf) const
|
||||
{
|
||||
const scalar t = time_.timeOutputValue();
|
||||
const scalarField d(d_->value(t));
|
||||
const scalarField z0(max(z0_->value(t), ROOTVSMALL));
|
||||
const scalar groundMin = zDir() & ppMin_;
|
||||
|
||||
return sqr(Ustar(z0))/sqrt(Cmu_);
|
||||
// (YGCJ:Eq. 21; RH:Eq. 7, HW:Eq. 6 when C1=0 and C2=1)
|
||||
return
|
||||
sqr(Ustar(z0))/sqrt(Cmu_)
|
||||
*sqrt(C1_*log(((zDir() & pCf) - groundMin - d + z0)/z0) + C2_);
|
||||
}
|
||||
|
||||
|
||||
tmp<scalarField> atmBoundaryLayer::epsilon(const vectorField& p) const
|
||||
tmp<scalarField> atmBoundaryLayer::epsilon(const vectorField& pCf) const
|
||||
{
|
||||
const scalar t = time_.timeOutputValue();
|
||||
const scalarField zGround(zGround_->value(t));
|
||||
const scalarField d(d_->value(t));
|
||||
const scalarField z0(max(z0_->value(t), ROOTVSMALL));
|
||||
const scalar groundMin = zDir() & ppMin_;
|
||||
|
||||
return pow3(Ustar(z0))/(kappa_*((zDir() & p) - zGround + z0));
|
||||
// (YGCJ:Eq. 22; RH:Eq. 8, HW:Eq. 7 when C1=0 and C2=1)
|
||||
return
|
||||
pow3(Ustar(z0))/(kappa_*((zDir() & pCf) - groundMin - d + z0))
|
||||
*sqrt(C1_*log(((zDir() & pCf) - groundMin - d + z0)/z0) + C2_);
|
||||
}
|
||||
|
||||
|
||||
tmp<scalarField> atmBoundaryLayer::omega(const vectorField& pCf) const
|
||||
{
|
||||
const scalar t = time_.timeOutputValue();
|
||||
const scalarField d(d_->value(t));
|
||||
const scalarField z0(max(z0_->value(t), ROOTVSMALL));
|
||||
const scalar groundMin = zDir() & ppMin_;
|
||||
|
||||
// (YGJ:Eq. 13)
|
||||
return Ustar(z0)/(kappa_*sqrt(Cmu_)*((zDir() & pCf) - groundMin - d + z0));
|
||||
}
|
||||
|
||||
|
||||
void atmBoundaryLayer::write(Ostream& os) const
|
||||
{
|
||||
z0_->writeData(os) ;
|
||||
flowDir_.writeData(os);
|
||||
zDir_.writeData(os);
|
||||
os.writeEntry("initABL", initABL_);
|
||||
os.writeEntry("kappa", kappa_);
|
||||
os.writeEntry("Cmu", Cmu_);
|
||||
os.writeEntry("C1", C1_);
|
||||
os.writeEntry("C2", C2_);
|
||||
flowDir_.writeData(os);
|
||||
zDir_.writeData(os);
|
||||
Uref_.writeData(os);
|
||||
Zref_.writeData(os);
|
||||
zGround_->writeData(os);
|
||||
z0_->writeData(os) ;
|
||||
d_->writeData(os);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -6,7 +6,7 @@
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
Copyright (C) 2014-2018 OpenFOAM Foundation
|
||||
Copyright (C) 2015 OpenCFD Ltd.
|
||||
Copyright (C) 2015-2020 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -31,84 +31,156 @@ Group
|
||||
grpRASBoundaryConditions grpInletBoundaryConditions
|
||||
|
||||
Description
|
||||
This class provides functions to evaluate the velocity and turbulence
|
||||
distributions appropriate for atmospheric boundary layers (ABL).
|
||||
Base class to set log-law type ground-normal inflow boundary conditions for
|
||||
wind velocity and turbulence quantities for homogeneous, two-dimensional,
|
||||
dry-air, equilibrium and neutral atmospheric boundary layer (ABL) modelling.
|
||||
|
||||
The profile is derived from the friction velocity, flow direction and
|
||||
"vertical" direction:
|
||||
The ground-normal profile expressions are due to \c YGCJ
|
||||
(refer to references below) whereat \c RH expressions were generalised:
|
||||
|
||||
\f[
|
||||
U = \frac{U^*}{\kappa} ln\left(\frac{z - z_g + z_0}{z_0}\right)
|
||||
\f]
|
||||
\f[
|
||||
u = \frac{u^*}{\kappa} \ln \left( \frac{z - d + z_0}{z_0} \right)
|
||||
\f]
|
||||
|
||||
\f[
|
||||
k = \frac{(U^*)^2}{\sqrt{C_{\mu}}}
|
||||
\f]
|
||||
\f[
|
||||
v = w = 0
|
||||
\f]
|
||||
|
||||
\f[
|
||||
\epsilon = \frac{(U^*)^3}{\kappa(z - z_g + z_0)}
|
||||
\f]
|
||||
\f[
|
||||
k = \frac{(u^*)^2}{\sqrt{C_\mu}}
|
||||
\sqrt{C_1 \ln \left( \frac{z - d + z_0}{z_0} \right) + C_2}
|
||||
\f]
|
||||
|
||||
\f[
|
||||
\epsilon = \frac{(u^*)^3}{\kappa (z - d + z_0)}
|
||||
\sqrt{C_1 \ln \left( \frac{z - d + z_0}{z_0} \right) + C_2}
|
||||
\f]
|
||||
|
||||
\f[
|
||||
\omega = \frac{u^*}{\kappa \sqrt{C_\mu}} \frac{1}{z - d + z_0}
|
||||
\f]
|
||||
|
||||
\f[
|
||||
u^* =
|
||||
\frac{u_{ref} \kappa}{\ln\left(\frac{z_{ref} + z_0}{z_0}\right)}
|
||||
\f]
|
||||
|
||||
where
|
||||
\vartable
|
||||
U^* | Friction velocity
|
||||
\kappa | von Karman's constant
|
||||
C_{\mu} | Turbulence viscosity coefficient
|
||||
z | Vertical coordinate
|
||||
z_0 | Surface roughness height [m]
|
||||
z_g | Minimum z-coordinate [m]
|
||||
\endvartable
|
||||
and
|
||||
\f[
|
||||
U^* = \kappa\frac{U_{ref}}{ln\left(\frac{Z_{ref} + z_0}{z_0}\right)}
|
||||
\f]
|
||||
where
|
||||
\vartable
|
||||
U_{ref} | Reference velocity at \f$Z_{ref}\f$ [m/s]
|
||||
Z_{ref} | Reference height [m]
|
||||
u | Ground-normal streamwise flow speed profile [m/s]
|
||||
v | Spanwise flow speed [m/s]
|
||||
w | Ground-normal flow speed [m/s]
|
||||
k | Ground-normal turbulent kinetic energy (TKE) profile [m^2/s^2]
|
||||
\epsilon | Ground-normal TKE dissipation rate profile [m^2/s^3]
|
||||
\omega | Ground-normal specific dissipation rate profile [m^2/s^3]
|
||||
u^* | Friction velocity [m/s]
|
||||
\kappa | von Kármán constant [-]
|
||||
C_\mu | Empirical model constant [-]
|
||||
z | Ground-normal coordinate component [m]
|
||||
d | Ground-normal displacement height [m]
|
||||
z_0 | Aerodynamic roughness length [m]
|
||||
u_{ref} | Reference mean streamwise wind speed at \f$z_{ref}\f$ [m/s]
|
||||
z_{ref} | Reference height being used in \f$u^*\f$ estimations [m]
|
||||
C_1 | Curve-fitting coefficient for \c YGCJ profiles [-]
|
||||
C_2 | Curve-fitting coefficient for \c YGCJ profiles [-]
|
||||
\endvartable
|
||||
|
||||
Use in the atmBoundaryLayerInletVelocity, atmBoundaryLayerInletK and
|
||||
atmBoundaryLayerInletEpsilon boundary conditions.
|
||||
Note
|
||||
- The \c RH expressions are special cases of those in \c YGCJ when \c C1=0
|
||||
and \c C2=1. Both \c C1 and \c C2 can be determined by nonlinear fitting
|
||||
of (\c YGCJ:Eq. 19) with an experimental dataset for \c k. By default,
|
||||
\c atmBoundaryLayerInlet boundary conditions compute \c RH expressions.
|
||||
- \c z is the ground-normal height relative to the global minimum height
|
||||
of the inlet patch; therefore, the minimum of \c z is always zero
|
||||
irrespective of the absolute z-coordinate of the computational patch.
|
||||
|
||||
Reference:
|
||||
D.M. Hargreaves and N.G. Wright, "On the use of the k-epsilon model
|
||||
in commercial CFD software to model the neutral atmospheric boundary
|
||||
layer", Journal of Wind Engineering and Industrial Aerodynamics
|
||||
95(2007), pp 355-369.
|
||||
\verbatim
|
||||
The ground-normal profile expressions (tag:RH):
|
||||
Richards, P. J., & Hoxey, R. P. (1993).
|
||||
Appropriate boundary conditions for computational wind
|
||||
engineering models using the k-ε turbulence model.
|
||||
In Computational Wind Engineering 1 (pp. 145-153).
|
||||
DOI:10.1016/B978-0-444-81688-7.50018-8
|
||||
|
||||
Modifications to preserve the profiles downstream (tag:HW):
|
||||
Hargreaves, D. M., & Wright, N. G. (2007).
|
||||
On the use of the k–ε model in commercial CFD software
|
||||
to model the neutral atmospheric boundary layer.
|
||||
Journal of wind engineering and
|
||||
industrial aerodynamics, 95(5), 355-369.
|
||||
DOI:10.1016/j.jweia.2006.08.002
|
||||
|
||||
Expression generalisations to allow height
|
||||
variation for turbulence quantities (tag:YGCJ):
|
||||
Yang, Y., Gu, M., Chen, S., & Jin, X. (2009).
|
||||
New inflow boundary conditions for modelling the neutral equilibrium
|
||||
atmospheric boundary layer in computational wind engineering.
|
||||
J. of Wind Engineering and Industrial Aerodynamics, 97(2), 88-95.
|
||||
DOI:10.1016/j.jweia.2008.12.001
|
||||
|
||||
The generalised ground-normal profile expression for omega (tag:YGJ):
|
||||
Yang, Y., Gu, M., & Jin, X., (2009).
|
||||
New inflow boundary conditions for modelling the
|
||||
neutral equilibrium atmospheric boundary layer in SST k-ω model.
|
||||
In: The Seventh Asia-Pacific Conference on Wind Engineering,
|
||||
November 8-12, Taipei, Taiwan.
|
||||
|
||||
Theoretical remarks (tag:E):
|
||||
Emeis, S. (2013).
|
||||
Wind Energy Meteorology: Atmospheric
|
||||
Physics for Wind Power Generation.
|
||||
Springer-Verlag Berlin Heidelberg.
|
||||
DOI:10.1007/978-3-642-30523-8
|
||||
\endverbatim
|
||||
|
||||
Usage
|
||||
\table
|
||||
Property | Description | Required | Default
|
||||
flowDir | Flow direction | yes |
|
||||
zDir | Vertical direction | yes |
|
||||
kappa | von Karman's constant | no | 0.41
|
||||
Cmu | Turbulence viscosity coefficient | no | 0.09
|
||||
Uref | Reference velocity [m/s] | yes |
|
||||
Zref | Reference height [m] | yes |
|
||||
z0 | Surface roughness height [m] | yes |
|
||||
zGround | Minimum z-coordinate [m] | yes |
|
||||
Property | Description | Type | Req'd | Deflt
|
||||
flowDir | Flow direction | TimeFunction1<vector> | yes | -
|
||||
zDir | Ground-normal direction | TimeFunction1<vector> | yes | -
|
||||
Uref | Reference mean streamwise flow speed being used in <!--
|
||||
--> \f$u^*\f$ estimations [m/s] | TimeFunction1<scalar> | yes | -
|
||||
Zref | Reference height being used in \f$u^*\f$ estimations [m] <!--
|
||||
--> | TimeFunction1<scalar> | yes | -
|
||||
z0 | Surface roughness length [m] <!--
|
||||
--> | PatchFunction1<scalar> | yes | -
|
||||
d | Displacement height [m] - see Notes <!--
|
||||
--> | PatchFunction1<scalar> | yes | -
|
||||
kappa | von Kármán constant | scalar | no | 0.41
|
||||
Cmu | Empirical model constant | scalar | no | 0.09
|
||||
initABL | Flag to initialise profiles with the theoretical <!--
|
||||
--> ABL expressions, otherwise use "value" list <!--
|
||||
--> | bool | no | true
|
||||
value | ABL profile content when initABL=false <!--
|
||||
--> | scalarList | conditional | -
|
||||
phi | Name of the flux field | word | no | phi
|
||||
C1 | Curve-fitting coefficient \c YGCJ profiles | scalar | no | 0.0
|
||||
C2 | Curve-fitting coefficient \c YGCJ profiles | scalar | no | 1.0
|
||||
\endtable
|
||||
|
||||
Example of the boundary condition specification:
|
||||
\verbatim
|
||||
ground
|
||||
{
|
||||
type atmBoundaryLayerInletVelocity;
|
||||
flowDir (1 0 0);
|
||||
zDir (0 0 1);
|
||||
Uref 10.0;
|
||||
Zref 20.0;
|
||||
z0 uniform 0.1;
|
||||
zGround uniform 0.0;
|
||||
}
|
||||
\endverbatim
|
||||
|
||||
Note
|
||||
D.M. Hargreaves and N.G. Wright recommend Gamma epsilon in the
|
||||
k-epsilon model should be changed from 1.3 to 1.11 for consistency.
|
||||
The roughness height (Er) is given by Er = 20 z0 following the same
|
||||
reference.
|
||||
- The derived ABL expressions automatically satisfy the simplified transport
|
||||
equation for \c k. Yet the same expressions only satisfy the simplified
|
||||
transport equation for \c epsilon when the model constants \c sigmaEpsilon
|
||||
is 1.11 with \c kappa=0.4 (\c HW:p. 358).
|
||||
- \c atmBoundaryLayerInlet boundary conditions inherit \c inletOutlet
|
||||
traits, so that a given inlet condition can be supplied from all sides of
|
||||
the domain, e.g. a ground-normal cylinder domain having a single
|
||||
inlet/outlet boundary where the changes between inlet and outlet depend
|
||||
on the wind direction and patch normals, so that any change in inflow
|
||||
orientation can be handled with the same mesh.
|
||||
- \c d is the displacement height, and "is relevant for flows over forests
|
||||
and cities" (E:p. 28). "The displacement height gives the vertical
|
||||
displacement of the entire flow regime over areas which are densely covered
|
||||
with obstacles such as trees or buildings" (E:p. 28).
|
||||
|
||||
See also
|
||||
- Foam::atmBoundaryLayer::atmBoundaryLayerInletVelocityFvPatchVectorField
|
||||
- Foam::atmBoundaryLayer::atmBoundaryLayerInletKFvPatchScalarField
|
||||
- Foam::atmBoundaryLayer::atmBoundaryLayerInletEpsilonFvPatchScalarField
|
||||
- Foam::atmBoundaryLayer::atmBoundaryLayerInletOmegaFvPatchScalarField
|
||||
- ExtendedCodeGuide::atmBoundaryLayer
|
||||
|
||||
SourceFiles
|
||||
atmBoundaryLayer.C
|
||||
@ -133,7 +205,33 @@ namespace Foam
|
||||
|
||||
class atmBoundaryLayer
|
||||
{
|
||||
// Private data
|
||||
protected:
|
||||
|
||||
// Protected Data
|
||||
|
||||
//- Flag to initialise profiles with the theoretical ABL expressions,
|
||||
//- otherwise initialises by using "value" entry content
|
||||
Switch initABL_;
|
||||
|
||||
|
||||
private:
|
||||
|
||||
// Private Data
|
||||
|
||||
//- von Kármán constant
|
||||
const scalar kappa_;
|
||||
|
||||
//- Empirical model constant
|
||||
const scalar Cmu_;
|
||||
|
||||
//- Curve-fitting coefficient
|
||||
const scalar C1_;
|
||||
|
||||
//- Curve-fitting coefficient
|
||||
const scalar C2_;
|
||||
|
||||
//- Minimum coordinate vector of this patch
|
||||
const vector ppMin_;
|
||||
|
||||
//- Reference to the time database
|
||||
const Time& time_;
|
||||
@ -141,29 +239,23 @@ class atmBoundaryLayer
|
||||
//- Reference to the patch
|
||||
const polyPatch& patch_;
|
||||
|
||||
//- Flow direction
|
||||
//- Streamwise flow direction
|
||||
TimeFunction1<vector> flowDir_;
|
||||
|
||||
//- Direction of the z-coordinate
|
||||
//- Direction of the ground-normal coordinate
|
||||
TimeFunction1<vector> zDir_;
|
||||
|
||||
//- Von Karman constant
|
||||
const scalar kappa_;
|
||||
|
||||
//- Turbulent viscosity coefficient
|
||||
const scalar Cmu_;
|
||||
|
||||
//- Reference velocity
|
||||
//- Reference mean streamwise flow speed being used in Ustar estimations
|
||||
TimeFunction1<scalar> Uref_;
|
||||
|
||||
//- Reference height
|
||||
//- Reference height being used in Ustar estimations
|
||||
TimeFunction1<scalar> Zref_;
|
||||
|
||||
//- Surface roughness height
|
||||
//- Surface roughness length
|
||||
autoPtr<PatchFunction1<scalar>> z0_;
|
||||
|
||||
//- Minimum coordinate value in z direction
|
||||
autoPtr<PatchFunction1<scalar>> zGround_;
|
||||
//- Displacement height
|
||||
autoPtr<PatchFunction1<scalar>> d_;
|
||||
|
||||
|
||||
public:
|
||||
@ -193,14 +285,14 @@ public:
|
||||
atmBoundaryLayer(const atmBoundaryLayer&);
|
||||
|
||||
|
||||
// Member functions
|
||||
// Member Functions
|
||||
|
||||
// Access
|
||||
|
||||
//- Return flow direction
|
||||
vector flowDir() const;
|
||||
|
||||
//- Return z-direction
|
||||
//- Return the ground-normal direction
|
||||
vector zDir() const;
|
||||
|
||||
//- Return friction velocity
|
||||
@ -219,14 +311,16 @@ public:
|
||||
// Evaluate functions
|
||||
|
||||
//- Return the velocity distribution for the ATM
|
||||
tmp<vectorField> U(const vectorField& p) const;
|
||||
tmp<vectorField> U(const vectorField& pCf) const;
|
||||
|
||||
//- Return the turbulent kinetic energy distribution for the ATM
|
||||
tmp<scalarField> k(const vectorField& p) const;
|
||||
tmp<scalarField> k(const vectorField& pCf) const;
|
||||
|
||||
//- Return the turbulent dissipation rate distribution for the ATM
|
||||
tmp<scalarField> epsilon(const vectorField& p) const;
|
||||
tmp<scalarField> epsilon(const vectorField& pCf) const;
|
||||
|
||||
//- Return the specific dissipation rate distribution for the ATM
|
||||
tmp<scalarField> omega(const vectorField& pCf) const;
|
||||
|
||||
//- Write
|
||||
void write(Ostream&) const;
|
||||
|
||||
@ -28,6 +28,7 @@ License
|
||||
|
||||
#include "atmBoundaryLayerInletEpsilonFvPatchScalarField.H"
|
||||
#include "addToRunTimeSelectionTable.H"
|
||||
#include "turbulenceModel.H"
|
||||
#include "fvPatchFieldMapper.H"
|
||||
#include "volFields.H"
|
||||
#include "surfaceFields.H"
|
||||
@ -68,13 +69,14 @@ atmBoundaryLayerInletEpsilonFvPatchScalarField
|
||||
refGrad() = 0;
|
||||
valueFraction() = 1;
|
||||
|
||||
if (dict.found("value"))
|
||||
if (!initABL_)
|
||||
{
|
||||
scalarField::operator=(scalarField("value", dict, p.size()));
|
||||
}
|
||||
else
|
||||
{
|
||||
scalarField::operator=(refValue());
|
||||
initABL_ = false;
|
||||
}
|
||||
}
|
||||
|
||||
@ -148,8 +150,8 @@ void atmBoundaryLayerInletEpsilonFvPatchScalarField::rmap
|
||||
void atmBoundaryLayerInletEpsilonFvPatchScalarField::write(Ostream& os) const
|
||||
{
|
||||
fvPatchScalarField::write(os);
|
||||
atmBoundaryLayer::write(os);
|
||||
os.writeEntryIfDifferent<word>("phi", "phi", phiName_);
|
||||
atmBoundaryLayer::write(os);
|
||||
writeEntry("value", os);
|
||||
}
|
||||
|
||||
|
||||
@ -6,6 +6,7 @@
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
Copyright (C) 2011-2018 OpenFOAM Foundation
|
||||
Copyright (C) 2020 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -30,28 +31,74 @@ Group
|
||||
grpRASBoundaryConditions grpInletBoundaryConditions
|
||||
|
||||
Description
|
||||
This boundary condition specifies an inlet value for the turbulence
|
||||
dissipation, \f$\epsilon\f$, appropriate for atmospheric boundary layers.
|
||||
This boundary condition provides a log-law type ground-normal inflow
|
||||
boundary condition for turbulent kinetic energy dissipation rate, i.e.
|
||||
\c epsilon, for homogeneous, two-dimensional, dry-air, equilibrium and
|
||||
neutral atmospheric boundary layer modelling.
|
||||
|
||||
See Foam::atmBoundaryLayer for details.
|
||||
The ground-normal \c epsilon profile expression:
|
||||
|
||||
\f[
|
||||
\epsilon = \frac{(u^*)^3}{\kappa (z - d + z_0)}
|
||||
\sqrt{C_1 \ln \left( \frac{z - d + z_0}{z_0} \right) + C_2}
|
||||
\f]
|
||||
|
||||
where
|
||||
\vartable
|
||||
\epsilon | Ground-normal TKE dissipation rate profile [m^2/s^3]
|
||||
u^* | Friction velocity [m/s]
|
||||
\kappa | von Kármán constant [-]
|
||||
z | Ground-normal coordinate component [m]
|
||||
z_0 | Aerodynamic roughness length [m]
|
||||
d | Ground-normal displacement height [m]
|
||||
C_1 | Curve-fitting coefficient for \c YGCJ profiles [-]
|
||||
C_2 | Curve-fitting coefficient for \c YGCJ profiles [-]
|
||||
\endvartable
|
||||
|
||||
Usage
|
||||
\heading Required fields
|
||||
\plaintable
|
||||
epsilon | Turbulent kinetic energy dissipation rate [m^2/s^3]
|
||||
\endplaintable
|
||||
|
||||
Example of the boundary condition specification:
|
||||
\verbatim
|
||||
ground
|
||||
inlet
|
||||
{
|
||||
// Mandatory entries (unmodifiable)
|
||||
type atmBoundaryLayerInletEpsilon;
|
||||
|
||||
// Mandatory (inherited) entries (unmodifiable)
|
||||
flowDir (1 0 0);
|
||||
z (0 0 1);
|
||||
Uref 10.0;
|
||||
Zref 20.0;
|
||||
Zref 0.0;
|
||||
z0 uniform 0.1;
|
||||
zGround uniform 0.0;
|
||||
d uniform 0.0;
|
||||
|
||||
// Optional (inherited) entries (unmodifiable)
|
||||
kappa 0.41;
|
||||
Cmu 0.09;
|
||||
initABL true;
|
||||
phi phi;
|
||||
C1 0.0;
|
||||
C2 1.0;
|
||||
|
||||
// Conditional mandatory (inherited) entries (runtime modifiable)
|
||||
value uniform 0; // when initABL=false
|
||||
}
|
||||
\endverbatim
|
||||
|
||||
The inherited entries are elaborated in:
|
||||
- \link atmBoundaryLayer.H \endlink
|
||||
- \link inletOutletFvPatchField.H \endlink
|
||||
|
||||
See also
|
||||
Foam::atmBoundaryLayer,
|
||||
Foam::atmBoundaryLayerInletVelocityFvPatchVectorField,
|
||||
Foam::atmBoundaryLayerInletKFvPatchScalarField
|
||||
- Foam::atmBoundaryLayer
|
||||
- Foam::atmBoundaryLayer::atmBoundaryLayerInletKFvPatchScalarField
|
||||
- Foam::atmBoundaryLayer::atmBoundaryLayerInletOmegaFvPatchScalarField
|
||||
- Foam::atmBoundaryLayer::atmBoundaryLayerInletVelocityFvPatchVectorField
|
||||
- ExtendedCodeGuide::atmBoundaryLayer::atmBoundaryLayerInletEpsilon
|
||||
|
||||
SourceFiles
|
||||
atmBoundaryLayerInletEpsilonFvPatchScalarField.C
|
||||
@ -104,7 +151,7 @@ public:
|
||||
);
|
||||
|
||||
//- Construct by mapping given
|
||||
// atmBoundaryLayerInletEpsilonFvPatchScalarField onto a new patch
|
||||
//- atmBoundaryLayerInletEpsilonFvPatchScalarField onto a new patch
|
||||
atmBoundaryLayerInletEpsilonFvPatchScalarField
|
||||
(
|
||||
const atmBoundaryLayerInletEpsilonFvPatchScalarField&,
|
||||
@ -142,12 +189,11 @@ public:
|
||||
}
|
||||
|
||||
|
||||
// Member functions
|
||||
// Member Functions
|
||||
|
||||
//- Update the coefficients associated with the patch field
|
||||
virtual void updateCoeffs();
|
||||
|
||||
|
||||
// Mapping functions
|
||||
|
||||
//- Map (and resize as needed) from self given a mapping object
|
||||
|
||||
@ -68,13 +68,14 @@ atmBoundaryLayerInletKFvPatchScalarField
|
||||
refGrad() = 0;
|
||||
valueFraction() = 1;
|
||||
|
||||
if (dict.found("value"))
|
||||
if (!initABL_)
|
||||
{
|
||||
scalarField::operator=(scalarField("value", dict, p.size()));
|
||||
}
|
||||
else
|
||||
{
|
||||
scalarField::operator=(refValue());
|
||||
initABL_ = false;
|
||||
}
|
||||
}
|
||||
|
||||
@ -148,8 +149,8 @@ void atmBoundaryLayerInletKFvPatchScalarField::rmap
|
||||
void atmBoundaryLayerInletKFvPatchScalarField::write(Ostream& os) const
|
||||
{
|
||||
fvPatchScalarField::write(os);
|
||||
atmBoundaryLayer::write(os);
|
||||
os.writeEntryIfDifferent<word>("phi", "phi", phiName_);
|
||||
atmBoundaryLayer::write(os);
|
||||
writeEntry("value", os);
|
||||
}
|
||||
|
||||
|
||||
@ -6,6 +6,7 @@
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
Copyright (C) 2014-2018 OpenFOAM Foundation
|
||||
Copyright (C) 2020 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -30,28 +31,71 @@ Group
|
||||
grpRASBoundaryConditions grpInletBoundaryConditions
|
||||
|
||||
Description
|
||||
This boundary condition specifies an inlet value for the turbulence
|
||||
kinetic energy, \f$k\f$, appropriate for atmospheric boundary layers.
|
||||
This boundary condition provides a log-law type ground-normal inflow
|
||||
boundary condition for turbulent kinetic energy, i.e. \c k,
|
||||
for homogeneous, two-dimensional, dry-air, equilibrium and neutral
|
||||
atmospheric boundary layer modelling.
|
||||
|
||||
See Foam::atmBoundaryLayer for details.
|
||||
The ground-normal \c k profile expression:
|
||||
|
||||
\f[
|
||||
k = \frac{(u^*)^2}{\sqrt{C_\mu}}
|
||||
\sqrt{C_1 \ln \left( \frac{z - d + z_0}{z_0} \right) + C_2}
|
||||
\f]
|
||||
|
||||
where
|
||||
\vartable
|
||||
k | Ground-normal turbulent kinetic energy profile [m^2/s^3]
|
||||
u^* | Friction velocity [m/s]
|
||||
C_\mu | Empirical model constant [-]
|
||||
C_1 | Curve-fitting coefficient for \c YGCJ profiles [-]
|
||||
C_2 | Curve-fitting coefficient for \c YGCJ profiles [-]
|
||||
\endvartable
|
||||
|
||||
Usage
|
||||
\heading Required fields
|
||||
\plaintable
|
||||
k | Turbulent kinetic energy [m^2/s^2]
|
||||
\endplaintable
|
||||
|
||||
Example of the boundary condition specification:
|
||||
\verbatim
|
||||
ground
|
||||
inlet
|
||||
{
|
||||
// Mandatory entries (unmodifiable)
|
||||
type atmBoundaryLayerInletK;
|
||||
z (0 0 1);
|
||||
|
||||
// Mandatory (inherited) entries (unmodifiable)
|
||||
Uref 10.0;
|
||||
Zref 20.0;
|
||||
Zref 0.0;
|
||||
z0 uniform 0.1;
|
||||
zGround uniform 0.0;
|
||||
d uniform 0.0;
|
||||
flowDir (1 0 0); // not used
|
||||
z (0 0 1); // not used
|
||||
|
||||
// Optional (inherited) entries (unmodifiable)
|
||||
kappa 0.41;
|
||||
Cmu 0.09;
|
||||
initABL true;
|
||||
phi phi;
|
||||
C1 0.0;
|
||||
C2 1.0;
|
||||
|
||||
// Conditional mandatory (inherited) entries (runtime modifiable)
|
||||
value uniform 0; // when initABL=false
|
||||
}
|
||||
\endverbatim
|
||||
|
||||
The inherited entries are elaborated in:
|
||||
- \link atmBoundaryLayer.H \endlink
|
||||
- \link inletOutletFvPatchField.H \endlink
|
||||
|
||||
See also
|
||||
Foam::atmBoundaryLayer,
|
||||
Foam::atmBoundaryLayerInletVelocityFvPatchVectorField,
|
||||
Foam::atmBoundaryLayerInletEpsilonFvPatchScalarField
|
||||
- Foam::atmBoundaryLayer
|
||||
- Foam::atmBoundaryLayer::atmBoundaryLayerInletVelocityFvPatchVectorField
|
||||
- Foam::atmBoundaryLayer::atmBoundaryLayerInletEpsilonFvPatchScalarField
|
||||
- Foam::atmBoundaryLayer::atmBoundaryLayerInletOmegaFvPatchScalarField
|
||||
- ExtendedCodeGuide::atmBoundaryLayer::atmBoundaryLayerInletK
|
||||
|
||||
SourceFiles
|
||||
atmBoundaryLayerInletKFvPatchScalarField.C
|
||||
@ -104,7 +148,7 @@ public:
|
||||
);
|
||||
|
||||
//- Construct by mapping given
|
||||
// atmBoundaryLayerInletKFvPatchScalarField onto a new patch
|
||||
//- atmBoundaryLayerInletKFvPatchScalarField onto a new patch
|
||||
atmBoundaryLayerInletKFvPatchScalarField
|
||||
(
|
||||
const atmBoundaryLayerInletKFvPatchScalarField&,
|
||||
@ -142,7 +186,7 @@ public:
|
||||
}
|
||||
|
||||
|
||||
// Member functions
|
||||
// Member Functions
|
||||
|
||||
//- Update the coefficients associated with the patch field
|
||||
virtual void updateCoeffs();
|
||||
|
||||
@ -0,0 +1,169 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | www.openfoam.com
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
Copyright (C) 2020 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
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 "atmBoundaryLayerInletOmegaFvPatchScalarField.H"
|
||||
#include "addToRunTimeSelectionTable.H"
|
||||
#include "fvPatchFieldMapper.H"
|
||||
#include "volFields.H"
|
||||
#include "surfaceFields.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
|
||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||
|
||||
atmBoundaryLayerInletOmegaFvPatchScalarField::
|
||||
atmBoundaryLayerInletOmegaFvPatchScalarField
|
||||
(
|
||||
const fvPatch& p,
|
||||
const DimensionedField<scalar, volMesh>& iF
|
||||
)
|
||||
:
|
||||
inletOutletFvPatchScalarField(p, iF),
|
||||
atmBoundaryLayer(iF.time(), p.patch())
|
||||
{}
|
||||
|
||||
|
||||
atmBoundaryLayerInletOmegaFvPatchScalarField::
|
||||
atmBoundaryLayerInletOmegaFvPatchScalarField
|
||||
(
|
||||
const fvPatch& p,
|
||||
const DimensionedField<scalar, volMesh>& iF,
|
||||
const dictionary& dict
|
||||
)
|
||||
:
|
||||
inletOutletFvPatchScalarField(p, iF),
|
||||
atmBoundaryLayer(iF.time(), p.patch(), dict)
|
||||
{
|
||||
phiName_ = dict.getOrDefault<word>("phi", "phi");
|
||||
|
||||
refValue() = omega(patch().Cf());
|
||||
refGrad() = 0;
|
||||
valueFraction() = 1;
|
||||
|
||||
if (!initABL_)
|
||||
{
|
||||
scalarField::operator=(scalarField("value", dict, p.size()));
|
||||
}
|
||||
else
|
||||
{
|
||||
scalarField::operator=(refValue());
|
||||
initABL_ = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
atmBoundaryLayerInletOmegaFvPatchScalarField::
|
||||
atmBoundaryLayerInletOmegaFvPatchScalarField
|
||||
(
|
||||
const atmBoundaryLayerInletOmegaFvPatchScalarField& psf,
|
||||
const fvPatch& p,
|
||||
const DimensionedField<scalar, volMesh>& iF,
|
||||
const fvPatchFieldMapper& mapper
|
||||
)
|
||||
:
|
||||
inletOutletFvPatchScalarField(psf, p, iF, mapper),
|
||||
atmBoundaryLayer(psf, p, mapper)
|
||||
{}
|
||||
|
||||
|
||||
atmBoundaryLayerInletOmegaFvPatchScalarField::
|
||||
atmBoundaryLayerInletOmegaFvPatchScalarField
|
||||
(
|
||||
const atmBoundaryLayerInletOmegaFvPatchScalarField& psf,
|
||||
const DimensionedField<scalar, volMesh>& iF
|
||||
)
|
||||
:
|
||||
inletOutletFvPatchScalarField(psf, iF),
|
||||
atmBoundaryLayer(psf)
|
||||
{}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||
|
||||
void atmBoundaryLayerInletOmegaFvPatchScalarField::updateCoeffs()
|
||||
{
|
||||
if (updated())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
refValue() = omega(patch().Cf());
|
||||
|
||||
inletOutletFvPatchScalarField::updateCoeffs();
|
||||
}
|
||||
|
||||
|
||||
void atmBoundaryLayerInletOmegaFvPatchScalarField::autoMap
|
||||
(
|
||||
const fvPatchFieldMapper& m
|
||||
)
|
||||
{
|
||||
inletOutletFvPatchScalarField::autoMap(m);
|
||||
atmBoundaryLayer::autoMap(m);
|
||||
}
|
||||
|
||||
|
||||
void atmBoundaryLayerInletOmegaFvPatchScalarField::rmap
|
||||
(
|
||||
const fvPatchScalarField& psf,
|
||||
const labelList& addr
|
||||
)
|
||||
{
|
||||
inletOutletFvPatchScalarField::rmap(psf, addr);
|
||||
|
||||
const atmBoundaryLayerInletOmegaFvPatchScalarField& blpsf =
|
||||
refCast<const atmBoundaryLayerInletOmegaFvPatchScalarField>(psf);
|
||||
|
||||
atmBoundaryLayer::rmap(blpsf, addr);
|
||||
}
|
||||
|
||||
|
||||
void atmBoundaryLayerInletOmegaFvPatchScalarField::write(Ostream& os) const
|
||||
{
|
||||
fvPatchScalarField::write(os);
|
||||
os.writeEntryIfDifferent<word>("phi", "phi", phiName_);
|
||||
atmBoundaryLayer::write(os);
|
||||
writeEntry("value", os);
|
||||
}
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
makePatchTypeField
|
||||
(
|
||||
fvPatchScalarField,
|
||||
atmBoundaryLayerInletOmegaFvPatchScalarField
|
||||
);
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace Foam
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -0,0 +1,223 @@
|
||||
/*---------------------------------------------------------------------------*\
|
||||
========= |
|
||||
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
|
||||
\\ / O peration |
|
||||
\\ / A nd | www.openfoam.com
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
Copyright (C) 2020 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
This file is part of OpenFOAM.
|
||||
|
||||
OpenFOAM is free software: you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
|
||||
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
|
||||
for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Class
|
||||
Foam::atmBoundaryLayerInletOmegaFvPatchScalarField
|
||||
|
||||
Group
|
||||
grpRASBoundaryConditions grpInletBoundaryConditions
|
||||
|
||||
Description
|
||||
This boundary condition provides a log-law type ground-normal inflow
|
||||
boundary condition for specific dissipation rate, i.e. \c omega,
|
||||
for homogeneous, two-dimensional, dry-air, equilibrium and neutral
|
||||
atmospheric boundary layer modelling.
|
||||
|
||||
The ground-normal \c omega profile expression:
|
||||
|
||||
\f[
|
||||
\omega = \frac{u^*}{\kappa \sqrt{C_\mu}} \frac{1}{z - d + z_0}
|
||||
\f]
|
||||
|
||||
where
|
||||
\vartable
|
||||
\omega | Ground-normal specific dissipation rate profile [m^2/s^3]
|
||||
u^* | Friction velocity [m/s]
|
||||
\kappa | von Kármán constant [-]
|
||||
C_\mu | Empirical model constant [-]
|
||||
z | Ground-normal coordinate component [m]
|
||||
d | Ground-normal displacement height [m]
|
||||
z_0 | Aerodynamic roughness length [m]
|
||||
\endvartable
|
||||
|
||||
Usage
|
||||
\heading Required fields
|
||||
\plaintable
|
||||
omega | Specific dissipation rate [1/s]
|
||||
\endplaintable
|
||||
|
||||
Example of the boundary condition specification:
|
||||
\verbatim
|
||||
inlet
|
||||
{
|
||||
// Mandatory entries (unmodifiable)
|
||||
type atmBoundaryLayerInletOmega;
|
||||
|
||||
// Mandatory (inherited) entries (unmodifiable)
|
||||
flowDir (1 0 0);
|
||||
z (0 0 1);
|
||||
Uref 10.0;
|
||||
Zref 0.0;
|
||||
z0 uniform 0.1;
|
||||
d uniform 0.0;
|
||||
|
||||
// Optional (inherited) entries (unmodifiable)
|
||||
kappa 0.41;
|
||||
Cmu 0.09;
|
||||
initABL true;
|
||||
phi phi;
|
||||
C1 0.0;
|
||||
C2 1.0;
|
||||
|
||||
// Conditional mandatory (inherited) entries (runtime modifiable)
|
||||
value uniform 0; // when initABL=false
|
||||
}
|
||||
\endverbatim
|
||||
|
||||
The inherited entries are elaborated in:
|
||||
- \link atmBoundaryLayer.H \endlink
|
||||
- \link inletOutletFvPatchField.H \endlink
|
||||
|
||||
See also
|
||||
- Foam::atmBoundaryLayer
|
||||
- Foam::atmBoundaryLayer::atmBoundaryLayerInletVelocityFvPatchVelocityField
|
||||
- Foam::atmBoundaryLayer::atmBoundaryLayerInletEpsilonFvPatchScalarField
|
||||
- Foam::atmBoundaryLayer::atmBoundaryLayerInletKFvPatchScalarField
|
||||
- ExtendedCodeGuide::atmBoundaryLayer::atmBoundaryLayerInletOmega
|
||||
|
||||
SourceFiles
|
||||
atmBoundaryLayerInletOmegaFvPatchScalarField.C
|
||||
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
#ifndef atmBoundaryLayerInletOmegaFvPatchScalarField_H
|
||||
#define atmBoundaryLayerInletOmegaFvPatchScalarField_H
|
||||
|
||||
#include "fvPatchFields.H"
|
||||
#include "inletOutletFvPatchFields.H"
|
||||
#include "atmBoundaryLayer.H"
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
namespace Foam
|
||||
{
|
||||
|
||||
/*---------------------------------------------------------------------------*\
|
||||
Class atmBoundaryLayerInletOmegaFvPatchScalarField Declaration
|
||||
\*---------------------------------------------------------------------------*/
|
||||
|
||||
class atmBoundaryLayerInletOmegaFvPatchScalarField
|
||||
:
|
||||
public inletOutletFvPatchScalarField,
|
||||
public atmBoundaryLayer
|
||||
{
|
||||
|
||||
public:
|
||||
|
||||
//- Runtime type information
|
||||
TypeName("atmBoundaryLayerInletOmega");
|
||||
|
||||
|
||||
// Constructors
|
||||
|
||||
//- Construct from patch and internal field
|
||||
atmBoundaryLayerInletOmegaFvPatchScalarField
|
||||
(
|
||||
const fvPatch&,
|
||||
const DimensionedField<scalar, volMesh>&
|
||||
);
|
||||
|
||||
//- Construct from patch, internal field and dictionary
|
||||
atmBoundaryLayerInletOmegaFvPatchScalarField
|
||||
(
|
||||
const fvPatch&,
|
||||
const DimensionedField<scalar, volMesh>&,
|
||||
const dictionary&
|
||||
);
|
||||
|
||||
//- Construct by mapping given
|
||||
//- atmBoundaryLayerInletOmegaFvPatchScalarField onto a new patch
|
||||
atmBoundaryLayerInletOmegaFvPatchScalarField
|
||||
(
|
||||
const atmBoundaryLayerInletOmegaFvPatchScalarField&,
|
||||
const fvPatch&,
|
||||
const DimensionedField<scalar, volMesh>&,
|
||||
const fvPatchFieldMapper&
|
||||
);
|
||||
|
||||
//- Construct and return a clone
|
||||
virtual tmp<fvPatchScalarField> clone() const
|
||||
{
|
||||
return tmp<fvPatchScalarField>
|
||||
(
|
||||
new atmBoundaryLayerInletOmegaFvPatchScalarField(*this)
|
||||
);
|
||||
}
|
||||
|
||||
//- Construct as copy setting internal field reference
|
||||
atmBoundaryLayerInletOmegaFvPatchScalarField
|
||||
(
|
||||
const atmBoundaryLayerInletOmegaFvPatchScalarField&,
|
||||
const DimensionedField<scalar, volMesh>&
|
||||
);
|
||||
|
||||
//- Construct and return a clone setting internal field reference
|
||||
virtual tmp<fvPatchScalarField> clone
|
||||
(
|
||||
const DimensionedField<scalar, volMesh>& iF
|
||||
) const
|
||||
{
|
||||
return tmp<fvPatchScalarField>
|
||||
(
|
||||
new atmBoundaryLayerInletOmegaFvPatchScalarField(*this, iF)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
// Member Functions
|
||||
|
||||
//- Update the coefficients associated with the patch field
|
||||
virtual void updateCoeffs();
|
||||
|
||||
|
||||
// Mapping functions
|
||||
|
||||
//- Map (and resize as needed) from self given a mapping object
|
||||
virtual void autoMap
|
||||
(
|
||||
const fvPatchFieldMapper&
|
||||
);
|
||||
|
||||
//- Reverse map the given fvPatchField onto this fvPatchField
|
||||
virtual void rmap
|
||||
(
|
||||
const fvPatchScalarField&,
|
||||
const labelList&
|
||||
);
|
||||
|
||||
|
||||
//- Write
|
||||
virtual void write(Ostream&) const;
|
||||
};
|
||||
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
} // End namespace Foam
|
||||
|
||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||
|
||||
#endif
|
||||
|
||||
// ************************************************************************* //
|
||||
@ -68,13 +68,14 @@ atmBoundaryLayerInletVelocityFvPatchVectorField
|
||||
refGrad() = Zero;
|
||||
valueFraction() = 1;
|
||||
|
||||
if (dict.found("value"))
|
||||
if (!initABL_)
|
||||
{
|
||||
vectorField::operator=(vectorField("value", dict, p.size()));
|
||||
}
|
||||
else
|
||||
{
|
||||
vectorField::operator=(refValue());
|
||||
initABL_ = false;
|
||||
}
|
||||
}
|
||||
|
||||
@ -148,8 +149,8 @@ void atmBoundaryLayerInletVelocityFvPatchVectorField::rmap
|
||||
void atmBoundaryLayerInletVelocityFvPatchVectorField::write(Ostream& os) const
|
||||
{
|
||||
fvPatchVectorField::write(os);
|
||||
atmBoundaryLayer::write(os);
|
||||
os.writeEntryIfDifferent<word>("phi", "phi", phiName_);
|
||||
atmBoundaryLayer::write(os);
|
||||
writeEntry("value", os);
|
||||
}
|
||||
|
||||
|
||||
@ -6,6 +6,7 @@
|
||||
\\/ M anipulation |
|
||||
-------------------------------------------------------------------------------
|
||||
Copyright (C) 2011-2018 OpenFOAM Foundation
|
||||
Copyright (C) 2020 OpenCFD Ltd.
|
||||
-------------------------------------------------------------------------------
|
||||
License
|
||||
This file is part of OpenFOAM.
|
||||
@ -30,29 +31,77 @@ Group
|
||||
grpRASBoundaryConditions grpInletBoundaryConditions
|
||||
|
||||
Description
|
||||
This boundary condition specifies a velocity inlet profile appropriate
|
||||
for atmospheric boundary layers (ABL).
|
||||
This boundary condition provides a log-law type ground-normal inflow
|
||||
boundary condition for streamwise component of wind velocity, i.e. \c u,
|
||||
for homogeneous, two-dimensional, dry-air, equilibrium and neutral
|
||||
atmospheric boundary layer modelling.
|
||||
|
||||
See Foam::atmBoundaryLayer for details.
|
||||
The ground-normal streamwise flow speed profile expression:
|
||||
|
||||
\f[
|
||||
u = \frac{u^*}{\kappa} \ln \left( \frac{z - d + z_0}{z_0} \right)
|
||||
\f]
|
||||
|
||||
\f[
|
||||
v = w = 0
|
||||
\f]
|
||||
|
||||
where
|
||||
\vartable
|
||||
u | Ground-normal streamwise flow speed profile [m/s]
|
||||
v | Spanwise flow speed [m/s]
|
||||
w | Ground-normal flow speed [m/s]
|
||||
u^* | Friction velocity [m/s]
|
||||
\kappa | von Kármán constant [-]
|
||||
z | Ground-normal coordinate component [m]
|
||||
d | Ground-normal displacement height [m]
|
||||
z_0 | Aerodynamic roughness length [m]
|
||||
\endvartable
|
||||
|
||||
Usage
|
||||
\heading Required fields
|
||||
\plaintable
|
||||
U | Velocity [m/s]
|
||||
\endplaintable
|
||||
|
||||
Example of the boundary condition specification:
|
||||
\verbatim
|
||||
ground
|
||||
inlet
|
||||
{
|
||||
// Mandatory entries (unmodifiable)
|
||||
type atmBoundaryLayerInletVelocity;
|
||||
n (1 0 0);
|
||||
|
||||
// Mandatory (inherited) entries (unmodifiable)
|
||||
flowDir (1 0 0);
|
||||
z (0 0 1);
|
||||
Uref 10.0;
|
||||
Zref 20.0;
|
||||
Zref 0.0;
|
||||
z0 uniform 0.1;
|
||||
zGround uniform 0.0;
|
||||
d uniform 0.0;
|
||||
|
||||
// Optional (inherited) entries (unmodifiable)
|
||||
kappa 0.41;
|
||||
Cmu 0.09;
|
||||
initABL true;
|
||||
phi phi;
|
||||
C1 0.0;
|
||||
C2 1.0;
|
||||
|
||||
// Conditional mandatory (inherited) entries (runtime modifiable)
|
||||
value uniform (0 0 0); // when initABL=false
|
||||
}
|
||||
\endverbatim
|
||||
|
||||
The inherited entries are elaborated in:
|
||||
- \link atmBoundaryLayer.H \endlink
|
||||
- \link inletOutletFvPatchField.H \endlink
|
||||
|
||||
See also
|
||||
Foam::atmBoundaryLayer,
|
||||
Foam::atmBoundaryLayerInletKFvPatchScalarField,
|
||||
Foam::atmBoundaryLayerInletEpsilonFvPatchScalarField
|
||||
- Foam::atmBoundaryLayer
|
||||
- Foam::atmBoundaryLayer::atmBoundaryLayerInletKFvPatchScalarField
|
||||
- Foam::atmBoundaryLayer::atmBoundaryLayerInletEpsilonFvPatchScalarField
|
||||
- Foam::atmBoundaryLayer::atmBoundaryLayerInletOmegaFvPatchScalarField
|
||||
- ExtendedCodeGuide::atmBoundaryLayer::atmBoundaryLayerInletVelocity
|
||||
|
||||
SourceFiles
|
||||
atmBoundaryLayerInletVelocityFvPatchVectorField.C
|
||||
@ -105,7 +154,7 @@ public:
|
||||
);
|
||||
|
||||
//- Construct by mapping given
|
||||
// atmBoundaryLayerInletVelocityFvPatchVectorField onto a new patch
|
||||
//- atmBoundaryLayerInletVelocityFvPatchVectorField onto a new patch
|
||||
atmBoundaryLayerInletVelocityFvPatchVectorField
|
||||
(
|
||||
const atmBoundaryLayerInletVelocityFvPatchVectorField&,
|
||||
@ -143,7 +192,7 @@ public:
|
||||
}
|
||||
|
||||
|
||||
// Member functions
|
||||
// Member Functions
|
||||
|
||||
//- Update the coefficients associated with the patch field
|
||||
virtual void updateCoeffs();
|
||||
|
||||
Reference in New Issue
Block a user