Initial commit for version 2.0.x patch release
[OpenFOAM-2.0.x.git] / src / OpenFOAM / fields / Fields / Field / Field.H
blobaaf338ef99dcc42b838abf21b581fd259af71169
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
4    \\    /   O peration     |
5     \\  /    A nd           | Copyright (C) 2004-2010 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::Field
27 Description
28     Generic templated field type.
30 SourceFiles
31     FieldFunctions.H
32     FieldFunctionsM.H
33     FieldMapper.H
34     FieldM.H
35     Field.C
36     FieldFunctions.C
37     FieldFunctionsM.C
39 \*---------------------------------------------------------------------------*/
41 #ifndef Field_H
42 #define Field_H
44 #include "tmp.H"
45 #include "direction.H"
46 #include "VectorSpace.H"
47 #include "scalarList.H"
48 #include "labelList.H"
50 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
52 namespace Foam
55 // Forward declaration of friend functions and operators
57 template<class Type>
58 class Field;
60 //- Pre-declare related SubField type
61 template<class Type>
62 class SubField;
64 template<class Type>
65 Ostream& operator<<(Ostream&, const Field<Type>&);
67 template<class Type>
68 Ostream& operator<<(Ostream&, const tmp<Field<Type> >&);
70 class FieldMapper;
71 class dictionary;
73 /*---------------------------------------------------------------------------*\
74                            Class Field Declaration
75 \*---------------------------------------------------------------------------*/
77 template<class Type>
78 class Field
80     public refCount,
81     public List<Type>
84 public:
86     //- Component type
87     typedef typename pTraits<Type>::cmptType cmptType;
89     //- Declare type of subField
90     typedef SubField<Type> subField;
93     // Static data members
95         static const char* const typeName;
98     // Static Member Functions
100         //- Return a null field
101         inline static const Field<Type>& null()
102         {
103             return *reinterpret_cast< Field<Type>* >(0);
104         }
107     // Constructors
109         //- Construct null
110         //  Used for temporary fields which are initialised after construction
111         Field();
113         //- Construct given size
114         //  Used for temporary fields which are initialised after construction
115         explicit Field(const label);
117         //- Construct given size and initial value
118         Field(const label, const Type&);
120         //- Construct as copy of a UList\<Type\>
121         explicit Field(const UList<Type>&);
123         //- Construct by transferring the List contents
124         explicit Field(const Xfer<List<Type> >&);
126         //- Construct by 1 to 1 mapping from the given field
127         Field
128         (
129             const UList<Type>& mapF,
130             const labelUList& mapAddressing
131         );
133         //- Construct by 1 to 1 mapping from the given tmp field
134         Field
135         (
136             const tmp<Field<Type> >& tmapF,
137             const labelUList& mapAddressing
138         );
140         //- Construct by interpolative mapping from the given field
141         Field
142         (
143             const UList<Type>& mapF,
144             const labelListList& mapAddressing,
145             const scalarListList& weights
146         );
148         //- Construct by interpolative mapping from the given tmp field
149         Field
150         (
151             const tmp<Field<Type> >& tmapF,
152             const labelListList& mapAddressing,
153             const scalarListList& weights
154         );
156         //- Construct by mapping from the given field
157         Field
158         (
159             const UList<Type>& mapF,
160             const FieldMapper& map
161         );
163         //- Construct by mapping from the given tmp field
164         Field
165         (
166             const tmp<Field<Type> >& tmapF,
167             const FieldMapper& map
168         );
170         //- Construct as copy
171         Field(const Field<Type>&);
173         //- Construct as copy or re-use as specified.
174         Field(Field<Type>&, bool reUse);
176         //- Construct by transferring the Field contents
177         Field(const Xfer<Field<Type> >&);
179 #ifdef __INTEL_COMPILER
180         //- Construct as copy of subField
181         Field(const typename Field<Type>::subField&);
182 #endif
184         //- Construct as copy of tmp<Field>
185 #       ifdef ConstructFromTmp
186         Field(const tmp<Field<Type> >&);
187 #       endif
189         //- Construct from Istream
190         Field(Istream&);
192         //- Construct from a dictionary entry
193         Field(const word& keyword, const dictionary&, const label size);
195         //- Clone
196         tmp<Field<Type> > clone() const;
198         //- Return a pointer to a new calculatedFvPatchFieldField created on
199         //  freestore without setting patchField values
200         template<class Type2>
201         static tmp<Field<Type> > NewCalculatedType(const Field<Type2>& f)
202         {
203             return tmp<Field<Type> >(new Field<Type>(f.size()));
204         }
207     // Member Functions
209         //- 1 to 1 map from the given field
210         void map
211         (
212             const UList<Type>& mapF,
213             const labelUList& mapAddressing
214         );
216         //- 1 to 1 map from the given tmp field
217         void map
218         (
219             const tmp<Field<Type> >& tmapF,
220             const labelUList& mapAddressing
221         );
223         //- Interpolative map from the given field
224         void map
225         (
226             const UList<Type>& mapF,
227             const labelListList& mapAddressing,
228             const scalarListList& weights
229         );
231         //- Interpolative map from the given tmp field
232         void map
233         (
234             const tmp<Field<Type> >& tmapF,
235             const labelListList& mapAddressing,
236             const scalarListList& weights
237         );
239         //- Map from the given field
240         void map
241         (
242             const UList<Type>& mapF,
243             const FieldMapper& map
244         );
246         //- Map from the given tmp field
247         void map
248         (
249             const tmp<Field<Type> >& tmapF,
250             const FieldMapper& map
251         );
253         //- Map from self
254         void autoMap
255         (
256             const FieldMapper& map
257         );
259         //- 1 to 1 reverse-map from the given field
260         void rmap
261         (
262             const UList<Type>& mapF,
263             const labelUList& mapAddressing
264         );
266         //- 1 to 1 reverse-map from the given tmp field
267         void rmap
268         (
269             const tmp<Field<Type> >& tmapF,
270             const labelUList& mapAddressing
271         );
273         //- Interpolative reverse map from the given field
274         void rmap
275         (
276             const UList<Type>& mapF,
277             const labelUList& mapAddressing,
278             const UList<scalar>& weights
279         );
281         //- Interpolative reverse map from the given tmp field
282         void rmap
283         (
284             const tmp<Field<Type> >& tmapF,
285             const labelUList& mapAddressing,
286             const UList<scalar>& weights
287         );
289         //- Negate this field
290         void negate();
292         //- Return a component field of the field
293         tmp<Field<cmptType> > component(const direction) const;
295         //- Replace a component field of the field
296         void replace(const direction, const UList<cmptType>&);
298         //- Replace a component field of the field
299         void replace(const direction, const tmp<Field<cmptType> >&);
301         //- Replace a component field of the field
302         void replace(const direction, const cmptType&);
304         //- Return the field transpose (only defined for second rank tensors)
305         tmp<Field<Type> > T() const;
307         //- Write the field as a dictionary entry
308         void writeEntry(const word& keyword, Ostream& os) const;
311     // Member operators
313         void operator=(const Field<Type>&);
314         void operator=(const UList<Type>&);
315         void operator=(const SubField<Type>&);
316         void operator=(const tmp<Field<Type> >&);
317         void operator=(const Type&);
319         template<class Form, class Cmpt, int nCmpt>
320         void operator=(const VectorSpace<Form,Cmpt,nCmpt>&);
322         void operator+=(const UList<Type>&);
323         void operator+=(const tmp<Field<Type> >&);
325         void operator-=(const UList<Type>&);
326         void operator-=(const tmp<Field<Type> >&);
328         void operator*=(const UList<scalar>&);
329         void operator*=(const tmp<Field<scalar> >&);
331         void operator/=(const UList<scalar>&);
332         void operator/=(const tmp<Field<scalar> >&);
334         void operator+=(const Type&);
335         void operator-=(const Type&);
337         void operator*=(const scalar&);
338         void operator/=(const scalar&);
341     // IOstream operators
343         friend Ostream& operator<< <Type>
344         (Ostream&, const Field<Type>&);
346         friend Ostream& operator<< <Type>
347         (Ostream&, const tmp<Field<Type> >&);
351 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
353 } // End namespace Foam
355 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
357 #include "FieldFunctions.H"
359 #ifdef NoRepository
360 #   include "Field.C"
361 #endif
363 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
365 #endif
367 // ************************************************************************* //