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