Initial commit for version 2.0.x patch release
[OpenFOAM-2.0.x.git] / src / finiteVolume / fields / fvPatchFields / derived / advective / advectiveFvPatchField.H
blob9fa8d251cf6c33d0f8966fe15f5006a72bf6fc96
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 Class
25     Foam::advectiveFvPatchField
27 Description
28     Advective outflow boundary condition based on solving DDt(psi, U) = 0
29     at the boundary.
31     The standard (Euler, backward, CrankNicholson) time schemes are
32     supported.  Additionally an optional mechanism to relax the value at
33     the boundary to a specified far-field value is provided which is
34     switched on by specifying the relaxation length-scale lInf and the
35     far-field value fieldInf.
37     The flow/wave speed at the outlet is provided by the virtual function
38     advectionSpeed() the default implementation of which requires the name of
39     flux field a the outlet (phi) and optionally the density (rho) if the
40     mass-flux rather than the volumetric-flux is given.
41     \verbatim
42         outlet
43         {
44             type            advective;
45             phi             phi;
46             // rho          rho; // Not needed, phi volumetric
47             // fieldInf     1e5; // Optional
48             // lInf         0.1; // Optional
49         }
50     \endverbatim
52     The flow/wave speed at the outlet can be changed by deriving a specialised
53     BC fron this class and overriding advectionSpeed() e.g. in
54     waveTransmissiveFvPatchField the advectionSpeed() calculates and returns
55     the flow-speed plus the acoustic wave speed creating an acoustic wave
56     transmissive boundary condition.
58 SourceFiles
59     advectiveFvPatchField.C
61 \*---------------------------------------------------------------------------*/
63 #ifndef advectiveFvPatchField_H
64 #define advectiveFvPatchField_H
66 #include "mixedFvPatchFields.H"
68 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
70 namespace Foam
73 /*---------------------------------------------------------------------------*\
74                  Class advectiveFvPatch Declaration
75 \*---------------------------------------------------------------------------*/
77 template<class Type>
78 class advectiveFvPatchField
80     public mixedFvPatchField<Type>
82 protected:
84     // Private data
86         //- Name of the flux transporting the field
87         word phiName_;
89         //- Name of the density field used to normalise the mass flux
90         //  if neccessary
91         word rhoName_;
93         //- Field value of the far-field
94         Type fieldInf_;
96         //- Relaxation length-scale
97         scalar lInf_;
100 public:
102     //- Runtime type information
103     TypeName("advective");
106     // Constructors
108         //- Construct from patch and internal field
109         advectiveFvPatchField
110         (
111             const fvPatch&,
112             const DimensionedField<Type, volMesh>&
113         );
115         //- Construct from patch, internal field and dictionary
116         advectiveFvPatchField
117         (
118             const fvPatch&,
119             const DimensionedField<Type, volMesh>&,
120             const dictionary&
121         );
123         //- Construct by mapping given advectiveFvPatchField
124         //  onto a new patch
125         advectiveFvPatchField
126         (
127             const advectiveFvPatchField<Type>&,
128             const fvPatch&,
129             const DimensionedField<Type, volMesh>&,
130             const fvPatchFieldMapper&
131         );
133         //- Construct as copy
134         advectiveFvPatchField
135         (
136             const advectiveFvPatchField&
137         );
139         //- Construct and return a clone
140         virtual tmp<fvPatchField<Type> > clone() const
141         {
142             return tmp<fvPatchField<Type> >
143             (
144                 new advectiveFvPatchField<Type>(*this)
145             );
146         }
148         //- Construct as copy setting internal field reference
149         advectiveFvPatchField
150         (
151             const advectiveFvPatchField&,
152             const DimensionedField<Type, volMesh>&
153         );
155         //- Construct and return a clone setting internal field reference
156         virtual tmp<fvPatchField<Type> > clone
157         (
158             const DimensionedField<Type, volMesh>& iF
159         ) const
160         {
161             return tmp<fvPatchField<Type> >
162             (
163                 new advectiveFvPatchField<Type>(*this, iF)
164             );
165         }
168     // Member functions
170         // Access
172             //- Return the field at infinity
173             const Type& fieldInf() const
174             {
175                 return fieldInf_;
176             }
178             //- Return reference to the field at infinity to allow adjustment
179             Type& fieldInf()
180             {
181                 return fieldInf_;
182             }
184             //- Return the relaxation length-scale
185             scalar lInf() const
186             {
187                 return lInf_;
188             }
190             //- Return reference to the relaxation length-scale
191             //  to allow adjustment
192             scalar& lInf()
193             {
194                 return lInf_;
195             }
198         // Evaluation functions
200             //- Calculate and return the advection speed at the boundary
201             virtual tmp<scalarField> advectionSpeed() const;
203             //- Update the coefficients associated with the patch field
204             virtual void updateCoeffs();
207         //- Write
208         virtual void write(Ostream&) const;
212 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
214 } // End namespace Foam
216 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
218 #ifdef NoRepository
219 #   include "advectiveFvPatchField.C"
220 #endif
222 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
224 #endif
226 // ************************************************************************* //