@@ -64,21 +64,8 @@ DASolver::DASolver(
64
64
primalMinResTol_ = daOptionPtr_ -> getOption < scalar > ("primalMinResTol" );
65
65
primalMinIters_ = daOptionPtr_ -> getOption < label > ("primalMinIters" );
66
66
67
- // check if the objective function std is used in determining the primal convergence
68
- primalObjStdActive_ = daOptionPtr_ -> getSubDictOption < label > ("primalObjStdTol" , "active" );
69
- if (primalObjStdActive_ )
70
- {
71
- // if it is active, read in the tolerance and set a large value for the initial std
72
- primalObjStdTol_ = daOptionPtr_ -> getSubDictOption < scalar > ("primalObjStdTol" , "tol" );
73
- primalObjStd_ = 1e10 ;
74
- }
75
- else
76
- {
77
- // if it is not active, set primalObjStdTol_ > primalObjStd_, such that it will
78
- // always pass the condition in DASolver::loop (ignore primalObjStd)
79
- primalObjStdTol_ = 1e-5 ;
80
- primalObjStd_ = 0.0 ;
81
- }
67
+ // initialize the objStd variables.
68
+ this -> initObjStd ();
82
69
83
70
Info << "DAOpton initialized " << endl ;
84
71
}
@@ -187,26 +174,67 @@ label DASolver::loop(Time& runTime)
187
174
}
188
175
}
189
176
177
+ void DASolver ::initObjStd ()
178
+ {
179
+ /*
180
+ Description:
181
+ Initialize the objStd variables.
182
+ */
183
+
184
+ // check if the objective function std is used in determining the primal convergence
185
+ primalObjStdActive_ = daOptionPtr_ -> getSubDictOption < label > ("primalObjStdTol" , "active" );
186
+ if (primalObjStdActive_ )
187
+ {
188
+ // if it is active, read in the tolerance and set a large value for the initial std
189
+ primalObjStdTol_ = daOptionPtr_ -> getSubDictOption < scalar > ("primalObjStdTol" , "tol" );
190
+ primalObjStd_ = 999.0 ;
191
+
192
+ label steps = daOptionPtr_ -> getSubDictOption < label > ("primalObjStdTol" , "steps" );
193
+ primalObjSeries_ .setSize (steps , 0.0 );
194
+
195
+ word objFuncNameWanted = daOptionPtr_ -> getSubDictOption < word > ("primalObjStdTol" , "objFuncName" );
196
+
197
+ label objFuncNameFound = 0 ;
198
+ const dictionary & objFuncDict = daOptionPtr_ -> getAllOptions ().subDict ("objFunc" );
199
+ forAll (objFuncDict .toc (), idxI )
200
+ {
201
+ word objFuncName = objFuncDict .toc ()[idxI ];
202
+ if (objFuncName == objFuncNameWanted )
203
+ {
204
+ objFuncNameFound = 1 ;
205
+ }
206
+ }
207
+ if (objFuncNameFound == 0 )
208
+ {
209
+ FatalErrorIn ("initObjStd" ) << "objStd->objFuncName not found! "
210
+ << abort (FatalError );
211
+ }
212
+ }
213
+ else
214
+ {
215
+ // if it is not active, set primalObjStdTol_ > primalObjStd_, such that it will
216
+ // always pass the condition in DASolver::loop (ignore primalObjStd)
217
+ primalObjStdTol_ = 1e-5 ;
218
+ primalObjStd_ = 0.0 ;
219
+ }
220
+ }
221
+
190
222
void DASolver ::calcObjStd (Time & runTime )
191
223
{
192
224
/*
193
225
Description:
194
226
calculate the objective function's std, this will be used to stop the primal simulation and also
195
- evaluate whether the primal converges
227
+ evaluate whether the primal converges. We will start calculating the objStd when primalObjSeries_
228
+ is filled at least once, i.e., runTime.timeIndex() >= steps
196
229
*/
197
230
198
- if (!primalObjStdActive_ )
231
+ if (!primalObjStdActive_ || runTime . timeIndex () < 1 )
199
232
{
200
233
return ;
201
234
}
202
235
203
236
label steps = daOptionPtr_ -> getSubDictOption < label > ("primalObjStdTol" , "steps" );
204
237
205
- if (runTime .timeIndex () == 1 )
206
- {
207
- primalObjSeries_ .clear ();
208
- }
209
-
210
238
word objFuncNameWanted = daOptionPtr_ -> getSubDictOption < word > ("primalObjStdTol" , "objFuncName" );
211
239
212
240
scalar objFunPartSum = 0.0 ;
@@ -219,22 +247,21 @@ void DASolver::calcObjStd(Time& runTime)
219
247
objFunPartSum += daObjFunc .getObjFuncValue ();
220
248
}
221
249
}
222
- primalObjSeries_ .append (objFunPartSum );
250
+ label seriesI = (runTime .timeIndex () - 1 ) % steps ;
251
+ primalObjSeries_ [seriesI ] = objFunPartSum ;
223
252
224
- label seriesSize = primalObjSeries_ .size ();
225
-
226
- if (seriesSize >= steps )
253
+ if (runTime .timeIndex () >= steps )
227
254
{
228
255
scalar mean = 0 ;
229
- for ( label i = seriesSize - 1 ; i >= seriesSize - steps ; i -- )
256
+ forAll ( primalObjSeries_ , idxI )
230
257
{
231
- mean += primalObjSeries_ [i ];
258
+ mean += primalObjSeries_ [idxI ];
232
259
}
233
260
mean /= steps ;
234
261
primalObjStd_ = 0.0 ;
235
- for ( label i = seriesSize - 1 ; i >= seriesSize - steps ; i -- )
262
+ forAll ( primalObjSeries_ , idxI )
236
263
{
237
- primalObjStd_ += (primalObjSeries_ [i ] - mean ) * (primalObjSeries_ [i ] - mean );
264
+ primalObjStd_ += (primalObjSeries_ [idxI ] - mean ) * (primalObjSeries_ [idxI ] - mean );
238
265
}
239
266
primalObjStd_ = sqrt (primalObjStd_ / steps );
240
267
}
@@ -328,6 +355,14 @@ void DASolver::printAllObjFuncs()
328
355
<< "-" << objFuncPart
329
356
<< "-" << daObjFunc .getObjFuncType ()
330
357
<< ": " << objFuncVal ;
358
+ if (primalObjStdActive_ )
359
+ {
360
+ word objFuncNameWanted = daOptionPtr_ -> getSubDictOption < word > ("primalObjStdTol" , "objFuncName" );
361
+ if (objFuncNameWanted == objFuncName )
362
+ {
363
+ Info << " Std " << primalObjStd_ ;
364
+ }
365
+ }
331
366
if (timeOperator == "average" || timeOperator == "sum" )
332
367
{
333
368
Info << " Unsteady " << timeOperator << " " << unsteadyObjFuncs_ [uKey ];
0 commit comments