/*---------------------------------------------------------------------------*\ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright held by original author \\/ 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 2 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, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA \*---------------------------------------------------------------------------*/ #include "controlledParabolicVelocityFvPatchVectorField.H" #include "addToRunTimeSelectionTable.H" #include "fvPatchFieldMapper.H" #include "volFields.H" #include "surfaceFields.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // namespace Foam { // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // controlledParabolicVelocityFvPatchVectorField::controlledParabolicVelocityFvPatchVectorField ( const fvPatch& p, const DimensionedField& iF ) : fixedValueFvPatchVectorField(p, iF), Umean_(0), n_(0, 1, 0), y_(1, 0, 0), target_(0), obsFieldName_("undef"), obsPatchName_("undef"), obsPatchID_(-1), gain_(0), curTimeIndex_(-1) {} controlledParabolicVelocityFvPatchVectorField::controlledParabolicVelocityFvPatchVectorField ( const controlledParabolicVelocityFvPatchVectorField& ptf, const fvPatch& p, const DimensionedField& iF, const fvPatchFieldMapper& mapper ) : fixedValueFvPatchVectorField(ptf, p, iF, mapper), Umean_(ptf.Umean_), n_(ptf.n_), y_(ptf.y_), target_(ptf.target_), obsFieldName_(ptf.obsFieldName_), obsPatchName_(ptf.obsPatchName_), obsPatchID_(ptf.obsPatchID_), gain_(ptf.gain_), curTimeIndex_(-1) {} controlledParabolicVelocityFvPatchVectorField::controlledParabolicVelocityFvPatchVectorField ( const fvPatch& p, const DimensionedField& iF, const dictionary& dict ) : fixedValueFvPatchVectorField(p, iF), Umean_(readScalar(dict.lookup("Umean"))), n_(dict.lookup("n")), y_(dict.lookup("y")), target_(readScalar(dict.lookup("target"))), obsFieldName_(dict.lookup("obsFieldName")), obsPatchName_(dict.lookup("obsPatchName")), obsPatchID_(patch().patch().boundaryMesh().findPatchID(obsPatchName_)), gain_(readScalar(dict.lookup("gain"))), curTimeIndex_(-1) { if (obsPatchID_ < 0) { FatalErrorIn ( "controlledParabolicVelocityFvPatchVectorField" ) << "patch " << dict.lookup("obsPatchName") << "not found" << nl << exit(FatalError); } n_ /= mag(n_); y_ /= mag(y_); fvPatchField::operator= ( vectorField("value", dict, p.size()) ); } controlledParabolicVelocityFvPatchVectorField::controlledParabolicVelocityFvPatchVectorField ( const controlledParabolicVelocityFvPatchVectorField& fcvpvf, const DimensionedField& iF ) : fixedValueFvPatchVectorField(fcvpvf, iF), Umean_(fcvpvf.Umean_), n_(fcvpvf.n_), y_(fcvpvf.y_), target_(fcvpvf.target_), obsFieldName_(fcvpvf.obsFieldName_), obsPatchName_(fcvpvf.obsPatchName_), obsPatchID_(fcvpvf.obsPatchID_), gain_(fcvpvf.gain_), curTimeIndex_(-1) {} // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // void controlledParabolicVelocityFvPatchVectorField::updateCoeffs() { if (updated()) { return; } if (curTimeIndex_ != this->db().time().timeIndex()) { const volScalarField& field = db().lookupObject(obsFieldName_); scalar obsPatchAverage = gAverage(field.boundaryField()[obsPatchID_]); Info<< "Average of " << obsFieldName_ << " on patch " << patch().name() << " = " << obsPatchAverage << " Difference to target = " << obsPatchAverage - target_ << " Umean = " << Umean_ << endl; Umean_ += gain_*(obsPatchAverage - target_); // Get range and orientation boundBox bb(patch().patch().localPoints(), true); vector ctr = 0.5*(bb.max() + bb.min()); const vectorField& c = patch().Cf(); // Calculate local 1-D coordinate for the parabolic profile scalarField coord = 0.5 - ((c - ctr) & y_)/((bb.max() - bb.min()) & y_); operator==(n_*3/2*Umean_*(1.0 - sqr(coord))); curTimeIndex_ = this->db().time().timeIndex(); } fixedValueFvPatchVectorField::updateCoeffs(); } // Write void controlledParabolicVelocityFvPatchVectorField::write(Ostream& os) const { fvPatchVectorField::write(os); os.writeKeyword("Umean") << Umean_ << token::END_STATEMENT << nl; os.writeKeyword("n") << n_ << token::END_STATEMENT << nl; os.writeKeyword("y") << y_ << token::END_STATEMENT << nl; os.writeKeyword("target") << target_ << token::END_STATEMENT << nl; os.writeKeyword("obsPatchName") << obsPatchName_ << token::END_STATEMENT << nl; os.writeKeyword("obsFieldName") << obsFieldName_ << token::END_STATEMENT << nl; os.writeKeyword("gain") << gain_ << token::END_STATEMENT << nl; writeEntry("value", os); } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // makePatchTypeField(fvPatchVectorField, controlledParabolicVelocityFvPatchVectorField); // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // } // End namespace Foam // ************************************************************************* //