From ed63d9b2c6ee420c5ba57c18081253221df45a24 Mon Sep 17 00:00:00 2001 From: Vaggelis Papoutsis <vaggelisp@gmail.com> Date: Thu, 9 Jan 2020 20:26:41 +0200 Subject: [PATCH] BUG: wrong bounding of sensitivity contituents in case of many control boxes (Fixes #1549) When more than one volumetric B-Splines control boxes are present, the sensitivity constituents corresponding to the non-active design variables were not bounded(zeroed) correctly. The resultant sensitivities, used in the optimization, were bounded correctly, so this was more a bug pertaining to the output file of the sensitivities rather than a functional one. --- ...mentMethodvolumetricBSplinesMotionSolver.C | 6 ++--- .../volumetricBSplinesMotionSolver.C | 8 +++---- .../volumetricBSplinesMotionSolver.H | 6 ++--- .../sensitivityVolBSplinesIncompressible.C | 13 +++++------ .../sensitivityVolBSplinesFIIncompressible.C | 23 +++++++++++-------- ...ntVolumetricBSplinesExternalMotionSolver.C | 6 ++--- .../volBSplinesBase/volBSplinesBase.C | 18 +++++++-------- .../volBSplinesBase/volBSplinesBase.H | 6 ++--- 8 files changed, 44 insertions(+), 42 deletions(-) diff --git a/src/optimisation/adjointOptimisation/adjoint/displacementMethod/displacementMethodvolumetricBSplinesMotionSolver/displacementMethodvolumetricBSplinesMotionSolver.C b/src/optimisation/adjointOptimisation/adjoint/displacementMethod/displacementMethodvolumetricBSplinesMotionSolver/displacementMethodvolumetricBSplinesMotionSolver.C index 7b7b0b45dc5..149a0505943 100644 --- a/src/optimisation/adjointOptimisation/adjoint/displacementMethod/displacementMethodvolumetricBSplinesMotionSolver/displacementMethodvolumetricBSplinesMotionSolver.C +++ b/src/optimisation/adjointOptimisation/adjoint/displacementMethod/displacementMethodvolumetricBSplinesMotionSolver/displacementMethodvolumetricBSplinesMotionSolver.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-2020 PCOpt/NTUA + Copyright (C) 2013-2020 FOSS GP Copyright (C) 2019 OpenCFD Ltd. ------------------------------------------------------------------------------- License @@ -108,7 +108,7 @@ void displacementMethodvolumetricBSplinesMotionSolver::boundControlField // control points movement. Safe since the motionSolver can only be an // volumetricBSplinesMotionSolver refCast<volumetricBSplinesMotionSolver> - (motionPtr_()).boundControlPointsMovement(controlField); + (motionPtr_()).boundControlPointMovement(controlField); } diff --git a/src/optimisation/adjointOptimisation/adjoint/dynamicMesh/motionSolver/volumetricBSplinesMotionSolver/volumetricBSplinesMotionSolver.C b/src/optimisation/adjointOptimisation/adjoint/dynamicMesh/motionSolver/volumetricBSplinesMotionSolver/volumetricBSplinesMotionSolver.C index 989e00bbd95..89fa4dd4a41 100644 --- a/src/optimisation/adjointOptimisation/adjoint/dynamicMesh/motionSolver/volumetricBSplinesMotionSolver/volumetricBSplinesMotionSolver.C +++ b/src/optimisation/adjointOptimisation/adjoint/dynamicMesh/motionSolver/volumetricBSplinesMotionSolver/volumetricBSplinesMotionSolver.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-2020 PCOpt/NTUA + Copyright (C) 2013-2020 FOSS GP Copyright (C) 2019 OpenCFD Ltd. ------------------------------------------------------------------------------- License @@ -142,12 +142,12 @@ void Foam::volumetricBSplinesMotionSolver::setControlPointsMovement } -void Foam::volumetricBSplinesMotionSolver::boundControlPointsMovement +void Foam::volumetricBSplinesMotionSolver::boundControlPointMovement ( vectorField& controlPointsMovement ) { - volBSplinesBase_.boundControlPointsMovement(controlPointsMovement); + volBSplinesBase_.boundControlPointMovement(controlPointsMovement); } diff --git a/src/optimisation/adjointOptimisation/adjoint/dynamicMesh/motionSolver/volumetricBSplinesMotionSolver/volumetricBSplinesMotionSolver.H b/src/optimisation/adjointOptimisation/adjoint/dynamicMesh/motionSolver/volumetricBSplinesMotionSolver/volumetricBSplinesMotionSolver.H index 32ed7f2f3e6..0a90e27c853 100644 --- a/src/optimisation/adjointOptimisation/adjoint/dynamicMesh/motionSolver/volumetricBSplinesMotionSolver/volumetricBSplinesMotionSolver.H +++ b/src/optimisation/adjointOptimisation/adjoint/dynamicMesh/motionSolver/volumetricBSplinesMotionSolver/volumetricBSplinesMotionSolver.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 @@ -130,7 +130,7 @@ public: void setControlPointsMovement(const vectorField& controlPointsMovement); //- Bound control points movement - void boundControlPointsMovement(vectorField& controlPointsMovement); + void boundControlPointMovement(vectorField& controlPointsMovement); }; diff --git a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivityVolBSplines/sensitivityVolBSplinesIncompressible.C b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivityVolBSplines/sensitivityVolBSplinesIncompressible.C index 13cd21c6858..7e9e54a6352 100644 --- a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivityVolBSplines/sensitivityVolBSplinesIncompressible.C +++ b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivityVolBSplines/sensitivityVolBSplinesIncompressible.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-2020 PCOpt/NTUA + Copyright (C) 2013-2020 FOSS GP Copyright (C) 2019 OpenCFD Ltd. ------------------------------------------------------------------------------- License @@ -86,10 +86,10 @@ void sensitivityVolBSplines::computeObjectiveContributions() dSdbSens_[passedCPs + cpI] = dSdbSensCP; dndbSens_[passedCPs + cpI] = dndbSensCP; } - boxes[iNURB].boundControlPointMovement(dSdbSens_); - boxes[iNURB].boundControlPointMovement(dndbSens_); passedCPs += nb; } + volBSplinesBase_.boundControlPointMovement(dSdbSens_); + volBSplinesBase_.boundControlPointMovement(dndbSens_); passedCPs = 0; forAll(boxes, iNURB) @@ -106,9 +106,9 @@ void sensitivityVolBSplines::computeObjectiveContributions() { dxdbDirectSens_[passedCPs + cpI] = sensDxDbDirect[cpI]; } - boxes[iNURB].boundControlPointMovement(dxdbDirectSens_); passedCPs += sensDxDbDirect.size(); } + volBSplinesBase_.boundControlPointMovement(dxdbDirectSens_); } } @@ -188,9 +188,8 @@ void sensitivityVolBSplines::assembleSensitivities() flowSens_[passedCPs + cpI] = sens[cpI]; } passedCPs += sens.size(); - - boxes[iNURB].boundControlPointMovement(flowSens_); } + volBSplinesBase_.boundControlPointMovement(flowSens_); // Contribution from objective function // Note: diff --git a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivityVolBSplinesFI/sensitivityVolBSplinesFIIncompressible.C b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivityVolBSplinesFI/sensitivityVolBSplinesFIIncompressible.C index aba56274ec3..7191f5a90cf 100644 --- a/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivityVolBSplinesFI/sensitivityVolBSplinesFIIncompressible.C +++ b/src/optimisation/adjointOptimisation/adjoint/optimisation/adjointSensitivity/incompressible/sensitivityVolBSplinesFI/sensitivityVolBSplinesFIIncompressible.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-2020 PCOpt/NTUA + Copyright (C) 2013-2020 FOSS GP Copyright (C) 2019 OpenCFD Ltd. ------------------------------------------------------------------------------- License @@ -137,7 +137,7 @@ void sensitivityVolBSplinesFI::assembleSensitivities() PtrList<NURBS3DVolume>& boxes = volBSplinesBase_.boxesRef(); forAll(boxes, iNURB) { - label nb = boxes[iNURB].getControlPoints().size(); + const label nb(boxes[iNURB].getControlPoints().size()); vectorField boxSensitivities(nb, Zero); vectorField dxdbSens = boxes[iNURB].computeControlPointSensitivities @@ -278,13 +278,6 @@ void sensitivityVolBSplinesFI::assembleSensitivities() } // Zero sensitivities in non-active design variables - boxes[iNURB].boundControlPointMovement(flowSens_); - boxes[iNURB].boundControlPointMovement(dSdbSens_); - boxes[iNURB].boundControlPointMovement(dndbSens_); - boxes[iNURB].boundControlPointMovement(dVdbSens_); - boxes[iNURB].boundControlPointMovement(distanceSens_); - boxes[iNURB].boundControlPointMovement(dxdbDirectSens_); - boxes[iNURB].boundControlPointMovement(optionsSens_); boxes[iNURB].boundControlPointMovement(boxSensitivities); // Transfer sensitivities to global list @@ -299,6 +292,16 @@ void sensitivityVolBSplinesFI::assembleSensitivities() // Increment number of passed sensitivities passedCPs += nb; } + + // Zero non-active sensitivity components. + // For consistent output only, does not affect optimisation + volBSplinesBase_.boundControlPointMovement(flowSens_); + volBSplinesBase_.boundControlPointMovement(dSdbSens_); + volBSplinesBase_.boundControlPointMovement(dndbSens_); + volBSplinesBase_.boundControlPointMovement(dVdbSens_); + volBSplinesBase_.boundControlPointMovement(distanceSens_); + volBSplinesBase_.boundControlPointMovement(dxdbDirectSens_); + volBSplinesBase_.boundControlPointMovement(optionsSens_); } diff --git a/src/optimisation/adjointOptimisation/adjoint/optimisation/optMeshMovement/optMeshMovementVolumetricBSplinesExternalMotionSolver/optMeshMovementVolumetricBSplinesExternalMotionSolver.C b/src/optimisation/adjointOptimisation/adjoint/optimisation/optMeshMovement/optMeshMovementVolumetricBSplinesExternalMotionSolver/optMeshMovementVolumetricBSplinesExternalMotionSolver.C index b53cc7669ff..46eeadedeab 100644 --- a/src/optimisation/adjointOptimisation/adjoint/optimisation/optMeshMovement/optMeshMovementVolumetricBSplinesExternalMotionSolver/optMeshMovementVolumetricBSplinesExternalMotionSolver.C +++ b/src/optimisation/adjointOptimisation/adjoint/optimisation/optMeshMovement/optMeshMovementVolumetricBSplinesExternalMotionSolver/optMeshMovementVolumetricBSplinesExternalMotionSolver.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-2020 PCOpt/NTUA + Copyright (C) 2013-2020 FOSS GP Copyright (C) 2019 OpenCFD Ltd. ------------------------------------------------------------------------------- License @@ -69,7 +69,7 @@ computeBoundaryMovement } // Bound control point movement for non-active CPs - volBSplinesBase_.boundControlPointsMovement(cpMovement_); + volBSplinesBase_.boundControlPointMovement(cpMovement_); // Compute boundary movement label passedCPs(0); diff --git a/src/optimisation/adjointOptimisation/adjoint/parameterization/NURBS/NURBS3DVolume/volBSplinesBase/volBSplinesBase.C b/src/optimisation/adjointOptimisation/adjoint/parameterization/NURBS/NURBS3DVolume/volBSplinesBase/volBSplinesBase.C index ca4d51eb308..32212570127 100644 --- a/src/optimisation/adjointOptimisation/adjoint/parameterization/NURBS/NURBS3DVolume/volBSplinesBase/volBSplinesBase.C +++ b/src/optimisation/adjointOptimisation/adjoint/parameterization/NURBS/NURBS3DVolume/volBSplinesBase/volBSplinesBase.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-2020 PCOpt/NTUA + Copyright (C) 2013-2020 FOSS GP Copyright (C) 2019 OpenCFD Ltd. ------------------------------------------------------------------------------- License @@ -203,7 +203,7 @@ Foam::scalar Foam::volBSplinesBase::computeMaxBoundaryDisplacement label pastControlPoints(0); forAll(volume_, iNURB) { - const label nb = volume_[iNURB].getControlPoints().size(); + const label nb(volume_[iNURB].getControlPoints().size()); vectorField localControlPointsMovement(nb, Zero); // Set localControlPointsMovement @@ -230,7 +230,7 @@ Foam::scalar Foam::volBSplinesBase::computeMaxBoundaryDisplacement } -void Foam::volBSplinesBase::boundControlPointsMovement +void Foam::volBSplinesBase::boundControlPointMovement ( vectorField& controlPointsMovement ) @@ -238,10 +238,10 @@ void Foam::volBSplinesBase::boundControlPointsMovement label pastControlPoints(0); forAll(volume_, iNURB) { - label nb = volume_[iNURB].getControlPoints().size(); + const label nb(volume_[iNURB].getControlPoints().size()); vectorField localControlPointsMovement(nb, Zero); - // set localControlPointsMovement + // Set localControlPointsMovement forAll (localControlPointsMovement, iCPM) { localControlPointsMovement[iCPM] = @@ -250,7 +250,7 @@ void Foam::volBSplinesBase::boundControlPointsMovement volume_[iNURB].boundControlPointMovement(localControlPointsMovement); - // transfer bounding back to controlPointMovement + // Transfer bounding back to controlPointMovement forAll(localControlPointsMovement, iCPM) { controlPointsMovement[pastControlPoints + iCPM] = @@ -270,10 +270,10 @@ void Foam::volBSplinesBase::moveControlPoints label pastControlPoints(0); forAll(volume_, iNURB) { - const label nb = volume_[iNURB].getControlPoints().size(); + const label nb(volume_[iNURB].getControlPoints().size()); vectorField localControlPointsMovement(nb, Zero); - // set localControlPointsMovement + // Set localControlPointsMovement forAll (localControlPointsMovement, iCPM) { localControlPointsMovement[iCPM] = diff --git a/src/optimisation/adjointOptimisation/adjoint/parameterization/NURBS/NURBS3DVolume/volBSplinesBase/volBSplinesBase.H b/src/optimisation/adjointOptimisation/adjoint/parameterization/NURBS/NURBS3DVolume/volBSplinesBase/volBSplinesBase.H index 12945ef6a17..b880a932ce2 100644 --- a/src/optimisation/adjointOptimisation/adjoint/parameterization/NURBS/NURBS3DVolume/volBSplinesBase/volBSplinesBase.H +++ b/src/optimisation/adjointOptimisation/adjoint/parameterization/NURBS/NURBS3DVolume/volBSplinesBase/volBSplinesBase.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 @@ -141,7 +141,7 @@ public: ); //- Bound control points movement - void boundControlPointsMovement(vectorField& controlPointsMovement); + void boundControlPointMovement(vectorField& controlPointsMovement); //- Move control points. No effect on mesh void moveControlPoints(const vectorField& controlPointsMovement); -- GitLab