Go to the documentation of this file.
61 temp[i][i] = scalar(1);
76 y.map(objectiveDerivatives_ - derivativesOld_, activeDesignVars_);
77 s.map(correctionOld_, activeDesignVars_);
82 scalar tempMag =
sqrt(globalSum(
sqr(temp)));
83 scalar yMag =
sqrt(globalSum(
sqr(
y)));
84 scalar HessYMag =
sqrt(globalSum(
sqr(rightMult(HessianInvOld_,
y))));
87 if (tempMag > ratioThreshold_ * yMag * HessYMag)
91 + (scalar(1)/(globalSum(temp*
y)))*outerProd(temp, temp);
96 <<
"Denominator of update too small. Keeping old Hessian" <<
endl;
97 HessianInv_ = HessianInvOld_;
106 if (counter_ < nSteepestDescent_)
108 Info<<
"Using steepest descent to update design variables ... " <<
endl;
109 correction_ = -eta_*objectiveDerivatives_;
114 activeDerivs.
map(objectiveDerivatives_, activeDesignVars_);
117 -etaHessian_*rightMult(HessianInv_, activeDerivs)
122 forAll(activeDesignVars_, varI)
124 correction_[activeDesignVars_[varI]] = activeCorrection[varI];
129 derivativesOld_ = objectiveDerivatives_;
130 correctionOld_ = correction_;
131 HessianInvOld_ = HessianInv_;
137 if (optMethodIODict_.headerOk())
139 optMethodIODict_.readEntry(
"HessianInvOld", HessianInvOld_);
140 optMethodIODict_.readEntry(
"derivativesOld", derivativesOld_);
141 optMethodIODict_.readEntry(
"correctionOld", correctionOld_);
142 optMethodIODict_.readEntry(
"counter", counter_);
143 optMethodIODict_.readEntry(
"eta", eta_);
145 const label
n(HessianInvOld_.n());
149 if (activeDesignVars_.empty())
166 coeffsDict().getOrDefault<scalar>(
"etaHessian", 1)
170 coeffsDict().getOrDefault<label>(
"nSteepestDescent", 1)
174 coeffsDict().getOrDefault<scalar>(
"ratioThreshold", 1
e-08)
176 activeDesignVars_(0),
190 Info<<
"\t Didn't find explicit definition of active design variables. "
191 <<
"Treating all available ones as active " <<
endl;
220 correctionOld_ = oldCorrection;
232 optMethodIODict_.add<
scalarField>(
"derivativesOld", derivativesOld_,
true);
233 optMethodIODict_.add<
scalarField>(
"correctionOld", correctionOld_,
true);
234 optMethodIODict_.add<label>(
"counter", counter_,
true);
addToRunTimeSelectionTable(decompositionMethod, kahipDecomp, dictionary)
Field< scalar > scalarField
Specialisation of Field<T> for scalar.
gmvFile<< "tracers "<< particles.size()<< nl;for(const passiveParticle &p :particles){ gmvFile<< p.position().x()<< " ";}gmvFile<< nl;for(const passiveParticle &p :particles){ gmvFile<< p.position().y()<< " ";}gmvFile<< nl;for(const passiveParticle &p :particles){ gmvFile<< p.position().z()<< " ";}gmvFile<< nl;forAll(lagrangianScalarNames, i){ word name=lagrangianScalarNames[i];IOField< scalar > s(IOobject(name, runTime.timeName(), cloud::prefix, mesh, IOobject::MUST_READ, IOobject::NO_WRITE))
static constexpr const zero Zero
Global zero (0)
Ostream & endl(Ostream &os)
Add newline and flush stream.
labelList activeDesignVars_
Map to active design variables.
void computeCorrection()
Compute design variables correction.
void allocateMatrices()
Allocate matrices in the first optimisation cycle.
#define forAll(list, i)
Loop across all elements in list.
void map(const UList< Type > &mapF, const labelUList &mapAddressing)
1 to 1 map from the given field
void readFromDict()
Read old info from dict.
virtual void updateOldCorrection(const scalarField &oldCorrection)
Abstract base class for optimisation methods.
messageStream Info
Information stream (uses stdout - output is on the master only)
A list of keyword definitions, which are a keyword followed by a number of values (eg,...
Macros for easy insertion into run-time selection tables.
Mesh data needed to do the Finite Volume discretisation.
dictionary coeffsDict()
Return optional dictionary with parameters specific to each method.
virtual void write()
Write useful quantities to files.
virtual void write()
Write old info to dict.
dimensionedSymmTensor sqr(const dimensionedVector &dv)
SquareMatrix< scalar > HessianInv_
dimensionedScalar sqrt(const dimensionedScalar &ds)
void update()
Update design variables.
const dimensionedScalar e
Elementary charge.
labelList identity(const label len, label start=0)
Create identity map of the given length with (map[i] == i)
SquareMatrix< scalar > HessianInvOld_
The previous Hessian inverse.
defineTypeNameAndDebug(combustionModel, 0)
#define WarningInFunction
Report a warning using Foam::Warning.
void updateHessian()
Update approximation of the inverse Hessian.
virtual void updateOldCorrection(const scalarField &oldCorrection)
scalarField objectiveDerivatives_
Derivatives of the objective functions.