35 #include <boost/multi_array.hpp> 57 void NodeOpti::CalcMinJac()
59 m_minJac = numeric_limits<double>::max();
60 for (
auto &typeIt : m_data)
62 for (
int i = 0; i < typeIt.second.size(); i++)
64 m_minJac = min(m_minJac, typeIt.second[i]->GetMinJac());
70 22, NodeOpti2D2D::create,
"2D2D");
72 void NodeOpti2D2D::Optimise()
75 NekDouble currentW = GetFunctional<2>(minJacNew);
79 if (m_grad[0] * m_grad[0] + m_grad[1] * m_grad[1] > gradTol())
85 vector<NekDouble> sk(2);
94 m_grad[2] += 1e-6 - val;
95 m_grad[4] += 1e-6 - val;
98 sk[0] = -1.0 / (m_grad[2] * m_grad[4] - m_grad[3] * m_grad[3]) *
99 (m_grad[4] * m_grad[0] - m_grad[3] * m_grad[1]);
100 sk[1] = -1.0 / (m_grad[2] * m_grad[4] - m_grad[3] * m_grad[3]) *
101 (m_grad[2] * m_grad[1] - m_grad[3] * m_grad[0]);
104 NekDouble pg = (m_grad[0] * sk[0] + m_grad[1] * sk[1]);
108 while (alpha > alphaTol())
111 m_node->m_x = xc + alpha * sk[0];
112 m_node->m_y = yc + alpha * sk[1];
114 newVal = GetFunctional<2>(minJacNew,
false);
117 if (newVal <= currentW + c1() * (alpha * pg))
138 m_minJac = minJacNew;
149 m_res->val = max(sqrt((m_node->m_x - xc) * (m_node->m_x - xc) +
150 (m_node->m_y - yc) * (m_node->m_y - yc)),
156 m_res->func += newVal;
161 33, NodeOpti3D3D::create,
"3D3D");
163 void NodeOpti3D3D::Optimise()
166 NekDouble currentW = GetFunctional<3>(minJacNew);
169 if (m_grad[0] * m_grad[0] + m_grad[1] * m_grad[1] + m_grad[2] * m_grad[2] >
177 vector<NekDouble> sk(3);
186 m_grad[3] += 1e-6 - val;
187 m_grad[6] += 1e-6 - val;
188 m_grad[8] += 1e-6 - val;
193 m_grad[3] * (m_grad[6] * m_grad[8] - m_grad[7] * m_grad[7]) -
194 m_grad[4] * (m_grad[4] * m_grad[8] - m_grad[5] * m_grad[7]) +
195 m_grad[5] * (m_grad[4] * m_grad[7] - m_grad[5] * m_grad[6]);
197 sk[0] = m_grad[0] * (m_grad[6] * m_grad[8] - m_grad[7] * m_grad[7]) +
198 m_grad[1] * (m_grad[5] * m_grad[7] - m_grad[4] * m_grad[8]) +
199 m_grad[2] * (m_grad[4] * m_grad[7] - m_grad[3] * m_grad[7]);
200 sk[1] = m_grad[0] * (m_grad[7] * m_grad[5] - m_grad[4] * m_grad[5]) +
201 m_grad[1] * (m_grad[3] * m_grad[8] - m_grad[5] * m_grad[5]) +
202 m_grad[2] * (m_grad[4] * m_grad[5] - m_grad[3] * m_grad[7]);
203 sk[2] = m_grad[0] * (m_grad[4] * m_grad[7] - m_grad[6] * m_grad[5]) +
204 m_grad[1] * (m_grad[4] * m_grad[5] - m_grad[3] * m_grad[7]) +
205 m_grad[2] * (m_grad[3] * m_grad[6] - m_grad[4] * m_grad[4]);
214 (m_grad[0] * sk[0] + m_grad[1] * sk[1] + m_grad[2] * sk[2]);
219 while (alpha > alphaTol())
222 m_node->m_x = xc + alpha * sk[0];
223 m_node->m_y = yc + alpha * sk[1];
224 m_node->m_z = zc + alpha * sk[2];
226 newVal = GetFunctional<3>(minJacNew,
false);
231 if (newVal <= currentW + c1() * alpha * pg)
252 m_minJac = minJacNew;
263 m_res->val = max(sqrt((m_node->m_x - xc) * (m_node->m_x - xc) +
264 (m_node->m_y - yc) * (m_node->m_y - yc) +
265 (m_node->m_z - zc) * (m_node->m_z - zc)),
270 m_res->func += newVal;
NodeOptiFactory & GetNodeOptiFactory()
tKey RegisterCreatorFunction(tKey idKey, CreatorFunction classCreator, std::string pDesc="")
Register a class with the factory.
Provides a generic Factory class.