diff --git a/applications/solvers/incompressible/adjointOptimisationFoam/adjointOptimisationFoam.C b/applications/solvers/incompressible/adjointOptimisationFoam/adjointOptimisationFoam.C index 024a9a29ad..7d29d48497 100644 --- a/applications/solvers/incompressible/adjointOptimisationFoam/adjointOptimisationFoam.C +++ b/applications/solvers/incompressible/adjointOptimisationFoam/adjointOptimisationFoam.C @@ -5,8 +5,8 @@ \\ / A nd | www.openfoam.com \\/ M anipulation | ------------------------------------------------------------------------------- - Copyright (C) 2007-2019 PCOpt/NTUA - Copyright (C) 2013-2019 FOSS GP + Copyright (C) 2007-2021 PCOpt/NTUA + Copyright (C) 2013-2021 FOSS GP Copyright (C) 2019 OpenCFD Ltd. ------------------------------------------------------------------------------- License @@ -71,9 +71,6 @@ int main(int argc, char *argv[]) // Solve all adjoint equations om.solveAdjointEquations(); - - // Compute all sensitivities - om.computeSensitivities(); } Info<< "End\n" << endl; diff --git a/src/optimisation/adjointOptimisation/adjoint/solvers/adjointSolvers/adjointSolver/adjointSolver.C b/src/optimisation/adjointOptimisation/adjoint/solvers/adjointSolvers/adjointSolver/adjointSolver.C index 01d88cb0d0..aff18976f3 100644 --- a/src/optimisation/adjointOptimisation/adjoint/solvers/adjointSolvers/adjointSolver/adjointSolver.C +++ b/src/optimisation/adjointOptimisation/adjoint/solvers/adjointSolvers/adjointSolver/adjointSolver.C @@ -151,6 +151,16 @@ Foam::objectiveManager& Foam::adjointSolver::getObjectiveManager() } +void Foam::adjointSolver::postLoop() +{ + computeObjectiveSensitivities(); + // The solver dictionary has been already written after the termination + // of the adjoint loop. Force re-writing it to include the sensitivities + // as well + regIOobject::write(true); +} + + bool Foam::adjointSolver::isConstraint() { return isConstraint_; @@ -169,4 +179,14 @@ void Foam::adjointSolver::updatePrimalBasedQuantities() } +bool Foam::adjointSolver::writeData(Ostream& os) const +{ + if (sensitivities_.valid()) + { + sensitivities_().writeEntry("sensitivities", os); + } + return true; +} + + // ************************************************************************* // diff --git a/src/optimisation/adjointOptimisation/adjoint/solvers/adjointSolvers/adjointSolver/adjointSolver.H b/src/optimisation/adjointOptimisation/adjoint/solvers/adjointSolvers/adjointSolver/adjointSolver.H index b4b06eb148..f3a7c8e765 100644 --- a/src/optimisation/adjointOptimisation/adjoint/solvers/adjointSolvers/adjointSolver/adjointSolver.H +++ b/src/optimisation/adjointOptimisation/adjoint/solvers/adjointSolvers/adjointSolver/adjointSolver.H @@ -81,7 +81,7 @@ protected: autoPtr objectiveManagerPtr_; //- Sensitivities field - autoPtr sensitivities_; + tmp sensitivities_; //- Are sensitivities computed bool computeSensitivities_; @@ -172,6 +172,10 @@ public: // Evolution + //- Functions to be called after loop + // Computes adjoint sensitivities + virtual void postLoop(); + //- Compute sensitivities of the underlaying objectives virtual void computeObjectiveSensitivities() = 0; @@ -191,6 +195,9 @@ public: //- in adjoint turbulence models // Does nothing in the base virtual void updatePrimalBasedQuantities(); + + //- Write the sensitivity derivatives + virtual bool writeData(Ostream& os) const; }; diff --git a/src/optimisation/adjointOptimisation/adjoint/solvers/adjointSolvers/incompressible/adjointSimple/adjointSimple.C b/src/optimisation/adjointOptimisation/adjoint/solvers/adjointSolvers/incompressible/adjointSimple/adjointSimple.C index 5bea81955b..58cc0d4459 100644 --- a/src/optimisation/adjointOptimisation/adjoint/solvers/adjointSolvers/incompressible/adjointSimple/adjointSimple.C +++ b/src/optimisation/adjointOptimisation/adjoint/solvers/adjointSolvers/incompressible/adjointSimple/adjointSimple.C @@ -151,6 +151,19 @@ Foam::adjointSimple::adjointSimple objectiveManagerPtr_() ).ptr() ); + // Read stored sensitivities, if they exist + // Need to know the size of the sensitivity field, retrieved after the + // allocation of the corresponding object + if (dictionary::found("sensitivities")) + { + sensitivities_ = + tmp::New + ( + "sensitivities", + *this, + adjointSensitivity_().getSensitivities().size() + ); + } } } @@ -336,6 +349,7 @@ void Foam::adjointSimple::solve() { solveIter(); } + postLoop(); } } @@ -363,7 +377,7 @@ void Foam::adjointSimple::computeObjectiveSensitivities() { sensitivities_.reset(new scalarField(sens.size(), Zero)); } - *sensitivities_ = sens; + sensitivities_.ref() = sens; } else { @@ -433,8 +447,7 @@ void Foam::adjointSimple::updatePrimalBasedQuantities() bool Foam::adjointSimple::writeData(Ostream& os) const { os.writeEntry("averageIter", solverControl_().averageIter()); - - return true; + return adjointSolver::writeData(os); }