From 31642a7d8862e7edcd2f3bc14a8cfe8f06382e62 Mon Sep 17 00:00:00 2001 From: Andrew Heather <> Date: Fri, 7 Dec 2018 11:17:23 +0000 Subject: [PATCH] ENH: residuals FO - extended writing to include solver name, initial and final residuals, nIterations. See #1115. --- .../utilities/residuals/residualsTemplates.C | 55 +++++++++++++------ 1 file changed, 38 insertions(+), 17 deletions(-) diff --git a/src/functionObjects/utilities/residuals/residualsTemplates.C b/src/functionObjects/utilities/residuals/residualsTemplates.C index 43c26a7f03..bfba247840 100644 --- a/src/functionObjects/utilities/residuals/residualsTemplates.C +++ b/src/functionObjects/utilities/residuals/residualsTemplates.C @@ -41,6 +41,8 @@ void Foam::functionObjects::residuals::writeFileHeader if (foundObject(fieldName)) { + writeTabbed(os, fieldName + "_solver"); + typename pTraits::labelType validComponents ( mesh_.validComponents() @@ -50,13 +52,16 @@ void Foam::functionObjects::residuals::writeFileHeader { if (component(validComponents, cmpt) != -1) { - writeTabbed - ( - os, - fieldName + word(pTraits::componentNames[cmpt]) - ); + const word cmptName(pTraits::componentNames[cmpt]); + const word fieldBase(fieldName + cmptName); + + writeTabbed(os, fieldBase + "_initial"); + writeTabbed(os, fieldBase + "_final"); + writeTabbed(os, fieldBase + "_iters"); } } + + writeTabbed(os, fieldName + "_converged"); } } @@ -81,8 +86,10 @@ void Foam::functionObjects::residuals::initialiseField(const word& fieldName) { if (component(validComponents, cmpt) != -1) { - const word resultName = - fieldName + word(pTraits::componentNames[cmpt]); + const word resultName + ( + fieldName + word(pTraits::componentNames[cmpt]) + ); createField(resultName); } @@ -96,6 +103,7 @@ template void Foam::functionObjects::residuals::writeResidual(const word& fieldName) { typedef GeometricField volFieldType; + typedef typename pTraits::labelType labelType; if (foundObject(fieldName)) { @@ -108,28 +116,41 @@ void Foam::functionObjects::residuals::writeResidual(const word& fieldName) solverDict.lookup(fieldName) ); - const Type& residual = sp.first().initialResidual(); + const SolverPerformance& sp0 = sp.first(); + const word& solverName = sp0.solverName(); + const Type& initialResidual = sp0.initialResidual(); + const Type& finalResidual = sp0.finalResidual(); + const labelType nIterations = sp0.nIterations(); + const bool converged = sp0.converged(); - typename pTraits::labelType validComponents - ( - mesh_.validComponents() - ); + const labelType validComponents(mesh_.validComponents()); + + file() << token::TAB << solverName; for (direction cmpt=0; cmpt::nComponents; ++cmpt) { if (component(validComponents, cmpt) != -1) { - const scalar r = component(residual, cmpt); + const scalar ri = component(initialResidual, cmpt); + const scalar rf = component(finalResidual, cmpt); + const label n = component(nIterations, cmpt); - file() << token::TAB << r; + file() + << token::TAB << ri + << token::TAB << rf + << token::TAB << n; - const word resultName = - fieldName + word(pTraits::componentNames[cmpt]); - setResult(resultName, r); + const word cmptName(pTraits::componentNames[cmpt]); + const word resultName(fieldName + cmptName); + setResult(resultName + "_initial", ri); + setResult(resultName + "_final", rf); + setResult(resultName + "_iters", n); writeField(resultName); } } + + file() << token::TAB << converged; } } }