1 /*---------------------------------------------------------------------------*\
3 \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
5 \\ / A nd | Copyright (C) 1991-2008 OpenCFD Ltd.
7 -------------------------------------------------------------------------------
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
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 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
35 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
37 // check mesh for two fields
38 #define checkField(df1, df2, op) \
39 if (&(df1).mesh() != &(df2).mesh()) \
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
56 const dimensionSet& dims,
57 const Field<Type>& field
65 if (field.size() && field.size() != GeoMesh::size(mesh))
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)
80 template<class Type, class GeoMesh>
81 DimensionedField<Type, GeoMesh>::DimensionedField
85 const dimensionSet& dims
89 Field<Type>(GeoMesh::size(mesh)),
95 template<class Type, class GeoMesh>
96 DimensionedField<Type, GeoMesh>::DimensionedField
100 const dimensioned<Type>& dt
104 Field<Type>(GeoMesh::size(mesh), dt.value()),
106 dimensions_(dt.dimensions())
110 template<class Type, class GeoMesh>
111 DimensionedField<Type, GeoMesh>::DimensionedField
113 const DimensionedField<Type, GeoMesh>& df
116 # ifdef ConstructFromTmp
119 regIOobject(df, true),
123 dimensions_(df.dimensions_)
127 template<class Type, class GeoMesh>
128 DimensionedField<Type, GeoMesh>::DimensionedField
130 DimensionedField<Type, GeoMesh>& df,
134 regIOobject(df, true),
135 Field<Type>(df, reUse),
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),
151 const_cast<DimensionedField<Type, GeoMesh>&>(tdf()),
155 dimensions_(tdf().dimensions_)
162 template<class Type, class GeoMesh>
163 DimensionedField<Type, GeoMesh>::DimensionedField
166 const DimensionedField<Type, GeoMesh>& df
172 dimensions_(df.dimensions_)
176 template<class Type, class GeoMesh>
177 DimensionedField<Type, GeoMesh>::DimensionedField
180 const DimensionedField<Type, GeoMesh>& df
183 regIOobject(IOobject(newName, df.time().timeName(), df.db())),
186 dimensions_(df.dimensions_)
190 template<class Type, class GeoMesh>
191 DimensionedField<Type, GeoMesh>::DimensionedField
194 DimensionedField<Type, GeoMesh>& df,
198 regIOobject(IOobject(newName, df.time().timeName(), df.db())),
199 Field<Type>(df, reUse),
201 dimensions_(df.dimensions_)
205 #ifdef ConstructFromTmp
206 template<class Type, class GeoMesh>
207 DimensionedField<Type, GeoMesh>::DimensionedField
210 const tmp<DimensionedField<Type, GeoMesh> >& tdf
213 regIOobject(IOobject(newName, tdf().time().timeName(), tdf().db())),
216 const_cast<DimensionedField<Type, GeoMesh>&>(tdf()),
220 dimensions_(tdf().dimensions_)
227 template<class Type, class GeoMesh>
228 tmp<DimensionedField<Type, GeoMesh> >
229 DimensionedField<Type, GeoMesh>::clone() const
231 return tmp<DimensionedField<Type, GeoMesh> >
233 new DimensionedField<Type, GeoMesh>(*this)
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);
257 template<class Type, class GeoMesh>
261 <typename DimensionedField<Type, GeoMesh>::cmptType, GeoMesh>
263 DimensionedField<Type, GeoMesh>::component
268 tmp<DimensionedField<cmptType, GeoMesh> > result
270 new DimensionedField<cmptType, GeoMesh>
274 name() + ".component(" + ::Foam::name(d) + ')',
283 Foam::component(result(), *this, d);
289 template<class Type, class GeoMesh>
290 void DimensionedField<Type, GeoMesh>::replace
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
308 <typename DimensionedField<Type, GeoMesh>::cmptType, GeoMesh>
317 template<class Type, class GeoMesh>
318 tmp<DimensionedField<Type, GeoMesh> >
319 DimensionedField<Type, GeoMesh>::T() const
321 tmp<DimensionedField<Type, GeoMesh> > result
323 new DimensionedField<Type, GeoMesh>
336 Foam::T(result(), *this);
342 template<class Type, class GeoMesh>
343 dimensioned<Type> DimensionedField<Type, GeoMesh>::average() const
345 dimensioned<Type> Average
347 this->name() + ".average()",
356 template<class Type, class GeoMesh>
357 dimensioned<Type> DimensionedField<Type, GeoMesh>::weightedAverage
359 const DimensionedField<scalar, GeoMesh>& weightField
366 this->name() + ".weightedAverage(weights)",
368 gSum(weightField*field())/gSum(weightField)
374 template<class Type, class GeoMesh>
375 dimensioned<Type> DimensionedField<Type, GeoMesh>::weightedAverage
377 const tmp<DimensionedField<scalar, GeoMesh> >& tweightField
380 dimensioned<Type> wa = weightedAverage(tweightField());
381 tweightField.clear();
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
399 "DimensionedField<Type, GeoMesh>::operator="
400 "(const DimensionedField<Type, GeoMesh>&)"
401 ) << "attempted assignment to self"
402 << abort(FatalError);
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
425 "DimensionedField<Type, GeoMesh>::operator="
426 "(const tmp<DimensionedField<Type, GeoMesh> >&)"
427 ) << "attempted assignment to self"
428 << abort(FatalError);
431 checkField(*this, df, "=");
433 dimensions_ = df.dimensions();
434 transfer(const_cast<DimensionedField<Type, GeoMesh>&>(df));
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) \
452 template<class Type, class GeoMesh> \
453 void DimensionedField<Type, GeoMesh>::operator op \
455 const DimensionedField<TYPE, GeoMesh>& df \
458 checkField(*this, df, #op); \
460 dimensions_ op df.dimensions(); \
461 Field<Type>::operator op(df); \
464 template<class Type, class GeoMesh> \
465 void DimensionedField<Type, GeoMesh>::operator op \
467 const tmp<DimensionedField<TYPE, GeoMesh> >& tdf \
470 operator op(tdf()); \
474 template<class Type, class GeoMesh> \
475 void DimensionedField<Type, GeoMesh>::operator op \
477 const dimensioned<TYPE>& dt \
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 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
496 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
498 } // End namespace Foam
500 // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
502 #include "DimensionedFieldIO.C"
503 #include "DimensionedFieldFunctions.C"
505 // ************************************************************************* //