diff --git a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivitySurface/sensitivitySurfaceIncompressible.C b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivitySurface/sensitivitySurfaceIncompressible.C index 0f11145894..69aa297c62 100644 --- a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivitySurface/sensitivitySurfaceIncompressible.C +++ b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivitySurface/sensitivitySurfaceIncompressible.C @@ -240,6 +240,7 @@ sensitivitySurface::sensitivitySurface includePressureTerm_(false), includeGradStressTerm_(false), includeTransposeStresses_(false), + useSnGradInTranposeStresses_(false), includeDivTerm_(false), includeDistance_(false), includeMeshMovement_(false), @@ -332,6 +333,8 @@ void sensitivitySurface::read() dict().getOrDefault("includeGradStressTerm", true); includeTransposeStresses_ = dict().getOrDefault("includeTransposeStresses", true); + useSnGradInTranposeStresses_ = + dict().getOrDefault("useSnGradInTranposeStresses", false); includeDivTerm_ = dict().getOrDefault("includeDivTerm", false); includeDistance_ = dict().getOrDefault @@ -528,16 +531,17 @@ void sensitivitySurface::accumulateIntegrand(const scalar dt) if (includeTransposeStresses_) { + vectorField gradUaNf + ( + useSnGradInTranposeStresses_ ? + (Ua.boundaryField()[patchI].snGrad() & nf)*nf : + (gradUa.boundaryField()[patchI] & nf) + ); + stressTerm -= nuEff.boundaryField()[patchI] - * ( - // Note: in case of laminar or low-Re flows, - // includes a spurious tangential gradUa component - // (gradUa.boundaryField()[patchI] & nf) - ((Ua.boundaryField()[patchI].snGrad() &nf)*nf) - & U.boundaryField()[patchI].snGrad() - ) - * nf; + *(gradUaNf & U.boundaryField()[patchI].snGrad()) + *nf; } if (includeDivTerm_) diff --git a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivitySurface/sensitivitySurfaceIncompressible.H b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivitySurface/sensitivitySurfaceIncompressible.H index 59cc575291..bbec0abfa1 100644 --- a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivitySurface/sensitivitySurfaceIncompressible.H +++ b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivitySurface/sensitivitySurfaceIncompressible.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-2020 PCOpt/NTUA + Copyright (C) 2013-2020 FOSS GP Copyright (C) 2019 OpenCFD Ltd. ------------------------------------------------------------------------------- License @@ -79,6 +79,9 @@ protected: //- Include the transpose part of the adjoint stresses bool includeTransposeStresses_; + //- Use snGrad in the transpose part of the adjoint stresses + bool useSnGradInTranposeStresses_; + //- Include the term from the deviatoric part of the stresses bool includeDivTerm_; diff --git a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivitySurfacePoints/sensitivitySurfacePointsIncompressible.C b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivitySurfacePoints/sensitivitySurfacePointsIncompressible.C index ce9654cf16..484c3f889c 100644 --- a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivitySurfacePoints/sensitivitySurfacePointsIncompressible.C +++ b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivitySurfacePoints/sensitivitySurfacePointsIncompressible.C @@ -61,6 +61,8 @@ void sensitivitySurfacePoints::read() dict().getOrDefault("includeGradStressTerm", true); includeTransposeStresses_ = dict().getOrDefault("includeTransposeStresses", true); + useSnGradInTranposeStresses_ = + dict().getOrDefault("useSnGradInTranposeStresses", false); includeDivTerm_ = dict().getOrDefault("includeDivTerm", false); includeDistance_ = @@ -351,6 +353,7 @@ sensitivitySurfacePoints::sensitivitySurfacePoints includePressureTerm_(false), includeGradStressTerm_(false), includeTransposeStresses_(false), + useSnGradInTranposeStresses_(false), includeDivTerm_(false), includeDistance_(false), includeMeshMovement_(false), @@ -544,16 +547,16 @@ void sensitivitySurfacePoints::accumulateIntegrand(const scalar dt) if (includeTransposeStresses_) { + vectorField gradUaNf + ( + useSnGradInTranposeStresses_ ? + (Ua.boundaryField()[patchI].snGrad() & nf)*nf : + (gradUa.boundaryField()[patchI] & nf) + ); stressTerm -= nuEff.boundaryField()[patchI] - *( - // Note: in case of laminar or low-Re flows, - // includes a spurious tangential gradUa component - // (gradUa.boundaryField()[patchI] & nf) - ((Ua.boundaryField()[patchI].snGrad() &nf)*nf) - & U.boundaryField()[patchI].snGrad() - ) - * nf; + *(gradUaNf & U.boundaryField()[patchI].snGrad()) + *nf; } if (includeDivTerm_) diff --git a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivitySurfacePoints/sensitivitySurfacePointsIncompressible.H b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivitySurfacePoints/sensitivitySurfacePointsIncompressible.H index bf889a0f4d..abe1a2e545 100644 --- a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivitySurfacePoints/sensitivitySurfacePointsIncompressible.H +++ b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivitySurfacePoints/sensitivitySurfacePointsIncompressible.H @@ -79,6 +79,9 @@ protected: //- Include the transpose part of the adjoint stresses bool includeTransposeStresses_; + //- Use snGrad in the transpose part of the adjoint stresses + bool useSnGradInTranposeStresses_; + //- Include the term from the deviatoric part of the stresses bool includeDivTerm_;