From 990b54a3d3243a08bbbdf2bbd4169f022d347065 Mon Sep 17 00:00:00 2001 From: mattijs <mattijs@hunt.opencfd.co.uk> Date: Thu, 9 Jul 2009 12:43:40 +0100 Subject: [PATCH] new bc --- src/finiteVolume/Make/files | 1 + .../activeBaffleVelocityFvPatchVectorField.C | 274 ++++++++++++++++++ .../activeBaffleVelocityFvPatchVectorField.H | 193 ++++++++++++ 3 files changed, 468 insertions(+) create mode 100644 src/finiteVolume/fields/fvPatchFields/derived/activeBaffleVelocity/activeBaffleVelocityFvPatchVectorField.C create mode 100644 src/finiteVolume/fields/fvPatchFields/derived/activeBaffleVelocity/activeBaffleVelocityFvPatchVectorField.H diff --git a/src/finiteVolume/Make/files b/src/finiteVolume/Make/files index 54bfbc7cf6e..6be4b7f3f49 100644 --- a/src/finiteVolume/Make/files +++ b/src/finiteVolume/Make/files @@ -104,6 +104,7 @@ $(constraintFvPatchFields)/wedge/wedgeFvPatchFields.C $(constraintFvPatchFields)/wedge/wedgeFvPatchScalarField.C derivedFvPatchFields = $(fvPatchFields)/derived +$(derivedFvPatchFields)/activeBaffleVelocity/activeBaffleVelocityFvPatchVectorField.C $(derivedFvPatchFields)/advective/advectiveFvPatchFields.C $(derivedFvPatchFields)/directMappedFixedValue/directMappedFixedValueFvPatchFields.C $(derivedFvPatchFields)/directMappedVelocityFluxFixedValue/directMappedVelocityFluxFixedValueFvPatchField.C diff --git a/src/finiteVolume/fields/fvPatchFields/derived/activeBaffleVelocity/activeBaffleVelocityFvPatchVectorField.C b/src/finiteVolume/fields/fvPatchFields/derived/activeBaffleVelocity/activeBaffleVelocityFvPatchVectorField.C new file mode 100644 index 00000000000..c090d529687 --- /dev/null +++ b/src/finiteVolume/fields/fvPatchFields/derived/activeBaffleVelocity/activeBaffleVelocityFvPatchVectorField.C @@ -0,0 +1,274 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2009 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 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 "activeBaffleVelocityFvPatchVectorField.H" +#include "addToRunTimeSelectionTable.H" +#include "volFields.H" +#include "surfaceFields.H" + +// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * // + +Foam::activeBaffleVelocityFvPatchVectorField:: +activeBaffleVelocityFvPatchVectorField +( + const fvPatch& p, + const DimensionedField<vector, volMesh>& iF +) +: + fixedValueFvPatchVectorField(p, iF), + pName_("p"), + cyclicPatchName_(), + cyclicPatchLabel_(-1), + orientation_(1), + initWallSf_(0), + initCyclicSf_(0), + openFraction_(0), + openingTime_(0), + maxOpenFractionDelta_(0), + curTimeIndex_(-1) +{} + + +Foam::activeBaffleVelocityFvPatchVectorField:: +activeBaffleVelocityFvPatchVectorField +( + const activeBaffleVelocityFvPatchVectorField& ptf, + const fvPatch& p, + const DimensionedField<vector, volMesh>& iF, + const fvPatchFieldMapper& mapper +) +: + fixedValueFvPatchVectorField(ptf, p, iF, mapper), + pName_(ptf.pName_), + cyclicPatchName_(ptf.cyclicPatchName_), + cyclicPatchLabel_(ptf.cyclicPatchLabel_), + orientation_(ptf.orientation_), + initWallSf_(ptf.initWallSf_), + initCyclicSf_(ptf.initCyclicSf_), + openFraction_(ptf.openFraction_), + openingTime_(ptf.openingTime_), + maxOpenFractionDelta_(ptf.maxOpenFractionDelta_), + curTimeIndex_(-1) +{} + + +Foam::activeBaffleVelocityFvPatchVectorField:: +activeBaffleVelocityFvPatchVectorField +( + const fvPatch& p, + const DimensionedField<vector, volMesh>& iF, + const dictionary& dict +) +: + fixedValueFvPatchVectorField(p, iF), + pName_("p"), + cyclicPatchName_(dict.lookup("cyclicPatch")), + cyclicPatchLabel_(p.patch().boundaryMesh().findPatchID(cyclicPatchName_)), + orientation_(readLabel(dict.lookup("orientation"))), + initWallSf_(p.Sf()), + initCyclicSf_(p.boundaryMesh()[cyclicPatchLabel_].Sf()), + openFraction_(readScalar(dict.lookup("openFraction"))), + openingTime_(readScalar(dict.lookup("openingTime"))), + maxOpenFractionDelta_(readScalar(dict.lookup("maxOpenFractionDelta"))), + curTimeIndex_(-1) +{ + fvPatchVectorField::operator=(vector::zero); + + if (dict.found("p")) + { + dict.lookup("p") >> pName_; + } +} + + +Foam::activeBaffleVelocityFvPatchVectorField:: +activeBaffleVelocityFvPatchVectorField +( + const activeBaffleVelocityFvPatchVectorField& ptf +) +: + fixedValueFvPatchVectorField(ptf), + pName_(ptf.pName_), + cyclicPatchName_(ptf.cyclicPatchName_), + cyclicPatchLabel_(ptf.cyclicPatchLabel_), + orientation_(ptf.orientation_), + initWallSf_(ptf.initWallSf_), + initCyclicSf_(ptf.initCyclicSf_), + openFraction_(ptf.openFraction_), + openingTime_(ptf.openingTime_), + maxOpenFractionDelta_(ptf.maxOpenFractionDelta_), + curTimeIndex_(-1) +{} + + +Foam::activeBaffleVelocityFvPatchVectorField:: +activeBaffleVelocityFvPatchVectorField +( + const activeBaffleVelocityFvPatchVectorField& ptf, + const DimensionedField<vector, volMesh>& iF +) +: + fixedValueFvPatchVectorField(ptf, iF), + pName_(ptf.pName_), + cyclicPatchName_(ptf.cyclicPatchName_), + cyclicPatchLabel_(ptf.cyclicPatchLabel_), + orientation_(ptf.orientation_), + initWallSf_(ptf.initWallSf_), + initCyclicSf_(ptf.initCyclicSf_), + openFraction_(ptf.openFraction_), + openingTime_(ptf.openingTime_), + maxOpenFractionDelta_(ptf.maxOpenFractionDelta_), + curTimeIndex_(-1) +{} + + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +void Foam::activeBaffleVelocityFvPatchVectorField::autoMap +( + const fvPatchFieldMapper& m +) +{ + fixedValueFvPatchVectorField::autoMap(m); + + //- Note: cannot map field from cyclic patch anyway so just recalculate + // Areas should be consistent when doing autoMap except in case of + // topo changes. + initWallSf_ = patch().Sf(); + initCyclicSf_ = patch().boundaryMesh()[cyclicPatchLabel_].Sf(); +} + +void Foam::activeBaffleVelocityFvPatchVectorField::rmap +( + const fvPatchVectorField& ptf, + const labelList& addr +) +{ + fixedValueFvPatchVectorField::rmap(ptf, addr); + + //- Note: cannot map field from cyclic patch anyway so just recalculate + // Areas should be consistent when doing rmap (mainly reconstructPar) + initWallSf_ = patch().Sf(); + initCyclicSf_ = patch().boundaryMesh()[cyclicPatchLabel_].Sf(); +} + + +void Foam::activeBaffleVelocityFvPatchVectorField::updateCoeffs() +{ + if (updated()) + { + return; + } + + // Execute the change to the openFraction only once per time-step + if (curTimeIndex_ != this->db().time().timeIndex()) + { + const volScalarField& p = db().lookupObject<volScalarField> + ( + pName_ + ); + + const fvPatch& cyclicPatch = patch().boundaryMesh()[cyclicPatchLabel_]; + const labelList& cyclicFaceCells = cyclicPatch.patch().faceCells(); + label nCyclicFaces = cyclicFaceCells.size(); + label nCyclicFacesPerSide = nCyclicFaces/2; + + scalar forceDiff = 0; + + for (label facei=0; facei<nCyclicFacesPerSide; facei++) + { + forceDiff += p[cyclicFaceCells[facei]]*mag(initCyclicSf_[facei]); + } + + for (label facei=nCyclicFacesPerSide; facei<nCyclicFaces; facei++) + { + forceDiff -= p[cyclicFaceCells[facei]]*mag(initCyclicSf_[facei]); + } + + openFraction_ = + max(min( + openFraction_ + + max + ( + this->db().time().deltaT().value()/openingTime_, + maxOpenFractionDelta_ + ) + *(orientation_*sign(forceDiff)), + 1 - 1e-6), 1e-6); + + Info<< "openFraction = " << openFraction_ << endl; + + vectorField::subField Sfw = patch().patch().faceAreas(); + vectorField newSfw = (1 - openFraction_)*initWallSf_; + forAll(Sfw, facei) + { + Sfw[facei] = newSfw[facei]; + } + const_cast<scalarField&>(patch().magSf()) = mag(patch().Sf()); + + const_cast<vectorField&>(cyclicPatch.Sf()) = + openFraction_*initCyclicSf_; + const_cast<scalarField&>(cyclicPatch.magSf()) = + mag(cyclicPatch.Sf()); + + curTimeIndex_ = this->db().time().timeIndex(); + } + + fixedValueFvPatchVectorField::updateCoeffs(); +} + + +void Foam::activeBaffleVelocityFvPatchVectorField::write(Ostream& os) const +{ + fvPatchVectorField::write(os); + os.writeKeyword("cyclicPatch") + << cyclicPatchName_ << token::END_STATEMENT << nl; + os.writeKeyword("orientation") + << orientation_ << token::END_STATEMENT << nl; + os.writeKeyword("openingTime") + << openingTime_ << token::END_STATEMENT << nl; + os.writeKeyword("maxOpenFractionDelta") + << maxOpenFractionDelta_ << token::END_STATEMENT << nl; + os.writeKeyword("openFraction") + << openFraction_ << token::END_STATEMENT << nl; + os.writeKeyword("p") + << pName_ << token::END_STATEMENT << nl; + writeEntry("value", os); +} + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + makePatchTypeField + ( + fvPatchVectorField, + activeBaffleVelocityFvPatchVectorField + ); +} + +// ************************************************************************* // diff --git a/src/finiteVolume/fields/fvPatchFields/derived/activeBaffleVelocity/activeBaffleVelocityFvPatchVectorField.H b/src/finiteVolume/fields/fvPatchFields/derived/activeBaffleVelocity/activeBaffleVelocityFvPatchVectorField.H new file mode 100644 index 00000000000..1f4f3d2b903 --- /dev/null +++ b/src/finiteVolume/fields/fvPatchFields/derived/activeBaffleVelocity/activeBaffleVelocityFvPatchVectorField.H @@ -0,0 +1,193 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | Copyright (C) 1991-2009 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 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 + +Class + Foam::activeBaffleVelocityFvPatchVectorField + +Description + Boundary condition that modifies mesh areas based on velocity. + +SourceFiles + activeBaffleVelocityFvPatchVectorField.C + +\*---------------------------------------------------------------------------*/ + +#ifndef activeBaffleVelocityFvPatchVectorField_H +#define activeBaffleVelocityFvPatchVectorField_H + +#include "fvPatchFields.H" +#include "fixedValueFvPatchFields.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +namespace Foam +{ + +/*---------------------------------------------------------------------------*\ + Class activeBaffleVelocityFvPatch Declaration +\*---------------------------------------------------------------------------*/ + +class activeBaffleVelocityFvPatchVectorField +: + public fixedValueFvPatchVectorField +{ + // Private data + + //- Name of the pressure field used to calculate the force + // on the active baffle + word pName_; + + //- Name of the cyclic patch used when the active baffle is open + word cyclicPatchName_; + + //- Index of the cyclic patch used when the active baffle is open + label cyclicPatchLabel_; + + //- Orientation (1 or -1) of the active baffle patch. + // Used to change the direction of opening without the need for + // reordering the patch faces + label orientation_; + + //- Initial wall patch areas + vectorField initWallSf_; + + //- Initial cyclic patch areas + vectorField initCyclicSf_; + + //- Current fraction of the active baffle which is open + scalar openFraction_; + + //- Time taken for the active baffle to open + scalar openingTime_; + + //- Maximum fractional change to the active baffle openness + // per time-step + scalar maxOpenFractionDelta_; + + label curTimeIndex_; + + +public: + + //- Runtime type information + TypeName("activeBaffleVelocity"); + + + // Constructors + + //- Construct from patch and internal field + activeBaffleVelocityFvPatchVectorField + ( + const fvPatch&, + const DimensionedField<vector, volMesh>& + ); + + //- Construct from patch, internal field and dictionary + activeBaffleVelocityFvPatchVectorField + ( + const fvPatch&, + const DimensionedField<vector, volMesh>&, + const dictionary& + ); + + //- Construct by mapping given activeBaffleVelocityFvPatchVectorField + // onto a new patch + activeBaffleVelocityFvPatchVectorField + ( + const activeBaffleVelocityFvPatchVectorField&, + const fvPatch&, + const DimensionedField<vector, volMesh>&, + const fvPatchFieldMapper& + ); + + //- Construct as copy + activeBaffleVelocityFvPatchVectorField + ( + const activeBaffleVelocityFvPatchVectorField& + ); + + //- Construct and return a clone + virtual tmp<fvPatchVectorField> clone() const + { + return tmp<fvPatchVectorField> + ( + new activeBaffleVelocityFvPatchVectorField(*this) + ); + } + + //- Construct as copy setting internal field reference + activeBaffleVelocityFvPatchVectorField + ( + const activeBaffleVelocityFvPatchVectorField&, + const DimensionedField<vector, volMesh>& + ); + + //- Construct and return a clone setting internal field reference + virtual tmp<fvPatchVectorField> clone + ( + const DimensionedField<vector, volMesh>& iF + ) const + { + return tmp<fvPatchVectorField> + ( + new activeBaffleVelocityFvPatchVectorField(*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 fvPatchVectorField&, + const labelList& + ); + + + //- Update the coefficients associated with the patch field + virtual void updateCoeffs(); + + //- Write + virtual void write(Ostream&) const; +}; + + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +} // End namespace Foam + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + +#endif + +// ************************************************************************* // -- GitLab