72 y.map(objectiveDerivatives_ - derivativesOld_, activeDesignVars_);
73 s.map(correctionOld_, activeDesignVars_);
75 scalar ys = globalSum(
s*
y);
77 if (counter_ == 1 && scaleFirstHessian_)
79 scalar scaleFactor = ys/globalSum(
y*
y);
80 Info<<
"Scaling Hessian with factor " << scaleFactor <<
endl;
81 forAll(activeDesignVars_, varI)
83 HessianInvOld_[varI][varI] *= scaleFactor;
88 if (ys < curvatureThreshold_)
91 <<
" y*s is below threshold! y*s=" << ys <<
endl;
95 <<
"Hessian curvature index " << ys <<
endl;
100 + (ys + globalSum(leftMult(
y, HessianInvOld_)*
y))/
sqr(ys)*outerProd(
s,
s)
103 outerProd(rightMult(HessianInvOld_,
y),
s)
104 + outerProd(
s, leftMult(
y, HessianInvOld_))
113 if (counter_ < nSteepestDescent_)
115 Info<<
"Using steepest descent to update design variables" <<
endl;
116 correction_ = -eta_*objectiveDerivatives_;
123 activeDerivs.
map(objectiveDerivatives_, activeDesignVars_);
126 -etaHessian_*rightMult(HessianInv_, activeDerivs)
131 forAll(activeDesignVars_, varI)
133 correction_[activeDesignVars_[varI]] = activeCorrection[varI];
138 derivativesOld_ = objectiveDerivatives_;
139 correctionOld_ = correction_;
140 HessianInvOld_ = HessianInv_;
146 if (optMethodIODict_.headerOk())
148 optMethodIODict_.readEntry(
"HessianInvOld", HessianInvOld_);
149 optMethodIODict_.readEntry(
"derivativesOld", derivativesOld_);
150 optMethodIODict_.readEntry(
"correctionOld", correctionOld_);
151 optMethodIODict_.readEntry(
"counter", counter_);
152 optMethodIODict_.readEntry(
"eta", eta_);
154 const label
n(HessianInvOld_.n());
158 if (activeDesignVars_.empty())
177 coeffsDict().getOrDefault<scalar>(
"etaHessian", 1)
181 coeffsDict().getOrDefault<label>(
"nSteepestDescent", 1)
183 activeDesignVars_(0),
186 coeffsDict().getOrDefault<bool>(
"scaleFirstHessian",
false)
190 coeffsDict().getOrDefault<scalar>(
"curvatureThreshold", 1
e-10)
201 !coeffsDict().readIfPresent(
"activeDesignVariables", activeDesignVars_)
206 Info<<
"\t Did not find explicit definition of active design variables."
207 <<
" Treating all available ones as active" <<
endl;
236 correctionOld_ = oldCorrection;
248 optMethodIODict_.add<
scalarField>(
"derivativesOld", derivativesOld_,
true);
249 optMethodIODict_.add<
scalarField>(
"correctionOld", correctionOld_,
true);
250 optMethodIODict_.add<label>(
"counter", counter_,
true);