diff --git a/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclic/jumpCyclicFvPatchField.H b/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclic/jumpCyclicFvPatchField.H index 36ebce0768424d576af57d5c3449f9ae527cdcb0..65ec90bd631f67bcffb015e77195751461aea107 100644 --- a/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclic/jumpCyclicFvPatchField.H +++ b/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclic/jumpCyclicFvPatchField.H @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2018 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -159,6 +159,18 @@ void jumpCyclicFvPatchField<scalar>::updateInterfaceMatrix ) const; +template<> +void jumpCyclicFvPatchField<vector>::updateInterfaceMatrix +( + scalarField& result, + const bool add, + const scalarField& psiInternal, + const scalarField& coeffs, + const direction cmpt, + const Pstream::commsTypes commsType +) const; + + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // } // End namespace Foam diff --git a/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclic/jumpCyclicFvPatchFields.C b/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclic/jumpCyclicFvPatchFields.C index f4d7d53342ca4706040045783217459bb202db10..9bab7819dfaa6fb6d8965af7b1437f13d6fa3a53 100644 --- a/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclic/jumpCyclicFvPatchFields.C +++ b/src/finiteVolume/fields/fvPatchFields/constraint/jumpCyclic/jumpCyclicFvPatchFields.C @@ -3,7 +3,7 @@ \\ / F ield | OpenFOAM: The Open Source CFD Toolbox \\ / O peration | \\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation - \\/ M anipulation | + \\/ M anipulation | Copyright (C) 2018 OpenCFD Ltd. ------------------------------------------------------------------------------- License This file is part of OpenFOAM. @@ -83,4 +83,54 @@ void Foam::jumpCyclicFvPatchField<Foam::scalar>::updateInterfaceMatrix } +template<> +void Foam::jumpCyclicFvPatchField<Foam::vector>::updateInterfaceMatrix +( + scalarField& result, + const bool add, + const scalarField& psiInternal, + const scalarField& coeffs, + const direction cmpt, + const Pstream::commsTypes +) const +{ + scalarField pnf(this->size()); + + const labelUList& nbrFaceCells = + this->cyclicPatch().neighbFvPatch().faceCells(); + + const Field<vector>& iField = this->primitiveField(); + + // only apply jump to original field + if (&psiInternal == &(iField.component(cmpt).ref())) + { + Field<vector> jf(this->jump()); + + if (!this->cyclicPatch().owner()) + { + jf *= -1.0; + } + + forAll(*this, facei) + { + pnf[facei] = + psiInternal[nbrFaceCells[facei]] + - jf[facei].component(cmpt); + } + } + else + { + forAll(*this, facei) + { + pnf[facei] = psiInternal[nbrFaceCells[facei]]; + } + } + + // Transform according to the transformation tensors + this->transformCoupleField(pnf, cmpt); + + // Multiply the field by coefficients and add into the result + this->addToInternalField(result, !add, coeffs, pnf); +} + // ************************************************************************* // diff --git a/src/finiteVolume/fields/fvPatchFields/derived/swirlFanVelocity/swirlFanVelocityFvPatchField.C b/src/finiteVolume/fields/fvPatchFields/derived/swirlFanVelocity/swirlFanVelocityFvPatchField.C new file mode 100644 index 0000000000000000000000000000000000000000..2042c489b9f64b236a3dc37a8dd9a6d2f608518c --- /dev/null +++ b/src/finiteVolume/fields/fvPatchFields/derived/swirlFanVelocity/swirlFanVelocityFvPatchField.C @@ -0,0 +1,275 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2018 OpenCFD Ltd. + \\/ 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 <http://www.gnu.org/licenses/>. + +\*---------------------------------------------------------------------------*/ + +#include "swirlFanVelocityFvPatchField.H" +#include "addToRunTimeSelectionTable.H" +#include "fvPatchFieldMapper.H" +#include "volFields.H" +#include "surfaceFields.H" + +// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * // + +void Foam::swirlFanVelocityFvPatchField::calcFanJump() +{ + if (this->cyclicPatch().owner()) + { + const surfaceScalarField& phi = + db().lookupObject<surfaceScalarField>(phiName_); + + const fvPatchField<scalar>& pOwner = + patch().lookupPatchField<volScalarField, scalar>(pName_); + + const label nbrIndex = this->cyclicPatch().neighbPatchID(); + + const fvPatch& nbrPatch = patch().boundaryMesh()[nbrIndex]; + + const fvPatchField<scalar>& pSlave = + nbrPatch.lookupPatchField<volScalarField, scalar>(pName_); + + scalarField deltaP(mag(pOwner - pSlave)); + + if (phi.dimensions() == dimMass/dimTime) + { + deltaP /= + patch().lookupPatchField<volScalarField, scalar>(rhoName_); + } + + const vector axisHat = + gSum(patch().nf()*patch().magSf())/gSum(patch().magSf()); + + vectorField tanDir + ( + axisHat ^ (patch().Cf() - origin_) + ); + + tanDir /= (mag(tanDir) + SMALL); + + scalarField magTangU(patch().size(), 0.0); + + if (useRealRadius_) + { + const scalarField rMag(mag(patch().Cf() - origin_)); + forAll (rMag, i) + { + if (rMag[i] > rInner_ && rMag[i] < rOuter_) + { + magTangU = + deltaP + /rMag[i] + /fanEff_ + /rpm_*constant::mathematical::pi/30.0; + } + } + } + else + { + magTangU = + deltaP/rEff_/fanEff_/rpm_*constant::mathematical::pi/30.0; + } + + // U upstream from fan + const vectorField Uup(this->patchInternalField()); + + // U normal to fan + const vectorField Un((Uup & patch().nf())*patch().nf()); + + // U tangential into fan + const vectorField UtanIn(Uup - Un); + + // Calculate the tangential velocity + const vectorField tangentialVelocity(magTangU*tanDir); + + this->jump_ = tangentialVelocity + UtanIn; + } +} + + + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::swirlFanVelocityFvPatchField::swirlFanVelocityFvPatchField +( + const fvPatch& p, + const DimensionedField<vector, volMesh>& iF +) +: + fixedJumpFvPatchField<vector>(p, iF), + phiName_("phi"), + pName_("p"), + rhoName_("rho"), + origin_(), + rpm_(0.0), + rEff_(0.0), + fanEff_(1.0), + useRealRadius_(false), + rInner_(0.0), + rOuter_(0.0) +{} + + +Foam::swirlFanVelocityFvPatchField::swirlFanVelocityFvPatchField +( + const fvPatch& p, + const DimensionedField<vector, volMesh>& iF, + const dictionary& dict +) +: + fixedJumpFvPatchField<vector>(p, iF, dict), + phiName_(dict.lookupOrDefault<word>("phi", "phi")), + pName_(dict.lookupOrDefault<word>("p", "p")), + rhoName_(dict.lookupOrDefault<word>("rho", "rho")), + origin_ + ( + dict.lookupOrDefault + ( + "origin", + patch().size() + ? gSum(patch().Cf()*patch().magSf())/gSum(patch().magSf()) + : Zero + ) + ), + rpm_(dict.lookupOrDefault<scalar>("rpm", 0.0)), + rEff_(dict.lookupOrDefault<scalar>("rEff", 0.0)), + fanEff_(dict.lookupOrDefault<scalar>("fanEff", 1.0)), + useRealRadius_(dict.lookupOrDefault<Switch>("useRealRadius", false)), + rInner_(dict.lookupOrDefault<scalar>("rInner", 0.0)), + rOuter_(dict.lookupOrDefault<scalar>("rOuter", 0.0)) +{ + if (dict.found("value")) + { + fvPatchVectorField::operator= + ( + vectorField("value", dict, p.size()) + ); + } + else + { + this->evaluate(Pstream::commsTypes::blocking); + } +} + + +Foam::swirlFanVelocityFvPatchField::swirlFanVelocityFvPatchField +( + const swirlFanVelocityFvPatchField& ptf, + const fvPatch& p, + const DimensionedField<vector, volMesh>& iF, + const fvPatchFieldMapper& mapper +) +: + fixedJumpFvPatchField<vector>(ptf, p, iF, mapper), + phiName_(ptf.phiName_), + pName_(ptf.pName_), + rhoName_(ptf.rhoName_), + origin_(ptf.origin_), + rpm_(ptf.rpm_), + rEff_(ptf.rEff_), + fanEff_(ptf.fanEff_), + useRealRadius_(ptf.useRealRadius_), + rInner_(ptf.rInner_), + rOuter_(ptf.rOuter_) +{} + + +Foam::swirlFanVelocityFvPatchField::swirlFanVelocityFvPatchField +( + const swirlFanVelocityFvPatchField& ptf +) +: + fixedJumpFvPatchField<vector>(ptf), + phiName_(ptf.phiName_), + rhoName_(ptf.rhoName_), + origin_(ptf.origin_), + rpm_(ptf.rpm_), + rEff_(ptf.rEff_), + useRealRadius_(ptf.useRealRadius_), + rInner_(ptf.rInner_), + rOuter_(ptf.rOuter_) +{} + + +Foam::swirlFanVelocityFvPatchField::swirlFanVelocityFvPatchField +( + const swirlFanVelocityFvPatchField& ptf, + const DimensionedField<vector, volMesh>& iF +) +: + fixedJumpFvPatchField<vector>(ptf, iF), + phiName_(ptf.phiName_), + rhoName_(ptf.rhoName_), + origin_(ptf.origin_), + rpm_(ptf.rpm_), + rEff_(ptf.rEff_), + useRealRadius_(ptf.useRealRadius_), + rInner_(ptf.rInner_), + rOuter_(ptf.rOuter_) +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +void Foam::swirlFanVelocityFvPatchField::updateCoeffs() +{ + if (this->updated()) + { + return; + } + + calcFanJump(); +} + + +void Foam::swirlFanVelocityFvPatchField::write(Ostream& os) const +{ + fixedJumpFvPatchField<vector>::write(os); + + if (this->cyclicPatch().owner()) + { + os.writeEntryIfDifferent<word>("phi", "phi", phiName_); + os.writeEntryIfDifferent<word>("p", "p", pName_); + os.writeEntryIfDifferent<word>("rho", "rho", rhoName_); + os.writeEntry("origin", origin_); + os.writeEntry("rpm", rpm_); + + os.writeEntryIfDifferent<scalar>("rEff", 0.0, rEff_); + os.writeEntryIfDifferent<bool>("useRealRadius", false, useRealRadius_); + os.writeEntryIfDifferent<scalar>("rInner", 0.0, rInner_); + os.writeEntryIfDifferent<scalar>("rOuter", 0.0, rOuter_); + } +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + makePatchTypeField + ( + fvPatchVectorField, + swirlFanVelocityFvPatchField + ); +} + +// ************************************************************************* // diff --git a/src/finiteVolume/fields/fvPatchFields/derived/swirlFanVelocity/swirlFanVelocityFvPatchField.H b/src/finiteVolume/fields/fvPatchFields/derived/swirlFanVelocity/swirlFanVelocityFvPatchField.H new file mode 100644 index 0000000000000000000000000000000000000000..e723a7663afcf171310bdf6e26a6dcde0d166f04 --- /dev/null +++ b/src/finiteVolume/fields/fvPatchFields/derived/swirlFanVelocity/swirlFanVelocityFvPatchField.H @@ -0,0 +1,241 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 2018 OpenCFD Ltd. + \\/ 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 <http://www.gnu.org/licenses/>. + +Class + Foam::swirlFanVelocityFvPatchField + +Group + grpCoupledBoundaryConditions + +Description + This boundary condition provides a jump condition for U across a + cyclic pressure jump condition and applies a transformation to U. + + The U-jump is specified with a swirl component as follows: + + Utan = deltaP/rEff/fanEff/rpm/pi/30.0; + + where: + + deltaP : pressure drop across the cyclic. + rEff : effective radius + fanEff : fan efficiency coefficient + rmp : RPM of the fan + + Alternatively an inner and outer radii can be used instead of rEff. The + Utan is as follow for r > rInner and r < rOuter + + Utan = deltaP/r/fanEff/rpm/pi/30.0; + + where: + + r : p - origin, p is the face center + + Outside rInner and rOuter, Utan = 0. The input for this mode is: + + useRealRadius true; + rInner 0.005; + rOuter 0.01; + + The radial velocity is zero in the present model. + +Usage + \table + Property | Description | Required | Default value + patchType | underlying patch type should be \c cyclic| yes | + phi | flux field name | no | phi + rho | density field name | no | rho + p | pressure field name | no | p + origin | fan centre | no | calculated + rpm | RPM of the fan | yes + rEff | Effective radius | no | 0.0 + fanEff | Fan efficiency | no | 1.0 + useRealRadius| Use inner/outer radii | no | false + rInner | Inner radius | no | 0.0 + rOuter | Outer radius | no | 0.0 + \endtable + + Example of the boundary condition specification: + \verbatim + <patchName> + { + cyclicFaces_master + { + type swirlFanVelocity; + patchType cyclic; + jump uniform (0 0 0); + value uniform (0 0 0); + rpm 1000; + rEff 0.01; + } + } + \endverbatim + + +SourceFiles + swirlFanVelocityFvPatchField.C + +\*---------------------------------------------------------------------------*/ + +#ifndef swirlFanVelocityFvPatchField_H +#define swirlFanVelocityFvPatchField_H + +#include "fixedJumpFvPatchField.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class swirlFanVelocityFvPatchField Declaration +\*---------------------------------------------------------------------------*/ + +class swirlFanVelocityFvPatchField +: + public fixedJumpFvPatchField<vector> +{ + // Private data + + + //- Name of the flux field + const word phiName_; + + //- Name of the pressure field + const word pName_; + + //- Name of the rho field + const word rhoName_; + + //- Origin of the rotation + const vector origin_; + + //- Fan rpm + scalar rpm_; + + //- Effective fan radius + scalar rEff_; + + //- Fan efficiency + scalar fanEff_; + + //- Switch to use effective radius or inner and outer radius + Switch useRealRadius_; + + //- Inner radius + scalar rInner_; + + //- Outer radius + scalar rOuter_; + + + // Private Member Functions + + //- Calculate the fan pressure jump + void calcFanJump(); + + +public: + + //- Runtime type information + TypeName("swirlFanVelocity"); + + + // Constructors + + //- Construct from patch and internal field + swirlFanVelocityFvPatchField + ( + const fvPatch&, + const DimensionedField<vector, volMesh>& + ); + + //- Construct from patch, internal field and dictionary + swirlFanVelocityFvPatchField + ( + const fvPatch&, + const DimensionedField<vector, volMesh>&, + const dictionary& + ); + + //- Construct by mapping given swirlFanVelocityFvPatchField onto a new patch + swirlFanVelocityFvPatchField + ( + const swirlFanVelocityFvPatchField&, + const fvPatch&, + const DimensionedField<vector, volMesh>&, + const fvPatchFieldMapper& + ); + + //- Construct as copy + swirlFanVelocityFvPatchField + ( + const swirlFanVelocityFvPatchField& + ); + + //- Construct and return a clone + virtual tmp<fvPatchField<vector>> clone() const + { + return tmp<fvPatchField<vector>> + ( + new swirlFanVelocityFvPatchField(*this) + ); + } + + //- Construct as copy setting internal field reference + swirlFanVelocityFvPatchField + ( + const swirlFanVelocityFvPatchField&, + const DimensionedField<vector, volMesh>& + ); + + //- Construct and return a clone setting internal field reference + virtual tmp<fvPatchField<vector>> clone + ( + const DimensionedField<vector, volMesh>& iF + ) const + { + return tmp<fvPatchField<vector>> + ( + new swirlFanVelocityFvPatchField(*this, iF) + ); + } + + + // Member functions + + //- Update the coefficients associated with the patch field + virtual void updateCoeffs(); + + //- Write + virtual void write(Ostream&) const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +#endif + +// ************************************************************************* //