50 13, NodeOpti1D3D::create,
"1D3D");
52 void NodeOpti1D3D::Optimise()
55 NekDouble currentW = GetFunctional<3>(minJacNew);
58 if (m_grad[0] * m_grad[0] + m_grad[1] * m_grad[1] + m_grad[2] * m_grad[2] >
65 NekDouble tc = m_node->GetCADCurveInfo(curve->GetId());
76 m_grad[1] = 1e-6 - m_grad[1];
79 sk[0] = m_grad[0] / m_grad[1] * -1.0;
90 while (alpha > alphaTol())
93 nt = tc + alpha * sk[0];
94 if (nt < bd[0] || nt > bd[1])
105 newVal = GetFunctional<3>(minJacNew,
false);
108 if (newVal <= currentW + c1() * alpha * pg)
132 m_minJac = minJacNew;
133 m_node->MoveCurve(p, curve->GetId(), nt);
136 m_res->val = max(sqrt((m_node->m_x - xc) * (m_node->m_x - xc) +
137 (m_node->m_y - yc) * (m_node->m_y - yc) +
138 (m_node->m_z - zc) * (m_node->m_z - zc)),
144 m_res->func += newVal;
149 23, NodeOpti2D3D::create,
"2D3D");
151 void NodeOpti2D3D::Optimise()
154 NekDouble currentW = GetFunctional<3>(minJacNew);
157 if (m_grad[0] * m_grad[0] + m_grad[1] * m_grad[1] + m_grad[2] * m_grad[2] >
181 m_grad[2] += 1e-6 - val;
182 m_grad[4] += 1e-6 - val;
185 sk[0] = -1.0 / (m_grad[2] * m_grad[4] - m_grad[3] * m_grad[3]) *
186 (m_grad[4] * m_grad[0] - m_grad[3] * m_grad[1]);
187 sk[1] = -1.0 / (m_grad[2] * m_grad[4] - m_grad[3] * m_grad[3]) *
188 (m_grad[2] * m_grad[1] - m_grad[3] * m_grad[0]);
191 NekDouble pg = (m_grad[0] * sk[0] + m_grad[1] * sk[1]);
195 while (alpha > alphaTol())
197 uvt[0] = uvc[0] + alpha * sk[0];
198 uvt[1] = uvc[1] + alpha * sk[1];
200 if (uvt[0] < bd[0] || uvt[0] > bd[1] || uvt[1] < bd[2] ||
212 newVal = GetFunctional<3>(minJacNew,
false);
215 if (newVal <= currentW + c1() * (alpha * pg))
238 m_minJac = minJacNew;
239 m_node->Move(p, surf->GetId(), uvt);
243 m_res->val = max(sqrt((m_node->m_x - xc) * (m_node->m_x - xc) +
244 (m_node->m_y - yc) * (m_node->m_y - yc) +
245 (m_node->m_z - zc) * (m_node->m_z - zc)),
250 if (uva[0] < bd[0] || uva[0] > bd[1] || uva[1] < bd[2] ||
253 ASSERTL0(
false,
"something when very wrong and the node finished "
254 "out of its parameter plane");
259 m_res->func += newVal;
263 void NodeOpti1D3D::ProcessGradient()
265 NekDouble tc = m_node->GetCADCurveInfo(curve->GetId());
273 m_grad[0] = grad[0] * d2[3] + grad[1] * d2[4] + grad[2] * d2[5];
277 m_grad[1] = grad[0] * d2[6] + grad[1] * d2[7] + grad[2] * d2[8] +
278 d2[3] * (grad[3] * d2[3] + grad[4] * d2[4] + grad[5] * d2[5]) +
279 d2[4] * (grad[4] * d2[3] + grad[6] * d2[4] + grad[7] * d2[5]) +
280 d2[5] * (grad[5] * d2[3] + grad[7] * d2[4] + grad[8] * d2[5]);
283 void NodeOpti2D3D::ProcessGradient()
321 m_grad[0] = d2[3] * grad[0] + d2[4] * grad[1] + d2[5] * grad[2];
322 m_grad[1] = d2[6] * grad[0] + d2[7] * grad[1] + d2[8] * grad[2];
324 m_grad[2] = grad[0] * d2[9] + grad[1] * d2[10] + grad[2] * d2[11] +
325 grad[3] * d2[3] * d2[3] + grad[6] * d2[4] * d2[4] +
326 grad[8] * d2[5] * d2[5] + 2.0 * grad[4] * d2[3] * d2[4] +
327 2.0 * grad[5] * d2[3] * d2[5] + 2.0 * grad[7] * d2[4] * d2[5];
329 m_grad[4] = grad[0] * d2[12] + grad[1] * d2[13] + grad[2] * d2[14] +
330 grad[3] * d2[6] * d2[6] + grad[6] * d2[7] * d2[7] +
331 grad[8] * d2[8] * d2[8] + 2.0 * grad[4] * d2[6] * d2[7] +
332 2.0 * grad[5] * d2[6] * d2[8] + 2.0 * grad[7] * d2[7] * d2[8];
334 m_grad[3] = grad[0] * d2[15] + grad[1] * d2[16] + grad[2] * d2[17] +
335 grad[3] * d2[3] * d2[6] + grad[6] * d2[4] * d2[7] +
336 grad[8] * d2[5] * d2[8] +
337 grad[4] * (d2[3] * d2[7] + d2[4] * d2[6]) +
338 grad[5] * (d2[3] * d2[8] + d2[5] * d2[6]) +
339 grad[7] * (d2[4] * d2[8] + d2[5] * d2[7]);
#define ASSERTL0(condition, msg)
NodeOptiFactory & GetNodeOptiFactory()
static boost::mutex mutex
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, tDescription pDesc="")
Register a class with the factory.