From ebbeef27b4e91ec471e77f86804c388b98aaefdc Mon Sep 17 00:00:00 2001
From: Kutalmis Bercin <kutalmis.bercin@esi-group.com>
Date: Thu, 1 May 2025 14:56:31 +0100
Subject: [PATCH] ENH: avoid the build-up of the background solver dictionary

The solverPerformanceDict gets larger due to the addition of a SolverPerformance
data per field at every outer iteration within the same main iteration/time
step.

However, the subsequent functionalities seem to use only the first and last
element of this dictionary per field; therefore, storing the interim values
was revealed to be redundant.

The change removes the interim values by transforming the `List` container
into the `Pair` container, and modifying the relevant algorithms.
---
 .../meshes/meshState/meshStateTemplates.C       | 17 +++++++++++++----
 .../solutionControl/solutionControl.C           |  2 +-
 .../equationInitialResidualConditionTemplates.C |  2 +-
 .../equationMaxIterCondition.C                  |  2 +-
 .../utilities/solverInfo/solverInfoTemplates.C  |  2 +-
 5 files changed, 17 insertions(+), 8 deletions(-)

diff --git a/src/OpenFOAM/meshes/meshState/meshStateTemplates.C b/src/OpenFOAM/meshes/meshState/meshStateTemplates.C
index 06b8561ac05..b56905fa45d 100644
--- a/src/OpenFOAM/meshes/meshState/meshStateTemplates.C
+++ b/src/OpenFOAM/meshes/meshState/meshStateTemplates.C
@@ -39,12 +39,14 @@ void Foam::meshState::setSolverPerformance
 {
     dictionary& dict = const_cast<dictionary&>(solverPerformanceDict());
 
-    List<SolverPerformance<Type>> perfs;
+    Pair<SolverPerformance<Type>> perfs;
 
-    if (prevTimeIndex_ != this->time().timeIndex())
+    const label timeIndex = this->time().timeIndex();
+
+    if (prevTimeIndex_ != timeIndex)
     {
         // Reset solver performance between iterations
-        prevTimeIndex_ = this->time().timeIndex();
+        prevTimeIndex_ = timeIndex;
         dict.clear();
     }
     else
@@ -52,7 +54,14 @@ void Foam::meshState::setSolverPerformance
         dict.readIfPresent(name, perfs);
     }
 
-    perfs.push_back(sp);
+    if (dict.found(name))
+    {
+        perfs.second() = sp;
+    }
+    else
+    {
+        perfs = Pair<SolverPerformance<Type>>(sp, sp);
+    }
 
     dict.set(name, perfs);
 }
diff --git a/src/finiteVolume/cfdTools/general/solutionControl/solutionControl/solutionControl.C b/src/finiteVolume/cfdTools/general/solutionControl/solutionControl/solutionControl.C
index a1630c94342..c8d27d0cb4c 100644
--- a/src/finiteVolume/cfdTools/general/solutionControl/solutionControl/solutionControl.C
+++ b/src/finiteVolume/cfdTools/general/solutionControl/solutionControl/solutionControl.C
@@ -227,7 +227,7 @@ bool Foam::solutionControl::maxTypeResidual
 
     if (fvmesh.foundObject<fieldType>(fieldName))
     {
-        const List<SolverPerformance<Type>> sp(solverPerfDictEntry.stream());
+        const Pair<SolverPerformance<Type>> sp(solverPerfDictEntry.stream());
 
         residuals.first() = cmptMax(sp.first().initialResidual());
         residuals.last()  = cmptMax(sp.last().initialResidual());
diff --git a/src/functionObjects/utilities/runTimeControl/runTimeCondition/equationInitialResidualCondition/equationInitialResidualConditionTemplates.C b/src/functionObjects/utilities/runTimeControl/runTimeCondition/equationInitialResidualCondition/equationInitialResidualConditionTemplates.C
index 52c71a4bca7..706023357e6 100644
--- a/src/functionObjects/utilities/runTimeControl/runTimeCondition/equationInitialResidualCondition/equationInitialResidualConditionTemplates.C
+++ b/src/functionObjects/utilities/runTimeControl/runTimeCondition/equationInitialResidualCondition/equationInitialResidualConditionTemplates.C
@@ -43,7 +43,7 @@ equationInitialResidualCondition::setResidual
 
     if (canSet && mesh.foundObject<volFieldType>(fieldName))
     {
-        const List<SolverPerformance<Type>> sp(dict.lookup(fieldName));
+        const Pair<SolverPerformance<Type>> sp(dict.lookup(fieldName));
         const Type& allComponents = sp.first().initialResidual();
 
         if (componenti != -1)
diff --git a/src/functionObjects/utilities/runTimeControl/runTimeCondition/equationMaxIterCondition/equationMaxIterCondition.C b/src/functionObjects/utilities/runTimeControl/runTimeCondition/equationMaxIterCondition/equationMaxIterCondition.C
index 756e2552b15..ef0e5656662 100644
--- a/src/functionObjects/utilities/runTimeControl/runTimeCondition/equationMaxIterCondition/equationMaxIterCondition.C
+++ b/src/functionObjects/utilities/runTimeControl/runTimeCondition/equationMaxIterCondition/equationMaxIterCondition.C
@@ -107,7 +107,7 @@ bool Foam::functionObjects::runTimeControls::equationMaxIterCondition::apply()
 
         if (solverDict.found(fieldName))
         {
-            const List<solverPerformance> sp(solverDict.lookup(fieldName));
+            const Pair<solverPerformance> sp(solverDict.lookup(fieldName));
             const label nIterations = sp.first().nIterations();
             result[fieldi] = nIterations;
 
diff --git a/src/functionObjects/utilities/solverInfo/solverInfoTemplates.C b/src/functionObjects/utilities/solverInfo/solverInfoTemplates.C
index 5ddc9d4e6b4..4438d977cee 100644
--- a/src/functionObjects/utilities/solverInfo/solverInfoTemplates.C
+++ b/src/functionObjects/utilities/solverInfo/solverInfoTemplates.C
@@ -119,7 +119,7 @@ void Foam::functionObjects::solverInfo::updateSolverInfo(const word& fieldName)
 
         if (solverDict.found(fieldName))
         {
-            const List<SolverPerformance<Type>> sp
+            const Pair<SolverPerformance<Type>> sp
             (
                 solverDict.lookup(fieldName)
             );
-- 
GitLab