initial commit for version 1.5.x patch release
[OpenFOAM-1.5.x.git] / src / OpenFOAM / fields / DimensionedFields / DimensionedField / DimensionedField.C
blob67100f518ba59c42c372890f2201d0c63490d544
1 /*---------------------------------------------------------------------------*\
2   =========                 |
3   \\      /  F ield         | OpenFOAM: The Open Source CFD Toolbox
4    \\    /   O peration     |
5     \\  /    A nd           | Copyright (C) 1991-2008 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 the
13     Free Software Foundation; either version 2 of the License, or (at your
14     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, write to the Free Software Foundation,
23     Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
25 \*---------------------------------------------------------------------------*/
27 #include "DimensionedField.H"
28 #include "dimensionedType.H"
30 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
32 namespace Foam
35 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
37 // check mesh for two fields
38 #define checkField(df1, df2, op)                                    \
39 if (&(df1).mesh() != &(df2).mesh())                                 \
40 {                                                                   \
41     FatalErrorIn("checkField(df1, df2, op)")                        \
42         << "different mesh for fields "                             \
43         << (df1).name() << " and " << (df2).name()                  \
44         << " during operatrion " <<  op                             \
45         << abort(FatalError);                                       \
49 // * * * * * * * * * * * * * * * * Constructors  * * * * * * * * * * * * * * //
51 template<class Type, class GeoMesh>
52 DimensionedField<Type, GeoMesh>::DimensionedField
54     const IOobject& io,
55     const Mesh& mesh,
56     const dimensionSet& dims,
57     const Field<Type>& field
60     regIOobject(io),
61     Field<Type>(field),
62     mesh_(mesh),
63     dimensions_(dims)
65     if (field.size() && field.size() != GeoMesh::size(mesh))
66     {
67         FatalErrorIn
68         (
69             "DimensionedField<Type, GeoMesh>::DimensionedField"
70             "(const IOobject& io,const Mesh& mesh, "
71             "const dimensionSet& dims, const Field<Type>& field)"
72         )   << "size of field = " << field.size()
73             << " is not the same as the size of mesh = "
74             << GeoMesh::size(mesh)
75             << abort(FatalError);
76     }
80 template<class Type, class GeoMesh>
81 DimensionedField<Type, GeoMesh>::DimensionedField
83     const IOobject& io,
84     const Mesh& mesh,
85     const dimensionSet& dims
88     regIOobject(io),
89     Field<Type>(GeoMesh::size(mesh)),
90     mesh_(mesh),
91     dimensions_(dims)
95 template<class Type, class GeoMesh>
96 DimensionedField<Type, GeoMesh>::DimensionedField
98     const IOobject& io,
99     const Mesh& mesh,
100     const dimensioned<Type>& dt
103     regIOobject(io),
104     Field<Type>(GeoMesh::size(mesh), dt.value()),
105     mesh_(mesh),
106     dimensions_(dt.dimensions())
110 template<class Type, class GeoMesh>
111 DimensionedField<Type, GeoMesh>::DimensionedField
113     const DimensionedField<Type, GeoMesh>& df
116 #   ifdef ConstructFromTmp
117     regIOobject(df),
118 #   else
119     regIOobject(df, true),
120 #   endif
121     Field<Type>(df),
122     mesh_(df.mesh_),
123     dimensions_(df.dimensions_)
127 template<class Type, class GeoMesh>
128 DimensionedField<Type, GeoMesh>::DimensionedField
130     DimensionedField<Type, GeoMesh>& df,
131     bool reUse
134     regIOobject(df, true),
135     Field<Type>(df, reUse),
136     mesh_(df.mesh_),
137     dimensions_(df.dimensions_)
141 #ifdef ConstructFromTmp
142 template<class Type, class GeoMesh>
143 DimensionedField<Type, GeoMesh>::DimensionedField
145     const tmp<DimensionedField<Type, GeoMesh> >& tdf
148     regIOobject(tdf(), true),
149     Field<Type>
150     (
151         const_cast<DimensionedField<Type, GeoMesh>&>(tdf()),
152         tdf.isTmp()
153     ),
154     mesh_(tdf().mesh_),
155     dimensions_(tdf().dimensions_)
157     tdf.clear();
159 #endif
162 template<class Type, class GeoMesh>
163 DimensionedField<Type, GeoMesh>::DimensionedField
165     const IOobject& io,
166     const DimensionedField<Type, GeoMesh>& df
169     regIOobject(io),
170     Field<Type>(df),
171     mesh_(df.mesh_),
172     dimensions_(df.dimensions_)
176 template<class Type, class GeoMesh>
177 DimensionedField<Type, GeoMesh>::DimensionedField
179     const word& newName,
180     const DimensionedField<Type, GeoMesh>& df
183     regIOobject(IOobject(newName, df.time().timeName(), df.db())),
184     Field<Type>(df),
185     mesh_(df.mesh_),
186     dimensions_(df.dimensions_)
190 template<class Type, class GeoMesh>
191 DimensionedField<Type, GeoMesh>::DimensionedField
193     const word& newName,
194     DimensionedField<Type, GeoMesh>& df,
195     bool reUse
198     regIOobject(IOobject(newName, df.time().timeName(), df.db())),
199     Field<Type>(df, reUse),
200     mesh_(df.mesh_),
201     dimensions_(df.dimensions_)
205 #ifdef ConstructFromTmp
206 template<class Type, class GeoMesh>
207 DimensionedField<Type, GeoMesh>::DimensionedField
209     const word& newName,
210     const tmp<DimensionedField<Type, GeoMesh> >& tdf
213     regIOobject(IOobject(newName, tdf().time().timeName(), tdf().db())),
214     Field<Type>
215     (
216         const_cast<DimensionedField<Type, GeoMesh>&>(tdf()),
217         tdf.isTmp()
218     ),
219     mesh_(tdf().mesh_),
220     dimensions_(tdf().dimensions_)
222     tdf().clear();
224 #endif
227 template<class Type, class GeoMesh>
228 tmp<DimensionedField<Type, GeoMesh> >
229 DimensionedField<Type, GeoMesh>::clone() const
231     return tmp<DimensionedField<Type, GeoMesh> >
232     (
233         new DimensionedField<Type, GeoMesh>(*this)
234     );
238 // * * * * * * * * * * * * * * * * Destructor  * * * * * * * * * * * * * * * //
240 template<class Type, class GeoMesh>
241 DimensionedField<Type, GeoMesh>::~DimensionedField()
245 // * * * * * * * * * * * * * * * Member Functions  * * * * * * * * * * * * * //
247 // Return a null Field
248 template<class Type, class GeoMesh>
249 const DimensionedField<Type, GeoMesh>& DimensionedField<Type, GeoMesh>::null()
251     DimensionedField<Type, GeoMesh>* nullPtr = 
252         reinterpret_cast<DimensionedField<Type, GeoMesh>*>(NULL);
253     return *nullPtr;
257 template<class Type, class GeoMesh>
260     DimensionedField
261         <typename DimensionedField<Type, GeoMesh>::cmptType, GeoMesh> 
263 DimensionedField<Type, GeoMesh>::component
265     const direction d
266 ) const
268     tmp<DimensionedField<cmptType, GeoMesh> > result
269     (
270         new DimensionedField<cmptType, GeoMesh>
271         (
272             IOobject
273             (
274                 name() + ".component(" + ::Foam::name(d) + ')',
275                 instance(),
276                 db()
277             ),
278             mesh_,
279             dimensions_
280         )
281     );
283     Foam::component(result(), *this, d);
285     return result;
289 template<class Type, class GeoMesh>
290 void DimensionedField<Type, GeoMesh>::replace
292     const direction d,
293     const DimensionedField
294         <typename DimensionedField<Type, GeoMesh>::cmptType, GeoMesh>& df
297     Field<Type>::replace(d, df);
301 template<class Type, class GeoMesh>
302 void DimensionedField<Type, GeoMesh>::replace
304     const direction d,
305     const tmp
306     <
307         DimensionedField
308             <typename DimensionedField<Type, GeoMesh>::cmptType, GeoMesh>
309     >& tdf
312     replace(d, tdf());
313     tdf.clear();
317 template<class Type, class GeoMesh>
318 tmp<DimensionedField<Type, GeoMesh> > 
319 DimensionedField<Type, GeoMesh>::T() const
321     tmp<DimensionedField<Type, GeoMesh> > result
322     (
323         new DimensionedField<Type, GeoMesh>
324         (
325             IOobject
326             (
327                 name() + ".T()",
328                 instance(),
329                 db()
330             ),
331             mesh_,
332             dimensions_
333         )
334     );
336     Foam::T(result(), *this);
338     return result;
342 template<class Type, class GeoMesh>
343 dimensioned<Type> DimensionedField<Type, GeoMesh>::average() const
345     dimensioned<Type> Average
346     (
347         this->name() + ".average()",
348         this->dimensions(),
349         gAverage(field())
350     );
352     return Average;
356 template<class Type, class GeoMesh>
357 dimensioned<Type> DimensionedField<Type, GeoMesh>::weightedAverage
359     const DimensionedField<scalar, GeoMesh>& weightField
360 ) const
362     return
363     (
364         dimensioned<Type>
365         (
366             this->name() + ".weightedAverage(weights)",
367             this->dimensions(),
368             gSum(weightField*field())/gSum(weightField)
369         )
370     );
374 template<class Type, class GeoMesh>
375 dimensioned<Type> DimensionedField<Type, GeoMesh>::weightedAverage
377     const tmp<DimensionedField<scalar, GeoMesh> >& tweightField
378 ) const
380     dimensioned<Type> wa = weightedAverage(tweightField());
381     tweightField.clear();
382     return wa;
386 // * * * * * * * * * * * * * * * Member Operators  * * * * * * * * * * * * * //
388 template<class Type, class GeoMesh>
389 void DimensionedField<Type, GeoMesh>::operator=
391     const DimensionedField<Type, GeoMesh>& df
394     // Check for assignment to self
395     if (this == &df)
396     {
397         FatalErrorIn
398         (
399             "DimensionedField<Type, GeoMesh>::operator="
400             "(const DimensionedField<Type, GeoMesh>&)"
401         )   << "attempted assignment to self"
402             << abort(FatalError);
403     }
405     checkField(*this, df, "=");
407     dimensions_ = df.dimensions();
408     Field<Type>::operator=(df);
412 template<class Type, class GeoMesh>
413 void DimensionedField<Type, GeoMesh>::operator=
415     const tmp<DimensionedField<Type, GeoMesh> >& tdf
418     const DimensionedField<Type, GeoMesh>& df = tdf();
420     // Check for assignment to self
421     if (this == &df)
422     {
423         FatalErrorIn
424         (
425             "DimensionedField<Type, GeoMesh>::operator="
426             "(const tmp<DimensionedField<Type, GeoMesh> >&)"
427         )   << "attempted assignment to self"
428             << abort(FatalError);
429     }
431     checkField(*this, df, "=");
433     dimensions_ = df.dimensions();
434     transfer(const_cast<DimensionedField<Type, GeoMesh>&>(df));
435     tdf.clear();
439 template<class Type, class GeoMesh>
440 void DimensionedField<Type, GeoMesh>::operator=
442     const dimensioned<Type>& dt
445     dimensions_ = dt.dimensions();
446     Field<Type>::operator=(dt.value());
450 #define COMPUTED_ASSIGNMENT(TYPE, op)                                         \
451                                                                               \
452 template<class Type, class GeoMesh>                                           \
453 void DimensionedField<Type, GeoMesh>::operator op                             \
454 (                                                                             \
455     const DimensionedField<TYPE, GeoMesh>& df                                 \
456 )                                                                             \
457 {                                                                             \
458     checkField(*this, df, #op);                                               \
459                                                                               \
460     dimensions_ op df.dimensions();                                           \
461     Field<Type>::operator op(df);                                             \
462 }                                                                             \
463                                                                               \
464 template<class Type, class GeoMesh>                                           \
465 void DimensionedField<Type, GeoMesh>::operator op                             \
466 (                                                                             \
467     const tmp<DimensionedField<TYPE, GeoMesh> >& tdf                          \
468 )                                                                             \
469 {                                                                             \
470     operator op(tdf());                                                       \
471     tdf.clear();                                                              \
472 }                                                                             \
473                                                                               \
474 template<class Type, class GeoMesh>                                           \
475 void DimensionedField<Type, GeoMesh>::operator op                             \
476 (                                                                             \
477     const dimensioned<TYPE>& dt                                               \
478 )                                                                             \
479 {                                                                             \
480     dimensions_ op dt.dimensions();                                           \
481     Field<Type>::operator op(dt.value());                                     \
484 COMPUTED_ASSIGNMENT(Type, +=)
485 COMPUTED_ASSIGNMENT(Type, -=)
486 COMPUTED_ASSIGNMENT(scalar, *=)
487 COMPUTED_ASSIGNMENT(scalar, /=)
489 #undef COMPUTED_ASSIGNMENT
492 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
494 #undef checkField
496 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
498 } // End namespace Foam
500 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
502 #include "DimensionedFieldIO.C"
503 #include "DimensionedFieldFunctions.C"
505 // ************************************************************************* //