ENH: Added window option to fieldAverage function object

This commit is contained in:
andy
2011-08-16 18:05:27 +01:00
parent 53f332bc60
commit 84907675f8
6 changed files with 69 additions and 26 deletions

View File

@ -68,6 +68,7 @@ functions
mean on; mean on;
prime2Mean on; prime2Mean on;
base time; base time;
window 0.01; // optional averaging window
} }
p p
@ -75,6 +76,7 @@ functions
mean on; mean on;
prime2Mean on; prime2Mean on;
base time; base time;
window 0.01; // optional averaging window
} }
); );
} }

View File

@ -377,8 +377,7 @@ void Foam::fieldAverage::execute()
void Foam::fieldAverage::end() void Foam::fieldAverage::end()
{ {}
}
void Foam::fieldAverage::write() void Foam::fieldAverage::write()

View File

@ -149,7 +149,7 @@ const
{ {
typedef GeometricField<Type, fvPatchField, volMesh> fieldType; typedef GeometricField<Type, fvPatchField, volMesh> fieldType;
const scalar dt = obr_.time().deltaTValue(); scalar dt = obr_.time().deltaTValue();
forAll(faItems_, i) forAll(faItems_, i)
{ {
@ -163,17 +163,24 @@ const
obr_.lookupObject<fieldType>(meanFieldList[i]) obr_.lookupObject<fieldType>(meanFieldList[i])
); );
scalar alpha = 0.0; scalar Dt = totalTime_[i];
scalar beta = 0.0; if (faItems_[i].iterBase())
if (faItems_[i].timeBase())
{ {
alpha = (totalTime_[i] - dt)/totalTime_[i]; dt = 1.0;
beta = dt/totalTime_[i]; Dt = scalar(totalIter_[i]);
} }
else
scalar alpha = (Dt - dt)/Dt;
scalar beta = dt/Dt;
if (faItems_[i].window() > 0)
{ {
alpha = scalar(totalIter_[i] - 1)/scalar(totalIter_[i]); const scalar w = faItems_[i].window();
beta = 1.0/scalar(totalIter_[i]);
if (Dt - dt >= w)
{
alpha = (w - dt)/w;
beta = dt/w;
}
} }
meanField = alpha*meanField + beta*baseField; meanField = alpha*meanField + beta*baseField;
@ -192,7 +199,7 @@ void Foam::fieldAverage::calculatePrime2MeanFields
typedef GeometricField<Type1, fvPatchField, volMesh> fieldType1; typedef GeometricField<Type1, fvPatchField, volMesh> fieldType1;
typedef GeometricField<Type2, fvPatchField, volMesh> fieldType2; typedef GeometricField<Type2, fvPatchField, volMesh> fieldType2;
const scalar dt = obr_.time().deltaTValue(); scalar dt = obr_.time().deltaTValue();
forAll(faItems_, i) forAll(faItems_, i)
{ {
@ -213,17 +220,24 @@ void Foam::fieldAverage::calculatePrime2MeanFields
obr_.lookupObject<fieldType2>(prime2MeanFieldList[i]) obr_.lookupObject<fieldType2>(prime2MeanFieldList[i])
); );
scalar alpha = 0.0; scalar Dt = totalTime_[i];
scalar beta = 0.0; if (faItems_[i].iterBase())
if (faItems_[i].timeBase())
{ {
alpha = (totalTime_[i] - dt)/totalTime_[i]; dt = 1.0;
beta = dt/totalTime_[i]; Dt = scalar(totalIter_[i]);
} }
else
scalar alpha = (Dt - dt)/Dt;
scalar beta = dt/Dt;
if (faItems_[i].window() > 0)
{ {
alpha = scalar(totalIter_[i] - 1)/scalar(totalIter_[i]); const scalar w = faItems_[i].window();
beta = 1.0/scalar(totalIter_[i]);
if (Dt - dt >= w)
{
alpha = (w - dt)/w;
beta = dt/w;
}
} }
prime2MeanField = prime2MeanField =

View File

@ -53,7 +53,8 @@ Foam::fieldAverageItem::fieldAverageItem()
fieldName_("unknown"), fieldName_("unknown"),
mean_(0), mean_(0),
prime2Mean_(0), prime2Mean_(0),
base_(ITER) base_(ITER),
window_(-1.0)
{} {}
@ -62,7 +63,8 @@ Foam::fieldAverageItem::fieldAverageItem(const fieldAverageItem& faItem)
fieldName_(faItem.fieldName_), fieldName_(faItem.fieldName_),
mean_(faItem.mean_), mean_(faItem.mean_),
prime2Mean_(faItem.prime2Mean_), prime2Mean_(faItem.prime2Mean_),
base_(faItem.base_) base_(faItem.base_),
window_(faItem.window_)
{} {}
@ -91,6 +93,7 @@ void Foam::fieldAverageItem::operator=(const fieldAverageItem& rhs)
mean_ = rhs.mean_; mean_ = rhs.mean_;
prime2Mean_ = rhs.prime2Mean_; prime2Mean_ = rhs.prime2Mean_;
base_ = rhs.base_; base_ = rhs.base_;
window_ = rhs.window_;
} }

View File

@ -33,9 +33,13 @@ Description
mean on; mean on;
prime2Mean on; prime2Mean on;
base time; // iteration base time; // iteration
window 200; // optional averaging window
} }
\endverbatim \endverbatim
The averaging window corresponds to the averaging interval (iters or time)
If not specified, the averaging is over 'all iters/time'
SourceFiles SourceFiles
fieldAverageItem.C fieldAverageItem.C
fieldAverageItemIO.C fieldAverageItemIO.C
@ -100,6 +104,9 @@ private:
//- Averaging base type //- Averaging base type
baseType base_; baseType base_;
//- Averaging window - defaults to -1 for 'all iters/time'
scalar window_;
public: public:
@ -148,7 +155,7 @@ public:
} }
//- Return true if base is ITER //- Return true if base is ITER
Switch ITERBase() const Switch iterBase() const
{ {
return base_ == ITER; return base_ == ITER;
} }
@ -159,6 +166,11 @@ public:
return base_ == TIME; return base_ == TIME;
} }
scalar window() const
{
return window_;
}
// Member Operators // Member Operators
@ -177,7 +189,8 @@ public:
a.fieldName_ == b.fieldName_ a.fieldName_ == b.fieldName_
&& a.mean_ == b.mean_ && a.mean_ == b.mean_
&& a.prime2Mean_ == b.prime2Mean_ && a.prime2Mean_ == b.prime2Mean_
&& a.base_ == b.base_; && a.base_ == b.base_
&& a.window_ == b.window_;
} }
friend bool operator!= friend bool operator!=

View File

@ -33,7 +33,9 @@ Foam::fieldAverageItem::fieldAverageItem(Istream& is)
: :
fieldName_("unknown"), fieldName_("unknown"),
mean_(0), mean_(0),
prime2Mean_(0) prime2Mean_(0),
base_(ITER),
window_(-1.0)
{ {
is.check("Foam::fieldAverageItem::fieldAverageItem(Foam::Istream&)"); is.check("Foam::fieldAverageItem::fieldAverageItem(Foam::Istream&)");
@ -43,6 +45,7 @@ Foam::fieldAverageItem::fieldAverageItem(Istream& is)
entry.lookup("mean") >> mean_; entry.lookup("mean") >> mean_;
entry.lookup("prime2Mean") >> prime2Mean_; entry.lookup("prime2Mean") >> prime2Mean_;
base_ = baseTypeNames_[entry.lookup("base")]; base_ = baseTypeNames_[entry.lookup("base")];
window_ = entry.lookupOrDefault<scalar>("window", -1.0);
} }
@ -62,6 +65,7 @@ Foam::Istream& Foam::operator>>(Istream& is, fieldAverageItem& faItem)
entry.lookup("mean") >> faItem.mean_; entry.lookup("mean") >> faItem.mean_;
entry.lookup("prime2Mean") >> faItem.prime2Mean_; entry.lookup("prime2Mean") >> faItem.prime2Mean_;
faItem.base_ = faItem.baseTypeNames_[entry.lookup("base")]; faItem.base_ = faItem.baseTypeNames_[entry.lookup("base")];
faItem.window_ = entry.lookupOrDefault<scalar>("window", -1.0);
return is; return is;
} }
@ -80,7 +84,15 @@ Foam::Ostream& Foam::operator<<(Ostream& os, const fieldAverageItem& faItem)
os.writeKeyword("prime2Mean") << faItem.mean_ os.writeKeyword("prime2Mean") << faItem.mean_
<< token::END_STATEMENT << nl; << token::END_STATEMENT << nl;
os.writeKeyword("base") << faItem.baseTypeNames_[faItem.base_] os.writeKeyword("base") << faItem.baseTypeNames_[faItem.base_]
<< token::END_STATEMENT << nl << token::END_BLOCK << nl; << token::END_STATEMENT << nl;
if (faItem.window_ > 0)
{
os.writeKeyword("window") << faItem.window_
<< token::END_STATEMENT << nl;
}
os << token::END_BLOCK << nl;
os.check os.check
( (