44 namespace NekMeshUtils
58 for (
int i = 0; i < ti.num_elements(); i++)
62 ti[i] = (xi[i] - ui[i]) / J(i, 0);
66 ti[i] = (xi[i] - li[i]) / J(i, 0);
70 ti[i] = numeric_limits<double>::max();
79 DNekMat d(xi.num_elements(), 1);
80 for (
int i = 0; i < xi.num_elements(); i++)
82 if (fabs(ti[i]) < 1E-10)
88 d(i, 0) = -1.0 * J(i, 0);
94 for (
int i = 0; i < xci.num_elements(); i++)
96 if (xi[i] + d(i, 0) < li[i])
104 xci[i] = xi[i] + d(i, 0);
107 if (xi[i] + d(i, 0) > ui[i])
115 xci[i] = xi[i] + d(i, 0);
119 DNekMat Z(xci.num_elements(), xci.num_elements(), 0.0);
121 set<int>::iterator it;
122 for (
int i = 0; i < xci.num_elements(); i++)
125 if (it != Fset.end())
131 DNekMat dx(xci.num_elements(), 1, 0.0);
132 for (
int i = 0; i < xci.num_elements(); i++)
134 dx(i, 0) = xci[i] - xi[i];
142 for (it = Fset.begin(); it != Fset.end(); it++)
145 if (li[i] - xci[i] > alpha * du(i, 0))
147 alpha = min(alpha, (li[i] - xci[i]) / du(i, 0));
149 else if (ui[i] - xci[i] < alpha * du(i, 0))
151 alpha = min(alpha, (ui[i] - xci[i]) / du(i, 0));
158 for (
int i = 0; i < xci.num_elements(); i++)
160 set<int>::iterator f = Fset.find(i);
163 xibar[i] = xci[i] + grad(i, 0);
171 Vmath::Vsub(xci.num_elements(), &xibar[0], 1, &xi[0], 1, &dk[0], 1);
176 for (
int i = 0; i < dk.num_elements(); i++)
178 c += 1E-4 * J(i, 0) * dk[i];
179 r += J(i, 0) * dk[i];
207 for (
int i = 0; i < xi.num_elements(); i++)
209 tst[i] = xi[i] + lam * dk[i];
217 for (
int i = 0; i < dk.num_elements(); i++)
219 l += jn(i, 0) * dk[i];
222 }
while (fn > fo + c || fabs(l) > 1.0 * fabs(r));
231 DNekMat s(dk.num_elements(), 1, 0.0);
232 for (
int i = 0; i < dk.num_elements(); i++)
234 s(i, 0) = lam * dk[i];
245 for (
int i = 0; i < dk.num_elements(); i++)
247 ynorm += y(i, 0) * y(i, 0);
250 if (d3(0, 0) > 2.2E-16 * ynorm)
252 B = B + y * yT * (1.0 / d1(0, 0)) - B * s * sT * B * (1.0 / d2(0, 0));
253 H = H + (d3(0, 0) + n1(0, 0)) / d3(0, 0) / d3(0, 0) * s * sT -
254 1.0 / d3(0, 0) * (H * y * sT + s * yT * H);
std::shared_ptr< OptiObj > OptiObjSharedPtr
void Vsub(int n, const T *x, const int incx, const T *y, const int incy, T *z, const int incz)
Subtract vector z = x-y.
bool BGFSUpdate(OptiObjSharedPtr opti, DNekMat &J, DNekMat &B, DNekMat &H)