constraintProjection.C
Go to the documentation of this file.
1/*---------------------------------------------------------------------------*\
2 ========= |
3 \\ / F ield | OpenFOAM: The Open Source CFD Toolbox
4 \\ / O peration |
5 \\ / A nd | www.openfoam.com
6 \\/ M anipulation |
7-------------------------------------------------------------------------------
8 Copyright (C) 2007-2019 PCOpt/NTUA
9 Copyright (C) 2013-2019 FOSS GP
10 Copyright (C) 2019-2020 OpenCFD Ltd.
11-------------------------------------------------------------------------------
12License
13 This file is part of OpenFOAM.
14
15 OpenFOAM is free software: you can redistribute it and/or modify it
16 under the terms of the GNU General Public License as published by
17 the Free Software Foundation, either version 3 of the License, or
18 (at your option) any later version.
19
20 OpenFOAM is distributed in the hope that it will be useful, but WITHOUT
21 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
22 FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
23 for more details.
24
25 You should have received a copy of the GNU General Public License
26 along with OpenFOAM. If not, see <http://www.gnu.org/licenses/>.
27
28\*---------------------------------------------------------------------------*/
29
32
33// * * * * * * * * * * * * * * Static Data Members * * * * * * * * * * * * * //
34
35namespace Foam
36{
39 (
43 );
45 (
49 );
50}
51
52
53// * * * * * * * * * * * * * * * * Constructors * * * * * * * * * * * * * * //
54
56(
57 const fvMesh& mesh,
58 const dictionary& dict
59)
60:
62 useCorrection_
63 (
64 coeffsDict().getOrDefault<bool>("useCorrection", true)
65 )
66{}
67
68
69// * * * * * * * * * * * * * * * Member Functions * * * * * * * * * * * * * //
70
72{
73 // Reset to zero
74 const label n = objectiveDerivatives_.size();
75 const label m = constraintDerivatives_.size();
76 correction_ = scalarField(n, Zero);
77
78 // Matrix with constraint derivatives and its inverse
80 forAll(constraintDerivatives_, cI)
81 {
82 forAll(constraintDerivatives_, cJ)
83 {
84 MMT[cI][cJ] =
85 globalSum
86 (
87 constraintDerivatives_[cI] * constraintDerivatives_[cJ]
88 );
89 }
90 }
91 scalarSquareMatrix invM(inv(MMT));
92
93 // Contribution from constraints
94 scalarField constraintContribution(n, Zero);
95 scalarField nonLinearContribution(n, Zero);
96 forAll(constraintDerivatives_, cI)
97 {
98 forAll(constraintDerivatives_, cJ)
99 {
100 constraintContribution +=
101 constraintDerivatives_[cI]
102 *invM[cI][cJ]
103 *globalSum(constraintDerivatives_[cJ] * objectiveDerivatives_);
104
105 // Correction to take non-linearities into consideration
106 if (useCorrection_)
107 {
108 nonLinearContribution +=
109 constraintDerivatives_[cI]
110 *invM[cI][cJ]
111 *cValues_[cJ];
112 }
113 }
114 }
115
116 // Final correction
117 correction_ = objectiveDerivatives_ - constraintContribution;
118 correction_ *= -eta_;
119 if (useCorrection_)
120 {
121 correction_ -= nonLinearContribution;
122 }
123}
124
125
126// ************************************************************************* //
label n
Macros for easy insertion into run-time selection tables.
#define addToRunTimeSelectionTable(baseType, thisType, argNames)
Add to construction table with typeName as the key.
Abstract base class for optimisation methods supporting constraints. Does not add functionality to up...
Update design variables using Rosen's projection method.
void computeCorrection()
Compute design variables correction.
A list of keyword definitions, which are a keyword followed by a number of values (eg,...
Definition: dictionary.H:126
Mesh data needed to do the Finite Volume discretisation.
Definition: fvMesh.H:91
Abstract base class for optimisation methods.
Definition: updateMethod.H:55
#define defineTypeNameAndDebug(Type, DebugSwitch)
Define the typeName and debug information.
Definition: className.H:121
bool
Definition: EEqn.H:20
dynamicFvMesh & mesh
Namespace for OpenFOAM.
Field< scalar > scalarField
Specialisation of Field<T> for scalar.
static constexpr const zero Zero
Global zero (0)
Definition: zero.H:131
dimensionedSphericalTensor inv(const dimensionedSphericalTensor &dt)
dictionary dict
#define forAll(list, i)
Loop across all elements in list.
Definition: stdFoam.H:333