Initial commit for version 2.0.x patch release
[OpenFOAM-2.0.x.git] / src / finiteVolume / cfdTools / general / porousMedia / porousZone.H
blobe827810c7c83b1f316a8b97f8f2a6064eebb7548
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
4    \\    /   O peration     |
5     \\  /    A nd           | Copyright (C) 2004-2011 OpenCFD Ltd.
6      \\/     M anipulation  |
7 -------------------------------------------------------------------------------
8 License
9     This file is part of OpenFOAM.
11     OpenFOAM is free software: you can redistribute it and/or modify it
12     under the terms of the GNU General Public License as published by
13     the Free Software Foundation, either version 3 of the License, or
14     (at your option) any later version.
16     OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
17     ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18     FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
19     for more details.
21     You should have received a copy of the GNU General Public License
22     along with OpenFOAM.  If not, see <http://www.gnu.org/licenses/>.
24 Namespace
25     Foam::porousMedia
27 Description
28     Namespace for models related to porous media
30 Class
31     Foam::porousZone
33 Description
34     Porous zone definition based on cell zones.
36     Porous zone definition based on cell zones and parameters obtained from a
37     control dictionary constructed from the given stream. The orientation of
38     the porous region is defined with the same notation as a coordinateSystem,
39     but only a Cartesian coordinate system is valid.
41     Implemented porosity models:
43     powerLaw (\e C0 and \e C1 parameters)
44     \f[
45         S = - \rho C_0 |U|^{(C_1 - 1)/2} U
46     \f]
48     Darcy-Forchheimer (@e d and \e f parameters)
49     \f[
50         S = - (\mu \, d + \frac{\rho |U|}{2} \, f) U
51     \f]
54     Since negative Darcy/Forchheimer parameters are invalid, they can be used
55     to specify a multiplier (of the max component).
57     The porousZones method porousZones::ddt() mirrors the normal fvm::ddt()
58     method, but accounts for the effective volume of the cells.
60     An example dictionary entry:
61     \verbatim
62     cat1
63     {
64         note            "some catalyst";
65         coordinateSystem    system_10;
66         porosity        0.809;
67         intensity       0.001;      // optional
68         mixingLength    0.0001;     // optional
69         printCoeffs     yes;        // optional: feedback for the user
71         Darcy
72         {
73             d   d [0 -2 0 0 0]  (-1000 -1000 5.3756e+07);
74             f   f [0 -1 0 0 0]  (-1000 -1000 15.83);
75         }
76     }
77     \endverbatim
79 See Also
80     porousZones and coordinateSystems
82 SourceFiles
83     porousZone.C
84     porousZoneTemplates.C
86 \*---------------------------------------------------------------------------*/
88 #ifndef porousZone_H
89 #define porousZone_H
91 #include "dictionary.H"
92 #include "coordinateSystem.H"
93 #include "coordinateSystems.H"
94 #include "wordList.H"
95 #include "labelList.H"
96 #include "dimensionedScalar.H"
97 #include "dimensionedTensor.H"
98 #include "primitiveFieldsFwd.H"
99 #include "volFieldsFwd.H"
100 #include "fvMatricesFwd.H"
102 #include "fvMesh.H"
104 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
106 namespace Foam
109 class fvMesh;
111 /*---------------------------------------------------------------------------*\
112                         Class porousZone Declaration
113 \*---------------------------------------------------------------------------*/
115 class porousZone
117     // Private data
119         //- Name of this zone, or a regular expression
120         keyType key_;
122         //- Reference to the finite volume mesh this zone is part of
123         const fvMesh& mesh_;
125         //- Dictionary containing the parameters
126         dictionary dict_;
128         //- Cell zone Ids
129         labelList cellZoneIds_;
131         //- Coordinate system used for the zone (Cartesian)
132         coordinateSystem coordSys_;
134         //- porosity of the zone (0 < porosity <= 1)
135         //  Placeholder for treatment of temporal terms.
136         //  Currently unused.
137         scalar porosity_;
139         //- Turbulent intensity as fraction of the velocity
140         scalar intensity_;
142         //- Turbulent length scale
143         scalar mixingLength_;
145         //- powerLaw coefficient C0
146         scalar C0_;
148         //- powerLaw coefficient C1
149         scalar C1_;
151         //- Darcy coefficient
152         dimensionedTensor D_;
154         //- Forchheimer coefficient
155         dimensionedTensor F_;
158     // Private Member Functions
160         //- adjust negative resistance values to be multiplier of max value
161         static void adjustNegativeResistance(dimensionedVector& resist);
163         //- Power-law resistance
164         template<class RhoFieldType>
165         void addPowerLawResistance
166         (
167             scalarField& Udiag,
168             const scalarField& V,
169             const RhoFieldType& rho,
170             const vectorField& U
171         ) const;
173         //- Viscous and inertial resistance
174         template<class RhoFieldType>
175         void addViscousInertialResistance
176         (
177             scalarField& Udiag,
178             vectorField& Usource,
179             const scalarField& V,
180             const RhoFieldType& rho,
181             const scalarField& mu,
182             const vectorField& U
183         ) const;
186         //- Power-law resistance
187         template<class RhoFieldType>
188         void addPowerLawResistance
189         (
190             tensorField& AU,
191             const RhoFieldType& rho,
192             const vectorField& U
193         ) const;
195         //- Viscous and inertial resistance
196         template<class RhoFieldType>
197         void addViscousInertialResistance
198         (
199             tensorField& AU,
200             const RhoFieldType& rho,
201             const scalarField& mu,
202             const vectorField& U
203         ) const;
206         //- Disallow default bitwise copy construct
207         porousZone(const porousZone&);
209         //- Disallow default bitwise assignment
210         void operator=(const porousZone&);
213 public:
215     // Constructors
217         //- Construct from components
218         porousZone(const keyType& key, const fvMesh&, const dictionary&);
220         //- Return clone
221         autoPtr<porousZone> clone() const
222         {
223             notImplemented("autoPtr<porousZone> clone() const");
224             return autoPtr<porousZone>(NULL);
225         }
227         //- Return pointer to new porousZone created on freestore from Istream
228         class iNew
229         {
230             //- Reference to the finite volume mesh this zone is part of
231             const fvMesh& mesh_;
233         public:
235             iNew(const fvMesh& mesh)
236             :
237                 mesh_(mesh)
238             {}
240             autoPtr<porousZone> operator()(Istream& is) const
241             {
242                 keyType key(is);
243                 dictionary dict(is);
245                 return autoPtr<porousZone>(new porousZone(key, mesh_, dict));
246             }
247         };
250     //- Destructor
251     virtual ~porousZone()
252     {}
255     // Member Functions
257         // Access
259             //- cellZone name
260             const keyType& zoneName() const
261             {
262                 return key_;
263             }
265             //- Return mesh
266             const fvMesh& mesh() const
267             {
268                 return mesh_;
269             }
271             //- cellZone numbers
272             const labelList& zoneIds() const
273             {
274                 return cellZoneIds_;
275             }
277             //- dictionary values used for the porousZone
278             const dictionary& dict() const
279             {
280                 return dict_;
281             }
283             //- Return coordinate system
284             const coordinateSystem& coordSys() const
285             {
286                 return coordSys_;
287             }
289             //- Return origin
290             const point& origin() const
291             {
292                 return coordSys_.origin();
293             }
295             //- Return axis
296             vector axis() const
297             {
298                 return coordSys_.axis();
299             }
301             //- Return porosity
302             scalar porosity() const
303             {
304                 return porosity_;
305             }
307             //- Edit access to porosity
308             scalar& porosity()
309             {
310                 return porosity_;
311             }
313             //- Return turbulent intensity
314             scalar intensity() const
315             {
316                 return intensity_;
317             }
319             //- Edit access to turbulent intensity
320             scalar& intensity()
321             {
322                 return intensity_;
323             }
325             //- Return turbulent length scale
326             scalar mixingLength() const
327             {
328                 return mixingLength_;
329             }
331             //- Edit access to turbulent length scale
332             scalar& mixingLength()
333             {
334                 return mixingLength_;
335             }
338         //- Modify time derivative elements according to porosity
339         template<class Type>
340         void modifyDdt(fvMatrix<Type>&) const;
342         //- Add the viscous and inertial resistance force contribution
343         //  to the momentum equation
344         void addResistance(fvVectorMatrix& UEqn) const;
346         //- Add the viscous and inertial resistance force contribution
347         //  to the tensorial diagonal.
348         //  Optionally correct the processor BCs of AU.
349         void addResistance
350         (
351             const fvVectorMatrix& UEqn,
352             volTensorField& AU,
353             bool correctAUprocBC = true
354         ) const;
356         //- Write the porousZone dictionary
357         virtual void writeDict(Ostream&, bool subDict = true) const;
360     // Ostream Operator
362         friend Ostream& operator<<(Ostream&, const porousZone&);
366 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
368 } // End namespace Foam
370 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
372 #ifdef NoRepository
373 #   include "porousZoneTemplates.C"
374 #endif
376 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
378 #endif
380 // ************************************************************************* //