diff --git a/src/finiteVolume/fields/fvPatchFields/derived/outletPhaseMeanVelocity/outletPhaseMeanVelocityFvPatchVectorField.C b/src/finiteVolume/fields/fvPatchFields/derived/outletPhaseMeanVelocity/outletPhaseMeanVelocityFvPatchVectorField.C new file mode 100644 index 0000000000..abf782bc90 --- /dev/null +++ b/src/finiteVolume/fields/fvPatchFields/derived/outletPhaseMeanVelocity/outletPhaseMeanVelocityFvPatchVectorField.C @@ -0,0 +1,188 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2013 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 "outletPhaseMeanVelocityFvPatchVectorField.H" +#include "volFields.H" +#include "addToRunTimeSelectionTable.H" +#include "fvPatchFieldMapper.H" +#include "surfaceFields.H" + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::outletPhaseMeanVelocityFvPatchVectorField +::outletPhaseMeanVelocityFvPatchVectorField +( + const fvPatch& p, + const DimensionedField& iF +) +: + mixedFvPatchField(p, iF), + Umean_(0), + alphaName_("none") +{ + refValue() = vector::zero; + refGrad() = vector::zero; + valueFraction() = 0.0; +} + + +Foam::outletPhaseMeanVelocityFvPatchVectorField +::outletPhaseMeanVelocityFvPatchVectorField +( + const outletPhaseMeanVelocityFvPatchVectorField& ptf, + const fvPatch& p, + const DimensionedField& iF, + const fvPatchFieldMapper& mapper +) +: + mixedFvPatchField(ptf, p, iF, mapper), + Umean_(ptf.Umean_), + alphaName_(ptf.alphaName_) +{} + + +Foam::outletPhaseMeanVelocityFvPatchVectorField +::outletPhaseMeanVelocityFvPatchVectorField +( + const fvPatch& p, + const DimensionedField& iF, + const dictionary& dict +) +: + mixedFvPatchField(p, iF), + Umean_(readScalar(dict.lookup("Umean"))), + alphaName_(dict.lookup("alpha")) +{ + refValue() = vector::zero; + refGrad() = vector::zero; + valueFraction() = 0.0; + + if (dict.found("value")) + { + fvPatchVectorField::operator= + ( + vectorField("value", dict, p.size()) + ); + } + else + { + fvPatchVectorField::operator=(patchInternalField()); + } +} + + +Foam::outletPhaseMeanVelocityFvPatchVectorField +::outletPhaseMeanVelocityFvPatchVectorField +( + const outletPhaseMeanVelocityFvPatchVectorField& ptf +) +: + mixedFvPatchField(ptf), + Umean_(ptf.Umean_), + alphaName_(ptf.alphaName_) +{} + + +Foam::outletPhaseMeanVelocityFvPatchVectorField +::outletPhaseMeanVelocityFvPatchVectorField +( + const outletPhaseMeanVelocityFvPatchVectorField& ptf, + const DimensionedField& iF +) +: + mixedFvPatchField(ptf, iF), + Umean_(ptf.Umean_), + alphaName_(ptf.alphaName_) +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +void Foam::outletPhaseMeanVelocityFvPatchVectorField::updateCoeffs() +{ + if (updated()) + { + return; + } + + scalarField alphap = + patch().lookupPatchField(alphaName_); + + alphap = max(alphap, scalar(0)); + alphap = min(alphap, scalar(1)); + + // Get the patchInternalField (zero-gradient field) + vectorField Uzg(patchInternalField()); + + // Calculate the phase mean zero-gradient velocity + scalar Uzgmean = + gSum(alphap*(patch().Sf() & Uzg)) + /gSum(alphap*patch().magSf()); + + // Set the refValue and valueFraction to adjust the boundary field + // such that the phase mean is Umean_ + if (Uzgmean >= Umean_) + { + refValue() = vector::zero; + valueFraction() = 1.0 - Umean_/Uzgmean; + } + else + { + refValue() = (Umean_ + Uzgmean)*patch().nf(); + valueFraction() = 1.0 - Uzgmean/Umean_; + } + + mixedFvPatchField::updateCoeffs(); +} + + +void Foam::outletPhaseMeanVelocityFvPatchVectorField::write +( + Ostream& os +) const +{ + fvPatchField::write(os); + + os.writeKeyword("Umean") << Umean_ + << token::END_STATEMENT << nl; + os.writeKeyword("alpha") << alphaName_ + << token::END_STATEMENT << nl; + writeEntry("value", os); +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + makePatchTypeField + ( + fvPatchVectorField, + outletPhaseMeanVelocityFvPatchVectorField + ); +} + + +// ************************************************************************* // diff --git a/src/finiteVolume/fields/fvPatchFields/derived/outletPhaseMeanVelocity/outletPhaseMeanVelocityFvPatchVectorField.H b/src/finiteVolume/fields/fvPatchFields/derived/outletPhaseMeanVelocity/outletPhaseMeanVelocityFvPatchVectorField.H new file mode 100644 index 0000000000..5e5dec0213 --- /dev/null +++ b/src/finiteVolume/fields/fvPatchFields/derived/outletPhaseMeanVelocity/outletPhaseMeanVelocityFvPatchVectorField.H @@ -0,0 +1,197 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2013 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::outletPhaseMeanVelocityFvPatchVectorField + +Group + grpOutletBoundaryConditions + +Description + This boundary condition adjusts the velocity for the given phase to achieve + the specified mean thus causing the phase-fraction to adjust according to + the mass flow rate. + + Typical usage is as the outlet condition for a towing-tank ship simulation + to maintain the outlet water level at the level as the inlet. + + \heading Patch usage + \table + Property | Description | Required | Default value + Umean | mean velocity normal to the boundary [m/s] | yes | + alpha | phase-fraction field | yes | + \endtable + + Example of the boundary condition specification: + \verbatim + myPatch + { + type outletPhaseMeanVelocity; + Umean 1.2; + alpha alpha.water; + value uniform (1.2 0 0); + } + \endverbatim + +SeeAlso + Foam::mixedFvPatchField + Foam::variableHeightFlowRateInletVelocityFvPatchVectorField + +SourceFiles + outletPhaseMeanVelocityFvPatchVectorField.C + +\*---------------------------------------------------------------------------*/ + +#ifndef outletPhaseMeanVelocityFvPatchVectorField_H +#define outletPhaseMeanVelocityFvPatchVectorField_H + +#include "mixedFvPatchFields.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ +/*---------------------------------------------------------------------------*\ + Class outletPhaseMeanVelocityFvPatchVectorField Declaration +\*---------------------------------------------------------------------------*/ + +class outletPhaseMeanVelocityFvPatchVectorField +: + public mixedFvPatchVectorField +{ + // Private data + + //- Inlet integral flow rate + scalar Umean_; + + //- Name of the phase-fraction field + word alphaName_; + + +public: + + //- Runtime type information + TypeName("outletPhaseMeanVelocity"); + + + // Constructors + + //- Construct from patch and internal field + outletPhaseMeanVelocityFvPatchVectorField + ( + const fvPatch&, + const DimensionedField& + ); + + //- Construct from patch, internal field and dictionary + outletPhaseMeanVelocityFvPatchVectorField + ( + const fvPatch&, + const DimensionedField&, + const dictionary& + ); + + //- Construct by mapping given + // outletPhaseMeanVelocityFvPatchVectorField + // onto a new patch + outletPhaseMeanVelocityFvPatchVectorField + ( + const outletPhaseMeanVelocityFvPatchVectorField&, + const fvPatch&, + const DimensionedField&, + const fvPatchFieldMapper& + ); + + //- Construct as copy + outletPhaseMeanVelocityFvPatchVectorField + ( + const outletPhaseMeanVelocityFvPatchVectorField& + ); + + //- Construct and return a clone + virtual tmp clone() const + { + return tmp + ( + new outletPhaseMeanVelocityFvPatchVectorField(*this) + ); + } + + //- Construct as copy setting internal field reference + outletPhaseMeanVelocityFvPatchVectorField + ( + const outletPhaseMeanVelocityFvPatchVectorField&, + const DimensionedField& + ); + + //- Construct and return a clone setting internal field reference + virtual tmp clone + ( + const DimensionedField& iF + ) const + { + return tmp + ( + new outletPhaseMeanVelocityFvPatchVectorField + ( + *this, + iF + ) + ); + } + + + // Member functions + + // Access + + //- Return the flux + scalar Umean() const + { + return Umean_; + } + + //- Return reference to the flux to allow adjustment + scalar& Umean() + { + return Umean_; + } + + + //- Update the coefficients associated with the patch field + virtual void updateCoeffs(); + + //- Write + virtual void write(Ostream&) const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* //