Merge solution control backport. Auther: Vanja Skuric & FSB team. Merge: Henrik Rusche
This commit is contained in:
commit
78ad89f025
88 changed files with 974 additions and 937 deletions
|
@ -10,9 +10,4 @@
|
||||||
|
|
||||||
UEqn.relax();
|
UEqn.relax();
|
||||||
|
|
||||||
eqnResidual = solve
|
solve(UEqn == -fvc::grad(p));
|
||||||
(
|
|
||||||
UEqn == -fvc::grad(p)
|
|
||||||
).initialResidual();
|
|
||||||
|
|
||||||
maxResidual = max(eqnResidual, maxResidual);
|
|
||||||
|
|
|
@ -1,9 +0,0 @@
|
||||||
// check convergence
|
|
||||||
|
|
||||||
if (maxResidual < convergenceCriterion)
|
|
||||||
{
|
|
||||||
Info<< "reached convergence criterion: " << convergenceCriterion << endl;
|
|
||||||
runTime.writeAndEnd();
|
|
||||||
Info<< "latestTime = " << runTime.timeName() << endl;
|
|
||||||
}
|
|
||||||
|
|
|
@ -39,3 +39,5 @@
|
||||||
thermo
|
thermo
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
mesh.schemesDict().setFluxRequired(p.name());
|
||||||
|
|
|
@ -23,8 +23,7 @@
|
||||||
|
|
||||||
hEqn.relax();
|
hEqn.relax();
|
||||||
|
|
||||||
eqnResidual = hEqn.solve().initialResidual();
|
hEqn.solve();
|
||||||
maxResidual = max(eqnResidual, maxResidual);
|
|
||||||
|
|
||||||
// Bounding of enthalpy taken out
|
// Bounding of enthalpy taken out
|
||||||
thermo.correct();
|
thermo.correct();
|
||||||
|
|
|
@ -1,7 +0,0 @@
|
||||||
// initialize values for convergence checks
|
|
||||||
|
|
||||||
scalar eqnResidual = 1, maxResidual = 0;
|
|
||||||
scalar convergenceCriterion = 0;
|
|
||||||
|
|
||||||
pimple.readIfPresent("convergence", convergenceCriterion);
|
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
// Needs to be outside of loop since p is changing, but psi and rho are not
|
// Needs to be outside of loop since p is changing, but psi and rho are not
|
||||||
surfaceScalarField rhoReff = rhof - psisf*fvc::interpolate(p);
|
surfaceScalarField rhoReff = rhof - psisf*fvc::interpolate(p);
|
||||||
|
|
||||||
for (int corr = 0; corr < nCorr; corr++)
|
while (pimple.correct())
|
||||||
{
|
{
|
||||||
U = rUA*UEqn.H();
|
U = rUA*UEqn.H();
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@
|
||||||
|
|
||||||
p.storePrevIter();
|
p.storePrevIter();
|
||||||
|
|
||||||
for (int nonOrth = 0; nonOrth <= nNonOrthCorr; nonOrth++)
|
while (pimple.correctNonOrthogonal())
|
||||||
{
|
{
|
||||||
fvScalarMatrix pEqn
|
fvScalarMatrix pEqn
|
||||||
(
|
(
|
||||||
|
@ -30,16 +30,10 @@
|
||||||
- fvm::laplacian(rho*rUA, p)
|
- fvm::laplacian(rho*rUA, p)
|
||||||
);
|
);
|
||||||
|
|
||||||
// Retain the residual from the first pressure solution
|
pEqn.solve();
|
||||||
eqnResidual = pEqn.solve().initialResidual();
|
|
||||||
|
|
||||||
if (corr == 0 && nonOrth == 0)
|
|
||||||
{
|
|
||||||
maxResidual = max(eqnResidual, maxResidual);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Calculate the flux
|
// Calculate the flux
|
||||||
if (nonOrth == nNonOrthCorr)
|
if (pimple.finalNonOrthogonalIter())
|
||||||
{
|
{
|
||||||
phi = phid2 + pEqn.flux();
|
phi = phid2 + pEqn.flux();
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,6 +36,7 @@ Author
|
||||||
#include "basicPsiThermo.H"
|
#include "basicPsiThermo.H"
|
||||||
#include "basicRhoThermo.H"
|
#include "basicRhoThermo.H"
|
||||||
#include "RASModel.H"
|
#include "RASModel.H"
|
||||||
|
#include "pimpleControl.H"
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
@ -46,9 +47,11 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
# include "createTime.H"
|
# include "createTime.H"
|
||||||
# include "createMesh.H"
|
# include "createMesh.H"
|
||||||
|
|
||||||
|
pimpleControl pimple(mesh);
|
||||||
|
|
||||||
# include "createThermo.H"
|
# include "createThermo.H"
|
||||||
# include "createFields.H"
|
# include "createFields.H"
|
||||||
# include "readPIMPLEControls.H"
|
|
||||||
# include "initContinuityErrs.H"
|
# include "initContinuityErrs.H"
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
@ -59,11 +62,8 @@ int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
Info<< "Time = " << runTime.timeName() << nl << endl;
|
Info<< "Time = " << runTime.timeName() << nl << endl;
|
||||||
|
|
||||||
# include "readPIMPLEControls.H"
|
|
||||||
# include "readFieldBounds.H"
|
# include "readFieldBounds.H"
|
||||||
|
|
||||||
# include "initConvergenceCheck.H"
|
|
||||||
|
|
||||||
# include "UEqn.H"
|
# include "UEqn.H"
|
||||||
# include "pEqn.H"
|
# include "pEqn.H"
|
||||||
|
|
||||||
|
@ -79,8 +79,6 @@ int main(int argc, char *argv[])
|
||||||
Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s"
|
Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s"
|
||||||
<< " ClockTime = " << runTime.elapsedClockTime() << " s"
|
<< " ClockTime = " << runTime.elapsedClockTime() << " s"
|
||||||
<< nl << endl;
|
<< nl << endl;
|
||||||
|
|
||||||
# include "convergenceCheck.H"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# include "clearThermo.H"
|
# include "clearThermo.H"
|
||||||
|
|
|
@ -13,9 +13,4 @@
|
||||||
|
|
||||||
UEqn.relax();
|
UEqn.relax();
|
||||||
|
|
||||||
eqnResidual = solve
|
solve(UEqn == -fvc::grad(p));
|
||||||
(
|
|
||||||
UEqn == -fvc::grad(p)
|
|
||||||
).initialResidual();
|
|
||||||
|
|
||||||
maxResidual = max(eqnResidual, maxResidual);
|
|
||||||
|
|
|
@ -1,9 +0,0 @@
|
||||||
// check convergence
|
|
||||||
|
|
||||||
if (maxResidual < convergenceCriterion)
|
|
||||||
{
|
|
||||||
Info<< "reached convergence criterion: " << convergenceCriterion << endl;
|
|
||||||
runTime.writeAndEnd();
|
|
||||||
Info<< "latestTime = " << runTime.timeName() << endl;
|
|
||||||
}
|
|
||||||
|
|
|
@ -80,3 +80,5 @@
|
||||||
mesh
|
mesh
|
||||||
);
|
);
|
||||||
i == h - 0.5*(magSqr(Urot) - magSqr(Urel));
|
i == h - 0.5*(magSqr(Urot) - magSqr(Urel));
|
||||||
|
|
||||||
|
mesh.schemesDict().setFluxRequired(p.name());
|
||||||
|
|
|
@ -18,8 +18,7 @@
|
||||||
|
|
||||||
iEqn.relax();
|
iEqn.relax();
|
||||||
|
|
||||||
eqnResidual = iEqn.solve().initialResidual();
|
iEqn.solve();
|
||||||
maxResidual = max(eqnResidual, maxResidual);
|
|
||||||
|
|
||||||
// From rothalpy, calculate enthalpy after solution of rothalpy equation
|
// From rothalpy, calculate enthalpy after solution of rothalpy equation
|
||||||
h = i + 0.5*(magSqr(Urot) - magSqr(Urel));
|
h = i + 0.5*(magSqr(Urot) - magSqr(Urel));
|
||||||
|
|
|
@ -1,7 +0,0 @@
|
||||||
// initialize values for convergence checks
|
|
||||||
|
|
||||||
scalar eqnResidual = 1, maxResidual = 0;
|
|
||||||
scalar convergenceCriterion = 0;
|
|
||||||
|
|
||||||
pimple.readIfPresent("convergence", convergenceCriterion);
|
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
// Needs to be outside of loop since p is changing, but psi and rho are not
|
// Needs to be outside of loop since p is changing, but psi and rho are not
|
||||||
surfaceScalarField rhoReff = rhof - psisf*fvc::interpolate(p);
|
surfaceScalarField rhoReff = rhof - psisf*fvc::interpolate(p);
|
||||||
|
|
||||||
for (int corr = 0; corr < nCorr; corr++)
|
while (pimple.correct())
|
||||||
{
|
{
|
||||||
U = rUA*UEqn.H();
|
U = rUA*UEqn.H();
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@
|
||||||
|
|
||||||
p.storePrevIter();
|
p.storePrevIter();
|
||||||
|
|
||||||
for (int nonOrth = 0; nonOrth <= nNonOrthCorr; nonOrth++)
|
while (pimple.correctNonOrthogonal())
|
||||||
{
|
{
|
||||||
fvScalarMatrix pEqn
|
fvScalarMatrix pEqn
|
||||||
(
|
(
|
||||||
|
@ -30,16 +30,10 @@
|
||||||
- fvm::laplacian(rho*rUA, p)
|
- fvm::laplacian(rho*rUA, p)
|
||||||
);
|
);
|
||||||
|
|
||||||
// Retain the residual from the first pressure solution
|
pEqn.solve();
|
||||||
eqnResidual = pEqn.solve().initialResidual();
|
|
||||||
|
|
||||||
if (corr == 0 && nonOrth == 0)
|
|
||||||
{
|
|
||||||
maxResidual = max(eqnResidual, maxResidual);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Calculate the flux
|
// Calculate the flux
|
||||||
if (nonOrth == nNonOrthCorr)
|
if (pimple.finalNonOrthogonalIter())
|
||||||
{
|
{
|
||||||
phi = phid2 + pEqn.flux();
|
phi = phid2 + pEqn.flux();
|
||||||
}
|
}
|
||||||
|
|
|
@ -43,6 +43,7 @@ GE CONFIDENTIAL INFORMATION 2016 General Electric Company. All Rights Reserved
|
||||||
#include "basicRhoThermo.H"
|
#include "basicRhoThermo.H"
|
||||||
#include "RASModel.H"
|
#include "RASModel.H"
|
||||||
#include "MRFZones.H"
|
#include "MRFZones.H"
|
||||||
|
#include "pimpleControl.H"
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
@ -53,9 +54,11 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
# include "createTime.H"
|
# include "createTime.H"
|
||||||
# include "createMesh.H"
|
# include "createMesh.H"
|
||||||
|
|
||||||
|
pimpleControl pimple(mesh);
|
||||||
|
|
||||||
# include "createThermo.H"
|
# include "createThermo.H"
|
||||||
# include "createFields.H"
|
# include "createFields.H"
|
||||||
# include "readPIMPLEControls.H"
|
|
||||||
# include "initContinuityErrs.H"
|
# include "initContinuityErrs.H"
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
@ -66,11 +69,8 @@ int main(int argc, char *argv[])
|
||||||
{
|
{
|
||||||
Info<< "Time = " << runTime.timeName() << nl << endl;
|
Info<< "Time = " << runTime.timeName() << nl << endl;
|
||||||
|
|
||||||
# include "readPIMPLEControls.H"
|
|
||||||
# include "readFieldBounds.H"
|
# include "readFieldBounds.H"
|
||||||
|
|
||||||
# include "initConvergenceCheck.H"
|
|
||||||
|
|
||||||
# include "UEqn.H"
|
# include "UEqn.H"
|
||||||
# include "pEqn.H"
|
# include "pEqn.H"
|
||||||
|
|
||||||
|
@ -86,8 +86,6 @@ int main(int argc, char *argv[])
|
||||||
Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s"
|
Info<< "ExecutionTime = " << runTime.elapsedCpuTime() << " s"
|
||||||
<< " ClockTime = " << runTime.elapsedClockTime() << " s"
|
<< " ClockTime = " << runTime.elapsedClockTime() << " s"
|
||||||
<< nl << endl;
|
<< nl << endl;
|
||||||
|
|
||||||
# include "convergenceCheck.H"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# include "clearThermo.H"
|
# include "clearThermo.H"
|
||||||
|
|
|
@ -154,3 +154,5 @@
|
||||||
aMesh,
|
aMesh,
|
||||||
dimensionedScalar("one", dimless, 0.01)
|
dimensionedScalar("one", dimless, 0.01)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
aMesh.schemesDict().setFluxRequired("h");
|
||||||
|
|
|
@ -125,6 +125,7 @@ Foam::multiphaseMixture::multiphaseMixture
|
||||||
forAllIter(PtrDictionary<phase>, phases_, iter)
|
forAllIter(PtrDictionary<phase>, phases_, iter)
|
||||||
{
|
{
|
||||||
alphaTable_.add(iter());
|
alphaTable_.add(iter());
|
||||||
|
mesh_.schemesDict().setFluxRequired(iter().volScalarField::name());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -102,7 +102,7 @@ int main(int argc, char *argv[])
|
||||||
//# include "waveCourantNo.H"
|
//# include "waveCourantNo.H"
|
||||||
|
|
||||||
int iCorr = 0;
|
int iCorr = 0;
|
||||||
lduMatrix::solverPerformance solverPerf;
|
lduSolverPerformance solverPerf;
|
||||||
scalar initialResidual = 0;
|
scalar initialResidual = 0;
|
||||||
scalar relativeResidual = 1;
|
scalar relativeResidual = 1;
|
||||||
//scalar forceResidual = 1;
|
//scalar forceResidual = 1;
|
||||||
|
|
|
@ -86,7 +86,7 @@ int main(int argc, char *argv[])
|
||||||
//# include "waveCourantNo.H"
|
//# include "waveCourantNo.H"
|
||||||
|
|
||||||
int iCorr = 0;
|
int iCorr = 0;
|
||||||
lduMatrix::solverPerformance solverPerf;
|
lduSolverPerformance solverPerf;
|
||||||
scalar initialResidual = 0;
|
scalar initialResidual = 0;
|
||||||
scalar relativeResidual = 1;
|
scalar relativeResidual = 1;
|
||||||
//scalar forceResidual = 1;
|
//scalar forceResidual = 1;
|
||||||
|
|
|
@ -70,7 +70,7 @@ int main(int argc, char *argv[])
|
||||||
int iCorr = 0;
|
int iCorr = 0;
|
||||||
scalar initialResidual = 0;
|
scalar initialResidual = 0;
|
||||||
scalar relativeResidual = 1.0;
|
scalar relativeResidual = 1.0;
|
||||||
lduMatrix::solverPerformance solverPerf;
|
lduSolverPerformance solverPerf;
|
||||||
lduMatrix::debug = 0;
|
lduMatrix::debug = 0;
|
||||||
|
|
||||||
do
|
do
|
||||||
|
|
|
@ -60,7 +60,7 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
int iCorr = 0;
|
int iCorr = 0;
|
||||||
scalar initialResidual = 0;
|
scalar initialResidual = 0;
|
||||||
lduMatrix::solverPerformance solverPerf;
|
lduSolverPerformance solverPerf;
|
||||||
scalar relativeResidual = 1.0;
|
scalar relativeResidual = 1.0;
|
||||||
lduMatrix::debug=0;
|
lduMatrix::debug=0;
|
||||||
|
|
||||||
|
|
|
@ -62,7 +62,7 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
int iCorr = 0;
|
int iCorr = 0;
|
||||||
scalar initialResidual = 0;
|
scalar initialResidual = 0;
|
||||||
lduMatrix::solverPerformance solverPerf;
|
lduSolverPerformance solverPerf;
|
||||||
scalar relativeResidual = 1.0;
|
scalar relativeResidual = 1.0;
|
||||||
lduMatrix::debug = 0;
|
lduMatrix::debug = 0;
|
||||||
|
|
||||||
|
|
|
@ -73,7 +73,7 @@ int main(int argc, char *argv[])
|
||||||
# include "readSolidMechanicsControls.H"
|
# include "readSolidMechanicsControls.H"
|
||||||
|
|
||||||
int iCorr = 0;
|
int iCorr = 0;
|
||||||
lduMatrix::solverPerformance solverPerf;
|
lduSolverPerformance solverPerf;
|
||||||
scalar initialResidual = 1.0;
|
scalar initialResidual = 1.0;
|
||||||
scalar relativeResidual = 1.0;
|
scalar relativeResidual = 1.0;
|
||||||
lduMatrix::debug = 0;
|
lduMatrix::debug = 0;
|
||||||
|
|
|
@ -103,7 +103,7 @@ int main(int argc, char *argv[])
|
||||||
//# include "waveCourantNo.H"
|
//# include "waveCourantNo.H"
|
||||||
|
|
||||||
int iCorr = 0;
|
int iCorr = 0;
|
||||||
lduMatrix::solverPerformance solverPerf;
|
lduSolverPerformance solverPerf;
|
||||||
scalar initialResidual = 0;
|
scalar initialResidual = 0;
|
||||||
scalar relativeResidual = 1;
|
scalar relativeResidual = 1;
|
||||||
//scalar forceResidual = 1;
|
//scalar forceResidual = 1;
|
||||||
|
|
|
@ -78,7 +78,7 @@ int main(int argc, char *argv[])
|
||||||
# include "readSolidMechanicsControls.H"
|
# include "readSolidMechanicsControls.H"
|
||||||
|
|
||||||
int iCorr = 0;
|
int iCorr = 0;
|
||||||
lduMatrix::solverPerformance solverPerf;
|
lduSolverPerformance solverPerf;
|
||||||
scalar initialResidual = 1.0;
|
scalar initialResidual = 1.0;
|
||||||
lduMatrix::debug = 0;
|
lduMatrix::debug = 0;
|
||||||
|
|
||||||
|
|
|
@ -67,7 +67,7 @@ int main(int argc, char *argv[])
|
||||||
# include "readSolidMechanicsControls.H"
|
# include "readSolidMechanicsControls.H"
|
||||||
|
|
||||||
int iCorr = 0;
|
int iCorr = 0;
|
||||||
lduMatrix::solverPerformance solverPerf;
|
lduSolverPerformance solverPerf;
|
||||||
scalar initialResidual = 1.0;
|
scalar initialResidual = 1.0;
|
||||||
scalar relativeResidual = 1.0;
|
scalar relativeResidual = 1.0;
|
||||||
lduMatrix::debug = 0;
|
lduMatrix::debug = 0;
|
||||||
|
|
|
@ -64,7 +64,7 @@ int main(int argc, char *argv[])
|
||||||
|
|
||||||
int iCorr = 0;
|
int iCorr = 0;
|
||||||
scalar initialResidual = 0;
|
scalar initialResidual = 0;
|
||||||
lduMatrix::solverPerformance solverPerf;
|
lduSolverPerformance solverPerf;
|
||||||
scalar relativeResidual = GREAT;
|
scalar relativeResidual = GREAT;
|
||||||
lduMatrix::debug = 0;
|
lduMatrix::debug = 0;
|
||||||
|
|
||||||
|
|
|
@ -80,7 +80,7 @@ int main(int argc, char *argv[])
|
||||||
# include "readSolidMechanicsControls.H"
|
# include "readSolidMechanicsControls.H"
|
||||||
|
|
||||||
int iCorr = 0;
|
int iCorr = 0;
|
||||||
lduMatrix::solverPerformance solverPerf;
|
lduSolverPerformance solverPerf;
|
||||||
scalar initialResidual = 0;
|
scalar initialResidual = 0;
|
||||||
scalar relativeResidual = 1.0;
|
scalar relativeResidual = 1.0;
|
||||||
lduMatrix::debug = 0;
|
lduMatrix::debug = 0;
|
||||||
|
|
|
@ -65,7 +65,7 @@ int main(int argc, char *argv[])
|
||||||
# include "readSolidMechanicsControls.H"
|
# include "readSolidMechanicsControls.H"
|
||||||
|
|
||||||
int iCorr = 0;
|
int iCorr = 0;
|
||||||
lduMatrix::solverPerformance solverPerf;
|
lduSolverPerformance solverPerf;
|
||||||
scalar initialResidual = 1.0;
|
scalar initialResidual = 1.0;
|
||||||
scalar relativeResidual = 1.0;
|
scalar relativeResidual = 1.0;
|
||||||
scalar plasticResidual = 1.0;
|
scalar plasticResidual = 1.0;
|
||||||
|
|
|
@ -69,7 +69,7 @@ int main(int argc, char *argv[])
|
||||||
# include "readSolidMechanicsControls.H"
|
# include "readSolidMechanicsControls.H"
|
||||||
|
|
||||||
int iCorr = 0;
|
int iCorr = 0;
|
||||||
lduMatrix::solverPerformance solverPerf;
|
lduSolverPerformance solverPerf;
|
||||||
scalar initialResidual = 1.0;
|
scalar initialResidual = 1.0;
|
||||||
scalar relativeResidual = 1.0;
|
scalar relativeResidual = 1.0;
|
||||||
// lduMatrix::debug = 0;
|
// lduMatrix::debug = 0;
|
||||||
|
|
|
@ -66,8 +66,8 @@ int main(int argc, char *argv[])
|
||||||
scalar initialResidual = 1.0;
|
scalar initialResidual = 1.0;
|
||||||
scalar relResT = 1.0;
|
scalar relResT = 1.0;
|
||||||
scalar relResU = 1.0;
|
scalar relResU = 1.0;
|
||||||
lduMatrix::solverPerformance solverPerfU;
|
lduSolverPerformance solverPerfU;
|
||||||
lduMatrix::solverPerformance solverPerfT;
|
lduSolverPerformance solverPerfT;
|
||||||
lduMatrix::debug = 0;
|
lduMatrix::debug = 0;
|
||||||
|
|
||||||
// solve energy equation for temperature
|
// solve energy equation for temperature
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
# include "readSolidMechanicsControls.H"
|
# include "readSolidMechanicsControls.H"
|
||||||
|
|
||||||
int iCorr = 0;
|
int iCorr = 0;
|
||||||
lduMatrix::solverPerformance solverPerf;
|
lduSolverPerformance solverPerf;
|
||||||
scalar initialResidual = 0;
|
scalar initialResidual = 0;
|
||||||
|
|
||||||
lduMatrix::debug = 0;
|
lduMatrix::debug = 0;
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
# include "readSolidMechanicsControls.H"
|
# include "readSolidMechanicsControls.H"
|
||||||
|
|
||||||
int iCorr = 0;
|
int iCorr = 0;
|
||||||
lduMatrix::solverPerformance solverPerf;
|
lduSolverPerformance solverPerf;
|
||||||
scalar initialResidual = 0;
|
scalar initialResidual = 0;
|
||||||
|
|
||||||
lduMatrix::debug = 0;
|
lduMatrix::debug = 0;
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
Info << "lambda = " << average(lambda.internalField()) << endl;
|
Info << "lambda = " << average(lambda.internalField()) << endl;
|
||||||
|
|
||||||
int iCorr = 0;
|
int iCorr = 0;
|
||||||
lduMatrix::solverPerformance solverPerf;
|
lduSolverPerformance solverPerf;
|
||||||
scalar initialResidual = 0;
|
scalar initialResidual = 0;
|
||||||
scalar err = GREAT;
|
scalar err = GREAT;
|
||||||
|
|
||||||
|
|
|
@ -73,7 +73,7 @@ int main(int argc, char *argv[])
|
||||||
Info << "average lambda = " << average(lambdaf.internalField()) << endl;
|
Info << "average lambda = " << average(lambdaf.internalField()) << endl;
|
||||||
|
|
||||||
int iCorr = 0;
|
int iCorr = 0;
|
||||||
lduMatrix::solverPerformance solverPerf;
|
lduSolverPerformance solverPerf;
|
||||||
scalar initialResidual = 1.0;
|
scalar initialResidual = 1.0;
|
||||||
scalar residual = 1.0;
|
scalar residual = 1.0;
|
||||||
surfaceSymmTensorField DSigmaCorrf = fvc::interpolate(DSigmaCorr);
|
surfaceSymmTensorField DSigmaCorrf = fvc::interpolate(DSigmaCorr);
|
||||||
|
|
|
@ -61,27 +61,87 @@ void faMeshDecomposition::distributeFaces()
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
labelHashSet faceProcAddressingHash
|
// If faMesh's fvPatch is a part of the global face zones, faces of that
|
||||||
(
|
// patch will be present on all processors. Because of that, looping
|
||||||
labelIOList
|
// through faceProcAddressing will decompose global faMesh faces to the
|
||||||
(
|
// very last processor regardless of where fvPatch is really decomposed.
|
||||||
IOobject
|
// Since global faces which do not belong to specific processor are
|
||||||
(
|
// located at the end of the faceProcAddressing, cutting it at
|
||||||
"faceProcAddressing",
|
// i = owner.size() will correctly decompose faMesh faces.
|
||||||
"constant",
|
// Vanja Skuric, 2016-04-21
|
||||||
procMesh.meshSubDir,
|
if (decompositionDict_.found("globalFaceZones"))
|
||||||
procMesh,
|
|
||||||
IOobject::MUST_READ,
|
|
||||||
IOobject::NO_WRITE
|
|
||||||
)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
|
|
||||||
forAll (faceLabels(), faceI)
|
|
||||||
{
|
{
|
||||||
if (faceProcAddressingHash.found(faceLabels()[faceI] + 1))
|
labelList faceProcAddressing
|
||||||
|
(
|
||||||
|
labelIOList
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
"faceProcAddressing",
|
||||||
|
"constant",
|
||||||
|
procMesh.meshSubDir,
|
||||||
|
procMesh,
|
||||||
|
IOobject::MUST_READ,
|
||||||
|
IOobject::NO_WRITE
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
const label ownerSize =
|
||||||
|
(
|
||||||
|
labelIOList
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
"owner",
|
||||||
|
"constant",
|
||||||
|
procMesh.meshSubDir,
|
||||||
|
procMesh,
|
||||||
|
IOobject::MUST_READ,
|
||||||
|
IOobject::NO_WRITE
|
||||||
|
)
|
||||||
|
)
|
||||||
|
).size();
|
||||||
|
|
||||||
|
labelHashSet faceProcAddressingHash(ownerSize);
|
||||||
|
|
||||||
|
for (int i = 0; i < ownerSize; ++i)
|
||||||
{
|
{
|
||||||
faceToProc_[faceI] = procI;
|
faceProcAddressingHash.insert(faceProcAddressing[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
forAll (faceLabels(), faceI)
|
||||||
|
{
|
||||||
|
if (faceProcAddressingHash.found(faceLabels()[faceI] + 1))
|
||||||
|
{
|
||||||
|
faceToProc_[faceI] = procI;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
labelHashSet faceProcAddressingHash
|
||||||
|
(
|
||||||
|
labelIOList
|
||||||
|
(
|
||||||
|
IOobject
|
||||||
|
(
|
||||||
|
"faceProcAddressing",
|
||||||
|
"constant",
|
||||||
|
procMesh.meshSubDir,
|
||||||
|
procMesh,
|
||||||
|
IOobject::MUST_READ,
|
||||||
|
IOobject::NO_WRITE
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
forAll (faceLabels(), faceI)
|
||||||
|
{
|
||||||
|
if (faceProcAddressingHash.found(faceLabels()[faceI] + 1))
|
||||||
|
{
|
||||||
|
faceToProc_[faceI] = procI;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -93,7 +93,7 @@ protected:
|
||||||
}
|
}
|
||||||
|
|
||||||
// Holds recent solver performance
|
// Holds recent solver performance
|
||||||
lduMatrix::solverPerformance solverPerf_;
|
lduSolverPerformance solverPerf_;
|
||||||
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -125,7 +125,7 @@ public:
|
||||||
virtual void updateMesh(const mapPolyMesh&);
|
virtual void updateMesh(const mapPolyMesh&);
|
||||||
|
|
||||||
//- Return recent solver performance
|
//- Return recent solver performance
|
||||||
const lduMatrix::solverPerformance& solverPerformance() const
|
const lduSolverPerformance& solverPerformance() const
|
||||||
{
|
{
|
||||||
return solverPerf_;
|
return solverPerf_;
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,31 +21,45 @@ License
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with foam-extend. If not, see <http://www.gnu.org/licenses/>.
|
along with foam-extend. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
Description
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
#include "error.H"
|
|
||||||
#include "objectRegistry.H"
|
|
||||||
#include "foamTime.H"
|
|
||||||
#include "faSchemes.H"
|
#include "faSchemes.H"
|
||||||
|
#include "objectRegistry.H"
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
|
|
||||||
Foam::debug::debugSwitch
|
Foam::debug::debugSwitch
|
||||||
faSchemes::debug
|
Foam::faSchemes::debug
|
||||||
(
|
(
|
||||||
"faSchemes",
|
"faSchemes",
|
||||||
false
|
false
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * Private Member Functions * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
void Foam::faSchemes::clear()
|
||||||
|
{
|
||||||
|
ddtSchemes_.clear();
|
||||||
|
defaultDdtScheme_.clear();
|
||||||
|
d2dt2Schemes_.clear();
|
||||||
|
defaultD2dt2Scheme_.clear();
|
||||||
|
interpolationSchemes_.clear();
|
||||||
|
defaultInterpolationScheme_.clear();
|
||||||
|
divSchemes_.clear(); // optional
|
||||||
|
defaultDivScheme_.clear();
|
||||||
|
gradSchemes_.clear(); // optional
|
||||||
|
defaultGradScheme_.clear();
|
||||||
|
lnGradSchemes_.clear();
|
||||||
|
defaultLnGradScheme_.clear();
|
||||||
|
laplacianSchemes_.clear(); // optional
|
||||||
|
defaultLaplacianScheme_.clear();
|
||||||
|
fluxRequired_.clear();
|
||||||
|
defaultFluxRequired_ = false;
|
||||||
|
}
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
faSchemes::faSchemes(const objectRegistry& obr)
|
Foam::faSchemes::faSchemes(const objectRegistry& obr)
|
||||||
:
|
:
|
||||||
IOdictionary
|
IOdictionary
|
||||||
(
|
(
|
||||||
|
@ -59,21 +73,106 @@ faSchemes::faSchemes(const objectRegistry& obr)
|
||||||
IOobject::NO_WRITE
|
IOobject::NO_WRITE
|
||||||
)
|
)
|
||||||
),
|
),
|
||||||
ddtSchemes_(ITstream("ddtSchemes", tokenList())()),
|
ddtSchemes_
|
||||||
defaultDdtScheme_("default", tokenList()),
|
(
|
||||||
d2dt2Schemes_(ITstream("d2dt2Schemes", tokenList())()),
|
ITstream
|
||||||
defaultD2dt2Scheme_("default", tokenList()),
|
(
|
||||||
interpolationSchemes_(ITstream("interpolationSchemes", tokenList())()),
|
objectPath() + "::ddtSchemes",
|
||||||
defaultInterpolationScheme_("default", tokenList()),
|
tokenList()
|
||||||
divSchemes_(ITstream("divSchemes", tokenList())()),
|
)()
|
||||||
defaultDivScheme_("default", tokenList()),
|
),
|
||||||
gradSchemes_(ITstream("gradSchemes", tokenList())()),
|
defaultDdtScheme_
|
||||||
defaultGradScheme_("default", tokenList()),
|
(
|
||||||
lnGradSchemes_(ITstream("lnGradSchemes", tokenList())()),
|
ddtSchemes_.name() + "::default",
|
||||||
defaultLnGradScheme_("default", tokenList()),
|
tokenList()
|
||||||
laplacianSchemes_(ITstream("laplacianSchemes", tokenList())()),
|
),
|
||||||
defaultLaplacianScheme_("default", tokenList()),
|
d2dt2Schemes_
|
||||||
fluxRequired_(ITstream("fluxRequired", tokenList())())
|
(
|
||||||
|
ITstream
|
||||||
|
(
|
||||||
|
objectPath() + "::d2dt2Schemes",
|
||||||
|
tokenList()
|
||||||
|
)()
|
||||||
|
),
|
||||||
|
defaultD2dt2Scheme_
|
||||||
|
(
|
||||||
|
d2dt2Schemes_.name() + "::default",
|
||||||
|
tokenList()
|
||||||
|
),
|
||||||
|
interpolationSchemes_
|
||||||
|
(
|
||||||
|
ITstream
|
||||||
|
(
|
||||||
|
objectPath() + "::interpolationSchemes",
|
||||||
|
tokenList()
|
||||||
|
)()
|
||||||
|
),
|
||||||
|
defaultInterpolationScheme_
|
||||||
|
(
|
||||||
|
interpolationSchemes_.name() + "::default",
|
||||||
|
tokenList()
|
||||||
|
),
|
||||||
|
divSchemes_
|
||||||
|
(
|
||||||
|
ITstream
|
||||||
|
(
|
||||||
|
objectPath() + "::divSchemes",
|
||||||
|
tokenList()
|
||||||
|
)()
|
||||||
|
),
|
||||||
|
defaultDivScheme_
|
||||||
|
(
|
||||||
|
divSchemes_.name() + "::default",
|
||||||
|
tokenList()
|
||||||
|
),
|
||||||
|
gradSchemes_
|
||||||
|
(
|
||||||
|
ITstream
|
||||||
|
(
|
||||||
|
objectPath() + "::gradSchemes",
|
||||||
|
tokenList()
|
||||||
|
)()
|
||||||
|
),
|
||||||
|
defaultGradScheme_
|
||||||
|
(
|
||||||
|
gradSchemes_.name() + "::default",
|
||||||
|
tokenList()
|
||||||
|
),
|
||||||
|
lnGradSchemes_
|
||||||
|
(
|
||||||
|
ITstream
|
||||||
|
(
|
||||||
|
objectPath() + "::snGradSchemes",
|
||||||
|
tokenList()
|
||||||
|
)()
|
||||||
|
),
|
||||||
|
defaultLnGradScheme_
|
||||||
|
(
|
||||||
|
lnGradSchemes_.name() + "::default",
|
||||||
|
tokenList()
|
||||||
|
),
|
||||||
|
laplacianSchemes_
|
||||||
|
(
|
||||||
|
ITstream
|
||||||
|
(
|
||||||
|
objectPath() + "::laplacianSchemes",
|
||||||
|
tokenList()
|
||||||
|
)()
|
||||||
|
),
|
||||||
|
defaultLaplacianScheme_
|
||||||
|
(
|
||||||
|
laplacianSchemes_.name() + "::default",
|
||||||
|
tokenList()
|
||||||
|
),
|
||||||
|
fluxRequired_
|
||||||
|
(
|
||||||
|
ITstream
|
||||||
|
(
|
||||||
|
objectPath() + "::fluxRequired",
|
||||||
|
tokenList()
|
||||||
|
)()
|
||||||
|
),
|
||||||
|
defaultFluxRequired_(false)
|
||||||
{
|
{
|
||||||
if (!headerOk())
|
if (!headerOk())
|
||||||
{
|
{
|
||||||
|
@ -85,6 +184,8 @@ faSchemes::faSchemes(const objectRegistry& obr)
|
||||||
) << "faSchemes dictionary not found. Creating default."
|
) << "faSchemes dictionary not found. Creating default."
|
||||||
<< endl;
|
<< endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
regIOobject::write();
|
||||||
}
|
}
|
||||||
|
|
||||||
read();
|
read();
|
||||||
|
@ -93,27 +194,58 @@ faSchemes::faSchemes(const objectRegistry& obr)
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||||
|
|
||||||
bool faSchemes::read()
|
bool Foam::faSchemes::read()
|
||||||
{
|
{
|
||||||
bool readOk = false;
|
if (regIOobject::read())
|
||||||
|
|
||||||
if (headerOk())
|
|
||||||
{
|
|
||||||
readOk = regIOobject::read();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (readOk)
|
|
||||||
{
|
{
|
||||||
const dictionary& dict = schemesDict();
|
const dictionary& dict = schemesDict();
|
||||||
|
|
||||||
// ddt Schemes
|
// persistent settings across reads is incorrect
|
||||||
|
clear();
|
||||||
|
|
||||||
if (dict.found("ddtSchemes"))
|
if (dict.found("ddtSchemes"))
|
||||||
{
|
{
|
||||||
ddtSchemes_ = dict.subDict("ddtSchemes");
|
ddtSchemes_ = dict.subDict("ddtSchemes");
|
||||||
}
|
}
|
||||||
|
else if (dict.found("timeScheme"))
|
||||||
|
{
|
||||||
|
// For backward compatibility.
|
||||||
|
// The timeScheme will be deprecated with warning or removed
|
||||||
|
WarningIn("fvSchemes::read()")
|
||||||
|
<< "Using deprecated 'timeScheme' instead of 'ddtSchemes'"
|
||||||
|
<< nl << endl;
|
||||||
|
|
||||||
|
word schemeName(dict.lookup("timeScheme"));
|
||||||
|
|
||||||
|
if (schemeName == "EulerImplicit")
|
||||||
|
{
|
||||||
|
schemeName = "Euler";
|
||||||
|
}
|
||||||
|
else if (schemeName == "BackwardDifferencing")
|
||||||
|
{
|
||||||
|
schemeName = "backward";
|
||||||
|
}
|
||||||
|
else if (schemeName == "SteadyState")
|
||||||
|
{
|
||||||
|
schemeName = "steadyState";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
FatalIOErrorIn("fvSchemes::read()", dict.lookup("timeScheme"))
|
||||||
|
<< "\n Only EulerImplicit, BackwardDifferencing and "
|
||||||
|
"SteadyState\n are supported by the old timeScheme "
|
||||||
|
"specification.\n Please use ddtSchemes instead."
|
||||||
|
<< exit(FatalIOError);
|
||||||
|
}
|
||||||
|
|
||||||
|
ddtSchemes_.set("default", schemeName);
|
||||||
|
|
||||||
|
ddtSchemes_.lookup("default")[0].lineNumber() =
|
||||||
|
dict.lookup("timeScheme").lineNumber();
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
ddtSchemes_.add("default", "none");
|
ddtSchemes_.set("default", "none");
|
||||||
}
|
}
|
||||||
|
|
||||||
if
|
if
|
||||||
|
@ -126,7 +258,6 @@ bool faSchemes::read()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// d2dt2 schemes
|
|
||||||
if (dict.found("d2dt2Schemes"))
|
if (dict.found("d2dt2Schemes"))
|
||||||
{
|
{
|
||||||
d2dt2Schemes_ = dict.subDict("d2dt2Schemes");
|
d2dt2Schemes_ = dict.subDict("d2dt2Schemes");
|
||||||
|
@ -134,29 +265,30 @@ bool faSchemes::read()
|
||||||
else if (dict.found("timeScheme"))
|
else if (dict.found("timeScheme"))
|
||||||
{
|
{
|
||||||
// For backward compatibility.
|
// For backward compatibility.
|
||||||
// The timeScheme will be deprecated with warning or removed in 2.4.
|
// The timeScheme will be deprecated with warning or removed
|
||||||
|
WarningIn("fvSchemes::read()")
|
||||||
|
<< "Using deprecated 'timeScheme' instead of 'd2dt2Schemes'"
|
||||||
|
<< nl << endl;
|
||||||
|
|
||||||
word timeSchemeName(dict.lookup("timeScheme"));
|
word schemeName(dict.lookup("timeScheme"));
|
||||||
|
|
||||||
if (timeSchemeName == "EulerImplicit")
|
if (schemeName == "EulerImplicit")
|
||||||
{
|
{
|
||||||
timeSchemeName = "Euler";
|
schemeName = "Euler";
|
||||||
}
|
}
|
||||||
else if (timeSchemeName == "SteadyState")
|
else if (schemeName == "SteadyState")
|
||||||
{
|
{
|
||||||
timeSchemeName = "steadyState";
|
schemeName = "steadyState";
|
||||||
}
|
}
|
||||||
|
|
||||||
if (d2dt2Schemes_.found("default"))
|
d2dt2Schemes_.set("default", schemeName);
|
||||||
{
|
|
||||||
d2dt2Schemes_.remove("default");
|
|
||||||
}
|
|
||||||
|
|
||||||
d2dt2Schemes_.add("default", timeSchemeName);
|
d2dt2Schemes_.lookup("default")[0].lineNumber() =
|
||||||
|
dict.lookup("timeScheme").lineNumber();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
d2dt2Schemes_.add("default", "none");
|
d2dt2Schemes_.set("default", "none");
|
||||||
}
|
}
|
||||||
|
|
||||||
if
|
if
|
||||||
|
@ -169,7 +301,6 @@ bool faSchemes::read()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Interpolation schemes
|
|
||||||
if (dict.found("interpolationSchemes"))
|
if (dict.found("interpolationSchemes"))
|
||||||
{
|
{
|
||||||
interpolationSchemes_ = dict.subDict("interpolationSchemes");
|
interpolationSchemes_ = dict.subDict("interpolationSchemes");
|
||||||
|
@ -190,15 +321,9 @@ bool faSchemes::read()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Div schemes
|
|
||||||
if (dict.found("divSchemes"))
|
if (dict.found("divSchemes"))
|
||||||
{
|
{
|
||||||
divSchemes_ = dict.subDict("divSchemes");
|
divSchemes_ = dict.subDict("divSchemes");
|
||||||
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
divSchemes_.add("default", "none");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if
|
if
|
||||||
|
@ -210,16 +335,9 @@ bool faSchemes::read()
|
||||||
defaultDivScheme_ = divSchemes_.lookup("default");
|
defaultDivScheme_ = divSchemes_.lookup("default");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Grad schemes
|
|
||||||
if (dict.found("gradSchemes"))
|
if (dict.found("gradSchemes"))
|
||||||
{
|
{
|
||||||
gradSchemes_ = dict.subDict("gradSchemes");
|
gradSchemes_ = dict.subDict("gradSchemes");
|
||||||
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
gradSchemes_.add("default", "none");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if
|
if
|
||||||
|
@ -232,12 +350,11 @@ bool faSchemes::read()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// lnGrad schemes
|
|
||||||
if (dict.found("lnGradSchemes"))
|
if (dict.found("lnGradSchemes"))
|
||||||
{
|
{
|
||||||
lnGradSchemes_ = dict.subDict("lnGradSchemes");
|
lnGradSchemes_ = dict.subDict("lnGradSchemes");
|
||||||
}
|
}
|
||||||
else
|
else if (!lnGradSchemes_.found("default"))
|
||||||
{
|
{
|
||||||
lnGradSchemes_.add("default", "corrected");
|
lnGradSchemes_.add("default", "corrected");
|
||||||
}
|
}
|
||||||
|
@ -252,15 +369,9 @@ bool faSchemes::read()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// laplacian schemes
|
|
||||||
if (dict.found("laplacianSchemes"))
|
if (dict.found("laplacianSchemes"))
|
||||||
{
|
{
|
||||||
laplacianSchemes_ = dict.subDict("laplacianSchemes");
|
laplacianSchemes_ = dict.subDict("laplacianSchemes");
|
||||||
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
laplacianSchemes_.add("default", "none");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if
|
if
|
||||||
|
@ -273,18 +384,30 @@ bool faSchemes::read()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Flux required
|
|
||||||
if (dict.found("fluxRequired"))
|
if (dict.found("fluxRequired"))
|
||||||
{
|
{
|
||||||
fluxRequired_ = dict.subDict("fluxRequired");
|
fluxRequired_ = dict.subDict("fluxRequired");
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return readOk;
|
if
|
||||||
|
(
|
||||||
|
fluxRequired_.found("default")
|
||||||
|
&& word(fluxRequired_.lookup("default")) != "none"
|
||||||
|
)
|
||||||
|
{
|
||||||
|
defaultFluxRequired_ = Switch(fluxRequired_.lookup("default"));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const dictionary& faSchemes::schemesDict() const
|
const Foam::dictionary& Foam::faSchemes::schemesDict() const
|
||||||
{
|
{
|
||||||
if (found("select"))
|
if (found("select"))
|
||||||
{
|
{
|
||||||
|
@ -297,18 +420,14 @@ const dictionary& faSchemes::schemesDict() const
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ITstream& faSchemes::ddtScheme(const word& name) const
|
Foam::ITstream& Foam::faSchemes::ddtScheme(const word& name) const
|
||||||
{
|
{
|
||||||
if (debug)
|
if (debug)
|
||||||
{
|
{
|
||||||
Info<< "Lookup ddtScheme for " << name << endl;
|
Info<< "Lookup ddtScheme for " << name << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
if
|
if (ddtSchemes_.found(name) || defaultDdtScheme_.empty())
|
||||||
(
|
|
||||||
ddtSchemes_.found(name)
|
|
||||||
|| !defaultDdtScheme_.size()
|
|
||||||
)
|
|
||||||
{
|
{
|
||||||
return ddtSchemes_.lookup(name);
|
return ddtSchemes_.lookup(name);
|
||||||
}
|
}
|
||||||
|
@ -320,18 +439,14 @@ ITstream& faSchemes::ddtScheme(const word& name) const
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ITstream& faSchemes::d2dt2Scheme(const word& name) const
|
Foam::ITstream& Foam::faSchemes::d2dt2Scheme(const word& name) const
|
||||||
{
|
{
|
||||||
if (debug)
|
if (debug)
|
||||||
{
|
{
|
||||||
Info<< "Lookup d2dt2Scheme for " << name << endl;
|
Info<< "Lookup d2dt2Scheme for " << name << endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
if
|
if (d2dt2Schemes_.found(name) || defaultD2dt2Scheme_.empty())
|
||||||
(
|
|
||||||
d2dt2Schemes_.found(name)
|
|
||||||
|| !defaultD2dt2Scheme_.size()
|
|
||||||
)
|
|
||||||
{
|
{
|
||||||
return d2dt2Schemes_.lookup(name);
|
return d2dt2Schemes_.lookup(name);
|
||||||
}
|
}
|
||||||
|
@ -343,12 +458,17 @@ ITstream& faSchemes::d2dt2Scheme(const word& name) const
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ITstream& faSchemes::interpolationScheme(const word& name) const
|
Foam::ITstream& Foam::faSchemes::interpolationScheme(const word& name) const
|
||||||
{
|
{
|
||||||
|
if (debug)
|
||||||
|
{
|
||||||
|
Info<< "Lookup interpolationScheme for " << name << endl;
|
||||||
|
}
|
||||||
|
|
||||||
if
|
if
|
||||||
(
|
(
|
||||||
interpolationSchemes_.found(name)
|
interpolationSchemes_.found(name)
|
||||||
|| !defaultInterpolationScheme_.size()
|
|| defaultInterpolationScheme_.empty()
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
return interpolationSchemes_.lookup(name);
|
return interpolationSchemes_.lookup(name);
|
||||||
|
@ -361,9 +481,14 @@ ITstream& faSchemes::interpolationScheme(const word& name) const
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ITstream& faSchemes::divScheme(const word& name) const
|
Foam::ITstream& Foam::faSchemes::divScheme(const word& name) const
|
||||||
{
|
{
|
||||||
if (divSchemes_.found(name) || !defaultDivScheme_.size())
|
if (debug)
|
||||||
|
{
|
||||||
|
Info<< "Lookup divScheme for " << name << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (divSchemes_.found(name) || defaultDivScheme_.empty())
|
||||||
{
|
{
|
||||||
return divSchemes_.lookup(name);
|
return divSchemes_.lookup(name);
|
||||||
}
|
}
|
||||||
|
@ -375,9 +500,14 @@ ITstream& faSchemes::divScheme(const word& name) const
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ITstream& faSchemes::gradScheme(const word& name) const
|
Foam::ITstream& Foam::faSchemes::gradScheme(const word& name) const
|
||||||
{
|
{
|
||||||
if (gradSchemes_.found(name) || !defaultGradScheme_.size())
|
if (debug)
|
||||||
|
{
|
||||||
|
Info<< "Lookup gradScheme for " << name << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (gradSchemes_.found(name) || defaultGradScheme_.empty())
|
||||||
{
|
{
|
||||||
return gradSchemes_.lookup(name);
|
return gradSchemes_.lookup(name);
|
||||||
}
|
}
|
||||||
|
@ -389,9 +519,14 @@ ITstream& faSchemes::gradScheme(const word& name) const
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ITstream& faSchemes::lnGradScheme(const word& name) const
|
Foam::ITstream& Foam::faSchemes::lnGradScheme(const word& name) const
|
||||||
{
|
{
|
||||||
if (lnGradSchemes_.found(name) || !defaultLnGradScheme_.size())
|
if (debug)
|
||||||
|
{
|
||||||
|
Info<< "Lookup snGradScheme for " << name << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lnGradSchemes_.found(name) || defaultLnGradScheme_.empty())
|
||||||
{
|
{
|
||||||
return lnGradSchemes_.lookup(name);
|
return lnGradSchemes_.lookup(name);
|
||||||
}
|
}
|
||||||
|
@ -403,9 +538,14 @@ ITstream& faSchemes::lnGradScheme(const word& name) const
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
ITstream& faSchemes::laplacianScheme(const word& name) const
|
Foam::ITstream& Foam::faSchemes::laplacianScheme(const word& name) const
|
||||||
{
|
{
|
||||||
if (laplacianSchemes_.found(name) || !defaultLaplacianScheme_.size())
|
if (debug)
|
||||||
|
{
|
||||||
|
Info<< "Lookup laplacianScheme for " << name << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (laplacianSchemes_.found(name) || defaultLaplacianScheme_.empty())
|
||||||
{
|
{
|
||||||
return laplacianSchemes_.lookup(name);
|
return laplacianSchemes_.lookup(name);
|
||||||
}
|
}
|
||||||
|
@ -417,13 +557,24 @@ ITstream& faSchemes::laplacianScheme(const word& name) const
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool faSchemes::fluxRequired(const word& name) const
|
void Foam::faSchemes::setFluxRequired(const word& name) const
|
||||||
|
{
|
||||||
|
if (debug)
|
||||||
|
{
|
||||||
|
Info<< "Setting fluxRequired for " << name << endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
fluxRequired_.add(name, true, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Foam::faSchemes::fluxRequired(const word& name) const
|
||||||
{
|
{
|
||||||
return fluxRequired_.found(name);
|
return fluxRequired_.found(name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
bool faSchemes::writeData(Ostream& os) const
|
bool Foam::faSchemes::writeData(Ostream& os) const
|
||||||
{
|
{
|
||||||
// Write dictionaries
|
// Write dictionaries
|
||||||
os << nl << "ddtSchemes";
|
os << nl << "ddtSchemes";
|
||||||
|
@ -454,8 +605,4 @@ bool faSchemes::writeData(Ostream& os) const
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
} // End namespace Foam
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
// ************************************************************************* //
|
||||||
|
|
|
@ -53,8 +53,6 @@ class faSchemes
|
||||||
:
|
:
|
||||||
public IOdictionary
|
public IOdictionary
|
||||||
{
|
{
|
||||||
private:
|
|
||||||
|
|
||||||
// Private data
|
// Private data
|
||||||
|
|
||||||
dictionary ddtSchemes_;
|
dictionary ddtSchemes_;
|
||||||
|
@ -78,13 +76,19 @@ private:
|
||||||
dictionary laplacianSchemes_;
|
dictionary laplacianSchemes_;
|
||||||
ITstream defaultLaplacianScheme_;
|
ITstream defaultLaplacianScheme_;
|
||||||
|
|
||||||
dictionary fluxRequired_;
|
mutable dictionary fluxRequired_;
|
||||||
|
bool defaultFluxRequired_;
|
||||||
|
|
||||||
|
|
||||||
// Private Member Functions
|
// Private Member Functions
|
||||||
|
|
||||||
//- Disallow default bitwise copy construct and assignment
|
//- Clear the dictionaries and streams before reading
|
||||||
|
void clear();
|
||||||
|
|
||||||
|
//- Disallow default bitwise copy construct
|
||||||
faSchemes(const faSchemes&);
|
faSchemes(const faSchemes&);
|
||||||
|
|
||||||
|
//- Disallow default bitwise assignment
|
||||||
void operator=(const faSchemes&);
|
void operator=(const faSchemes&);
|
||||||
|
|
||||||
|
|
||||||
|
@ -120,6 +124,8 @@ public:
|
||||||
|
|
||||||
ITstream& laplacianScheme(const word& name) const;
|
ITstream& laplacianScheme(const word& name) const;
|
||||||
|
|
||||||
|
void setFluxRequired(const word& name) const;
|
||||||
|
|
||||||
bool fluxRequired(const word& name) const;
|
bool fluxRequired(const word& name) const;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -329,6 +329,40 @@ laplacian
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
tmp<faMatrix<Type> >
|
||||||
|
laplacian
|
||||||
|
(
|
||||||
|
const edgeTensorField& gamma,
|
||||||
|
const GeometricField<Type, faPatchField, areaMesh>& vf,
|
||||||
|
const word& name
|
||||||
|
)
|
||||||
|
{
|
||||||
|
const faMesh& mesh = vf.mesh();
|
||||||
|
|
||||||
|
return fam::laplacian
|
||||||
|
(
|
||||||
|
(mesh.Le() & gamma & mesh.Le())/sqr(mesh.magLe()),
|
||||||
|
vf,
|
||||||
|
name
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
tmp<faMatrix<Type> >
|
||||||
|
laplacian
|
||||||
|
(
|
||||||
|
const tmp<edgeTensorField>& tgamma,
|
||||||
|
const GeometricField<Type, faPatchField, areaMesh>& vf,
|
||||||
|
const word& name
|
||||||
|
)
|
||||||
|
{
|
||||||
|
tmp<faMatrix<Type> > Laplacian = fam::laplacian(tgamma(), vf, name);
|
||||||
|
tgamma.clear();
|
||||||
|
return Laplacian;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
} // End namespace fam
|
} // End namespace fam
|
||||||
|
|
|
@ -180,6 +180,23 @@ namespace fam
|
||||||
const tmp<edgeTensorField>&,
|
const tmp<edgeTensorField>&,
|
||||||
const GeometricField<Type, faPatchField, areaMesh>&
|
const GeometricField<Type, faPatchField, areaMesh>&
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
tmp<faMatrix<Type> > laplacian
|
||||||
|
(
|
||||||
|
const edgeTensorField&,
|
||||||
|
const GeometricField<Type, faPatchField, areaMesh>&,
|
||||||
|
const word& name
|
||||||
|
);
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
tmp<faMatrix<Type> > laplacian
|
||||||
|
(
|
||||||
|
const tmp<edgeTensorField>&,
|
||||||
|
const GeometricField<Type, faPatchField, areaMesh>&,
|
||||||
|
const word& name
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -63,7 +63,7 @@ bool Foam::pimpleControl::criteriaSatisfied()
|
||||||
bool achieved = true;
|
bool achieved = true;
|
||||||
bool checked = false; // safety that some checks were indeed performed
|
bool checked = false; // safety that some checks were indeed performed
|
||||||
|
|
||||||
const dictionary& solverDict = mesh_.solverPerformanceDict();
|
const dictionary& solverDict = mesh_.solutionDict().solverPerformanceDict();
|
||||||
forAllConstIter(dictionary, solverDict, iter)
|
forAllConstIter(dictionary, solverDict, iter)
|
||||||
{
|
{
|
||||||
const word& variableName = iter().keyword();
|
const word& variableName = iter().keyword();
|
||||||
|
@ -190,7 +190,7 @@ bool Foam::pimpleControl::loop()
|
||||||
}
|
}
|
||||||
|
|
||||||
corr_ = 0;
|
corr_ = 0;
|
||||||
mesh_.data::remove("finalIteration");
|
mesh_.solutionDict().remove("finalIteration");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -202,7 +202,7 @@ bool Foam::pimpleControl::loop()
|
||||||
Info<< algorithmName_ << ": converged in " << corr_ - 1
|
Info<< algorithmName_ << ": converged in " << corr_ - 1
|
||||||
<< " iterations" << endl;
|
<< " iterations" << endl;
|
||||||
|
|
||||||
mesh_.data::remove("finalIteration");
|
mesh_.solutionDict().remove("finalIteration");
|
||||||
corr_ = 0;
|
corr_ = 0;
|
||||||
converged_ = false;
|
converged_ = false;
|
||||||
|
|
||||||
|
@ -213,7 +213,7 @@ bool Foam::pimpleControl::loop()
|
||||||
Info<< algorithmName_ << ": iteration " << corr_ << endl;
|
Info<< algorithmName_ << ": iteration " << corr_ << endl;
|
||||||
storePrevIterFields();
|
storePrevIterFields();
|
||||||
|
|
||||||
mesh_.data::add("finalIteration", true);
|
mesh_.solutionDict().add("finalIteration", true);
|
||||||
converged_ = true;
|
converged_ = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -221,7 +221,7 @@ bool Foam::pimpleControl::loop()
|
||||||
{
|
{
|
||||||
if (finalIter())
|
if (finalIter())
|
||||||
{
|
{
|
||||||
mesh_.data::add("finalIteration", true);
|
mesh_.solutionDict().add("finalIteration", true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (corr_ <= nCorrPIMPLE_)
|
if (corr_ <= nCorrPIMPLE_)
|
||||||
|
|
|
@ -52,7 +52,7 @@ bool Foam::simpleControl::criteriaSatisfied()
|
||||||
bool achieved = true;
|
bool achieved = true;
|
||||||
bool checked = false; // safety that some checks were indeed performed
|
bool checked = false; // safety that some checks were indeed performed
|
||||||
|
|
||||||
const dictionary& solverDict = mesh_.solverPerformanceDict();
|
const dictionary& solverDict = mesh_.solutionDict().solverPerformanceDict();
|
||||||
forAllConstIter(dictionary, solverDict, iter)
|
forAllConstIter(dictionary, solverDict, iter)
|
||||||
{
|
{
|
||||||
const word& variableName = iter().keyword();
|
const word& variableName = iter().keyword();
|
||||||
|
|
|
@ -28,7 +28,6 @@ License
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
|
||||||
Foam::debug::debugSwitch
|
Foam::debug::debugSwitch
|
||||||
Foam::fvSchemes::debug
|
Foam::fvSchemes::debug
|
||||||
(
|
(
|
||||||
|
@ -586,5 +585,35 @@ bool Foam::fvSchemes::fluxRequired(const word& name) const
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool Foam::fvSchemes::writeData(Ostream& os) const
|
||||||
|
{
|
||||||
|
// Write dictionaries
|
||||||
|
os << nl << "ddtSchemes";
|
||||||
|
ddtSchemes_.write(os, true);
|
||||||
|
|
||||||
|
os << nl << "d2dt2Schemes";
|
||||||
|
d2dt2Schemes_.write(os, true);
|
||||||
|
|
||||||
|
os << nl << "interpolationSchemes";
|
||||||
|
interpolationSchemes_.write(os, true);
|
||||||
|
|
||||||
|
os << nl << "divSchemes";
|
||||||
|
divSchemes_.write(os, true);
|
||||||
|
|
||||||
|
os << nl << "gradSchemes";
|
||||||
|
gradSchemes_.write(os, true);
|
||||||
|
|
||||||
|
os << nl << "snGradSchemes";
|
||||||
|
snGradSchemes_.write(os, true);
|
||||||
|
|
||||||
|
os << nl << "laplacianSchemes";
|
||||||
|
laplacianSchemes_.write(os, true);
|
||||||
|
|
||||||
|
os << nl << "fluxRequired";
|
||||||
|
fluxRequired_.write(os, true);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
// ************************************************************************* //
|
||||||
|
|
|
@ -95,7 +95,7 @@ class fvSchemes
|
||||||
public:
|
public:
|
||||||
|
|
||||||
//- Debug switch
|
//- Debug switch
|
||||||
static debug::debugSwitch debug;
|
static debug::debugSwitch debug;
|
||||||
|
|
||||||
|
|
||||||
// Constructors
|
// Constructors
|
||||||
|
@ -184,6 +184,12 @@ public:
|
||||||
|
|
||||||
//- Read the fvSchemes
|
//- Read the fvSchemes
|
||||||
bool read();
|
bool read();
|
||||||
|
|
||||||
|
|
||||||
|
// Write
|
||||||
|
|
||||||
|
//- WriteData function required for regIOobject write operation
|
||||||
|
virtual bool writeData(Ostream&) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1390,7 +1390,7 @@ Foam::tmp<Foam::fvMatrix<Type> > Foam::relax(const fvMatrix<Type>& m)
|
||||||
|
|
||||||
|
|
||||||
template<class Type>
|
template<class Type>
|
||||||
Foam::lduMatrix::solverPerformance Foam::solve
|
Foam::lduSolverPerformance Foam::solve
|
||||||
(
|
(
|
||||||
fvMatrix<Type>& fvm,
|
fvMatrix<Type>& fvm,
|
||||||
const dictionary& solverControls
|
const dictionary& solverControls
|
||||||
|
@ -1400,13 +1400,13 @@ Foam::lduMatrix::solverPerformance Foam::solve
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class Type>
|
template<class Type>
|
||||||
Foam::lduMatrix::solverPerformance Foam::solve
|
Foam::lduSolverPerformance Foam::solve
|
||||||
(
|
(
|
||||||
const tmp<fvMatrix<Type> >& tfvm,
|
const tmp<fvMatrix<Type> >& tfvm,
|
||||||
const dictionary& solverControls
|
const dictionary& solverControls
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
lduMatrix::solverPerformance solverPerf =
|
lduSolverPerformance solverPerf =
|
||||||
const_cast<fvMatrix<Type>&>(tfvm()).solve(solverControls);
|
const_cast<fvMatrix<Type>&>(tfvm()).solve(solverControls);
|
||||||
|
|
||||||
tfvm.clear();
|
tfvm.clear();
|
||||||
|
@ -1416,18 +1416,18 @@ Foam::lduMatrix::solverPerformance Foam::solve
|
||||||
|
|
||||||
|
|
||||||
template<class Type>
|
template<class Type>
|
||||||
Foam::lduMatrix::solverPerformance Foam::solve(fvMatrix<Type>& fvm)
|
Foam::lduSolverPerformance Foam::solve(fvMatrix<Type>& fvm)
|
||||||
{
|
{
|
||||||
return fvm.solve();
|
return fvm.solve();
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class Type>
|
template<class Type>
|
||||||
Foam::lduMatrix::solverPerformance Foam::solve
|
Foam::lduSolverPerformance Foam::solve
|
||||||
(
|
(
|
||||||
const tmp<fvMatrix<Type> >& tfvm
|
const tmp<fvMatrix<Type> >& tfvm
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
lduMatrix::solverPerformance solverPerf =
|
lduSolverPerformance solverPerf =
|
||||||
const_cast<fvMatrix<Type>&>(tfvm()).solve();
|
const_cast<fvMatrix<Type>&>(tfvm()).solve();
|
||||||
|
|
||||||
tfvm.clear();
|
tfvm.clear();
|
||||||
|
|
|
@ -363,7 +363,7 @@ public:
|
||||||
|
|
||||||
//- Solve returning the solution statistics.
|
//- Solve returning the solution statistics.
|
||||||
// Use the given solver controls
|
// Use the given solver controls
|
||||||
lduMatrix::solverPerformance solve(const dictionary&);
|
lduSolverPerformance solve(const dictionary&);
|
||||||
|
|
||||||
//- Solve returning the solution statistics.
|
//- Solve returning the solution statistics.
|
||||||
// Solver controls read from fvSolution
|
// Solver controls read from fvSolution
|
||||||
|
|
|
@ -52,7 +52,7 @@ void Foam::fvMatrix<Type>::setComponentReference
|
||||||
|
|
||||||
|
|
||||||
template<class Type>
|
template<class Type>
|
||||||
Foam::lduMatrix::solverPerformance Foam::fvMatrix<Type>::solve
|
Foam::lduSolverPerformance Foam::fvMatrix<Type>::solve
|
||||||
(
|
(
|
||||||
const dictionary& solverControls
|
const dictionary& solverControls
|
||||||
)
|
)
|
||||||
|
@ -140,7 +140,7 @@ Foam::lduMatrix::solverPerformance Foam::fvMatrix<Type>::solve
|
||||||
cmpt
|
cmpt
|
||||||
);
|
);
|
||||||
|
|
||||||
lduMatrix::solverPerformance solverPerf;
|
lduSolverPerformance solverPerf;
|
||||||
|
|
||||||
// Solver call
|
// Solver call
|
||||||
solverPerf = lduMatrix::solver::New
|
solverPerf = lduMatrix::solver::New
|
||||||
|
@ -170,14 +170,14 @@ Foam::lduMatrix::solverPerformance Foam::fvMatrix<Type>::solve
|
||||||
|
|
||||||
psi.correctBoundaryConditions();
|
psi.correctBoundaryConditions();
|
||||||
|
|
||||||
psi_.mesh().setSolverPerformance(psi_.name(), solverPerfVec);
|
psi_.mesh().solutionDict().setSolverPerformance(psi_.name(), solverPerfVec);
|
||||||
|
|
||||||
return solverPerfVec;
|
return solverPerfVec;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
template<class Type>
|
template<class Type>
|
||||||
Foam::lduMatrix::solverPerformance Foam::fvMatrix<Type>::solve()
|
Foam::lduSolverPerformance Foam::fvMatrix<Type>::solve()
|
||||||
{
|
{
|
||||||
return solve(psi_.mesh().solutionDict().solverDict(psi_.name()));
|
return solve(psi_.mesh().solutionDict().solverDict(psi_.name()));
|
||||||
}
|
}
|
||||||
|
|
|
@ -55,7 +55,7 @@ void Foam::fvMatrix<Foam::scalar>::setComponentReference
|
||||||
|
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
Foam::lduMatrix::solverPerformance Foam::fvMatrix<Foam::scalar>::solve
|
Foam::lduSolverPerformance Foam::fvMatrix<Foam::scalar>::solve
|
||||||
(
|
(
|
||||||
const dictionary& solverControls
|
const dictionary& solverControls
|
||||||
)
|
)
|
||||||
|
@ -104,7 +104,7 @@ Foam::lduMatrix::solverPerformance Foam::fvMatrix<Foam::scalar>::solve
|
||||||
|
|
||||||
psi.correctBoundaryConditions();
|
psi.correctBoundaryConditions();
|
||||||
|
|
||||||
psi_.mesh().setSolverPerformance(psi_.name(), solverPerf);
|
psi_.mesh().solutionDict().setSolverPerformance(psi_.name(), solverPerf);
|
||||||
|
|
||||||
return solverPerf;
|
return solverPerf;
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,7 +56,7 @@ void fvMatrix<scalar>::setComponentReference
|
||||||
);
|
);
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
lduMatrix::solverPerformance fvMatrix<scalar>::solve
|
lduSolverPerformance fvMatrix<scalar>::solve
|
||||||
(
|
(
|
||||||
const dictionary&
|
const dictionary&
|
||||||
);
|
);
|
||||||
|
|
|
@ -103,7 +103,6 @@ Foam::fvMesh::fvMesh(const IOobject& io)
|
||||||
:
|
:
|
||||||
polyMesh(io),
|
polyMesh(io),
|
||||||
surfaceInterpolation(*this),
|
surfaceInterpolation(*this),
|
||||||
data(static_cast<const objectRegistry&>(*this)),
|
|
||||||
boundary_(*this, boundaryMesh()),
|
boundary_(*this, boundaryMesh()),
|
||||||
lduPtr_(NULL),
|
lduPtr_(NULL),
|
||||||
curTimeIndex_(time().timeIndex()),
|
curTimeIndex_(time().timeIndex()),
|
||||||
|
@ -206,7 +205,6 @@ Foam::fvMesh::fvMesh
|
||||||
:
|
:
|
||||||
polyMesh(io, points, faces, allOwner, allNeighbour, syncPar),
|
polyMesh(io, points, faces, allOwner, allNeighbour, syncPar),
|
||||||
surfaceInterpolation(*this),
|
surfaceInterpolation(*this),
|
||||||
data(static_cast<const objectRegistry&>(*this)),
|
|
||||||
boundary_(*this),
|
boundary_(*this),
|
||||||
lduPtr_(NULL),
|
lduPtr_(NULL),
|
||||||
curTimeIndex_(time().timeIndex()),
|
curTimeIndex_(time().timeIndex()),
|
||||||
|
@ -237,7 +235,6 @@ Foam::fvMesh::fvMesh
|
||||||
:
|
:
|
||||||
polyMesh(io, points, faces, cells, syncPar),
|
polyMesh(io, points, faces, cells, syncPar),
|
||||||
surfaceInterpolation(*this),
|
surfaceInterpolation(*this),
|
||||||
data(static_cast<const objectRegistry&>(*this)),
|
|
||||||
boundary_(*this),
|
boundary_(*this),
|
||||||
lduPtr_(NULL),
|
lduPtr_(NULL),
|
||||||
curTimeIndex_(time().timeIndex()),
|
curTimeIndex_(time().timeIndex()),
|
||||||
|
@ -285,7 +282,6 @@ Foam::fvMesh::fvMesh
|
||||||
syncPar
|
syncPar
|
||||||
),
|
),
|
||||||
surfaceInterpolation(*this),
|
surfaceInterpolation(*this),
|
||||||
data(static_cast<const objectRegistry&>(*this)),
|
|
||||||
boundary_(*this),
|
boundary_(*this),
|
||||||
lduPtr_(NULL),
|
lduPtr_(NULL),
|
||||||
curTimeIndex_(time().timeIndex()),
|
curTimeIndex_(time().timeIndex()),
|
||||||
|
|
|
@ -52,7 +52,6 @@ SourceFiles
|
||||||
#include "primitiveMesh.H"
|
#include "primitiveMesh.H"
|
||||||
#include "fvBoundaryMesh.H"
|
#include "fvBoundaryMesh.H"
|
||||||
#include "surfaceInterpolation.H"
|
#include "surfaceInterpolation.H"
|
||||||
#include "data.H"
|
|
||||||
#include "DimensionedField.H"
|
#include "DimensionedField.H"
|
||||||
#include "volFieldsFwd.H"
|
#include "volFieldsFwd.H"
|
||||||
#include "surfaceFieldsFwd.H"
|
#include "surfaceFieldsFwd.H"
|
||||||
|
@ -77,8 +76,7 @@ class fvMesh
|
||||||
:
|
:
|
||||||
public polyMesh,
|
public polyMesh,
|
||||||
public lduMesh,
|
public lduMesh,
|
||||||
public surfaceInterpolation,
|
public surfaceInterpolation
|
||||||
public data
|
|
||||||
{
|
{
|
||||||
// Private data
|
// Private data
|
||||||
|
|
||||||
|
|
|
@ -242,7 +242,6 @@ lduMatrix = matrices/lduMatrix
|
||||||
$(lduMatrix)/lduMatrix/lduMatrix.C
|
$(lduMatrix)/lduMatrix/lduMatrix.C
|
||||||
$(lduMatrix)/lduMatrix/lduMatrixOperations.C
|
$(lduMatrix)/lduMatrix/lduMatrixOperations.C
|
||||||
$(lduMatrix)/lduMatrix/lduMatrixATmul.C
|
$(lduMatrix)/lduMatrix/lduMatrixATmul.C
|
||||||
$(lduMatrix)/lduMatrix/lduMatrixTests.C
|
|
||||||
$(lduMatrix)/lduMatrix/lduMatrixUpdateMatrixInterfaces.C
|
$(lduMatrix)/lduMatrix/lduMatrixUpdateMatrixInterfaces.C
|
||||||
$(lduMatrix)/lduMatrix/lduMatrixSolver.C
|
$(lduMatrix)/lduMatrix/lduMatrixSolver.C
|
||||||
$(lduMatrix)/lduMatrix/lduMatrixSmoother.C
|
$(lduMatrix)/lduMatrix/lduMatrixSmoother.C
|
||||||
|
@ -641,8 +640,6 @@ $(writers)/gnuplotGraph/gnuplotGraph.C
|
||||||
$(writers)/xmgrGraph/xmgrGraph.C
|
$(writers)/xmgrGraph/xmgrGraph.C
|
||||||
$(writers)/jplotGraph/jplotGraph.C
|
$(writers)/jplotGraph/jplotGraph.C
|
||||||
|
|
||||||
meshes/data/data.C
|
|
||||||
|
|
||||||
primitives/BlockCoeff/blockCoeffBase.C
|
primitives/BlockCoeff/blockCoeffBase.C
|
||||||
primitives/BlockCoeff/scalarBlockCoeff.C
|
primitives/BlockCoeff/scalarBlockCoeff.C
|
||||||
primitives/BlockCoeff/sphericalTensorBlockCoeff.C
|
primitives/BlockCoeff/sphericalTensorBlockCoeff.C
|
||||||
|
@ -733,6 +730,8 @@ $(BlockLduSmoothers)/BlockILUCpSmoother/blockILUCpSmoothers.C
|
||||||
BlockLduSolvers = matrices/blockLduMatrix/BlockLduSolvers
|
BlockLduSolvers = matrices/blockLduMatrix/BlockLduSolvers
|
||||||
$(BlockLduSolvers)/blockVectorNSolvers.C
|
$(BlockLduSolvers)/blockVectorNSolvers.C
|
||||||
$(BlockLduSolvers)/BlockLduSolver/blockLduSolvers.C
|
$(BlockLduSolvers)/BlockLduSolver/blockLduSolvers.C
|
||||||
|
$(BlockLduSolvers)/BlockLduSolver/BlockSolverPerformances.C
|
||||||
|
$(BlockLduSolvers)/BlockLduSolver/BlockSolverPerformanceVectorN.C
|
||||||
$(BlockLduSolvers)/BlockDiagonal/blockDiagonalSolvers.C
|
$(BlockLduSolvers)/BlockDiagonal/blockDiagonalSolvers.C
|
||||||
$(BlockLduSolvers)/BlockGaussSeidel/blockGaussSeidelSolvers.C
|
$(BlockLduSolvers)/BlockGaussSeidel/blockGaussSeidelSolvers.C
|
||||||
$(BlockLduSolvers)/BlockCG/blockCGSolvers.C
|
$(BlockLduSolvers)/BlockCG/blockCGSolvers.C
|
||||||
|
|
|
@ -27,7 +27,6 @@ License
|
||||||
#include "foamTime.H"
|
#include "foamTime.H"
|
||||||
#include "demandDrivenData.H"
|
#include "demandDrivenData.H"
|
||||||
#include "dictionary.H"
|
#include "dictionary.H"
|
||||||
#include "data.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
|
|
@ -34,7 +34,7 @@ bool Foam::BlockSolverPerformance<Type>::checkConvergence
|
||||||
const scalar RelTolerance
|
const scalar RelTolerance
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
if (BlockLduMatrix<Type>::debug >= 2)
|
if (debug >= 2)
|
||||||
{
|
{
|
||||||
Info<< solverName_
|
Info<< solverName_
|
||||||
<< ": Iteration " << nIterations_
|
<< ": Iteration " << nIterations_
|
||||||
|
@ -92,7 +92,7 @@ bool Foam::BlockSolverPerformance<Type>::checkSingularity
|
||||||
template<class Type>
|
template<class Type>
|
||||||
void Foam::BlockSolverPerformance<Type>::print() const
|
void Foam::BlockSolverPerformance<Type>::print() const
|
||||||
{
|
{
|
||||||
if (BlockLduMatrix<Type>::debug)
|
if (debug)
|
||||||
{
|
{
|
||||||
Info<< solverName_ << ": Solving for " << fieldName_;
|
Info<< solverName_ << ": Solving for " << fieldName_;
|
||||||
|
|
||||||
|
@ -111,4 +111,65 @@ void Foam::BlockSolverPerformance<Type>::print() const
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
bool Foam::BlockSolverPerformance<Type>::operator!=
|
||||||
|
(
|
||||||
|
const BlockSolverPerformance<Type>& bsp
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
return
|
||||||
|
(
|
||||||
|
solverName() != bsp.solverName()
|
||||||
|
|| fieldName() != bsp.fieldName()
|
||||||
|
|| initialResidual() != bsp.initialResidual()
|
||||||
|
|| finalResidual() != bsp.finalResidual()
|
||||||
|
|| nIterations() != bsp.nIterations()
|
||||||
|
|| converged() != bsp.converged()
|
||||||
|
|| singular() != bsp.singular()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
Foam::Istream& Foam::operator>>
|
||||||
|
(
|
||||||
|
Istream& is,
|
||||||
|
typename Foam::BlockSolverPerformance<Type>& bsp
|
||||||
|
)
|
||||||
|
{
|
||||||
|
is.readBeginList("BlockSolverPerformance<Type>");
|
||||||
|
is >> bsp.solverName_
|
||||||
|
>> bsp.fieldName_
|
||||||
|
>> bsp.initialResidual_
|
||||||
|
>> bsp.finalResidual_
|
||||||
|
>> bsp.nIterations_
|
||||||
|
>> bsp.converged_
|
||||||
|
>> bsp.singular_;
|
||||||
|
is.readEndList("BlockSolverPerformance<Type>");
|
||||||
|
|
||||||
|
return is;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
Foam::Ostream& Foam::operator<<
|
||||||
|
(
|
||||||
|
Ostream& os,
|
||||||
|
const typename Foam::BlockSolverPerformance<Type>& bsp
|
||||||
|
)
|
||||||
|
{
|
||||||
|
os << token::BEGIN_LIST
|
||||||
|
<< bsp.solverName_ << token::SPACE
|
||||||
|
<< bsp.fieldName_ << token::SPACE
|
||||||
|
<< bsp.initialResidual_ << token::SPACE
|
||||||
|
<< bsp.finalResidual_ << token::SPACE
|
||||||
|
<< bsp.nIterations_ << token::SPACE
|
||||||
|
<< bsp.converged_ << token::SPACE
|
||||||
|
<< bsp.singular_ << token::SPACE
|
||||||
|
<< token::END_LIST;
|
||||||
|
|
||||||
|
return os;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
// ************************************************************************* //
|
||||||
|
|
|
@ -51,6 +51,9 @@ namespace Foam
|
||||||
template<class Type>
|
template<class Type>
|
||||||
class BlockSolverPerformance;
|
class BlockSolverPerformance;
|
||||||
|
|
||||||
|
template<class Type>
|
||||||
|
Istream& operator>>(Istream&, BlockSolverPerformance<Type>&);
|
||||||
|
|
||||||
template<class Type>
|
template<class Type>
|
||||||
Ostream& operator<<(Ostream&, const BlockSolverPerformance<Type>&);
|
Ostream& operator<<(Ostream&, const BlockSolverPerformance<Type>&);
|
||||||
|
|
||||||
|
@ -88,8 +91,24 @@ class BlockSolverPerformance
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
// Static data
|
||||||
|
|
||||||
|
// Declare name of the class and its debug switch
|
||||||
|
ClassName("BlockSolverPerformance");
|
||||||
|
|
||||||
|
|
||||||
// Constructors
|
// Constructors
|
||||||
|
|
||||||
|
//- Construct without solver and field name
|
||||||
|
BlockSolverPerformance()
|
||||||
|
:
|
||||||
|
initialResidual_(pTraits<Type>::zero),
|
||||||
|
finalResidual_(pTraits<Type>::zero),
|
||||||
|
nIterations_(0),
|
||||||
|
converged_(false),
|
||||||
|
singular_(false)
|
||||||
|
{}
|
||||||
|
|
||||||
//- Construct with solver and field name
|
//- Construct with solver and field name
|
||||||
BlockSolverPerformance
|
BlockSolverPerformance
|
||||||
(
|
(
|
||||||
|
@ -120,6 +139,18 @@ public:
|
||||||
return solverName_;
|
return solverName_;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//- Return solver name
|
||||||
|
word& solverName()
|
||||||
|
{
|
||||||
|
return solverName_;
|
||||||
|
}
|
||||||
|
|
||||||
|
//- Return field name
|
||||||
|
const word& fieldName() const
|
||||||
|
{
|
||||||
|
return fieldName_;
|
||||||
|
}
|
||||||
|
|
||||||
//- Return initial residual
|
//- Return initial residual
|
||||||
const Type& initialResidual() const
|
const Type& initialResidual() const
|
||||||
{
|
{
|
||||||
|
@ -192,6 +223,26 @@ public:
|
||||||
|
|
||||||
//- Print summary of solver performance
|
//- Print summary of solver performance
|
||||||
void print() const;
|
void print() const;
|
||||||
|
|
||||||
|
|
||||||
|
// Member Operators
|
||||||
|
|
||||||
|
bool operator!=(const BlockSolverPerformance<Type>&) const;
|
||||||
|
|
||||||
|
|
||||||
|
// Friend functions
|
||||||
|
|
||||||
|
friend Istream& operator>> <Type>
|
||||||
|
(
|
||||||
|
Istream&,
|
||||||
|
BlockSolverPerformance<Type>&
|
||||||
|
);
|
||||||
|
|
||||||
|
friend Ostream& operator<< <Type>
|
||||||
|
(
|
||||||
|
Ostream&,
|
||||||
|
const BlockSolverPerformance<Type>&
|
||||||
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | foam-extend: Open Source CFD
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | For copyright notice see file Copyright
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of foam-extend.
|
||||||
|
|
||||||
|
foam-extend 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.
|
||||||
|
|
||||||
|
foam-extend 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 foam-extend. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Description
|
||||||
|
BlockSolverPerformance static data members
|
||||||
|
|
||||||
|
Author
|
||||||
|
Vanja Skuric, FMENA Zagreb. All rights reserved.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "coeffFields.H"
|
||||||
|
#include "BlockSolverPerformanceVectorN.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#define makeNamedTemplateTypeNameAndDebug(type, Type, args...) \
|
||||||
|
defineNamedTemplateTypeNameAndDebug(BlockSolverPerformance##Type, 1);
|
||||||
|
|
||||||
|
forAllVectorNTypes(makeNamedTemplateTypeNameAndDebug);
|
||||||
|
|
||||||
|
#undef makeNamedTemplateTypeNameAndDebug
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
|
@ -0,0 +1,66 @@
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | foam-extend: Open Source CFD
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | For copyright notice see file Copyright
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of foam-extend.
|
||||||
|
|
||||||
|
foam-extend 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.
|
||||||
|
|
||||||
|
foam-extend 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 foam-extend. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Class
|
||||||
|
BlockSolverPerformance
|
||||||
|
|
||||||
|
Description
|
||||||
|
Typedefs for BlockSolverPerformance
|
||||||
|
|
||||||
|
Author
|
||||||
|
Vanja Skuric, FMENA Zagreb. All rights reserved.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef BlockSolverPerformanceVectorN_H
|
||||||
|
#define BlockSolverPerformanceVectorN_H
|
||||||
|
|
||||||
|
#include "BlockSolverPerformances.H"
|
||||||
|
#include "VectorTensorNFieldsFwd.H"
|
||||||
|
#include "ExpandTensorNField.H"
|
||||||
|
#include "VectorNFieldTypes.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#define makeTypedef(type, Type, args...) \
|
||||||
|
typedef BlockSolverPerformance<type> BlockSolverPerformance##Type;
|
||||||
|
|
||||||
|
forAllVectorNTypes(makeTypedef)
|
||||||
|
|
||||||
|
#undef makeTypedef
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
|
@ -0,0 +1,52 @@
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | foam-extend: Open Source CFD
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | For copyright notice see file Copyright
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of foam-extend.
|
||||||
|
|
||||||
|
foam-extend 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.
|
||||||
|
|
||||||
|
foam-extend 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 foam-extend. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Description
|
||||||
|
BlockSolverPerformance static data members
|
||||||
|
|
||||||
|
Author
|
||||||
|
Vanja Skuric, FMENA Zagreb. All rights reserved.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#include "BlockSolverPerformances.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
defineNamedTemplateTypeNameAndDebug(BlockSolverPerformanceScalar, 1);
|
||||||
|
defineNamedTemplateTypeNameAndDebug(BlockSolverPerformanceVector, 1);
|
||||||
|
defineNamedTemplateTypeNameAndDebug(BlockSolverPerformanceSphericalTensor, 1);
|
||||||
|
defineNamedTemplateTypeNameAndDebug(BlockSolverPerformanceSymmTensor, 1);
|
||||||
|
defineNamedTemplateTypeNameAndDebug(BlockSolverPerformanceTensor, 1);
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
|
@ -0,0 +1,64 @@
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | foam-extend: Open Source CFD
|
||||||
|
\\ / O peration |
|
||||||
|
\\ / A nd | For copyright notice see file Copyright
|
||||||
|
\\/ M anipulation |
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of foam-extend.
|
||||||
|
|
||||||
|
foam-extend 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.
|
||||||
|
|
||||||
|
foam-extend 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 foam-extend. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Class
|
||||||
|
BlockSolverPerformance
|
||||||
|
|
||||||
|
Description
|
||||||
|
Typedefs for BlockSolverPerformance
|
||||||
|
|
||||||
|
Author
|
||||||
|
Vanja Skuric, FMENA Zagreb. All rights reserved.
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef BlockSolverPerformances_H
|
||||||
|
#define BlockSolverPerformances_H
|
||||||
|
|
||||||
|
#include "BlockSolverPerformance.H"
|
||||||
|
#include "fieldTypes.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
typedef BlockSolverPerformance<scalar> BlockSolverPerformanceScalar;
|
||||||
|
typedef BlockSolverPerformance<vector> BlockSolverPerformanceVector;
|
||||||
|
typedef BlockSolverPerformance<sphericalTensor>
|
||||||
|
BlockSolverPerformanceSphericalTensor;
|
||||||
|
typedef BlockSolverPerformance<symmTensor> BlockSolverPerformanceSymmTensor;
|
||||||
|
typedef BlockSolverPerformance<tensor> BlockSolverPerformanceTensor;
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
} // End namespace Foam
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
|
@ -42,7 +42,6 @@ SourceFiles
|
||||||
lduMatrixOperations.C
|
lduMatrixOperations.C
|
||||||
lduMatrixSolver.C
|
lduMatrixSolver.C
|
||||||
lduMatrixPreconditioner.C
|
lduMatrixPreconditioner.C
|
||||||
lduMatrixTests.C
|
|
||||||
lduMatrixUpdateMatrixInterfaces.C
|
lduMatrixUpdateMatrixInterfaces.C
|
||||||
lduMatrixBufferedUpdateMatrixInterfaces.C
|
lduMatrixBufferedUpdateMatrixInterfaces.C
|
||||||
|
|
||||||
|
@ -60,6 +59,7 @@ SourceFiles
|
||||||
#include "autoPtr.H"
|
#include "autoPtr.H"
|
||||||
#include "runTimeSelectionTables.H"
|
#include "runTimeSelectionTables.H"
|
||||||
#include "profilingTrigger.H"
|
#include "profilingTrigger.H"
|
||||||
|
#include "lduSolverPerformance.H"
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
@ -93,181 +93,6 @@ class lduMatrix
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
//- Class returned by the solver, containing performance statistics
|
|
||||||
class solverPerformance
|
|
||||||
{
|
|
||||||
// Private Data
|
|
||||||
|
|
||||||
//- Name of solver
|
|
||||||
word solverName_;
|
|
||||||
|
|
||||||
//- Name of field
|
|
||||||
word fieldName_;
|
|
||||||
|
|
||||||
//- Initial residual
|
|
||||||
scalar initialResidual_;
|
|
||||||
|
|
||||||
//- Final residual
|
|
||||||
scalar finalResidual_;
|
|
||||||
|
|
||||||
//- Number of iterations
|
|
||||||
label noIterations_;
|
|
||||||
|
|
||||||
//- Has the solver converged?
|
|
||||||
bool converged_;
|
|
||||||
|
|
||||||
//- Has the solver indicated a singular matrix?
|
|
||||||
bool singular_;
|
|
||||||
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
// Constructors
|
|
||||||
|
|
||||||
//- Construct null
|
|
||||||
solverPerformance()
|
|
||||||
:
|
|
||||||
initialResidual_(0),
|
|
||||||
finalResidual_(0),
|
|
||||||
noIterations_(0),
|
|
||||||
converged_(false),
|
|
||||||
singular_(false)
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
//- Construct from components
|
|
||||||
solverPerformance
|
|
||||||
(
|
|
||||||
const word& solverName,
|
|
||||||
const word& fieldName,
|
|
||||||
const scalar iRes = 0,
|
|
||||||
const scalar fRes = 0,
|
|
||||||
const label nIter = 0,
|
|
||||||
const bool converged = false,
|
|
||||||
const bool singular = false
|
|
||||||
)
|
|
||||||
:
|
|
||||||
solverName_(solverName),
|
|
||||||
fieldName_(fieldName),
|
|
||||||
initialResidual_(iRes),
|
|
||||||
finalResidual_(fRes),
|
|
||||||
noIterations_(nIter),
|
|
||||||
converged_(converged),
|
|
||||||
singular_(singular)
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
// Member functions
|
|
||||||
|
|
||||||
//- Return solver name
|
|
||||||
const word& solverName() const
|
|
||||||
{
|
|
||||||
return solverName_;
|
|
||||||
}
|
|
||||||
|
|
||||||
//- Return access to solver name
|
|
||||||
word& solverName()
|
|
||||||
{
|
|
||||||
return solverName_;
|
|
||||||
}
|
|
||||||
|
|
||||||
//- Return field name
|
|
||||||
const word& fieldName() const
|
|
||||||
{
|
|
||||||
return fieldName_;
|
|
||||||
}
|
|
||||||
|
|
||||||
//- Return access to field name
|
|
||||||
word& fieldName()
|
|
||||||
{
|
|
||||||
return fieldName_;
|
|
||||||
}
|
|
||||||
|
|
||||||
//- Return initial residual
|
|
||||||
scalar initialResidual() const
|
|
||||||
{
|
|
||||||
return initialResidual_;
|
|
||||||
}
|
|
||||||
|
|
||||||
//- Return initial residual
|
|
||||||
scalar& initialResidual()
|
|
||||||
{
|
|
||||||
return initialResidual_;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//- Return final residual
|
|
||||||
scalar finalResidual() const
|
|
||||||
{
|
|
||||||
return finalResidual_;
|
|
||||||
}
|
|
||||||
|
|
||||||
//- Return final residual
|
|
||||||
scalar& finalResidual()
|
|
||||||
{
|
|
||||||
return finalResidual_;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//- Return number of iterations
|
|
||||||
label nIterations() const
|
|
||||||
{
|
|
||||||
return noIterations_;
|
|
||||||
}
|
|
||||||
|
|
||||||
//- Return number of iterations
|
|
||||||
label& nIterations()
|
|
||||||
{
|
|
||||||
return noIterations_;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//- Has the solver converged?
|
|
||||||
bool converged() const
|
|
||||||
{
|
|
||||||
return converged_;
|
|
||||||
}
|
|
||||||
|
|
||||||
//- Is the matrix singular?
|
|
||||||
bool singular() const
|
|
||||||
{
|
|
||||||
return singular_;
|
|
||||||
}
|
|
||||||
|
|
||||||
//- Convergence test
|
|
||||||
bool checkConvergence
|
|
||||||
(
|
|
||||||
const scalar tolerance,
|
|
||||||
const scalar relTolerance
|
|
||||||
);
|
|
||||||
|
|
||||||
//- Singularity test
|
|
||||||
bool checkSingularity(const scalar residual);
|
|
||||||
|
|
||||||
//- Print summary of solver performance
|
|
||||||
void print() const;
|
|
||||||
|
|
||||||
// Member Operators
|
|
||||||
|
|
||||||
bool operator!=(const solverPerformance&) const;
|
|
||||||
|
|
||||||
// Ostream Operator
|
|
||||||
|
|
||||||
friend Istream& operator>>
|
|
||||||
(
|
|
||||||
Istream&,
|
|
||||||
solverPerformance&
|
|
||||||
);
|
|
||||||
|
|
||||||
friend Ostream& operator<<
|
|
||||||
(
|
|
||||||
Ostream&,
|
|
||||||
const solverPerformance&
|
|
||||||
);
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
//- Abstract base-class for lduMatrix solvers
|
//- Abstract base-class for lduMatrix solvers
|
||||||
class solver
|
class solver
|
||||||
{
|
{
|
||||||
|
@ -322,10 +147,10 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
//- Is the stop criterion reached
|
//- Is the stop criterion reached
|
||||||
bool stop(lduMatrix::solverPerformance& solverPerf) const;
|
bool stop(lduSolverPerformance& solverPerf) const;
|
||||||
|
|
||||||
//- Is the converrgence criterion reached
|
//- Is the converrgence criterion reached
|
||||||
bool converged(lduMatrix::solverPerformance& solverPerf) const;
|
bool converged(lduSolverPerformance& solverPerf) const;
|
||||||
|
|
||||||
//- Read the control parameters from the dictionary
|
//- Read the control parameters from the dictionary
|
||||||
virtual void readControls();
|
virtual void readControls();
|
||||||
|
@ -491,7 +316,7 @@ public:
|
||||||
//- Read and reset the solver parameters from the given stream
|
//- Read and reset the solver parameters from the given stream
|
||||||
virtual void read(const dictionary&);
|
virtual void read(const dictionary&);
|
||||||
|
|
||||||
virtual solverPerformance solve
|
virtual lduSolverPerformance solve
|
||||||
(
|
(
|
||||||
scalarField& x,
|
scalarField& x,
|
||||||
const scalarField& b,
|
const scalarField& b,
|
||||||
|
@ -1048,7 +873,6 @@ public:
|
||||||
|
|
||||||
// Helper typedefs
|
// Helper typedefs
|
||||||
typedef lduMatrix::solver lduSolver;
|
typedef lduMatrix::solver lduSolver;
|
||||||
typedef lduMatrix::solverPerformance lduSolverPerformance;
|
|
||||||
typedef lduMatrix::preconditioner lduPreconditioner;
|
typedef lduMatrix::preconditioner lduPreconditioner;
|
||||||
typedef lduMatrix::smoother lduSmoother;
|
typedef lduMatrix::smoother lduSmoother;
|
||||||
|
|
||||||
|
|
|
@ -207,7 +207,7 @@ Foam::scalar Foam::lduMatrix::solver::normFactor
|
||||||
|
|
||||||
bool Foam::lduMatrix::solver::stop
|
bool Foam::lduMatrix::solver::stop
|
||||||
(
|
(
|
||||||
lduMatrix::solverPerformance& solverPerf
|
lduSolverPerformance& solverPerf
|
||||||
) const
|
) const
|
||||||
{
|
{
|
||||||
if (solverPerf.nIterations() < minIter_)
|
if (solverPerf.nIterations() < minIter_)
|
||||||
|
@ -221,7 +221,7 @@ bool Foam::lduMatrix::solver::stop
|
||||||
|
|
||||||
bool Foam::lduMatrix::solver::converged
|
bool Foam::lduMatrix::solver::converged
|
||||||
(
|
(
|
||||||
lduMatrix::solverPerformance& solverPerf
|
lduSolverPerformance& solverPerf
|
||||||
) const
|
) const
|
||||||
{
|
{
|
||||||
if
|
if
|
||||||
|
|
|
@ -1,165 +0,0 @@
|
||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | foam-extend: Open Source CFD
|
|
||||||
\\ / O peration | Version: 3.2
|
|
||||||
\\ / A nd | Web: http://www.foam-extend.org
|
|
||||||
\\/ M anipulation | For copyright notice see file Copyright
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
License
|
|
||||||
This file is part of foam-extend.
|
|
||||||
|
|
||||||
foam-extend 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.
|
|
||||||
|
|
||||||
foam-extend 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 foam-extend. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
Description
|
|
||||||
Convergence and singularity tests for solvers.
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#include "lduMatrix.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
bool Foam::lduMatrix::solverPerformance::checkConvergence
|
|
||||||
(
|
|
||||||
const scalar Tolerance,
|
|
||||||
const scalar RelTolerance
|
|
||||||
)
|
|
||||||
{
|
|
||||||
if (debug >= 2)
|
|
||||||
{
|
|
||||||
Info<< solverName_
|
|
||||||
<< ": Iteration " << noIterations_
|
|
||||||
<< " residual = " << finalResidual_
|
|
||||||
<< endl;
|
|
||||||
}
|
|
||||||
|
|
||||||
if
|
|
||||||
(
|
|
||||||
finalResidual_ < Tolerance // Abs. tolerance
|
|
||||||
|| (
|
|
||||||
RelTolerance > SMALL
|
|
||||||
&& finalResidual_ <= RelTolerance*initialResidual_ // Rel. tolerance
|
|
||||||
)
|
|
||||||
// || (solverName == "symSolve" && iter == 0)
|
|
||||||
)
|
|
||||||
{
|
|
||||||
converged_ = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
converged_ = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return converged_;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool Foam::lduMatrix::solverPerformance::checkSingularity
|
|
||||||
(
|
|
||||||
const scalar residual
|
|
||||||
)
|
|
||||||
{
|
|
||||||
if (residual > VSMALL)
|
|
||||||
{
|
|
||||||
singular_ = false;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
singular_ = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return singular_;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Foam::lduMatrix::solverPerformance::print() const
|
|
||||||
{
|
|
||||||
if (debug)
|
|
||||||
{
|
|
||||||
Info<< solverName_ << ": Solving for " << fieldName_;
|
|
||||||
|
|
||||||
if (singular())
|
|
||||||
{
|
|
||||||
Info<< ": solution singularity" << endl;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Info<< ", Initial residual = " << initialResidual_
|
|
||||||
<< ", Final residual = " << finalResidual_
|
|
||||||
<< ", No Iterations " << noIterations_
|
|
||||||
<< endl;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool Foam::lduSolverPerformance::operator!=
|
|
||||||
(
|
|
||||||
const lduSolverPerformance& sp
|
|
||||||
) const
|
|
||||||
{
|
|
||||||
return
|
|
||||||
(
|
|
||||||
solverName() != sp.solverName()
|
|
||||||
|| fieldName() != sp.fieldName()
|
|
||||||
|| initialResidual() != sp.initialResidual()
|
|
||||||
|| finalResidual() != sp.finalResidual()
|
|
||||||
|| nIterations() != sp.nIterations()
|
|
||||||
|| converged() != sp.converged()
|
|
||||||
|| singular() != sp.singular()
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Foam::Istream& Foam::operator>>
|
|
||||||
(
|
|
||||||
Istream& is,
|
|
||||||
lduSolverPerformance& sp
|
|
||||||
)
|
|
||||||
{
|
|
||||||
is.readBeginList("SolverPerformance<Type>");
|
|
||||||
is >> sp.solverName_
|
|
||||||
>> sp.fieldName_
|
|
||||||
>> sp.initialResidual_
|
|
||||||
>> sp.finalResidual_
|
|
||||||
>> sp.noIterations_
|
|
||||||
>> sp.converged_
|
|
||||||
>> sp.singular_;
|
|
||||||
is.readEndList("SolverPerformance<Type>");
|
|
||||||
|
|
||||||
return is;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
Foam::Ostream& Foam::operator<<
|
|
||||||
(
|
|
||||||
Ostream& os,
|
|
||||||
const lduSolverPerformance& sp
|
|
||||||
)
|
|
||||||
{
|
|
||||||
os << token::BEGIN_LIST
|
|
||||||
<< sp.solverName_ << token::SPACE
|
|
||||||
<< sp.fieldName_ << token::SPACE
|
|
||||||
<< sp.initialResidual_ << token::SPACE
|
|
||||||
<< sp.finalResidual_ << token::SPACE
|
|
||||||
<< sp.noIterations_ << token::SPACE
|
|
||||||
<< sp.converged_ << token::SPACE
|
|
||||||
<< sp.singular_ << token::SPACE
|
|
||||||
<< token::END_LIST;
|
|
||||||
|
|
||||||
return os;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
49
src/foam/matrices/lduMatrix/lduMatrix/lduSolverPerformance.H
Normal file
49
src/foam/matrices/lduMatrix/lduMatrix/lduSolverPerformance.H
Normal file
|
@ -0,0 +1,49 @@
|
||||||
|
/*---------------------------------------------------------------------------*\
|
||||||
|
========= |
|
||||||
|
\\ / F ield | foam-extend: Open Source CFD
|
||||||
|
\\ / O peration | Version: 3.2
|
||||||
|
\\ / A nd | Web: http://www.foam-extend.org
|
||||||
|
\\/ M anipulation | For copyright notice see file Copyright
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
License
|
||||||
|
This file is part of foam-extend.
|
||||||
|
|
||||||
|
foam-extend 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.
|
||||||
|
|
||||||
|
foam-extend 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 foam-extend. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
Typedef
|
||||||
|
Foam::lduSolverPerformance
|
||||||
|
|
||||||
|
Description
|
||||||
|
BlockSolverPerformance instantiated for a scalar and lduMatrix
|
||||||
|
|
||||||
|
\*---------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
#ifndef lduSolverPerformance_H
|
||||||
|
#define lduSolverPerformance_H
|
||||||
|
|
||||||
|
#include "BlockSolverPerformance.H"
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
namespace Foam
|
||||||
|
{
|
||||||
|
typedef BlockSolverPerformance<scalar> lduSolverPerformance;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// ************************************************************************* //
|
|
@ -30,7 +30,7 @@ License
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
||||||
|
|
||||||
Foam::lduMatrix::solverPerformance Foam::GAMGSolver::solve
|
Foam::lduSolverPerformance Foam::GAMGSolver::solve
|
||||||
(
|
(
|
||||||
scalarField& x,
|
scalarField& x,
|
||||||
const scalarField& b,
|
const scalarField& b,
|
||||||
|
|
|
@ -59,7 +59,7 @@ Foam::diagonalSolver::diagonalSolver
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
Foam::lduMatrix::solverPerformance Foam::diagonalSolver::solve
|
Foam::lduSolverPerformance Foam::diagonalSolver::solve
|
||||||
(
|
(
|
||||||
scalarField& x,
|
scalarField& x,
|
||||||
const scalarField& b,
|
const scalarField& b,
|
||||||
|
|
|
@ -146,7 +146,8 @@ Foam::solution::solution(const objectRegistry& obr, const fileName& dictName)
|
||||||
eqnRelaxDict_(dictionary::null),
|
eqnRelaxDict_(dictionary::null),
|
||||||
fieldRelaxDefault_(0),
|
fieldRelaxDefault_(0),
|
||||||
eqnRelaxDefault_(0),
|
eqnRelaxDefault_(0),
|
||||||
solvers_(dictionary::null)
|
solvers_(dictionary::null),
|
||||||
|
prevTimeIndex_(0)
|
||||||
{
|
{
|
||||||
if (!headerOk())
|
if (!headerOk())
|
||||||
{
|
{
|
||||||
|
@ -162,6 +163,8 @@ Foam::solution::solution(const objectRegistry& obr, const fileName& dictName)
|
||||||
}
|
}
|
||||||
|
|
||||||
read(solutionDict());
|
read(solutionDict());
|
||||||
|
|
||||||
|
set("solverPerformance", dictionary());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -408,5 +411,46 @@ bool Foam::solution::writeData(Ostream& os) const
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const Foam::dictionary& Foam::solution::solverPerformanceDict() const
|
||||||
|
{
|
||||||
|
return subDict("solverPerformance");
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::solution::setSolverPerformance
|
||||||
|
(
|
||||||
|
const word& name,
|
||||||
|
const lduSolverPerformance& sp
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
dictionary& dict = const_cast<dictionary&>(solverPerformanceDict());
|
||||||
|
|
||||||
|
List<lduSolverPerformance> perfs;
|
||||||
|
|
||||||
|
if (prevTimeIndex_ != this->time().timeIndex())
|
||||||
|
{
|
||||||
|
// Reset solver performance between iterations
|
||||||
|
prevTimeIndex_ = this->time().timeIndex();
|
||||||
|
dict.clear();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
dict.readIfPresent(name, perfs);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Append to list
|
||||||
|
perfs.setSize(perfs.size()+1, sp);
|
||||||
|
|
||||||
|
dict.set(name, perfs);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Foam::solution::setSolverPerformance
|
||||||
|
(
|
||||||
|
const lduSolverPerformance& sp
|
||||||
|
) const
|
||||||
|
{
|
||||||
|
setSolverPerformance(sp.fieldName(), sp);
|
||||||
|
}
|
||||||
|
|
||||||
// ************************************************************************* //
|
// ************************************************************************* //
|
||||||
|
|
|
@ -37,6 +37,7 @@ SourceFiles
|
||||||
|
|
||||||
#include "IOdictionary.H"
|
#include "IOdictionary.H"
|
||||||
#include "debugSwitch.H"
|
#include "debugSwitch.H"
|
||||||
|
#include "lduSolverPerformance.H"
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
||||||
|
|
||||||
|
@ -74,6 +75,9 @@ class solution
|
||||||
//- Dictionary of solver parameters for all the fields
|
//- Dictionary of solver parameters for all the fields
|
||||||
dictionary solvers_;
|
dictionary solvers_;
|
||||||
|
|
||||||
|
//- Previously used time-index, used for reset between iterations
|
||||||
|
mutable label prevTimeIndex_;
|
||||||
|
|
||||||
|
|
||||||
// Private Member Functions
|
// Private Member Functions
|
||||||
|
|
||||||
|
@ -144,6 +148,24 @@ public:
|
||||||
//- Return the solver controls dictionary for the given field
|
//- Return the solver controls dictionary for the given field
|
||||||
const dictionary& solver(const word& name) const;
|
const dictionary& solver(const word& name) const;
|
||||||
|
|
||||||
|
//- Return the dictionary of solver performance data
|
||||||
|
// which includes initial and final residuals for convergence
|
||||||
|
// checking
|
||||||
|
const dictionary& solverPerformanceDict() const;
|
||||||
|
|
||||||
|
//- Add/set the solverPerformance entry for the named field
|
||||||
|
void setSolverPerformance
|
||||||
|
(
|
||||||
|
const word& name,
|
||||||
|
const lduSolverPerformance&
|
||||||
|
) const;
|
||||||
|
|
||||||
|
//- Add/set the solverPerformance entry, using its fieldName
|
||||||
|
void setSolverPerformance
|
||||||
|
(
|
||||||
|
const lduSolverPerformance&
|
||||||
|
) const;
|
||||||
|
|
||||||
|
|
||||||
// Edit
|
// Edit
|
||||||
|
|
||||||
|
|
|
@ -1,99 +0,0 @@
|
||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | foam-extend: Open Source CFD
|
|
||||||
\\ / O peration | Version: 3.2
|
|
||||||
\\ / A nd | Web: http://www.foam-extend.org
|
|
||||||
\\/ M anipulation | For copyright notice see file Copyright
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
License
|
|
||||||
This file is part of foam-extend.
|
|
||||||
|
|
||||||
foam-extend 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.
|
|
||||||
|
|
||||||
foam-extend 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 foam-extend. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#include "data.H"
|
|
||||||
#include "foamTime.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
int Foam::data::debug(Foam::debug::debugSwitchFromDict("data", false));
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
Foam::data::data(const objectRegistry& obr)
|
|
||||||
:
|
|
||||||
IOdictionary
|
|
||||||
(
|
|
||||||
IOobject
|
|
||||||
(
|
|
||||||
"data",
|
|
||||||
obr.time().system(),
|
|
||||||
obr,
|
|
||||||
IOobject::NO_READ,
|
|
||||||
IOobject::NO_WRITE
|
|
||||||
)
|
|
||||||
),
|
|
||||||
prevTimeIndex_(0)
|
|
||||||
{
|
|
||||||
set("solverPerformance", dictionary());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
const Foam::dictionary& Foam::data::solverPerformanceDict() const
|
|
||||||
{
|
|
||||||
return subDict("solverPerformance");
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Foam::data::setSolverPerformance
|
|
||||||
(
|
|
||||||
const word& name,
|
|
||||||
const lduSolverPerformance& sp
|
|
||||||
) const
|
|
||||||
{
|
|
||||||
dictionary& dict = const_cast<dictionary&>(solverPerformanceDict());
|
|
||||||
|
|
||||||
List<lduSolverPerformance> perfs;
|
|
||||||
|
|
||||||
if (prevTimeIndex_ != this->time().timeIndex())
|
|
||||||
{
|
|
||||||
// Reset solver performance between iterations
|
|
||||||
prevTimeIndex_ = this->time().timeIndex();
|
|
||||||
dict.clear();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
dict.readIfPresent(name, perfs);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Append to list
|
|
||||||
perfs.setSize(perfs.size()+1, sp);
|
|
||||||
|
|
||||||
dict.set(name, perfs);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Foam::data::setSolverPerformance
|
|
||||||
(
|
|
||||||
const lduSolverPerformance& sp
|
|
||||||
) const
|
|
||||||
{
|
|
||||||
setSolverPerformance(sp.fieldName(), sp);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
|
@ -1,116 +0,0 @@
|
||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
========= |
|
|
||||||
\\ / F ield | foam-extend: Open Source CFD
|
|
||||||
\\ / O peration | Version: 3.2
|
|
||||||
\\ / A nd | Web: http://www.foam-extend.org
|
|
||||||
\\/ M anipulation | For copyright notice see file Copyright
|
|
||||||
-------------------------------------------------------------------------------
|
|
||||||
License
|
|
||||||
This file is part of foam-extend.
|
|
||||||
|
|
||||||
foam-extend 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.
|
|
||||||
|
|
||||||
foam-extend 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 foam-extend. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
Class
|
|
||||||
Foam::data
|
|
||||||
|
|
||||||
Description
|
|
||||||
Database for solution data, solver performance and other reduced data.
|
|
||||||
|
|
||||||
fvMesh is derived from data so that all fields have access to the data from
|
|
||||||
the mesh reference they hold.
|
|
||||||
|
|
||||||
SourceFiles
|
|
||||||
data.C
|
|
||||||
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
#ifndef data_H
|
|
||||||
#define data_H
|
|
||||||
|
|
||||||
#include "IOdictionary.H"
|
|
||||||
#include "lduMatrix.H"
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
namespace Foam
|
|
||||||
{
|
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------*\
|
|
||||||
Class data Declaration
|
|
||||||
\*---------------------------------------------------------------------------*/
|
|
||||||
|
|
||||||
class data
|
|
||||||
:
|
|
||||||
public IOdictionary
|
|
||||||
{
|
|
||||||
// Private data
|
|
||||||
|
|
||||||
//- Previously used time-index, used for reset between iterations
|
|
||||||
mutable label prevTimeIndex_;
|
|
||||||
|
|
||||||
|
|
||||||
// Private Member Functions
|
|
||||||
|
|
||||||
//- Disallow default bitwise copy construct
|
|
||||||
data(const data&);
|
|
||||||
|
|
||||||
//- Disallow default bitwise assignment
|
|
||||||
void operator=(const data&);
|
|
||||||
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
//- Debug switch
|
|
||||||
static int debug;
|
|
||||||
|
|
||||||
|
|
||||||
// Constructors
|
|
||||||
|
|
||||||
//- Construct for objectRegistry
|
|
||||||
data(const objectRegistry& obr);
|
|
||||||
|
|
||||||
|
|
||||||
// Member Functions
|
|
||||||
|
|
||||||
// Access
|
|
||||||
|
|
||||||
//- Return the dictionary of solver performance data
|
|
||||||
// which includes initial and final residuals for convergence
|
|
||||||
// checking
|
|
||||||
const dictionary& solverPerformanceDict() const;
|
|
||||||
|
|
||||||
//- Add/set the solverPerformance entry for the named field
|
|
||||||
void setSolverPerformance
|
|
||||||
(
|
|
||||||
const word& name,
|
|
||||||
const lduSolverPerformance&
|
|
||||||
) const;
|
|
||||||
|
|
||||||
//- Add/set the solverPerformance entry, using its fieldName
|
|
||||||
void setSolverPerformance
|
|
||||||
(
|
|
||||||
const lduSolverPerformance&
|
|
||||||
) const;
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
} // End namespace Foam
|
|
||||||
|
|
||||||
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
|
|
@ -66,7 +66,6 @@ divSchemes
|
||||||
laplacianSchemes { default Gauss linear corrected; }
|
laplacianSchemes { default Gauss linear corrected; }
|
||||||
interpolationSchemes { default linear; }
|
interpolationSchemes { default linear; }
|
||||||
snGradSchemes { default corrected; }
|
snGradSchemes { default corrected; }
|
||||||
fluxRequired { default yes; }
|
|
||||||
EOF
|
EOF
|
||||||
}
|
}
|
||||||
#
|
#
|
||||||
|
|
|
@ -45,8 +45,4 @@ interpolationSchemes
|
||||||
snGradSchemes
|
snGradSchemes
|
||||||
{}
|
{}
|
||||||
|
|
||||||
fluxRequired
|
|
||||||
{}
|
|
||||||
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
// ************************************************************************* //
|
||||||
|
|
|
@ -72,12 +72,6 @@ snGradSchemes
|
||||||
default limited 0.5;
|
default limited 0.5;
|
||||||
}
|
}
|
||||||
|
|
||||||
fluxRequired
|
|
||||||
{
|
|
||||||
default no;
|
|
||||||
p;
|
|
||||||
}
|
|
||||||
|
|
||||||
mixingPlane
|
mixingPlane
|
||||||
{
|
{
|
||||||
default areaAveraging;
|
default areaAveraging;
|
||||||
|
@ -86,22 +80,4 @@ mixingPlane
|
||||||
omega areaAveraging;
|
omega areaAveraging;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
// ************************************************************************* //
|
||||||
|
|
|
@ -72,12 +72,6 @@ snGradSchemes
|
||||||
default limited 0.5;
|
default limited 0.5;
|
||||||
}
|
}
|
||||||
|
|
||||||
fluxRequired
|
|
||||||
{
|
|
||||||
default no;
|
|
||||||
p;
|
|
||||||
}
|
|
||||||
|
|
||||||
mixingPlane
|
mixingPlane
|
||||||
{
|
{
|
||||||
default areaAveraging;
|
default areaAveraging;
|
||||||
|
|
|
@ -52,11 +52,4 @@ snGradSchemes
|
||||||
default corrected;
|
default corrected;
|
||||||
}
|
}
|
||||||
|
|
||||||
fluxRequired
|
|
||||||
{
|
|
||||||
default no;
|
|
||||||
p_rgh;
|
|
||||||
p;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
// ************************************************************************* //
|
||||||
|
|
|
@ -46,9 +46,4 @@ snGradSchemes
|
||||||
default uncorrected;
|
default uncorrected;
|
||||||
}
|
}
|
||||||
|
|
||||||
fluxRequired
|
|
||||||
{
|
|
||||||
default no;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
// ************************************************************************* //
|
||||||
|
|
|
@ -49,10 +49,5 @@ snGradSchemes
|
||||||
default corrected;
|
default corrected;
|
||||||
}
|
}
|
||||||
|
|
||||||
fluxRequired
|
|
||||||
{
|
|
||||||
h;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
// ************************************************************************* //
|
||||||
|
|
|
@ -50,9 +50,5 @@ snGradSchemes
|
||||||
default corrected;
|
default corrected;
|
||||||
}
|
}
|
||||||
|
|
||||||
fluxRequired
|
|
||||||
{
|
|
||||||
h;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
// ************************************************************************* //
|
||||||
|
|
|
@ -48,9 +48,4 @@ snGradSchemes
|
||||||
default corrected;
|
default corrected;
|
||||||
}
|
}
|
||||||
|
|
||||||
fluxRequired
|
|
||||||
{
|
|
||||||
p;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
// ************************************************************************* //
|
||||||
|
|
|
@ -48,9 +48,4 @@ snGradSchemes
|
||||||
default corrected;
|
default corrected;
|
||||||
}
|
}
|
||||||
|
|
||||||
fluxRequired
|
|
||||||
{
|
|
||||||
p;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
// ************************************************************************* //
|
||||||
|
|
|
@ -51,9 +51,4 @@ snGradSchemes
|
||||||
default corrected;
|
default corrected;
|
||||||
}
|
}
|
||||||
|
|
||||||
fluxRequired
|
|
||||||
{
|
|
||||||
p;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
// ************************************************************************* //
|
||||||
|
|
|
@ -50,11 +50,4 @@ snGradSchemes
|
||||||
default corrected;
|
default corrected;
|
||||||
}
|
}
|
||||||
|
|
||||||
fluxRequired
|
|
||||||
{
|
|
||||||
default no;
|
|
||||||
pcorr;
|
|
||||||
p;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
// ************************************************************************* //
|
||||||
|
|
|
@ -49,9 +49,5 @@ snGradSchemes
|
||||||
default corrected;
|
default corrected;
|
||||||
}
|
}
|
||||||
|
|
||||||
fluxRequired
|
|
||||||
{
|
|
||||||
default yes;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
// ************************************************************************* //
|
||||||
|
|
|
@ -49,9 +49,5 @@ snGradSchemes
|
||||||
default corrected;
|
default corrected;
|
||||||
}
|
}
|
||||||
|
|
||||||
fluxRequired
|
|
||||||
{
|
|
||||||
default yes;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
// ************************************************************************* //
|
||||||
|
|
|
@ -47,9 +47,4 @@ snGradSchemes
|
||||||
default none;
|
default none;
|
||||||
}
|
}
|
||||||
|
|
||||||
fluxRequired
|
|
||||||
{
|
|
||||||
p;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
// ************************************************************************* //
|
||||||
|
|
|
@ -44,8 +44,4 @@ snGradSchemes
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
fluxRequired
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
// ************************************************************************* //
|
||||||
|
|
|
@ -43,8 +43,4 @@ snGradSchemes
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
fluxRequired
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
// ************************************************************************* //
|
||||||
|
|
|
@ -48,8 +48,4 @@ snGradSchemes
|
||||||
default none;
|
default none;
|
||||||
}
|
}
|
||||||
|
|
||||||
fluxRequired
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
// ************************************************************************* //
|
||||||
|
|
|
@ -43,8 +43,4 @@ snGradSchemes
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
fluxRequired
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
// ************************************************************************* //
|
// ************************************************************************* //
|
||||||
|
|
Reference in a new issue