/*---------------------------------------------------------------------------*\ ========= | \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | Website: https://openfoam.org \\ / A nd | Copyright (C) 2011-2019 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 "angularOscillatingVelocityPointPatchVectorField.H" #include "pointPatchFields.H" #include "addToRunTimeSelectionTable.H" #include "Time.H" #include "polyMesh.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // namespace Foam { // * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // angularOscillatingVelocityPointPatchVectorField:: angularOscillatingVelocityPointPatchVectorField ( const pointPatch& p, const DimensionedField& iF ) : fixedValuePointPatchField(p, iF), axis_(Zero), origin_(Zero), angle0_(0.0), amplitude_(0.0), omega_(0.0), p0_(p.localPoints()) {} angularOscillatingVelocityPointPatchVectorField:: angularOscillatingVelocityPointPatchVectorField ( const pointPatch& p, const DimensionedField& iF, const dictionary& dict ) : fixedValuePointPatchField(p, iF, dict), axis_(dict.lookup("axis")), origin_(dict.lookup("origin")), angle0_(readScalar(dict.lookup("angle0"))), amplitude_(readScalar(dict.lookup("amplitude"))), omega_(readScalar(dict.lookup("omega"))) { if (!dict.found("value")) { updateCoeffs(); } if (dict.found("p0")) { p0_ = vectorField("p0", dict , p.size()); } else { p0_ = p.localPoints(); } } angularOscillatingVelocityPointPatchVectorField:: angularOscillatingVelocityPointPatchVectorField ( const angularOscillatingVelocityPointPatchVectorField& ptf, const pointPatch& p, const DimensionedField& iF, const pointPatchFieldMapper& mapper ) : fixedValuePointPatchField(ptf, p, iF, mapper), axis_(ptf.axis_), origin_(ptf.origin_), angle0_(ptf.angle0_), amplitude_(ptf.amplitude_), omega_(ptf.omega_), p0_(ptf.p0_) {} angularOscillatingVelocityPointPatchVectorField:: angularOscillatingVelocityPointPatchVectorField ( const angularOscillatingVelocityPointPatchVectorField& ptf, const DimensionedField& iF ) : fixedValuePointPatchField(ptf, iF), axis_(ptf.axis_), origin_(ptf.origin_), angle0_(ptf.angle0_), amplitude_(ptf.amplitude_), omega_(ptf.omega_), p0_(ptf.p0_) {} // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // void angularOscillatingVelocityPointPatchVectorField::autoMap ( const pointPatchFieldMapper& m ) { fixedValuePointPatchField::autoMap(m); m(p0_, p0_); } void angularOscillatingVelocityPointPatchVectorField::rmap ( const pointPatchField& ptf, const labelList& addr ) { const angularOscillatingVelocityPointPatchVectorField& aOVptf = refCast(ptf); fixedValuePointPatchField::rmap(aOVptf, addr); p0_.rmap(aOVptf.p0_, addr); } void angularOscillatingVelocityPointPatchVectorField::updateCoeffs() { if (this->updated()) { return; } const polyMesh& mesh = this->internalField().mesh()(); const Time& t = mesh.time(); const pointPatch& p = this->patch(); scalar angle = angle0_ + amplitude_*sin(omega_*t.value()); vector axisHat = axis_/mag(axis_); vectorField p0Rel(p0_ - origin_); vectorField::operator= ( ( p0_ + p0Rel*(cos(angle) - 1) + (axisHat ^ p0Rel*sin(angle)) + (axisHat & p0Rel)*(1 - cos(angle))*axisHat - p.localPoints() )/t.deltaTValue() ); fixedValuePointPatchField::updateCoeffs(); } void angularOscillatingVelocityPointPatchVectorField::write ( Ostream& os ) const { pointPatchField::write(os); writeEntry(os, "axis", axis_); writeEntry(os, "origin", origin_); writeEntry(os, "angle0", angle0_); writeEntry(os, "amplitude", amplitude_); writeEntry(os, "omega", omega_); writeEntry(os, "p0", p0_); writeEntry(os, "value", *this); } // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // makePointPatchTypeField ( pointPatchVectorField, angularOscillatingVelocityPointPatchVectorField ); // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // } // End namespace Foam // ************************************************************************* //