1 /*---------------------------------------------------------------------------*\
3 \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
5 \\ / A nd | Copyright (C) 1991-2009 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 "fieldAverageItem.H"
28 #include "volFields.H"
31 // * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
34 void Foam::fieldAverage::addMeanField
37 wordList& meanFieldList
40 if (faItems_[fieldI].mean())
42 typedef GeometricField<Type, fvPatchField, volMesh> fieldType;
44 const word& fieldName = faItems_[fieldI].fieldName();
46 const word meanFieldName = fieldName + EXT_MEAN;
48 Info<< "Reading/calculating field " << meanFieldName << nl << endl;
50 if (obr_.foundObject<fieldType>(meanFieldName))
52 meanFieldList[fieldI] = meanFieldName;
54 else if (obr_.found(meanFieldName))
56 Info<< "Cannot allocate average field " << meanFieldName
57 << " since an object with that name already exists."
58 << " Disabling averaging." << nl << endl;
59 meanFieldList[fieldI] = word::null;
63 const fieldType& baseField =
64 obr_.lookupObject<fieldType>(fieldName);
74 obr_.time().timeName(),
76 IOobject::READ_IF_PRESENT,
83 meanFieldList[fieldI] = meanFieldName;
89 template<class Type1, class Type2>
90 void Foam::fieldAverage::addPrime2MeanField
93 const wordList& meanFieldList,
94 wordList& prime2MeanFieldList
97 if (faItems_[fieldI].mean() && meanFieldList[fieldI].size())
99 typedef GeometricField<Type1, fvPatchField, volMesh> fieldType1;
100 typedef GeometricField<Type2, fvPatchField, volMesh> fieldType2;
102 const word& fieldName = faItems_[fieldI].fieldName();
104 const word meanFieldName = fieldName + EXT_PRIME2MEAN;
105 Info<< "Reading/calculating field " << meanFieldName << nl << endl;
107 if (obr_.foundObject<fieldType2>(meanFieldName))
109 prime2MeanFieldList[fieldI] = meanFieldName;
111 else if (obr_.found(meanFieldName))
113 Info<< "Cannot allocate average field " << meanFieldName
114 << " since an object with that name already exists."
115 << " Disabling averaging." << nl << endl;
116 prime2MeanFieldList[fieldI] = word::null;
120 const fieldType1& baseField =
121 obr_.lookupObject<fieldType1>(fieldName);
122 const fieldType1& meanField =
123 obr_.lookupObject<fieldType1>(meanFieldList[fieldI]);
132 obr_.time().timeName(),
134 IOobject::READ_IF_PRESENT,
137 sqr(baseField) - sqr(meanField)
141 prime2MeanFieldList[fieldI] = meanFieldName;
148 void Foam::fieldAverage::calculateMeanFields(const wordList& meanFieldList)
151 typedef GeometricField<Type, fvPatchField, volMesh> fieldType;
153 const scalar dt = obr_.time().deltaT().value();
157 if (faItems_[i].mean() && meanFieldList[i].size())
159 const word& fieldName = faItems_[i].fieldName();
160 const fieldType& baseField =
161 obr_.lookupObject<fieldType>(fieldName);
162 fieldType& meanField = const_cast<fieldType&>
164 obr_.lookupObject<fieldType>(meanFieldList[i])
169 if (faItems_[i].timeBase())
171 alpha = (totalTime_[i] - dt)/totalTime_[i];
172 beta = dt/totalTime_[i];
176 alpha = scalar(totalIter_[i] - 1)/scalar(totalIter_[i]);
177 beta = 1.0/scalar(totalIter_[i]);
180 meanField = alpha*meanField + beta*baseField;
186 template<class Type1, class Type2>
187 void Foam::fieldAverage::calculatePrime2MeanFields
189 const wordList& meanFieldList,
190 const wordList& prime2MeanFieldList
193 typedef GeometricField<Type1, fvPatchField, volMesh> fieldType1;
194 typedef GeometricField<Type2, fvPatchField, volMesh> fieldType2;
196 const scalar dt = obr_.time().deltaT().value();
202 faItems_[i].prime2Mean()
203 && meanFieldList[i].size()
204 && prime2MeanFieldList[i].size()
207 const word& fieldName = faItems_[i].fieldName();
208 const fieldType1& baseField =
209 obr_.lookupObject<fieldType1>(fieldName);
210 const fieldType1& meanField =
211 obr_.lookupObject<fieldType1>(meanFieldList[i]);
212 fieldType2& prime2MeanField = const_cast<fieldType2&>
214 obr_.lookupObject<fieldType2>(prime2MeanFieldList[i])
219 if (faItems_[i].timeBase())
221 alpha = (totalTime_[i] - dt)/totalTime_[i];
222 beta = dt/totalTime_[i];
226 alpha = scalar(totalIter_[i] - 1)/scalar(totalIter_[i]);
227 beta = 1.0/scalar(totalIter_[i]);
231 alpha*prime2MeanField
232 + beta*sqr(baseField)
239 template<class Type1, class Type2>
240 void Foam::fieldAverage::addMeanSqrToPrime2Mean
242 const wordList& meanFieldList,
243 const wordList& prime2MeanFieldList
246 typedef GeometricField<Type1, fvPatchField, volMesh> fieldType1;
247 typedef GeometricField<Type2, fvPatchField, volMesh> fieldType2;
253 faItems_[i].prime2Mean()
254 && meanFieldList[i].size()
255 && prime2MeanFieldList[i].size()
258 const fieldType1& meanField =
259 obr_.lookupObject<fieldType1>(meanFieldList[i]);
260 fieldType2& prime2MeanField = const_cast<fieldType2&>
262 obr_.lookupObject<fieldType2>(prime2MeanFieldList[i])
265 prime2MeanField += sqr(meanField);
272 void Foam::fieldAverage::writeFieldList(const wordList& fieldList) const
274 typedef GeometricField<Type, fvPatchField, volMesh> fieldType;
278 if (fieldList[i].size())
280 const fieldType& f = obr_.lookupObject<fieldType>(fieldList[i]);
287 // ************************************************************************* //