49 13, NodeOpti1D3D::create,
"1D3D");
51 void NodeOpti1D3D::Optimise()
54 NekDouble currentW = GetFunctional<3>(minJacNew);
57 if (m_grad[0] * m_grad[0] + m_grad[1] * m_grad[1] + m_grad[2] * m_grad[2] >
64 NekDouble tc = m_node->GetCADCurveInfo(curve->GetId());
70 vector<NekDouble> sk(1);
74 m_grad[1] = 1e-6 - m_grad[1];
77 sk[0] = m_grad[0] / m_grad[1] * -1.0;
79 vector<NekDouble> bd(2);
80 curve->GetBounds(bd[0], bd[1]);
89 while (alpha > alphaTol())
92 nt = tc + alpha * sk[0];
93 if (nt < bd[0] || nt > bd[1])
99 curve->P(nt, m_node->m_x, m_node->m_y, m_node->m_z);
101 newVal = GetFunctional<3>(minJacNew,
false);
104 if (newVal <= currentW + c1() * alpha * pg)
117 curve->P(nt, m_node->m_x, m_node->m_y, m_node->m_z);
125 m_minJac = minJacNew;
126 m_node->Move(m_node->m_x, m_node->m_y, m_node->m_z, curve->GetId(),
130 m_res->val = max(sqrt((m_node->m_x - xc) * (m_node->m_x - xc) +
131 (m_node->m_y - yc) * (m_node->m_y - yc) +
132 (m_node->m_z - zc) * (m_node->m_z - zc)),
138 m_res->func += newVal;
143 23, NodeOpti2D3D::create,
"2D3D");
145 void NodeOpti2D3D::Optimise()
148 NekDouble currentW = GetFunctional<3>(minJacNew);
151 if (m_grad[0] * m_grad[0] + m_grad[1] * m_grad[1] + m_grad[2] * m_grad[2] >
163 vector<NekDouble> bd(4);
164 surf->GetBounds(bd[0], bd[1], bd[2], bd[3]);
166 vector<NekDouble> sk(2);
175 m_grad[2] += 1e-6 - val;
176 m_grad[4] += 1e-6 - val;
179 sk[0] = -1.0 / (m_grad[2] * m_grad[4] - m_grad[3] * m_grad[3]) *
180 (m_grad[4] * m_grad[0] - m_grad[3] * m_grad[1]);
181 sk[1] = -1.0 / (m_grad[2] * m_grad[4] - m_grad[3] * m_grad[3]) *
182 (m_grad[2] * m_grad[1] - m_grad[3] * m_grad[0]);
185 NekDouble pg = (m_grad[0] * sk[0] + m_grad[1] * sk[1]);
189 while (alpha > alphaTol())
191 uvt[0] = uvc[0] + alpha * sk[0];
192 uvt[1] = uvc[1] + alpha * sk[1];
194 if (uvt[0] < bd[0] || uvt[0] > bd[1] || uvt[1] < bd[2] ||
201 surf->P(uvt, m_node->m_x, m_node->m_y, m_node->m_z);
203 newVal = GetFunctional<3>(minJacNew,
false);
206 if (newVal <= currentW + c1() * (alpha * pg))
218 surf->P(uvc, m_node->m_x, m_node->m_y, m_node->m_z);
226 m_minJac = minJacNew;
227 m_node->Move(m_node->m_x, m_node->m_y, m_node->m_z, surf->GetId(),
232 m_res->val = max(sqrt((m_node->m_x - xc) * (m_node->m_x - xc) +
233 (m_node->m_y - yc) * (m_node->m_y - yc) +
234 (m_node->m_z - zc) * (m_node->m_z - zc)),
239 if (uva[0] < bd[0] || uva[0] > bd[1] || uva[1] < bd[2] ||
242 ASSERTL0(
false,
"something when very wrong and the node finished " 243 "out of its parameter plane");
248 m_res->func += newVal;
252 void NodeOpti1D3D::ProcessGradient()
254 NekDouble tc = m_node->GetCADCurveInfo(curve->GetId());
255 vector<NekDouble> grad = m_grad;
256 m_grad = vector<NekDouble>(2, 0.0);
262 m_grad[0] = grad[0] * d2[3] + grad[1] * d2[4] + grad[2] * d2[5];
266 m_grad[1] = grad[0] * d2[6] + grad[1] * d2[7] + grad[2] * d2[8] +
267 d2[3] * (grad[3] * d2[3] + grad[4] * d2[4] + grad[5] * d2[5]) +
268 d2[4] * (grad[4] * d2[3] + grad[6] * d2[4] + grad[7] * d2[5]) +
269 d2[5] * (grad[5] * d2[3] + grad[7] * d2[4] + grad[8] * d2[5]);
272 void NodeOpti2D3D::ProcessGradient()
276 vector<NekDouble> grad = m_grad;
277 m_grad = vector<NekDouble>(5, 0.0);
310 m_grad[0] = d2[3] * grad[0] + d2[4] * grad[1] + d2[5] * grad[2];
311 m_grad[1] = d2[6] * grad[0] + d2[7] * grad[1] + d2[8] * grad[2];
313 m_grad[2] = grad[0] * d2[9] + grad[1] * d2[10] + grad[2] * d2[11] +
314 grad[3] * d2[3] * d2[3] + grad[6] * d2[4] * d2[4] +
315 grad[8] * d2[5] * d2[5] + 2.0 * grad[4] * d2[3] * d2[4] +
316 2.0 * grad[5] * d2[3] * d2[5] + 2.0 * grad[7] * d2[4] * d2[5];
318 m_grad[4] = grad[0] * d2[12] + grad[1] * d2[13] + grad[2] * d2[14] +
319 grad[3] * d2[6] * d2[6] + grad[6] * d2[7] * d2[7] +
320 grad[8] * d2[8] * d2[8] + 2.0 * grad[4] * d2[6] * d2[7] +
321 2.0 * grad[5] * d2[6] * d2[8] + 2.0 * grad[7] * d2[7] * d2[8];
323 m_grad[3] = grad[0] * d2[15] + grad[1] * d2[16] + grad[2] * d2[17] +
324 grad[3] * d2[3] * d2[6] + grad[6] * d2[4] * d2[7] +
325 grad[8] * d2[5] * d2[8] +
326 grad[4] * (d2[3] * d2[7] + d2[4] * d2[6]) +
327 grad[5] * (d2[3] * d2[8] + d2[5] * d2[6]) +
328 grad[7] * (d2[4] * d2[8] + d2[5] * d2[7]);
#define ASSERTL0(condition, msg)
NodeOptiFactory & GetNodeOptiFactory()
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.