diff --git a/src/finiteVolume/fields/fvPatchFields/derived/waveSurfacePressure/waveSurfacePressureFvPatchScalarField.C b/src/finiteVolume/fields/fvPatchFields/derived/waveSurfacePressure/waveSurfacePressureFvPatchScalarField.C
new file mode 100644
index 0000000000..cd395a5bc6
--- /dev/null
+++ b/src/finiteVolume/fields/fvPatchFields/derived/waveSurfacePressure/waveSurfacePressureFvPatchScalarField.C
@@ -0,0 +1,240 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2011 OpenFOAM Foundation
+ \\/ M anipulation |
+-------------------------------------------------------------------------------
+License
+ This file is part of OpenFOAM.
+
+ OpenFOAM is free software: you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with OpenFOAM. If not, see .
+
+\*---------------------------------------------------------------------------*/
+
+#include "waveSurfacePressureFvPatchScalarField.H"
+#include "addToRunTimeSelectionTable.H"
+#include "fvPatchFieldMapper.H"
+#include "volFields.H"
+#include "surfaceFields.H"
+#include "uniformDimensionedFields.H"
+
+// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
+
+Foam::waveSurfacePressureFvPatchScalarField::
+waveSurfacePressureFvPatchScalarField
+(
+ const fvPatch& p,
+ const DimensionedField& iF
+)
+:
+ fixedValueFvPatchScalarField(p, iF),
+ phiName_("phi"),
+ rhoName_("rho"),
+ zetaName_("zeta"),
+ zeta0_(p.size(), vector::zero),
+ curTimeIndex_(-1)
+{}
+
+
+Foam::waveSurfacePressureFvPatchScalarField::
+waveSurfacePressureFvPatchScalarField
+(
+ const fvPatch& p,
+ const DimensionedField& iF,
+ const dictionary& dict
+)
+:
+ fixedValueFvPatchScalarField(p, iF),
+ phiName_(dict.lookupOrDefault("phi", "phi")),
+ rhoName_(dict.lookupOrDefault("rho", "rho")),
+ zetaName_(dict.lookupOrDefault("zeta", "zeta")),
+ zeta0_(p.size(), vector::zero),
+ curTimeIndex_(-1)
+{
+ fvPatchField::operator=
+ (
+ scalarField("value", dict, p.size())
+ );
+}
+
+
+Foam::waveSurfacePressureFvPatchScalarField::
+waveSurfacePressureFvPatchScalarField
+(
+ const waveSurfacePressureFvPatchScalarField& ptf,
+ const fvPatch& p,
+ const DimensionedField& iF,
+ const fvPatchFieldMapper& mapper
+)
+:
+ fixedValueFvPatchScalarField(ptf, p, iF, mapper),
+ phiName_(ptf.phiName_),
+ rhoName_(ptf.rhoName_),
+ zetaName_(ptf.zetaName_),
+ zeta0_(ptf.zeta0_),
+ curTimeIndex_(-1)
+{}
+
+
+Foam::waveSurfacePressureFvPatchScalarField::
+waveSurfacePressureFvPatchScalarField
+(
+ const waveSurfacePressureFvPatchScalarField& wspsf
+)
+:
+ fixedValueFvPatchScalarField(wspsf),
+ phiName_(wspsf.phiName_),
+ rhoName_(wspsf.rhoName_),
+ zetaName_(wspsf.zetaName_),
+ zeta0_(wspsf.zeta0_),
+ curTimeIndex_(wspsf.curTimeIndex_)
+{}
+
+
+Foam::waveSurfacePressureFvPatchScalarField::
+waveSurfacePressureFvPatchScalarField
+(
+ const waveSurfacePressureFvPatchScalarField& wspsf,
+ const DimensionedField& iF
+)
+:
+ fixedValueFvPatchScalarField(wspsf, iF),
+ phiName_(wspsf.phiName_),
+ rhoName_(wspsf.rhoName_),
+ zetaName_(wspsf.zetaName_),
+ zeta0_(wspsf.zeta0_),
+ curTimeIndex_(wspsf.curTimeIndex_)
+{}
+
+
+// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
+
+void Foam::waveSurfacePressureFvPatchScalarField::autoMap
+(
+ const fvPatchFieldMapper& m
+)
+{
+ fixedValueFvPatchScalarField::autoMap(m);
+ zeta0_.autoMap(m);
+}
+
+
+void Foam::waveSurfacePressureFvPatchScalarField::rmap
+(
+ const fvPatchScalarField& ptf,
+ const labelList& addr
+)
+{
+ fixedValueFvPatchScalarField::rmap(ptf, addr);
+
+ const waveSurfacePressureFvPatchScalarField& wspsf =
+ refCast(ptf);
+
+ zeta0_.rmap(wspsf.zeta0_, addr);
+}
+
+
+void Foam::waveSurfacePressureFvPatchScalarField::updateCoeffs()
+{
+ if (updated())
+ {
+ return;
+ }
+
+ const scalar dt = db().time().deltaTValue();
+ const scalar timeI = db().time().timeIndex();
+ const scalar patchI = patch().index();
+
+ volVectorField& zeta =
+ const_cast
+ (
+ db().lookupObject(zetaName_)
+ );
+
+ vectorField& zetap = zeta.boundaryField()[patchI];
+
+ if (curTimeIndex_ != timeI)
+ {
+ zeta0_ = zetap;
+ curTimeIndex_ = timeI;
+ }
+
+ const surfaceScalarField& phi =
+ db().lookupObject(phiName_);
+
+ const scalarField& phip = phi.boundaryField()[patchI];
+
+ const uniformDimensionedVectorField& g =
+ db().lookupObject("g");
+
+ tmp nf(patch().nf());
+
+ if (phi.dimensions() == dimVelocity*dimArea)
+ {
+ zetap = zeta0_ + nf()*dt*phip/patch().magSf();
+
+ operator==(-g.value() & zetap);
+ }
+ else if (phi.dimensions() = dimDensity*dimVelocity*dimArea)
+ {
+ const scalarField& rhop =
+ patch().lookupPatchField(rhoName_);
+
+ zetap = zeta0_ + nf()*dt*phip/rhop/patch().magSf();
+
+ operator==(-rhop*(g.value() & zetap));
+ }
+ else
+ {
+ FatalErrorIn
+ (
+ "waveSurfacePressureFvPatchScalarField::updateCoeffs()"
+ )
+ << "dimensions of phi are incorrect" << nl
+ << " on patch " << this->patch().name()
+ << " of field " << this->dimensionedInternalField().name()
+ << " in file " << this->dimensionedInternalField().objectPath()
+ << exit(FatalError);
+ }
+
+ Info<< "min/max mag(zetap) = " << min(zetap & nf()) << ", "
+ << max(zetap & nf()) << endl;
+
+ fixedValueFvPatchScalarField::updateCoeffs();
+}
+
+
+void Foam::waveSurfacePressureFvPatchScalarField::write(Ostream& os) const
+{
+ fvPatchScalarField::write(os);
+ writeEntryIfDifferent(os, "phi", "phi", phiName_);
+ writeEntryIfDifferent(os, "rho", "rho", rhoName_);
+ writeEntryIfDifferent(os, "zeta", "zeta", zetaName_);
+ writeEntry("value", os);
+}
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+ makePatchTypeField
+ (
+ fvPatchScalarField,
+ waveSurfacePressureFvPatchScalarField
+ );
+}
+
+// ************************************************************************* //
diff --git a/src/finiteVolume/fields/fvPatchFields/derived/waveSurfacePressure/waveSurfacePressureFvPatchScalarField.H b/src/finiteVolume/fields/fvPatchFields/derived/waveSurfacePressure/waveSurfacePressureFvPatchScalarField.H
new file mode 100644
index 0000000000..f80e25dae2
--- /dev/null
+++ b/src/finiteVolume/fields/fvPatchFields/derived/waveSurfacePressure/waveSurfacePressureFvPatchScalarField.H
@@ -0,0 +1,191 @@
+/*---------------------------------------------------------------------------*\
+ ========= |
+ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
+ \\ / O peration |
+ \\ / A nd | Copyright (C) 2011 OpenFOAM Foundation
+ \\/ M anipulation |
+-------------------------------------------------------------------------------
+License
+ This file is part of OpenFOAM.
+
+ OpenFOAM is free software: you can redistribute it and/or modify it
+ under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
+ ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
+ for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with OpenFOAM. If not, see .
+
+Class
+ Foam::waveSurfacePressureFvPatchScalarField
+
+Description
+ Applies the surface wave pressure, based on the wave height
+
+ p = -rho.g.zeta
+
+ Where
+
+ p = pressure - kinematic of dynamic depending on the flux units
+ zeta = wave height vector [m]
+ g = acceleration due to gravity [m/s2]
+
+
+ Note:
+
+ This boundary also updates the wave height boundary field, which
+ is accessed via lookup from the database
+
+
+SourceFiles
+ waveSurfacePressureFvPatchScalarField.C
+
+\*---------------------------------------------------------------------------*/
+
+#ifndef waveSurfacePressureFvPatchScalarField_H
+#define waveSurfacePressureFvPatchScalarField_H
+
+#include "fixedValueFvPatchFields.H"
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+namespace Foam
+{
+
+/*---------------------------------------------------------------------------*\
+ Class waveSurfacePressureFvPatchScalarField Declaration
+\*---------------------------------------------------------------------------*/
+
+class waveSurfacePressureFvPatchScalarField
+:
+ public fixedValueFvPatchScalarField
+{
+ // Private data
+
+ //- Flux field name
+ word phiName_;
+
+ //- Density field name (if compressible)
+ word rhoName_;
+
+ //- Wave height field name
+ word zetaName_;
+
+ //- Old-time zeta patch value
+ vectorField zeta0_;
+
+ //- Current time index used to store ms0_
+ label curTimeIndex_;
+
+
+public:
+
+ //- Runtime type information
+ TypeName("waveSurfacePressure");
+
+
+ // Constructors
+
+ //- Construct from patch and internal field
+ waveSurfacePressureFvPatchScalarField
+ (
+ const fvPatch&,
+ const DimensionedField&
+ );
+
+ //- Construct from patch, internal field and dictionary
+ waveSurfacePressureFvPatchScalarField
+ (
+ const fvPatch&,
+ const DimensionedField&,
+ const dictionary&
+ );
+
+ //- Construct by mapping given waveSurfacePressureFvPatchScalarField
+ // onto a new patch
+ waveSurfacePressureFvPatchScalarField
+ (
+ const waveSurfacePressureFvPatchScalarField&,
+ const fvPatch&,
+ const DimensionedField&,
+ const fvPatchFieldMapper&
+ );
+
+ //- Construct as copy
+ waveSurfacePressureFvPatchScalarField
+ (
+ const waveSurfacePressureFvPatchScalarField&
+ );
+
+ //- Construct and return a clone
+ virtual tmp clone() const
+ {
+ return tmp
+ (
+ new waveSurfacePressureFvPatchScalarField(*this)
+ );
+ }
+
+ //- Construct as copy setting internal field reference
+ waveSurfacePressureFvPatchScalarField
+ (
+ const waveSurfacePressureFvPatchScalarField&,
+ const DimensionedField&
+ );
+
+ //- Construct and return a clone setting internal field reference
+ virtual tmp clone
+ (
+ const DimensionedField& iF
+ ) const
+ {
+ return tmp
+ (
+ new waveSurfacePressureFvPatchScalarField(*this, iF)
+ );
+ }
+
+
+ // Member functions
+
+ // 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&
+ );
+
+
+ // Evaluation functions
+
+ //- Update the coefficients associated with the patch field
+ virtual void updateCoeffs();
+
+
+ //- Write
+ virtual void write(Ostream&) const;
+};
+
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+} // End namespace Foam
+
+// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
+
+#endif
+
+// ************************************************************************* //