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