From ebbeef27b4e91ec471e77f86804c388b98aaefdc Mon Sep 17 00:00:00 2001 From: Kutalmis Bercin 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 06b8561ac0..b56905fa45 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(solverPerformanceDict()); - List> perfs; + Pair> 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>(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 a1630c9434..c8d27d0cb4 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(fieldName)) { - const List> sp(solverPerfDictEntry.stream()); + const Pair> 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 52c71a4bca..706023357e 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(fieldName)) { - const List> sp(dict.lookup(fieldName)); + const Pair> 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 756e2552b1..ef0e565666 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 sp(solverDict.lookup(fieldName)); + const Pair 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 5ddc9d4e6b..4438d977ce 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> sp + const Pair> sp ( solverDict.lookup(fieldName) );