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 + +// ************************************************************************* //