From bac1d8bae41c343a6704cec03620e895b6f70218 Mon Sep 17 00:00:00 2001 From: Vaggelis Papoutsis <vaggelisp@gmail.com> Date: Thu, 7 Oct 2021 18:00:44 +0300 Subject: [PATCH] ENH: adjustments to the efficiency of the adjoint code - ATCstandard, ATCUaGradU: the ATC is now added as a dimensioned field and not as an fvMatrix to UaEqn. This get rid of many unnecessary allocations. - ATCstandard: gradU is cached within the class to avoid its re-computation in every adjoint iteration of the steady state solver. - Inlined a number of functions within the primal and adjoint solvers. This probably has a negligible effect since they likely were inlined by the compiler either way. - The momentum diffusivity at the boundary, used by the adjoint boundary conditions, was computed for the entire field and, then, only the boundary field of each adjoint boundary condition was used. If many outlet boundaries exist, the entire nuEff field would be computed as many times as the number of boundaries, leading to an unnecessary computational overhead. - Outlet boundary conditions (both pressure and velocity) use the local patch gradient to compute their fluxes. This patch gradient requires the computation of the adjacent cell gradient, which is done on the fly, on a per patch basis. To compute this patch adjacent gradient however, the field under the grad sign is interpolated on the entire mesh. If many outlets exist, this leads to a huge computational overhead. Solved by caching the interpolated field to the database and re-using it, in a way similar to the caching of gradient fields (see fvc::grad). WIP: functions returning references to primal and adjoint boundary fields within boundaryAdjointContributions seem to have a non-negligible overhead for cases with many patches. No easy work-around here since these are virtual and cannot be inlined. WIP: introduced the code structure for caching the contributions to the adjoint boundary conditions that depend only on the primal fields and reusing. The process needs to be completed and evaluated, to make sure that the extra code complexity is justified by gains in performance. --- .../adjoint/ATCModel/ATCModel/ATCModel.C | 10 +- .../adjoint/ATCModel/ATCModel/ATCModel.H | 7 +- .../adjoint/ATCModel/ATCUaGradU/ATCUaGradU.C | 6 +- .../ATCModel/ATCstandard/ATCstandard.C | 52 +++++--- .../ATCModel/ATCstandard/ATCstandard.H | 15 ++- .../adjointBoundaryCondition.C | 64 +++++++--- .../adjointBoundaryCondition.H | 8 +- ...ointOutletVelocityFluxFvPatchVectorField.C | 9 +- ...ointOutletVelocityFluxFvPatchVectorField.H | 8 +- .../adjointWallVelocityFvPatchVectorField.C | 9 +- ...oundaryAdjointContributionIncompressible.C | 95 ++++----------- .../adjointSolver/adjointSolver.C | 5 +- .../adjointSimple/adjointSimple.C | 6 +- .../incompressibleAdjointSolver.C | 6 +- .../incompressible/incompressibleVars.C | 79 +----------- .../incompressible/incompressibleVars.H | 34 +++--- .../incompressible/incompressibleVarsI.H | 112 ++++++++++++++++++ .../incompressibleAdjointVars.C | 46 ++++--- .../incompressibleAdjointVars.H | 16 ++- .../incompressibleAdjointVarsI.H | 49 ++++++++ .../incompressibleAdjointMeanFlowVars.C | 40 +------ .../incompressibleAdjointMeanFlowVars.H | 20 ++-- .../incompressibleAdjointMeanFlowVarsI.H | 73 ++++++++++++ .../adjointSpalartAllmaras.C | 8 +- .../adjointTurbulenceModel.H | 21 +++- 25 files changed, 511 insertions(+), 287 deletions(-) create mode 100644 src/optimisation/adjointOptimisation/adjoint/solvers/variablesSet/incompressible/incompressibleVarsI.H create mode 100644 src/optimisation/adjointOptimisation/adjoint/solvers/variablesSet/incompressibleAdjoint/incompressibleAdjointVarsI.H create mode 100644 src/optimisation/adjointOptimisation/adjoint/solvers/variablesSet/incompressibleAdjointMeanFlow/incompressibleAdjointMeanFlowVarsI.H diff --git a/src/optimisation/adjointOptimisation/adjoint/ATCModel/ATCModel/ATCModel.C b/src/optimisation/adjointOptimisation/adjoint/ATCModel/ATCModel/ATCModel.C index 2be1febb350..057996e18ab 100644 --- a/src/optimisation/adjointOptimisation/adjoint/ATCModel/ATCModel/ATCModel.C +++ b/src/optimisation/adjointOptimisation/adjoint/ATCModel/ATCModel/ATCModel.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-2021 OpenCFD Ltd. ------------------------------------------------------------------------------- License @@ -259,6 +259,12 @@ bool ATCModel::writeData(Ostream&) const } +void ATCModel::updatePrimalBasedQuantities() +{ + // Does nothing in base +} + + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // } // End namespace Foam diff --git a/src/optimisation/adjointOptimisation/adjoint/ATCModel/ATCModel/ATCModel.H b/src/optimisation/adjointOptimisation/adjoint/ATCModel/ATCModel/ATCModel.H index d80c75b12eb..7738ef491c5 100644 --- a/src/optimisation/adjointOptimisation/adjoint/ATCModel/ATCModel/ATCModel.H +++ b/src/optimisation/adjointOptimisation/adjoint/ATCModel/ATCModel/ATCModel.H @@ -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 @@ -201,6 +201,9 @@ public: //- Dummy writeData function required from regIOobject virtual bool writeData(Ostream&) const; + + //- Update quantities related with the primal fields + virtual void updatePrimalBasedQuantities(); }; diff --git a/src/optimisation/adjointOptimisation/adjoint/ATCModel/ATCUaGradU/ATCUaGradU.C b/src/optimisation/adjointOptimisation/adjoint/ATCModel/ATCUaGradU/ATCUaGradU.C index 99d73932ff4..660a697ee2f 100644 --- a/src/optimisation/adjointOptimisation/adjoint/ATCModel/ATCUaGradU/ATCUaGradU.C +++ b/src/optimisation/adjointOptimisation/adjoint/ATCModel/ATCUaGradU/ATCUaGradU.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 @@ -97,7 +97,7 @@ void ATCUaGradU::addATC(fvVectorMatrix& UaEqn) smoothATC(); // Actual ATC term - UaEqn += fvm::Su(ATC_, Ua); + UaEqn += ATC_.internalField(); } diff --git a/src/optimisation/adjointOptimisation/adjoint/ATCModel/ATCstandard/ATCstandard.C b/src/optimisation/adjointOptimisation/adjoint/ATCModel/ATCstandard/ATCstandard.C index 214c3aefbcf..ec389d20d75 100644 --- a/src/optimisation/adjointOptimisation/adjoint/ATCModel/ATCstandard/ATCstandard.C +++ b/src/optimisation/adjointOptimisation/adjoint/ATCModel/ATCstandard/ATCstandard.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 @@ -57,7 +57,20 @@ ATCstandard::ATCstandard const dictionary& dict ) : - ATCModel(mesh, primalVars, adjointVars, dict) + ATCModel(mesh, primalVars, adjointVars, dict), + gradU_ + ( + IOobject + ( + "gradUATC", + mesh_.time().timeName(), + mesh_, + IOobject::NO_READ, + IOobject::NO_WRITE + ), + mesh_, + dimensionedTensor(dimless/dimTime, Zero) + ) {} @@ -65,23 +78,14 @@ ATCstandard::ATCstandard void ATCstandard::addATC(fvVectorMatrix& UaEqn) { + addProfiling(ATCstandard, "ATCstandard::addATC"); const volVectorField& U = primalVars_.U(); const volVectorField& Ua = adjointVars_.UaInst(); const surfaceScalarField& phi = primalVars_.phi(); - // Build U to go into the ATC term, based on whether to smooth field or not - autoPtr<volVectorField> UForATC(nullptr); - if (reconstructGradients_) - { - UForATC.reset(new volVectorField(fvc::reconstruct(phi))); - } - else - { - UForATC.reset(new volVectorField(U)); - } // Main ATC term - ATC_ = (fvc::grad(UForATC(), "gradUATC") & Ua); + ATC_ = gradU_ & Ua; if (extraConvection_ > 0) { @@ -97,7 +101,7 @@ void ATCstandard::addATC(fvVectorMatrix& UaEqn) smoothATC(); // actual ATC term - UaEqn += fvm::Su(ATC_, Ua); + UaEqn += ATC_.internalField(); } @@ -149,6 +153,24 @@ tmp<volTensorField> ATCstandard::getFISensitivityTerm() const } +void ATCstandard::updatePrimalBasedQuantities() +{ + const volVectorField& U = primalVars_.U(); + const surfaceScalarField& phi = primalVars_.phi(); + // Build U to go into the ATC term, based on whether to smooth field or not + autoPtr<volVectorField> UForATC(nullptr); + if (reconstructGradients_) + { + UForATC.reset(new volVectorField(fvc::reconstruct(phi))); + } + else + { + UForATC.reset(new volVectorField(U)); + } + gradU_ = fvc::grad(UForATC(), "gradUATC"); +} + + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // } // End namespace Foam diff --git a/src/optimisation/adjointOptimisation/adjoint/ATCModel/ATCstandard/ATCstandard.H b/src/optimisation/adjointOptimisation/adjoint/ATCModel/ATCstandard/ATCstandard.H index 4c65a9c2803..0d7f4eb99f4 100644 --- a/src/optimisation/adjointOptimisation/adjoint/ATCModel/ATCstandard/ATCstandard.H +++ b/src/optimisation/adjointOptimisation/adjoint/ATCModel/ATCstandard/ATCstandard.H @@ -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 @@ -49,7 +49,7 @@ namespace Foam { /*---------------------------------------------------------------------------*\ - Class ATCstandard Declaration + Class ATCstandard Declaration \*---------------------------------------------------------------------------*/ class ATCstandard @@ -58,6 +58,12 @@ class ATCstandard { private: + // Private data + + //- The gradU used in the computation of the standard ATC + // Cached to avoid costly recomputation in each adjoint iteration + volTensorField gradU_; + // Private Member Functions //- No copy construct @@ -96,6 +102,9 @@ public: //- Get the FI sensitivity derivatives term coming from the ATC virtual tmp<volTensorField> getFISensitivityTerm() const; + + //- Update quantities related with the primal fields + virtual void updatePrimalBasedQuantities(); }; diff --git a/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointBoundaryCondition/adjointBoundaryCondition.C b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointBoundaryCondition/adjointBoundaryCondition.C index 1d87524b235..0e49b2815e3 100644 --- a/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointBoundaryCondition/adjointBoundaryCondition.C +++ b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointBoundaryCondition/adjointBoundaryCondition.C @@ -5,8 +5,8 @@ \\ / A nd | www.openfoam.com \\/ M anipulation | ------------------------------------------------------------------------------- - Copyright (C) 2007-2020 PCOpt/NTUA - Copyright (C) 2013-2020 FOSS GP + Copyright (C) 2007-2021 PCOpt/NTUA + Copyright (C) 2013-2021 FOSS GP Copyright (C) 2019-2020 OpenCFD Ltd. ------------------------------------------------------------------------------- License @@ -73,19 +73,48 @@ adjointBoundaryCondition<Type>::computePatchGrad(word name) word schemeData(is); */ - tmp<surfaceInterpolationScheme<Type2>> tinterpScheme - ( - surfaceInterpolationScheme<Type2>::New - ( - mesh, - mesh.interpolationScheme("interpolate(" + name + ")") - ) - ); + // If there are many patches calling this function, the computation of + // the surface field might be a significant computational + // burden. Cache the interpolated field and fetch from the registry when + // possible. + const word surfFieldName("interpolated" + name + "ForBoundaryGrad"); + typedef GeometricField<Type2, fvsPatchField, surfaceMesh> surfFieldType; + surfFieldType* surfFieldPtr = + mesh.objectRegistry::template getObjectPtr<surfFieldType>(surfFieldName); - GeometricField<Type2, fvsPatchField, surfaceMesh> surfField - ( - tinterpScheme().interpolate(field) - ); + if (!surfFieldPtr) + { + solution::cachePrintMessage("Calculating and caching", name, field); + + surfFieldPtr = + surfaceInterpolationScheme<Type2>::New + ( + mesh, mesh.interpolationScheme("interpolate(" + name + ")") + )().interpolate(field).ptr(); + surfFieldPtr->rename(surfFieldName); + regIOobject::store(surfFieldPtr); + } + else + { + if (surfFieldPtr->upToDate(field)) + { + solution::cachePrintMessage("Reusing", name, field); + } + else + { + solution::cachePrintMessage("Updating", name, field); + delete surfFieldPtr; + + surfFieldPtr = + surfaceInterpolationScheme<Type2>::New + ( + mesh, mesh.interpolationScheme("interpolate(" + name + ")") + )().interpolate(field).ptr(); + surfFieldPtr->rename(surfFieldName); + regIOobject::store(surfFieldPtr); + } + } + surfFieldType& surfField = *surfFieldPtr; // Auxiliary fields const surfaceVectorField& Sf = mesh.Sf(); @@ -271,6 +300,13 @@ const ATCModel& adjointBoundaryCondition<Type>::getATC() const } +template<class Type> +void adjointBoundaryCondition<Type>::updatePrimalBasedQuantities() +{ + // Does nothing in base +} + + template<class Type> tmp < diff --git a/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointBoundaryCondition/adjointBoundaryCondition.H b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointBoundaryCondition/adjointBoundaryCondition.H index 4ec46c64c96..dd2f92c98d3 100644 --- a/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointBoundaryCondition/adjointBoundaryCondition.H +++ b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointBoundaryCondition/adjointBoundaryCondition.H @@ -5,8 +5,8 @@ \\ / A nd | www.openfoam.com \\/ M anipulation | ------------------------------------------------------------------------------- - Copyright (C) 2007-2020 PCOpt/NTUA - Copyright (C) 2013-2020 FOSS GP + Copyright (C) 2007-2021 PCOpt/NTUA + Copyright (C) 2013-2021 FOSS GP Copyright (C) 2019 OpenCFD Ltd. ------------------------------------------------------------------------------- License @@ -152,6 +152,10 @@ public: < Field<typename Foam::outerProduct<Foam::vector, Type>::type> > dxdbMult() const; + + //- Update the primal based quantities related to the adjoint boundary + //- conditions + virtual void updatePrimalBasedQuantities(); }; diff --git a/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointOutletVelocityFlux/adjointOutletVelocityFluxFvPatchVectorField.C b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointOutletVelocityFlux/adjointOutletVelocityFluxFvPatchVectorField.C index 8abaf44d00c..8b70903941d 100644 --- a/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointOutletVelocityFlux/adjointOutletVelocityFluxFvPatchVectorField.C +++ b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointOutletVelocityFlux/adjointOutletVelocityFluxFvPatchVectorField.C @@ -5,8 +5,8 @@ \\ / A nd | www.openfoam.com \\/ M anipulation | ------------------------------------------------------------------------------- - Copyright (C) 2007-2020 PCOpt/NTUA - Copyright (C) 2013-2020 FOSS GP + Copyright (C) 2007-2021 PCOpt/NTUA + Copyright (C) 2013-2021 FOSS GP Copyright (C) 2019 OpenCFD Ltd. ------------------------------------------------------------------------------- License @@ -97,6 +97,11 @@ void Foam::adjointOutletVelocityFluxFvPatchVectorField::manipulateMatrix fvMatrix<vector>& matrix ) { + addProfiling + ( + adjointOutletVelocityFluxFvPatchVectorField, + "adjointOutletVelocityFluxFvPatchVectorField::manipulateMatrix" + ); vectorField& source = matrix.source(); const vectorField& Sf = patch().Sf(); const labelList& faceCells = patch().faceCells(); diff --git a/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointOutletVelocityFlux/adjointOutletVelocityFluxFvPatchVectorField.H b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointOutletVelocityFlux/adjointOutletVelocityFluxFvPatchVectorField.H index 3201b245ab7..5dd565f9d73 100644 --- a/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointOutletVelocityFlux/adjointOutletVelocityFluxFvPatchVectorField.H +++ b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointOutletVelocityFlux/adjointOutletVelocityFluxFvPatchVectorField.H @@ -5,8 +5,8 @@ \\ / A nd | www.openfoam.com \\/ M anipulation | ------------------------------------------------------------------------------- - Copyright (C) 2007-2020 PCOpt/NTUA - Copyright (C) 2013-2020 FOSS GP + Copyright (C) 2007-2021 PCOpt/NTUA + Copyright (C) 2013-2021 FOSS GP Copyright (C) 2019 OpenCFD Ltd. ------------------------------------------------------------------------------- License @@ -63,10 +63,6 @@ class adjointOutletVelocityFluxFvPatchVectorField public fixedValueFvPatchVectorField, public adjointVectorBoundaryCondition { - // Private Member Functions - - tmp<tensorField> computeLocalGrad(); - public: diff --git a/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointWallVelocity/adjointWallVelocityFvPatchVectorField.C b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointWallVelocity/adjointWallVelocityFvPatchVectorField.C index 32372f99aff..c26a7b863a7 100644 --- a/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointWallVelocity/adjointWallVelocityFvPatchVectorField.C +++ b/src/optimisation/adjointOptimisation/adjoint/adjointBoundaryConditions/adjointWallVelocity/adjointWallVelocityFvPatchVectorField.C @@ -5,8 +5,8 @@ \\ / A nd | www.openfoam.com \\/ M anipulation | ------------------------------------------------------------------------------- - Copyright (C) 2007-2020 PCOpt/NTUA - Copyright (C) 2013-2020 FOSS GP + Copyright (C) 2007-2021 PCOpt/NTUA + Copyright (C) 2013-2021 FOSS GP Copyright (C) 2019-2020 OpenCFD Ltd. ------------------------------------------------------------------------------- License @@ -105,6 +105,11 @@ void Foam::adjointWallVelocityFvPatchVectorField::manipulateMatrix fvMatrix<vector>& matrix ) { + addProfiling + ( + adjointWallVelocityFvPatchVectorField, + "adjointWallVelocityFvPatchVectorField::manipulateMatrix" + ); // Grab ref to the diagonal matrix vectorField& source = matrix.source(); diff --git a/src/optimisation/adjointOptimisation/adjoint/boundaryAdjointContributions/boundaryAdjointContributionIncompressible/boundaryAdjointContributionIncompressible.C b/src/optimisation/adjointOptimisation/adjoint/boundaryAdjointContributions/boundaryAdjointContributionIncompressible/boundaryAdjointContributionIncompressible.C index 6f108478a0f..f694aa7f1ee 100644 --- a/src/optimisation/adjointOptimisation/adjoint/boundaryAdjointContributions/boundaryAdjointContributionIncompressible/boundaryAdjointContributionIncompressible.C +++ b/src/optimisation/adjointOptimisation/adjoint/boundaryAdjointContributions/boundaryAdjointContributionIncompressible/boundaryAdjointContributionIncompressible.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 @@ -89,11 +89,10 @@ boundaryAdjointContributionIncompressible tmp<vectorField> boundaryAdjointContributionIncompressible::velocitySource() { // Objective function contribution - PtrList<objective>& objectives = objectiveManager_.getObjectiveFunctions(); tmp<vectorField> tsource = sumContributions ( - objectives, + objectiveManager_.getObjectiveFunctions(), &objectiveIncompressible::boundarydJdv ); vectorField& source = tsource.ref(); @@ -110,11 +109,10 @@ tmp<vectorField> boundaryAdjointContributionIncompressible::velocitySource() tmp<scalarField> boundaryAdjointContributionIncompressible::pressureSource() { // Objective function contribution - PtrList<objective>& objectives = objectiveManager_.getObjectiveFunctions(); tmp<scalarField> tsource = sumContributions ( - objectives, + objectiveManager_.getObjectiveFunctions(), &objectiveIncompressible::boundarydJdvn ); @@ -126,8 +124,7 @@ tmp<scalarField> boundaryAdjointContributionIncompressible::pressureSource() const vectorField& adjointTurbulenceContr = adjointRAS().adjointMomentumBCSource()[patch_.index()]; - tmp<vectorField> tnf = patch_.nf(); - const vectorField& nf = tnf(); + tmp<vectorField> nf = patch_.nf(); source += adjointTurbulenceContr & nf; @@ -139,11 +136,10 @@ tmp<vectorField> boundaryAdjointContributionIncompressible::tangentVelocitySource() { // Objective function contribution - PtrList<objective>& objectives = objectiveManager_.getObjectiveFunctions(); tmp<vectorField> tsource = sumContributions ( - objectives, + objectiveManager_.getObjectiveFunctions(), &objectiveIncompressible::boundarydJdvt ); @@ -167,73 +163,58 @@ boundaryAdjointContributionIncompressible::tangentVelocitySource() tmp<vectorField> boundaryAdjointContributionIncompressible::normalVelocitySource() { - PtrList<objective>& objectives = objectiveManager_.getObjectiveFunctions(); - tmp<vectorField> tsource = + return sumContributions ( - objectives, + objectiveManager_.getObjectiveFunctions(), &objectiveIncompressible::boundarydJdp ); - return (tsource); } tmp<scalarField> boundaryAdjointContributionIncompressible::energySource() { - PtrList<objective>& objectives = objectiveManager_.getObjectiveFunctions(); - tmp<scalarField> tsource = + return sumContributions ( - objectives, + objectiveManager_.getObjectiveFunctions(), &objectiveIncompressible::boundarydJdT ); - return (tsource); } tmp<scalarField> boundaryAdjointContributionIncompressible::adjointTMVariable1Source() { - PtrList<objective>& objectives = objectiveManager_.getObjectiveFunctions(); - tmp<scalarField> tsource = + return sumContributions ( - objectives, + objectiveManager_.getObjectiveFunctions(), &objectiveIncompressible::boundarydJdTMvar1 ); - return (tsource); } tmp<scalarField> boundaryAdjointContributionIncompressible::adjointTMVariable2Source() { - PtrList<objective>& objectives = objectiveManager_.getObjectiveFunctions(); - tmp<scalarField> tsource = + return sumContributions ( - objectives, + objectiveManager_.getObjectiveFunctions(), &objectiveIncompressible::boundarydJdTMvar2 ); - return (tsource); } tmp<scalarField> boundaryAdjointContributionIncompressible::momentumDiffusion() { - tmp<scalarField> tnuEff(new scalarField(patch_.size(), Zero)); - scalarField& nuEff = tnuEff.ref(); - - const autoPtr<incompressibleAdjoint::adjointRASModel>& - adjointTurbulenceModel = adjointVars().adjointTurbulence(); - nuEff = adjointTurbulenceModel().nuEff()().boundaryField()[patch_.index()]; - - return tnuEff; + return adjointVars().adjointTurbulence()().nuEff(patch_.index()); } @@ -272,64 +253,40 @@ tmp<scalarField> boundaryAdjointContributionIncompressible::thermalDiffusion() tmp<scalarField> boundaryAdjointContributionIncompressible::wallDistance() { - tmp<scalarField> twallDist(new scalarField(patch_.size(), Zero)); - scalarField& wallDist = twallDist.ref(); - - wallDist = primalVars_.turbulence()->y()[patch_.index()]; - - return twallDist; + return primalVars_.turbulence()->y()[patch_.index()]; } tmp<scalarField> boundaryAdjointContributionIncompressible::TMVariable1Diffusion() { - const autoPtr<incompressibleAdjoint::adjointRASModel>& adjointRAS = - adjointVars().adjointTurbulence(); - - tmp<scalarField> tdiffCoeff = - adjointRAS().diffusionCoeffVar1(patch_.index()); + return + adjointVars().adjointTurbulence()->diffusionCoeffVar1(patch_.index()); - return tdiffCoeff; } tmp<scalarField> boundaryAdjointContributionIncompressible::TMVariable2Diffusion() { - const autoPtr<incompressibleAdjoint::adjointRASModel>& adjointRAS = - adjointVars().adjointTurbulence(); - - tmp<scalarField> tdiffCoeff = - adjointRAS().diffusionCoeffVar2(patch_.index()); - - return tdiffCoeff; + return + adjointVars().adjointTurbulence()->diffusionCoeffVar2(patch_.index()); } tmp<scalarField> boundaryAdjointContributionIncompressible::TMVariable1() { - const autoPtr<incompressible::RASModelVariables>& RASVariables = - primalVars_.RASModelVariables(); - tmp<scalarField> tboundField(new scalarField(patch_.size(), Zero)); - scalarField& boundField = tboundField.ref(); - - boundField = RASVariables().TMVar1().boundaryField()[patch_.index()]; - - return tboundField; + return + primalVars_.RASModelVariables()->TMVar1(). + boundaryField()[patch_.index()]; } tmp<scalarField> boundaryAdjointContributionIncompressible::TMVariable2() { - const autoPtr<incompressible::RASModelVariables>& RASVariables = - primalVars_.RASModelVariables(); - tmp<scalarField> tboundField(new scalarField(patch_.size(), Zero)); - scalarField& boundField = tboundField.ref(); - - boundField = RASVariables().TMVar2().boundaryField()[patch_.index()]; - - return tboundField; + return + primalVars_.RASModelVariables()->TMVar2(). + boundaryField()[patch_.index()]; } diff --git a/src/optimisation/adjointOptimisation/adjoint/solvers/adjointSolvers/adjointSolver/adjointSolver.C b/src/optimisation/adjointOptimisation/adjoint/solvers/adjointSolvers/adjointSolver/adjointSolver.C index aff18976f3e..e212b596dc8 100644 --- a/src/optimisation/adjointOptimisation/adjoint/solvers/adjointSolvers/adjointSolver/adjointSolver.C +++ b/src/optimisation/adjointOptimisation/adjoint/solvers/adjointSolvers/adjointSolver/adjointSolver.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-2021 OpenCFD Ltd. ------------------------------------------------------------------------------- License @@ -153,6 +153,7 @@ Foam::objectiveManager& Foam::adjointSolver::getObjectiveManager() void Foam::adjointSolver::postLoop() { + addProfiling(adjointSolver, "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 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 064c176ee7f..5fa4603e8c9 100644 --- a/src/optimisation/adjointOptimisation/adjoint/solvers/adjointSolvers/incompressible/adjointSimple/adjointSimple.C +++ b/src/optimisation/adjointOptimisation/adjoint/solvers/adjointSolvers/incompressible/adjointSimple/adjointSimple.C @@ -5,8 +5,8 @@ \\ / A nd | www.openfoam.com \\/ M anipulation | ------------------------------------------------------------------------------- - Copyright (C) 2007-2020 PCOpt/NTUA - Copyright (C) 2013-2020 FOSS GP + Copyright (C) 2007-2021 PCOpt/NTUA + Copyright (C) 2013-2021 FOSS GP Copyright (C) 2019-2020 OpenCFD Ltd. ------------------------------------------------------------------------------- License @@ -206,6 +206,7 @@ void Foam::adjointSimple::preIter() void Foam::adjointSimple::mainIter() { + addProfiling(adjointSimple, "adjointSimple::mainIter"); // Grab primal references const surfaceScalarField& phi = primalVars_.phi(); // Grab adjoint references @@ -340,6 +341,7 @@ void Foam::adjointSimple::postIter() void Foam::adjointSimple::solve() { + addProfiling(adjointSimple, "adjointSimple::solve"); if (active_) { preLoop(); diff --git a/src/optimisation/adjointOptimisation/adjoint/solvers/adjointSolvers/incompressible/incompressibleAdjointSolver/incompressibleAdjointSolver.C b/src/optimisation/adjointOptimisation/adjoint/solvers/adjointSolvers/incompressible/incompressibleAdjointSolver/incompressibleAdjointSolver.C index b158a1310bc..2ffa2d1b037 100644 --- a/src/optimisation/adjointOptimisation/adjoint/solvers/adjointSolvers/incompressible/incompressibleAdjointSolver/incompressibleAdjointSolver.C +++ b/src/optimisation/adjointOptimisation/adjoint/solvers/adjointSolvers/incompressible/incompressibleAdjointSolver/incompressibleAdjointSolver.C @@ -5,8 +5,8 @@ \\ / A nd | www.openfoam.com \\/ M anipulation | ------------------------------------------------------------------------------- - Copyright (C) 2007-2020 PCOpt/NTUA - Copyright (C) 2013-2020 FOSS GP + Copyright (C) 2007-2021 PCOpt/NTUA + Copyright (C) 2013-2021 FOSS GP Copyright (C) 2019-2021 OpenCFD Ltd. ------------------------------------------------------------------------------- License @@ -163,6 +163,8 @@ void Foam::incompressibleAdjointSolver::updatePrimalBasedQuantities() if (vars_) { getAdjointVars().adjointTurbulence()->setChangedPrimalSolution(); + ATCModel_().updatePrimalBasedQuantities(); + getAdjointVars().updatePrimalBasedQuantities(); } } diff --git a/src/optimisation/adjointOptimisation/adjoint/solvers/variablesSet/incompressible/incompressibleVars.C b/src/optimisation/adjointOptimisation/adjoint/solvers/variablesSet/incompressible/incompressibleVars.C index 45fb8baffe6..0fe83537d5a 100644 --- a/src/optimisation/adjointOptimisation/adjoint/solvers/variablesSet/incompressible/incompressibleVars.C +++ b/src/optimisation/adjointOptimisation/adjoint/solvers/variablesSet/incompressible/incompressibleVars.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-2020 OpenCFD Ltd. ------------------------------------------------------------------------------- License @@ -379,81 +379,6 @@ surfaceScalarField& incompressibleVars::phi() } -const volScalarField& incompressibleVars::pInst() const -{ - return pPtr_(); -} - - -volScalarField& incompressibleVars::pInst() -{ - return pPtr_(); -} - - -const volVectorField& incompressibleVars::UInst() const -{ - return UPtr_(); -} - - -volVectorField& incompressibleVars::UInst() -{ - return UPtr_(); -} - - -const surfaceScalarField& incompressibleVars::phiInst() const -{ - return phiPtr_(); -} - - -surfaceScalarField& incompressibleVars::phiInst() -{ - return phiPtr_(); -} - - -const singlePhaseTransportModel& incompressibleVars::laminarTransport() const -{ - return laminarTransportPtr_(); -} - - -singlePhaseTransportModel& incompressibleVars::laminarTransport() -{ - return laminarTransportPtr_(); -} - - -const autoPtr<incompressible::turbulenceModel>& -incompressibleVars::turbulence() const -{ - return turbulence_; -} - - -autoPtr<incompressible::turbulenceModel>& incompressibleVars::turbulence() -{ - return turbulence_; -} - - -const autoPtr<incompressible::RASModelVariables>& -incompressibleVars::RASModelVariables() const -{ - return RASModelVariables_; -} - - -autoPtr<incompressible::RASModelVariables>& -incompressibleVars::RASModelVariables() -{ - return RASModelVariables_; -} - - void incompressibleVars::restoreInitValues() { if (solverControl_.storeInitValues()) diff --git a/src/optimisation/adjointOptimisation/adjoint/solvers/variablesSet/incompressible/incompressibleVars.H b/src/optimisation/adjointOptimisation/adjoint/solvers/variablesSet/incompressible/incompressibleVars.H index 1ddc919cb93..38c34a8484f 100644 --- a/src/optimisation/adjointOptimisation/adjoint/solvers/variablesSet/incompressible/incompressibleVars.H +++ b/src/optimisation/adjointOptimisation/adjoint/solvers/variablesSet/incompressible/incompressibleVars.H @@ -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 @@ -182,42 +182,44 @@ public: // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ //- Return const reference to pressure - const volScalarField& pInst() const; + inline const volScalarField& pInst() const; //- Return reference to pressure - volScalarField& pInst(); + inline volScalarField& pInst(); //- Return const reference to velocity - const volVectorField& UInst() const; + inline const volVectorField& UInst() const; //- Return reference to velocity - volVectorField& UInst(); + inline volVectorField& UInst(); //- Return const reference to volume flux - const surfaceScalarField& phiInst() const; + inline const surfaceScalarField& phiInst() const; //- Return reference to volume flux - surfaceScalarField& phiInst(); + inline surfaceScalarField& phiInst(); //- Return const reference to transport model - const singlePhaseTransportModel& laminarTransport() const; + inline const singlePhaseTransportModel& laminarTransport() const; //- Return reference to transport model - singlePhaseTransportModel& laminarTransport(); + inline singlePhaseTransportModel& laminarTransport(); //- Return const reference to the turbulence model - const autoPtr<incompressible::turbulenceModel>& turbulence() const; + inline const autoPtr<incompressible::turbulenceModel>& + turbulence() const; //- Return reference to the turbulence model - autoPtr<incompressible::turbulenceModel>& turbulence(); + inline autoPtr<incompressible::turbulenceModel>& turbulence(); //- Return const reference to the turbulence model variables - const autoPtr<incompressible::RASModelVariables>& + inline const autoPtr<incompressible::RASModelVariables>& RASModelVariables() const; //- Return reference to the turbulence model variables - autoPtr<incompressible::RASModelVariables>& RASModelVariables(); + inline autoPtr<incompressible::RASModelVariables>& + RASModelVariables(); //- Restore field values to the initial ones void restoreInitValues(); @@ -260,6 +262,10 @@ public: // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +#include "incompressibleVarsI.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + #endif // ************************************************************************* // diff --git a/src/optimisation/adjointOptimisation/adjoint/solvers/variablesSet/incompressible/incompressibleVarsI.H b/src/optimisation/adjointOptimisation/adjoint/solvers/variablesSet/incompressible/incompressibleVarsI.H new file mode 100644 index 00000000000..c1777b45796 --- /dev/null +++ b/src/optimisation/adjointOptimisation/adjoint/solvers/variablesSet/incompressible/incompressibleVarsI.H @@ -0,0 +1,112 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2021 PCOpt/NTUA + Copyright (C) 2021 FOSS GP +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + + +\*---------------------------------------------------------------------------*/ + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + + +inline const Foam::volScalarField& Foam::incompressibleVars::pInst() const +{ + return pPtr_(); +} + + +inline Foam::volScalarField& Foam::incompressibleVars::pInst() +{ + return pPtr_(); +} + + +inline const Foam::volVectorField& Foam::incompressibleVars::UInst() const +{ + return UPtr_(); +} + + +inline Foam::volVectorField& Foam::incompressibleVars::UInst() +{ + return UPtr_(); +} + + +inline const Foam::surfaceScalarField& +Foam::incompressibleVars::phiInst() const +{ + return phiPtr_(); +} + + +inline Foam::surfaceScalarField& Foam::incompressibleVars::phiInst() +{ + return phiPtr_(); +} + + +inline const Foam::singlePhaseTransportModel& +Foam::incompressibleVars::laminarTransport() const +{ + return laminarTransportPtr_(); +} + + +inline Foam::singlePhaseTransportModel& +Foam::incompressibleVars::laminarTransport() +{ + return laminarTransportPtr_(); +} + + +inline const Foam::autoPtr<Foam::incompressible::turbulenceModel>& +Foam::incompressibleVars::turbulence() const +{ + return turbulence_; +} + + +inline Foam::autoPtr<Foam::incompressible::turbulenceModel>& +Foam::incompressibleVars::turbulence() +{ + return turbulence_; +} + + +inline const Foam::autoPtr<Foam::incompressible::RASModelVariables>& +Foam::incompressibleVars::RASModelVariables() const +{ + return RASModelVariables_; +} + + +inline Foam::autoPtr<Foam::incompressible::RASModelVariables>& +Foam::incompressibleVars::RASModelVariables() +{ + return RASModelVariables_; +} + + +// ************************************************************************* // diff --git a/src/optimisation/adjointOptimisation/adjoint/solvers/variablesSet/incompressibleAdjoint/incompressibleAdjointVars.C b/src/optimisation/adjointOptimisation/adjoint/solvers/variablesSet/incompressibleAdjoint/incompressibleAdjointVars.C index c544f74d900..6bf4cbc2dfc 100644 --- a/src/optimisation/adjointOptimisation/adjoint/solvers/variablesSet/incompressibleAdjoint/incompressibleAdjointVars.C +++ b/src/optimisation/adjointOptimisation/adjoint/solvers/variablesSet/incompressibleAdjoint/incompressibleAdjointVars.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 @@ -28,6 +28,7 @@ License \*---------------------------------------------------------------------------*/ #include "incompressibleAdjointVars.H" +#include "adjointBoundaryCondition.H" // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // @@ -66,20 +67,6 @@ incompressibleAdjointVars::incompressibleAdjointVars // * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // -const autoPtr<incompressibleAdjoint::adjointRASModel>& -incompressibleAdjointVars::adjointTurbulence() const -{ - return adjointTurbulence_; -} - - -autoPtr<incompressibleAdjoint::adjointRASModel>& -incompressibleAdjointVars::adjointTurbulence() -{ - return adjointTurbulence_; -} - - void incompressibleAdjointVars::resetMeanFields() { if (solverControl_.average()) @@ -123,6 +110,33 @@ void incompressibleAdjointVars::nullify() } +void incompressibleAdjointVars::updatePrimalBasedQuantities() +{ + /* + // WIP + for (fvPatchVectorField& pf : UaInst().boundaryFieldRef()) + { + if (isA<adjointBoundaryCondition<vector>>(pf)) + { + adjointBoundaryCondition<vector>& adjointBC = + refCast<adjointBoundaryCondition<vector>>(pf); + adjointBC.updatePrimalBasedQuantities(); + } + } + + for (fvPatchScalarField& pf : paInst().boundaryFieldRef()) + { + if (isA<adjointBoundaryCondition<scalar>>(pf)) + { + adjointBoundaryCondition<scalar>& adjointBC = + refCast<adjointBoundaryCondition<scalar>>(pf); + adjointBC.updatePrimalBasedQuantities(); + } + } + */ +} + + // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // } // End namespace Foam diff --git a/src/optimisation/adjointOptimisation/adjoint/solvers/variablesSet/incompressibleAdjoint/incompressibleAdjointVars.H b/src/optimisation/adjointOptimisation/adjoint/solvers/variablesSet/incompressibleAdjoint/incompressibleAdjointVars.H index 815edfb43b8..8bb60a23ebf 100644 --- a/src/optimisation/adjointOptimisation/adjoint/solvers/variablesSet/incompressibleAdjoint/incompressibleAdjointVars.H +++ b/src/optimisation/adjointOptimisation/adjoint/solvers/variablesSet/incompressibleAdjoint/incompressibleAdjointVars.H @@ -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 @@ -104,11 +104,11 @@ public: // Access //- Return const reference to the adjointRASModel - const autoPtr<incompressibleAdjoint::adjointRASModel>& + inline const autoPtr<incompressibleAdjoint::adjointRASModel>& adjointTurbulence() const; //- Return non-const reference to the adjointRASModel - autoPtr<incompressibleAdjoint::adjointRASModel>& + inline autoPtr<incompressibleAdjoint::adjointRASModel>& adjointTurbulence(); //- Reset mean fields to zero @@ -119,6 +119,10 @@ public: //- Nullify all adjoint fields virtual void nullify(); + + //- Update primal based quantities of the adjoint boundary + // conditions + virtual void updatePrimalBasedQuantities(); }; @@ -128,6 +132,10 @@ public: // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +#include "incompressibleAdjointVarsI.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + #endif // ************************************************************************* // diff --git a/src/optimisation/adjointOptimisation/adjoint/solvers/variablesSet/incompressibleAdjoint/incompressibleAdjointVarsI.H b/src/optimisation/adjointOptimisation/adjoint/solvers/variablesSet/incompressibleAdjoint/incompressibleAdjointVarsI.H new file mode 100644 index 00000000000..75576a43c3c --- /dev/null +++ b/src/optimisation/adjointOptimisation/adjoint/solvers/variablesSet/incompressibleAdjoint/incompressibleAdjointVarsI.H @@ -0,0 +1,49 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2021 PCOpt/NTUA + Copyright (C) 2021 FOSS GP +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + + +\*---------------------------------------------------------------------------*/ + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +inline const Foam::autoPtr<Foam::incompressibleAdjoint::adjointRASModel>& +Foam::incompressibleAdjointVars::adjointTurbulence() const +{ + return adjointTurbulence_; +} + + +inline Foam::autoPtr<Foam::incompressibleAdjoint::adjointRASModel>& +Foam::incompressibleAdjointVars::adjointTurbulence() +{ + return adjointTurbulence_; +} + + + + + +// ************************************************************************* // diff --git a/src/optimisation/adjointOptimisation/adjoint/solvers/variablesSet/incompressibleAdjointMeanFlow/incompressibleAdjointMeanFlowVars.C b/src/optimisation/adjointOptimisation/adjoint/solvers/variablesSet/incompressibleAdjointMeanFlow/incompressibleAdjointMeanFlowVars.C index eab4d49e5e7..7a23aba9254 100644 --- a/src/optimisation/adjointOptimisation/adjoint/solvers/variablesSet/incompressibleAdjointMeanFlow/incompressibleAdjointMeanFlowVars.C +++ b/src/optimisation/adjointOptimisation/adjoint/solvers/variablesSet/incompressibleAdjointMeanFlow/incompressibleAdjointMeanFlowVars.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 @@ -222,42 +222,6 @@ surfaceScalarField& incompressibleAdjointMeanFlowVars::phia() } -const volScalarField& incompressibleAdjointMeanFlowVars::paInst() const -{ - return paPtr_(); -} - - -volScalarField& incompressibleAdjointMeanFlowVars::paInst() -{ - return paPtr_(); -} - - -const volVectorField& incompressibleAdjointMeanFlowVars::UaInst() const -{ - return UaPtr_(); -} - - -volVectorField& incompressibleAdjointMeanFlowVars::UaInst() -{ - return UaPtr_(); -} - - -const surfaceScalarField& incompressibleAdjointMeanFlowVars::phiaInst() const -{ - return phiaPtr_(); -} - - -surfaceScalarField& incompressibleAdjointMeanFlowVars::phiaInst() -{ - return phiaPtr_(); -} - - bool incompressibleAdjointMeanFlowVars::computeMeanFields() const { return solverControl_.average(); diff --git a/src/optimisation/adjointOptimisation/adjoint/solvers/variablesSet/incompressibleAdjointMeanFlow/incompressibleAdjointMeanFlowVars.H b/src/optimisation/adjointOptimisation/adjoint/solvers/variablesSet/incompressibleAdjointMeanFlow/incompressibleAdjointMeanFlowVars.H index 5082cf6f525..9e523c61e2e 100644 --- a/src/optimisation/adjointOptimisation/adjoint/solvers/variablesSet/incompressibleAdjointMeanFlow/incompressibleAdjointMeanFlowVars.H +++ b/src/optimisation/adjointOptimisation/adjoint/solvers/variablesSet/incompressibleAdjointMeanFlow/incompressibleAdjointMeanFlowVars.H @@ -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 @@ -158,22 +158,22 @@ public: // conditions should use these fields to execute a solver iteration //- Return const reference to pressure - const volScalarField& paInst() const; + inline const volScalarField& paInst() const; //- Return reference to pressure - volScalarField& paInst(); + inline volScalarField& paInst(); //- Return const reference to velocity - const volVectorField& UaInst() const; + inline const volVectorField& UaInst() const; //- Return reference to velocity - volVectorField& UaInst(); + inline volVectorField& UaInst(); //- Return const reference to volume flux - const surfaceScalarField& phiaInst() const; + inline const surfaceScalarField& phiaInst() const; //- Return reference to volume flux - surfaceScalarField& phiaInst(); + inline surfaceScalarField& phiaInst(); //- Return computeMeanFields bool bool computeMeanFields() const; @@ -192,6 +192,10 @@ public: // * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // +#include "incompressibleAdjointMeanFlowVarsI.H" + +// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * // + #endif // ************************************************************************* // diff --git a/src/optimisation/adjointOptimisation/adjoint/solvers/variablesSet/incompressibleAdjointMeanFlow/incompressibleAdjointMeanFlowVarsI.H b/src/optimisation/adjointOptimisation/adjoint/solvers/variablesSet/incompressibleAdjointMeanFlow/incompressibleAdjointMeanFlowVarsI.H new file mode 100644 index 00000000000..e70f29030f7 --- /dev/null +++ b/src/optimisation/adjointOptimisation/adjoint/solvers/variablesSet/incompressibleAdjointMeanFlow/incompressibleAdjointMeanFlowVarsI.H @@ -0,0 +1,73 @@ +/*---------------------------------------------------------------------------*\ + ========= | + \\ / F ield | OpenFOAM: The Open Source CFD Toolbox + \\ / O peration | + \\ / A nd | www.openfoam.com + \\/ M anipulation | +------------------------------------------------------------------------------- + Copyright (C) 2021 PCOpt/NTUA + Copyright (C) 2021 FOSS GP +------------------------------------------------------------------------------- +License + This file is part of OpenFOAM. + + OpenFOAM is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + OpenFOAM is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + for more details. + + You should have received a copy of the GNU General Public License + along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>. + + +\*---------------------------------------------------------------------------*/ + +// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * // + +inline const Foam::volScalarField& +Foam::incompressibleAdjointMeanFlowVars::paInst() const +{ + return paPtr_(); +} + + +inline Foam::volScalarField& Foam::incompressibleAdjointMeanFlowVars::paInst() +{ + return paPtr_(); +} + + +inline const Foam::volVectorField& +Foam::incompressibleAdjointMeanFlowVars::UaInst() const +{ + return UaPtr_(); +} + + +inline Foam::volVectorField& Foam::incompressibleAdjointMeanFlowVars::UaInst() +{ + return UaPtr_(); +} + + +inline const Foam::surfaceScalarField& +Foam::incompressibleAdjointMeanFlowVars::phiaInst() const +{ + return phiaPtr_(); +} + + +inline Foam::surfaceScalarField& +Foam::incompressibleAdjointMeanFlowVars::phiaInst() +{ + return phiaPtr_(); +} + + + +// ************************************************************************* // diff --git a/src/optimisation/adjointOptimisation/adjoint/turbulenceModels/incompressibleAdjoint/adjointRAS/adjointSpalartAllmaras/adjointSpalartAllmaras.C b/src/optimisation/adjointOptimisation/adjoint/turbulenceModels/incompressibleAdjoint/adjointRAS/adjointSpalartAllmaras/adjointSpalartAllmaras.C index 78783498227..edb83dded5a 100644 --- a/src/optimisation/adjointOptimisation/adjoint/turbulenceModels/incompressibleAdjoint/adjointRAS/adjointSpalartAllmaras/adjointSpalartAllmaras.C +++ b/src/optimisation/adjointOptimisation/adjoint/turbulenceModels/incompressibleAdjoint/adjointRAS/adjointSpalartAllmaras/adjointSpalartAllmaras.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-2020 OpenCFD Ltd. ------------------------------------------------------------------------------- License @@ -743,6 +743,8 @@ tmp<fvVectorMatrix> adjointSpalartAllmaras::divDevReff(volVectorField& Ua) const tmp<volVectorField> adjointSpalartAllmaras::adjointMeanFlowSource() { + addProfiling + (adjointSpalartAllmaras, "adjointSpalartAllmaras::addMomentumSource"); // cm formulation //return (- nuTilda()*fvc::grad(nuaTilda() - conservativeMomentumSource()); @@ -1029,6 +1031,8 @@ void adjointSpalartAllmaras::nullify() void adjointSpalartAllmaras::correct() { + addProfiling + (adjointSpalartAllmaras, "adjointSpalartAllmaras::correct"); if (!adjointTurbulence_) { return; diff --git a/src/optimisation/adjointOptimisation/adjoint/turbulenceModels/incompressibleAdjoint/adjointTurbulenceModel/adjointTurbulenceModel.H b/src/optimisation/adjointOptimisation/adjoint/turbulenceModels/incompressibleAdjoint/adjointTurbulenceModel/adjointTurbulenceModel.H index e7039465e53..04adc50c37e 100644 --- a/src/optimisation/adjointOptimisation/adjoint/turbulenceModels/incompressibleAdjoint/adjointTurbulenceModel/adjointTurbulenceModel.H +++ b/src/optimisation/adjointOptimisation/adjoint/turbulenceModels/incompressibleAdjoint/adjointTurbulenceModel/adjointTurbulenceModel.H @@ -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 @@ -183,6 +183,23 @@ public: //return primalVars_.turbulence()().nuEff(); } + //- Return the effective viscosity on a given patch + virtual tmp<scalarField> nuEff(const label patchI) const + { + // Go through RASModelVariables::nutRef in order to obtain + // the mean field, if present + const singlePhaseTransportModel& lamTrans = + primalVars_.laminarTransport(); + const autoPtr<incompressible::RASModelVariables>& + turbVars = primalVars_.RASModelVariables(); + + return + ( + lamTrans.nu()().boundaryField()[patchI] + + turbVars().nutRef().boundaryField()[patchI] + ); + } + //- Return the effective stress tensor including the laminar stress virtual tmp<volSymmTensorField> devReff() const = 0; -- GitLab