Commit eff78243 authored by mattijs's avatar mattijs

ENH: nutUWallFunction: user defined tolerance on N-R. See #1172

parent 3e4205a0
......@@ -3,7 +3,7 @@
\\ / F ield | OpenFOAM: The Open Source CFD Toolbox
\\ / O peration |
\\ / A nd | Copyright (C) 2011-2016 OpenFOAM Foundation
\\/ M anipulation |
\\/ M anipulation | Copyright (C) 2019 OpenCFD Ltd.
-------------------------------------------------------------------------------
License
This file is part of OpenFOAM.
......@@ -161,8 +161,8 @@ tmp<scalarField> nutURoughWallFunctionFvPatchScalarField::calcYPlus
}
} while
(
mag(ryPlusLam*(yp - yPlusLast)) > 0.0001
&& ++iter < 10
mag(ryPlusLam*(yp - yPlusLast)) > tolerance_
&& ++iter < maxIter_
&& yp > VSMALL
);
......@@ -190,7 +190,12 @@ tmp<scalarField> nutURoughWallFunctionFvPatchScalarField::calcYPlus
yPlusLast = yp;
yp = (kappaRe + yp)/(1.0 + log(E_*yp));
} while (mag(ryPlusLam*(yp - yPlusLast)) > 0.0001 && ++iter < 10);
}
while
(
mag(ryPlusLam*(yp - yPlusLast)) > tolerance_
&& ++iter < maxIter_
);
yPlus[facei] = max(0.0, yp);
}
......@@ -200,6 +205,20 @@ tmp<scalarField> nutURoughWallFunctionFvPatchScalarField::calcYPlus
}
void nutURoughWallFunctionFvPatchScalarField::writeLocalEntries
(
Ostream& os
) const
{
nutWallFunctionFvPatchScalarField::writeLocalEntries(os);
os.writeEntry("roughnessHeight", roughnessHeight_);
os.writeEntry("roughnessConstant", roughnessConstant_);
os.writeEntry("roughnessFactor", roughnessFactor_);
os.writeEntryIfDifferent<label>("maxIter", 10, maxIter_);
os.writeEntryIfDifferent<scalar>("tolerance", 0.0001, tolerance_);
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
nutURoughWallFunctionFvPatchScalarField::nutURoughWallFunctionFvPatchScalarField
......@@ -211,7 +230,9 @@ nutURoughWallFunctionFvPatchScalarField::nutURoughWallFunctionFvPatchScalarField
nutWallFunctionFvPatchScalarField(p, iF),
roughnessHeight_(Zero),
roughnessConstant_(Zero),
roughnessFactor_(Zero)
roughnessFactor_(Zero),
maxIter_(10),
tolerance_(0.0001)
{}
......@@ -226,7 +247,9 @@ nutURoughWallFunctionFvPatchScalarField::nutURoughWallFunctionFvPatchScalarField
nutWallFunctionFvPatchScalarField(ptf, p, iF, mapper),
roughnessHeight_(ptf.roughnessHeight_),
roughnessConstant_(ptf.roughnessConstant_),
roughnessFactor_(ptf.roughnessFactor_)
roughnessFactor_(ptf.roughnessFactor_),
maxIter_(ptf.maxIter_),
tolerance_(ptf.tolerance_)
{}
......@@ -240,7 +263,9 @@ nutURoughWallFunctionFvPatchScalarField::nutURoughWallFunctionFvPatchScalarField
nutWallFunctionFvPatchScalarField(p, iF, dict),
roughnessHeight_(dict.get<scalar>("roughnessHeight")),
roughnessConstant_(dict.get<scalar>("roughnessConstant")),
roughnessFactor_(dict.get<scalar>("roughnessFactor"))
roughnessFactor_(dict.get<scalar>("roughnessFactor")),
maxIter_(dict.lookupOrDefault<label>("maxIter", 10)),
tolerance_(dict.lookupOrDefault<scalar>("tolerance", 0.0001))
{}
......@@ -252,7 +277,9 @@ nutURoughWallFunctionFvPatchScalarField::nutURoughWallFunctionFvPatchScalarField
nutWallFunctionFvPatchScalarField(rwfpsf),
roughnessHeight_(rwfpsf.roughnessHeight_),
roughnessConstant_(rwfpsf.roughnessConstant_),
roughnessFactor_(rwfpsf.roughnessFactor_)
roughnessFactor_(rwfpsf.roughnessFactor_),
maxIter_(rwfpsf.maxIter_),
tolerance_(rwfpsf.tolerance_)
{}
......@@ -265,7 +292,9 @@ nutURoughWallFunctionFvPatchScalarField::nutURoughWallFunctionFvPatchScalarField
nutWallFunctionFvPatchScalarField(rwfpsf, iF),
roughnessHeight_(rwfpsf.roughnessHeight_),
roughnessConstant_(rwfpsf.roughnessConstant_),
roughnessFactor_(rwfpsf.roughnessFactor_)
roughnessFactor_(rwfpsf.roughnessFactor_),
maxIter_(rwfpsf.maxIter_),
tolerance_(rwfpsf.tolerance_)
{}
......@@ -294,9 +323,6 @@ void nutURoughWallFunctionFvPatchScalarField::write(Ostream& os) const
{
fvPatchField<scalar>::write(os);
writeLocalEntries(os);
os.writeEntry("roughnessHeight", roughnessHeight_);
os.writeEntry("roughnessConstant", roughnessConstant_);
os.writeEntry("roughnessFactor", roughnessFactor_);
writeEntry("value", os);
}
......
......@@ -37,6 +37,8 @@ Usage
roughnessHeight | roughness height | yes |
roughnessConstant | roughness constanr | yes |
roughnessFactor | scaling factor | yes |
maxIter | Number of N-R iterations | no | 10
tolerance | Convergence tolerance | no | 0.0001
\endtable
Example of the boundary condition specification:
......@@ -53,7 +55,10 @@ Usage
Note
Suffers from non-exact restart since correctNut() (called through
turbulence->validate) returns a slightly different value every time
it is called. See nutUSpaldingWallFunctionFvPatchScalarField.C
it is called. See nutUSpaldingWallFunctionFvPatchScalarField.C.
Can be avoided by seeding the NR with e.g. the laminar viscosity
or tightening the convergence tolerance
to e.g. 1e-7 and the max number of iterations to 100.
See also
Foam::nutWallFunctionFvPatchScalarField
......@@ -95,6 +100,13 @@ class nutURoughWallFunctionFvPatchScalarField
scalar roughnessFactor_;
//- Max iterations in calcNut
const label maxIter_;
//- Convergence tolerance
const scalar tolerance_;
// Protected Member Functions
//- Calculate yPlus
......@@ -103,6 +115,9 @@ class nutURoughWallFunctionFvPatchScalarField
//- Calculate the turbulence viscosity
virtual tmp<scalarField> calcNut() const;
//- Write local wall function variables
virtual void writeLocalEntries(Ostream&) const;
public:
......
......@@ -119,19 +119,21 @@ tmp<scalarField> nutUSpaldingWallFunctionFvPatchScalarField::calcUTau
err = mag((ut - uTauNew)/ut);
ut = uTauNew;
if (debug)
{
iterations_++;
}
//iterations_++;
} while (ut > ROOTVSMALL && err > 0.01 && ++iter < 10);
} while (ut > ROOTVSMALL && err > tolerance_ && ++iter < maxIter_);
uTau[facei] = max(0.0, ut);
if (debug)
{
invocations_++;
}
//invocations_++;
//if (iter > 1)
//{
// nontrivial_++;
//}
//if (iter >= maxIter_)
//{
// nonconvergence_++;
//}
}
}
......@@ -139,6 +141,18 @@ tmp<scalarField> nutUSpaldingWallFunctionFvPatchScalarField::calcUTau
}
void Foam::nutUSpaldingWallFunctionFvPatchScalarField::writeLocalEntries
(
Ostream& os
) const
{
nutWallFunctionFvPatchScalarField::writeLocalEntries(os);
os.writeEntryIfDifferent<label>("maxIter", 10, maxIter_);
os.writeEntryIfDifferent<scalar>("tolerance", 0.01, tolerance_);
}
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
nutUSpaldingWallFunctionFvPatchScalarField::
......@@ -149,8 +163,12 @@ nutUSpaldingWallFunctionFvPatchScalarField
)
:
nutWallFunctionFvPatchScalarField(p, iF),
invocations_(0),
iterations_(0)
maxIter_(10),
tolerance_(0.01)
//invocations_(0),
//nontrivial_(0),
//nonconvergence_(0),
//iterations_(0)
{}
......@@ -164,8 +182,12 @@ nutUSpaldingWallFunctionFvPatchScalarField
)
:
nutWallFunctionFvPatchScalarField(ptf, p, iF, mapper),
invocations_(0),
iterations_(0)
maxIter_(ptf.maxIter_),
tolerance_(ptf.tolerance_)
//invocations_(0),
//nontrivial_(0),
//nonconvergence_(0),
//iterations_(0)
{}
......@@ -178,8 +200,12 @@ nutUSpaldingWallFunctionFvPatchScalarField
)
:
nutWallFunctionFvPatchScalarField(p, iF, dict),
invocations_(0),
iterations_(0)
maxIter_(dict.lookupOrDefault<label>("maxIter", 10)),
tolerance_(dict.lookupOrDefault<scalar>("tolerance", 0.01))
//invocations_(0),
//nontrivial_(0),
//nonconvergence_(0),
//iterations_(0)
{}
......@@ -190,8 +216,12 @@ nutUSpaldingWallFunctionFvPatchScalarField
)
:
nutWallFunctionFvPatchScalarField(wfpsf),
invocations_(wfpsf.invocations_),
iterations_(wfpsf.iterations_)
maxIter_(wfpsf.maxIter_),
tolerance_(wfpsf.tolerance_)
//invocations_(wfpsf.invocations_),
//nontrivial_(wfpsf.nontrivial_),
//nonconvergence_(wfpsf.nonconvergence_),
//iterations_(wfpsf.iterations_)
{}
......@@ -203,8 +233,12 @@ nutUSpaldingWallFunctionFvPatchScalarField
)
:
nutWallFunctionFvPatchScalarField(wfpsf, iF),
invocations_(0),
iterations_(0)
maxIter_(wfpsf.maxIter_),
tolerance_(wfpsf.tolerance_)
//invocations_(0),
//nontrivial_(0),
//nonconvergence_(0),
//iterations_(0)
{}
......@@ -213,15 +247,19 @@ nutUSpaldingWallFunctionFvPatchScalarField
nutUSpaldingWallFunctionFvPatchScalarField::
~nutUSpaldingWallFunctionFvPatchScalarField()
{
if (debug)
{
Info<< "nutUSpaldingWallFunctionFvPatchScalarField :"
<< " total invocations:"
<< returnReduce(invocations_, sumOp<label>())
<< " total iterations:"
<< returnReduce(iterations_, sumOp<label>())
<< endl;
}
//if (debug)
//{
// Info<< "nutUSpaldingWallFunctionFvPatchScalarField :"
// << " total invocations:"
// << returnReduce(invocations_, sumOp<label>())
// << " total iterations:"
// << returnReduce(iterations_, sumOp<label>())
// << " total non-convergence:"
// << returnReduce(nonconvergence_, sumOp<label>())
// << " total non-trivial:"
// << returnReduce(nontrivial_, sumOp<label>())
// << endl;
//}
}
......
......@@ -51,9 +51,19 @@ Usage
<patchName>
{
type nutUSpaldingWallFunction;
// .. nutWallFunctionFvPatchScalarField entries ..
}
\endverbatim
Additional entries (see below)
\table
Property | Description | Required | Default value
maxIter | Number of N-R iterations | no | 10
tolerance | Convergence tolerance | no | 0.01
\endtable
See also
Foam::nutWallFunctionFvPatchScalarField
......@@ -62,7 +72,8 @@ Note
turbulence->validate) returns a slightly different value every time
it is called. This is since the seed for the Newton-Raphson iteration
uses the current value of *this (= nut). Can be avoided by seeding the
NR with e.g. the laminar viscosity.
NR with e.g. the laminar viscosity or tightening the convergence tolerance
to e.g. 1e-7 and the max number of iterations to 100.
SourceFiles
nutUSpaldingWallFunctionFvPatchScalarField.C
......@@ -73,7 +84,6 @@ SourceFiles
#define nutUSpaldingWallFunctionFvPatchScalarField_H
#include "nutWallFunctionFvPatchScalarField.H"
#include "uint64.H"
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
......@@ -92,8 +102,17 @@ protected:
// Protected data
mutable uint64_t invocations_;
mutable uint64_t iterations_;
//- Max iterations in calcNut
const label maxIter_;
//- Convergence tolerance
const scalar tolerance_;
//- Uncomment in case of intrumentation
//mutable uint64_t invocations_;
//mutable uint64_t nontrivial_;
//mutable uint64_t nonconvergence_;
//mutable uint64_t iterations_;
// Protected Member Functions
......@@ -104,6 +123,9 @@ protected:
//- Calculate the friction velocity
virtual tmp<scalarField> calcUTau(const scalarField& magGradU) const;
//- Write local wall function variables
virtual void writeLocalEntries(Ostream&) const;
public:
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment