/*---------------------------------------------------------------------------*\
========= |
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
\\/ M anipulation |
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
OpenFOAM is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
for more details.
You should have received a copy of the GNU General Public License
along with OpenFOAM. If not, see .
\*---------------------------------------------------------------------------*/
#include "fieldAverageItem.H"
#include "volFields.H"
#include "surfaceFields.H"
#include "OFstream.H"
// * * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * //
template
void Foam::functionObjects::fieldAverage::addMeanFieldType(const label fieldi)
{
const word& fieldName = faItems_[fieldi].fieldName();
const word& meanFieldName = faItems_[fieldi].meanFieldName();
if (log_) Info<< " Reading/initialising field " << meanFieldName << endl;
if (obr_.foundObject(meanFieldName))
{
// do nothing
}
else if (obr_.found(meanFieldName))
{
if (log_) Info
<< " Cannot allocate average field " << meanFieldName
<< " since an object with that name already exists."
<< " Disabling averaging for field." << endl;
faItems_[fieldi].mean() = false;
}
else
{
const Type& baseField = obr_.lookupObject(fieldName);
// Store on registry
obr_.store
(
new Type
(
IOobject
(
meanFieldName,
obr_.time().timeName(obr_.time().startTime().value()),
obr_,
restartOnOutput_
? IOobject::NO_READ
: IOobject::READ_IF_PRESENT,
IOobject::NO_WRITE
),
1*baseField
)
);
}
}
template
void Foam::functionObjects::fieldAverage::addMeanField(const label fieldi)
{
if (faItems_[fieldi].mean())
{
typedef GeometricField
VolFieldType;
typedef GeometricField
SurfaceFieldType;
const word& fieldName = faItems_[fieldi].fieldName();
if (obr_.foundObject(fieldName))
{
addMeanFieldType(fieldi);
}
else if (obr_.foundObject(fieldName))
{
addMeanFieldType(fieldi);
}
}
}
template
void Foam::functionObjects::fieldAverage::addPrime2MeanFieldType
(
const label fieldi
)
{
const word& fieldName = faItems_[fieldi].fieldName();
const word& meanFieldName = faItems_[fieldi].meanFieldName();
const word& prime2MeanFieldName = faItems_[fieldi].prime2MeanFieldName();
if (log_) Info
<< " Reading/initialising field " << prime2MeanFieldName << nl;
if (obr_.foundObject(prime2MeanFieldName))
{
// do nothing
}
else if (obr_.found(prime2MeanFieldName))
{
if (log_) Info
<< " Cannot allocate average field " << prime2MeanFieldName
<< " since an object with that name already exists."
<< " Disabling averaging for field." << nl;
faItems_[fieldi].prime2Mean() = false;
}
else
{
const Type1& baseField = obr_.lookupObject(fieldName);
const Type1& meanField = obr_.lookupObject(meanFieldName);
// Store on registry
obr_.store
(
new Type2
(
IOobject
(
prime2MeanFieldName,
obr_.time().timeName(obr_.time().startTime().value()),
obr_,
restartOnOutput_
? IOobject::NO_READ
: IOobject::READ_IF_PRESENT,
IOobject::NO_WRITE
),
sqr(baseField) - sqr(meanField)
)
);
}
}
template
void Foam::functionObjects::fieldAverage::addPrime2MeanField(const label fieldi)
{
typedef GeometricField VolFieldType1;
typedef GeometricField SurfaceFieldType1;
typedef GeometricField VolFieldType2;
typedef GeometricField SurfaceFieldType2;
if (faItems_[fieldi].prime2Mean())
{
const word& fieldName = faItems_[fieldi].fieldName();
if (!faItems_[fieldi].mean())
{
FatalErrorInFunction
<< "To calculate the prime-squared average, the "
<< "mean average must also be selected for field "
<< fieldName << nl << exit(FatalError);
}
if (obr_.foundObject(fieldName))
{
addPrime2MeanFieldType(fieldi);
}
else if (obr_.foundObject(fieldName))
{
addPrime2MeanFieldType
(
fieldi
);
}
}
}
template
void Foam::functionObjects::fieldAverage::calculateMeanFieldType
(
const label fieldi
) const
{
const word& fieldName = faItems_[fieldi].fieldName();
if (obr_.foundObject(fieldName))
{
const Type& baseField = obr_.lookupObject(fieldName);
Type& meanField = const_cast
(
obr_.lookupObject(faItems_[fieldi].meanFieldName())
);
scalar dt = obr_.time().deltaTValue();
scalar Dt = totalTime_[fieldi];
if (faItems_[fieldi].iterBase())
{
dt = 1.0;
Dt = scalar(totalIter_[fieldi]);
}
scalar alpha = (Dt - dt)/Dt;
scalar beta = dt/Dt;
if (faItems_[fieldi].window() > 0)
{
const scalar w = faItems_[fieldi].window();
if (Dt - dt >= w)
{
alpha = (w - dt)/w;
beta = dt/w;
}
}
meanField = alpha*meanField + beta*baseField;
}
}
template
void Foam::functionObjects::fieldAverage::calculateMeanFields() const
{
typedef GeometricField VolFieldType;
typedef GeometricField SurfaceFieldType;
forAll(faItems_, i)
{
if (faItems_[i].mean())
{
calculateMeanFieldType(i);
calculateMeanFieldType(i);
}
}
}
template
void Foam::functionObjects::fieldAverage::calculatePrime2MeanFieldType
(
const label fieldi
) const
{
const word& fieldName = faItems_[fieldi].fieldName();
if (obr_.foundObject(fieldName))
{
const Type1& baseField = obr_.lookupObject(fieldName);
const Type1& meanField =
obr_.lookupObject(faItems_[fieldi].meanFieldName());
Type2& prime2MeanField = const_cast
(
obr_.lookupObject(faItems_[fieldi].prime2MeanFieldName())
);
scalar dt = obr_.time().deltaTValue();
scalar Dt = totalTime_[fieldi];
if (faItems_[fieldi].iterBase())
{
dt = 1.0;
Dt = scalar(totalIter_[fieldi]);
}
scalar alpha = (Dt - dt)/Dt;
scalar beta = dt/Dt;
if (faItems_[fieldi].window() > 0)
{
const scalar w = faItems_[fieldi].window();
if (Dt - dt >= w)
{
alpha = (w - dt)/w;
beta = dt/w;
}
}
prime2MeanField =
alpha*prime2MeanField
+ beta*sqr(baseField)
- sqr(meanField);
}
}
template
void Foam::functionObjects::fieldAverage::calculatePrime2MeanFields() const
{
typedef GeometricField VolFieldType1;
typedef GeometricField SurfaceFieldType1;
typedef GeometricField VolFieldType2;
typedef GeometricField SurfaceFieldType2;
forAll(faItems_, i)
{
if (faItems_[i].prime2Mean())
{
calculatePrime2MeanFieldType
(
i
);
calculatePrime2MeanFieldType
(
i
);
}
}
}
template
void Foam::functionObjects::fieldAverage::addMeanSqrToPrime2MeanType
(
const label fieldi
) const
{
const word& fieldName = faItems_[fieldi].fieldName();
if (obr_.foundObject(fieldName))
{
const Type1& meanField =
obr_.lookupObject(faItems_[fieldi].meanFieldName());
Type2& prime2MeanField = const_cast
(
obr_.lookupObject(faItems_[fieldi].prime2MeanFieldName())
);
prime2MeanField += sqr(meanField);
}
}
template
void Foam::functionObjects::fieldAverage::addMeanSqrToPrime2Mean() const
{
typedef GeometricField VolFieldType1;
typedef GeometricField SurfaceFieldType1;
typedef GeometricField VolFieldType2;
typedef GeometricField SurfaceFieldType2;
forAll(faItems_, i)
{
if (faItems_[i].prime2Mean())
{
addMeanSqrToPrime2MeanType(i);
addMeanSqrToPrime2MeanType(i);
}
}
}
template
void Foam::functionObjects::fieldAverage::writeFieldType
(
const word& fieldName
) const
{
if (obr_.foundObject(fieldName))
{
const Type& f = obr_.lookupObject(fieldName);
f.write();
}
}
template
void Foam::functionObjects::fieldAverage::writeFields() const
{
typedef GeometricField VolFieldType;
typedef GeometricField SurfaceFieldType;
forAll(faItems_, i)
{
if (faItems_[i].mean())
{
const word& fieldName = faItems_[i].meanFieldName();
writeFieldType(fieldName);
writeFieldType(fieldName);
}
if (faItems_[i].prime2Mean())
{
const word& fieldName = faItems_[i].prime2MeanFieldName();
writeFieldType(fieldName);
writeFieldType(fieldName);
}
}
}
// ************************************************************************* //