Skip to content

Commit e64dbf9

Browse files
authored
Added an option to compute objective function difference square. (#588)
* Updated the version. * Added an option to consider refDiffSquare for all objs. * Fixed the test and a potential issue in dFdAOA-analytical. * Fixed a test script and ref. * Updated test ref.
1 parent 376843f commit e64dbf9

22 files changed

+153
-2
lines changed

dafoam/pyDAFoam.py

+18-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
1212
"""
1313

14-
__version__ = "3.1.0"
14+
__version__ = "3.1.1"
1515

1616
import subprocess
1717
import os
@@ -3031,6 +3031,23 @@ def calcdFdAOAAnalytical(self, objFuncName, dFdAOA):
30313031

30323032
# if it is a forceObj, use the analytical approach to calculate dFdAOA, otherwise set it to zero
30333033
if isForceObj == 1:
3034+
# First, we need to check if a pair of lift and drag forces
3035+
# is defined. If not, return an error.
3036+
nParallelToFlows = 0
3037+
nNormalToFlows = 0
3038+
for objFuncName in objFuncDict:
3039+
for objFuncPart in objFuncDict[objFuncName]:
3040+
if objFuncDict[objFuncName][objFuncPart]["type"] == "force":
3041+
if objFuncDict[objFuncName][objFuncPart]["directionMode"] == "parallelToFlow":
3042+
nParallelToFlows += 1
3043+
if objFuncDict[objFuncName][objFuncPart]["directionMode"] == "normalToFlow":
3044+
nNormalToFlows += 1
3045+
3046+
if nParallelToFlows != 1 or nNormalToFlows != 1:
3047+
raise Error(
3048+
"calcdFdAOAAnalytical supports only one pair of force: one with normalToFlow and the other with parallelToFlow"
3049+
)
3050+
30343051
# loop over all objectives again to find the neededMode
30353052
# Note that if the neededMode == "parallelToFlow", we need to add a minus sign
30363053
for objFuncNameNeeded in objFuncDict:

src/adjoint/DAObjFunc/DAObjFunc.C

+6
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,12 @@ DAObjFunc::DAObjFunc(
5555
{
5656
objFuncCellValues_[idxI] = 0.0;
5757
}
58+
59+
calcRefDiffSquare_ = objFuncDict_.lookupOrDefault<label>("calcRefDiffSquare", 0);
60+
if (calcRefDiffSquare_)
61+
{
62+
objFuncDict_.readEntry<scalar>("ref", ref_);
63+
}
5864
}
5965

6066
// * * * * * * * * * * * * * * * * * Selectors * * * * * * * * * * * * * * * //

src/adjoint/DAObjFunc/DAObjFunc.H

+7
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,13 @@ protected:
9292
/// the connectivity information for the objective function
9393
List<List<word>> objFuncConInfo_;
9494

95+
/// whether to calculate (obj-ref)^2
96+
label calcRefDiffSquare_;
97+
98+
/// if calcRefDiffSquare_ is True, set the reference value
99+
scalar ref_;
100+
101+
95102
public:
96103
/// Runtime type information
97104
TypeName("DAObjFunc");

src/adjoint/DAObjFunc/DAObjFuncCenterOfPressure.C

+5
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,11 @@ void DAObjFuncCenterOfPressure::calcObjFunc(
128128

129129
objFuncValue = scale_ * (weightedPressure / totalPressure + (center_ & axis_));
130130

131+
if (calcRefDiffSquare_)
132+
{
133+
objFuncValue = (objFuncValue - ref_) * (objFuncValue - ref_);
134+
}
135+
131136
return;
132137
}
133138
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

src/adjoint/DAObjFunc/DAObjFuncForce.C

+5
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,11 @@ void DAObjFuncForce::calcObjFunc(
191191
// need to reduce the sum of force across all processors
192192
reduce(objFuncValue, sumOp<scalar>());
193193

194+
if (calcRefDiffSquare_)
195+
{
196+
objFuncValue = (objFuncValue - ref_) * (objFuncValue - ref_);
197+
}
198+
194199
return;
195200
}
196201

src/adjoint/DAObjFunc/DAObjFuncLocation.C

+5
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,11 @@ void DAObjFuncLocation::calcObjFunc(
219219
<< abort(FatalError);
220220
}
221221

222+
if (calcRefDiffSquare_)
223+
{
224+
objFuncValue = (objFuncValue - ref_) * (objFuncValue - ref_);
225+
}
226+
222227
return;
223228
}
224229

src/adjoint/DAObjFunc/DAObjFuncMass.C

+5
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,11 @@ void DAObjFuncMass::calcObjFunc(
9696
// need to reduce the sum of force across all processors
9797
reduce(objFuncValue, sumOp<scalar>());
9898

99+
if (calcRefDiffSquare_)
100+
{
101+
objFuncValue = (objFuncValue - ref_) * (objFuncValue - ref_);
102+
}
103+
99104
return;
100105
}
101106

src/adjoint/DAObjFunc/DAObjFuncMassFlowRate.C

+5
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,11 @@ void DAObjFuncMassFlowRate::calcObjFunc(
119119
// need to reduce the sum of force across all processors
120120
reduce(objFuncValue, sumOp<scalar>());
121121

122+
if (calcRefDiffSquare_)
123+
{
124+
objFuncValue = (objFuncValue - ref_) * (objFuncValue - ref_);
125+
}
126+
122127
return;
123128
}
124129

src/adjoint/DAObjFunc/DAObjFuncMeshQualityKS.C

+5
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,11 @@ void DAObjFuncMeshQualityKS::calcObjFunc(
219219

220220
objFuncValue = log(objFuncValue) / coeffKS_;
221221

222+
if (calcRefDiffSquare_)
223+
{
224+
objFuncValue = (objFuncValue - ref_) * (objFuncValue - ref_);
225+
}
226+
222227
return;
223228
}
224229

src/adjoint/DAObjFunc/DAObjFuncMoment.C

+5
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,11 @@ void DAObjFuncMoment::calcObjFunc(
165165
// need to reduce the sum of force across all processors
166166
reduce(objFuncValue, sumOp<scalar>());
167167

168+
if (calcRefDiffSquare_)
169+
{
170+
objFuncValue = (objFuncValue - ref_) * (objFuncValue - ref_);
171+
}
172+
168173
return;
169174
}
170175
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

src/adjoint/DAObjFunc/DAObjFuncPatchMean.C

+5
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,11 @@ void DAObjFuncPatchMean::calcObjFunc(
132132
// need to reduce the sum of force across all processors
133133
reduce(objFuncValue, sumOp<scalar>());
134134

135+
if (calcRefDiffSquare_)
136+
{
137+
objFuncValue = (objFuncValue - ref_) * (objFuncValue - ref_);
138+
}
139+
135140
return;
136141
}
137142

src/adjoint/DAObjFunc/DAObjFuncPower.C

+5
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,11 @@ void DAObjFuncPower::calcObjFunc(
168168
// need to reduce the sum of force across all processors
169169
reduce(objFuncValue, sumOp<scalar>());
170170

171+
if (calcRefDiffSquare_)
172+
{
173+
objFuncValue = (objFuncValue - ref_) * (objFuncValue - ref_);
174+
}
175+
171176
return;
172177
}
173178
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * //

src/adjoint/DAObjFunc/DAObjFuncTotalPressure.C

+5
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,11 @@ void DAObjFuncTotalPressure::calcObjFunc(
132132
// need to reduce the sum of force across all processors
133133
reduce(objFuncValue, sumOp<scalar>());
134134

135+
if (calcRefDiffSquare_)
136+
{
137+
objFuncValue = (objFuncValue - ref_) * (objFuncValue - ref_);
138+
}
139+
135140
return;
136141
}
137142

src/adjoint/DAObjFunc/DAObjFuncTotalPressureRatio.C

+5
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,11 @@ void DAObjFuncTotalPressureRatio::calcObjFunc(
217217
}
218218
}
219219

220+
if (calcRefDiffSquare_)
221+
{
222+
objFuncValue = (objFuncValue - ref_) * (objFuncValue - ref_);
223+
}
224+
220225
return;
221226
}
222227

src/adjoint/DAObjFunc/DAObjFuncTotalTemperatureRatio.C

+5
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,11 @@ void DAObjFuncTotalTemperatureRatio::calcObjFunc(
207207
}
208208
}
209209

210+
if (calcRefDiffSquare_)
211+
{
212+
objFuncValue = (objFuncValue - ref_) * (objFuncValue - ref_);
213+
}
214+
210215
return;
211216
}
212217

src/adjoint/DAObjFunc/DAObjFuncVariableVolSum.C

+5
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,11 @@ void DAObjFuncVariableVolSum::calcObjFunc(
167167

168168
objFuncValue /= totalVol;
169169

170+
if (calcRefDiffSquare_)
171+
{
172+
objFuncValue = (objFuncValue - ref_) * (objFuncValue - ref_);
173+
}
174+
170175
return;
171176
}
172177

src/adjoint/DAObjFunc/DAObjFuncVonMisesStressKS.C

+5
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,11 @@ void DAObjFuncVonMisesStressKS::calcObjFunc(
121121

122122
objFuncValue = log(objValTmp) / coeffKS_;
123123

124+
if (calcRefDiffSquare_)
125+
{
126+
objFuncValue = (objFuncValue - ref_) * (objFuncValue - ref_);
127+
}
128+
124129
return;
125130
}
126131

src/adjoint/DAObjFunc/DAObjFuncWallHeatFlux.C

+5
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,11 @@ void DAObjFuncWallHeatFlux::calcObjFunc(
246246
// need to reduce the sum of force across all processors
247247
reduce(objFuncValue, sumOp<scalar>());
248248

249+
if (calcRefDiffSquare_)
250+
{
251+
objFuncValue = (objFuncValue - ref_) * (objFuncValue - ref_);
252+
}
253+
249254
return;
250255
}
251256

tests/refs/DAFoam_Test_DASimpleFoamADRef.txt

+11
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ Dictionary Key: CD
22
@value 0.02043001230171681 1e-08 1e-10
33
Dictionary Key: CL
44
@value 0.4874216250833033 1e-08 1e-10
5+
Dictionary Key: CMZDIFF
6+
@value 0.0115816476130927 1e-08 1e-10
57
Dictionary Key: COP
68
@value 0.2298218575123644 1e-08 1e-10
79
Dictionary Key: R1
@@ -30,6 +32,15 @@ Dictionary Key: shapey
3032
@value 1.418731716621286 1e-05 1e-07
3133
Dictionary Key: twist
3234
@value 0.09008667655578639 1e-05 1e-07
35+
Dictionary Key: CMZDIFF
36+
Dictionary Key: alpha
37+
@value 0.0005090113344677443 1e-05 1e-07
38+
Dictionary Key: shapey
39+
@value -0.001151982015258751 1e-05 1e-07
40+
@value -0.03924921702616808 1e-05 1e-07
41+
@value -0.1132153003029267 1e-05 1e-07
42+
Dictionary Key: twist
43+
@value 0.0004899695826971005 1e-05 1e-07
3344
Dictionary Key: COP
3445
Dictionary Key: alpha
3546
@value -0.002070288134429892 1e-05 1e-07

tests/refs/DAFoam_Test_MphysAeroFieldRef.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@ Dictionary Key: CL
44
Dictionary Key: alpha
55
@value 0.435012393483863 0.0001 1e-06
66
Dictionary Key: aoa
7-
@value 0.09767145516644697 0.0001 1e-06
7+
@value 0.0973750318897765 0.0001 1e-06
88
Dictionary Key: twist
99
@value 0.09790920083964022 0.0001 1e-06

tests/runTests_DASimpleFoamAD.py

+24
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,30 @@
110110
"addToAdjoint": True,
111111
}
112112
},
113+
"CMZ": {
114+
"part1": {
115+
"type": "moment",
116+
"source": "patchToFace",
117+
"patches": ["wing"],
118+
"axis": [0.0, 0.0, 1.0],
119+
"center": [0.25, 0.0, 0.05],
120+
"scale": 1.0 / (0.5 * U0 * U0 * A0 * 1.0),
121+
"addToAdjoint": False
122+
}
123+
},
124+
"CMZDIFF": {
125+
"part1": {
126+
"type": "moment",
127+
"source": "patchToFace",
128+
"patches": ["wing"],
129+
"axis": [0.0, 0.0, 1.0],
130+
"center": [0.25, 0.0, 0.05],
131+
"scale": 1.0 / (0.5 * U0 * U0 * A0 * 1.0),
132+
"addToAdjoint": True,
133+
"calcRefDiffSquare": True,
134+
"ref": 0.1
135+
}
136+
},
113137
},
114138
"normalizeStates": {"U": U0, "p": U0 * U0 / 2.0, "k": k0, "omega": omega0, "phi": 1.0},
115139
"adjPartDerivFDStep": {"State": 1e-6, "FFD": 1e-3, "ACTD": 1.0e-3},

tests/runTests_MphysAeroField.py

+11
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,17 @@
4343
"transport:nu": 1.5e-5,
4444
},
4545
"objFunc": {
46+
"CD": {
47+
"part1": {
48+
"type": "force",
49+
"source": "patchToFace",
50+
"patches": ["wing"],
51+
"directionMode": "parallelToFlow",
52+
"alphaName": "aoa",
53+
"scale": 1.0 / (0.5 * U0 * U0 * A0),
54+
"addToAdjoint": True,
55+
}
56+
},
4657
"CL": {
4758
"part1": {
4859
"type": "force",

0 commit comments

Comments
 (0)