XIAN-FEM-2026June/3D opticsfem-master/function/BF_Tetrahedron.cpp

109 lines
5.0 KiB
C++

#include"BF.h"
static void BF_Tetrahedron_Nedelec_Order2(int numBF, double u, double v, double w, Eigen::Vector3d& o)
{
switch (numBF)
{
case 1: o(0) = v - 3 * u * v; o(1) = -u + 3 * u * u; o(2) = 0.; break;
case 2: o(0) = v - 3 * v * v; o(1) = -u + 3 * u * v; o(2) = 0.; break;
case 3: o(0) = w - 3 * u * w; o(1) = 0.; o(2) = -u + 3 * u * u; break;
case 4: o(0) = w - 3 * w * w; o(1) = 0.; o(2) = -u + 3 * u * w; break;
case 5: o(0) = 1 - 3 * u - v + 3 * u * v - w + 3 * u * w; o(1) = u - 3 * u * u; o(2) = u - 3 * u * u; break;
case 6: o(0) = -2 + 3 * u + 5 * v - 3 * u * v - 3 * v * v + 5 * w - 3 * u * w - 6 * v * w - 3 * w * w; o(1) = -2 * u + 3 * u * u + 3 * u * v + 3 * u * w; o(2) = -2 * u + 3 * u * u + 3 * u * v + 3 * u * w; break;
case 7: o(0) = 0.; o(1) = w - 3 * v * w; o(2) = -v + 3 * v * v; break;
case 8: o(0) = 0.; o(1) = w - 3 * w * w; o(2) = -v + 3 * v * w; break;
case 9: o(0) = v - 3 * v * v; o(1) = 1 - u - 3 * v + 3 * u * v - w + 3 * v * w; o(2) = v - 3 * v * v; break;
case 10: o(0) = -2 * v + 3 * u * v + 3 * v * v + 3 * v * w; o(1) = -2 + 5 * u - 3 * u * u + 3 * v - 3 * u * v + 5 * w - 6 * u * w - 3 * v * w - 3 * w * w; o(2) = -2 * v + 3 * u * v + 3 * v * v + 3 * v * w; break;
case 11: o(0) = w - 3 * w * w; o(1) = w - 3 * w * w; o(2) = 1 - u - v - 3 * w + 3 * u * w + 3 * v * w; break;
case 12: o(0) = -2 * w + 3 * u * w + 3 * v * w + 3 * w * w; o(1) = -2 * w + 3 * u * w + 3 * v * w + 3 * w * w; o(2) = -2 + 5 * u - 3 * u * u + 5 * v - 6 * u * v - 3 * v * v + 3 * w - 3 * u * w - 3 * v * w; break;
case 13: o(0) = -3 * v * w; o(1) = 3 * u * w; o(2) = 0.; break;
case 14: o(0) = -3 * v * w; o(1) = 0.; o(2) = 3 * u * v; break;
case 15: o(0) = -3 * v + 3 * u * v + 3 * v * v + 3 * v * w; o(1) = 3 * u - 3 * u * u - 3 * u * v - 3 * u * w; o(2) = 0.; break;
case 16: o(0) = -3 * v + 3 * v * v + 3 * v * w; o(1) = -3 * u * v; o(2) = -3 * u * v; break;
case 17: o(0) = -3 * w + 3 * u * w + 3 * v * w + 3 * w * w; o(1) = 0.; o(2) = 3 * u - 3 * u * u - 3 * u * v - 3 * u * w; break;
case 18: o(0) = -3 * w + 3 * v * w + 3 * w * w; o(1) = -3 * u * w; o(2) = -3 * u * w; break;
case 19: o(0) = 0.; o(1) = -3 * w + 3 * u * w + 3 * v * w + 3 * w * w; o(2) = 3 * v - 3 * u * v - 3 * v * v - 3 * v * w; break;
case 20: o(0) = -3 * v * w; o(1) = -3 * w + 3 * u * w + 3 * w * w; o(2) = -3 * v * w; break;
default: o.setZero(); break;
}
}
static void BF_Tetrahedron_Curl_Nedelec_Order2(int numBF, double u, double v, double w, Eigen::Vector3d& o)
{
(void)u; (void)v; (void)w;
switch (numBF)
{
case 1: o(0) = 0.; o(1) = 0.; o(2) = -2 + 9 * u; break;
case 2: o(0) = 0.; o(1) = 0.; o(2) = -2 + 9 * v; break;
case 3: o(0) = 0.; o(1) = 2 - 9 * u; o(2) = 0.; break;
case 4: o(0) = 0.; o(1) = 2 - 9 * w; o(2) = 0.; break;
case 5: o(0) = 0.; o(1) = -2 + 9 * u; o(2) = 2 - 9 * u; break;
case 6: o(0) = 0.; o(1) = 7 - 9 * u - 9 * v - 9 * w; o(2) = -7 + 9 * u + 9 * v + 9 * w; break;
case 7: o(0) = -2 + 9 * v; o(1) = 0.; o(2) = 0.; break;
case 8: o(0) = -2 + 9 * w; o(1) = 0.; o(2) = 0.; break;
case 9: o(0) = 2 - 9 * v; o(1) = 0.; o(2) = -2 + 9 * v; break;
case 10: o(0) = -7 + 9 * u + 9 * v + 9 * w; o(1) = 0.; o(2) = 7 - 9 * u - 9 * v - 9 * w; break;
case 11: o(0) = -2 + 9 * w; o(1) = 2 - 9 * w; o(2) = 0.; break;
case 12: o(0) = 7 - 9 * u - 9 * v - 9 * w; o(1) = -7 + 9 * u + 9 * v + 9 * w; o(2) = 0.; break;
case 13: o(0) = -3 * u; o(1) = -3 * v; o(2) = 6 * w; break;
case 14: o(0) = 3 * u; o(1) = -6 * v; o(2) = 3 * w; break;
case 15: o(0) = 3 * u; o(1) = 3 * v; o(2) = 6 - 9 * u - 9 * v - 6 * w; break;
case 16: o(0) = -3 * u; o(1) = 6 * v; o(2) = 3 - 9 * v - 3 * w; break;
case 17: o(0) = -3 * u; o(1) = -6 + 9 * u + 6 * v + 9 * w; o(2) = -3 * w; break;
case 18: o(0) = 3 * u; o(1) = -3 + 3 * v + 9 * w; o(2) = -6 * w; break;
case 19: o(0) = 6 - 6 * u - 9 * v - 9 * w; o(1) = 3 * v; o(2) = 3 * w; break;
case 20: o(0) = 3 - 3 * u - 9 * w; o(1) = -3 * v; o(2) = 6 * w; break;
default: o.setZero(); break;
}
}
void BF_Tetrahedron_Nedelec(BF_INPUT)
{
switch (order)
{
case 1:
switch (numBF)
{
case 1: o(0) = -v; o(1) = u; o(2) = 0.; break;
case 2: o(0) = -w; o(1) = 0.; o(2) = u; break;
case 3: o(0) = -1 + v + w; o(1) = -u; o(2) = -u; break;
case 4: o(0) = 0.; o(1) = -w; o(2) = v; break;
case 5: o(0) = -v; o(1) = -1 + u + w; o(2) = -v; break;
case 6: o(0) = -w; o(1) = -w; o(2) = -1 + u + v; break;
default: o.setZero(); break;
}
break;
case 2:
BF_Tetrahedron_Nedelec_Order2(numBF, u, v, w, o);
break;
default:
o.setZero();
break;
}
}
void BF_Tetrahedron_Curl_Nedelec(BF_INPUT)
{
switch (order)
{
case 1:
switch (numBF)
{
case 1: o(0) = 0.; o(1) = 0.; o(2) = 2.; break;
case 2: o(0) = 0.; o(1) = -2.; o(2) = 0.; break;
case 3: o(0) = 0.; o(1) = 2.; o(2) = -2.; break;
case 4: o(0) = 2.; o(1) = 0.; o(2) = 0.; break;
case 5: o(0) = -2.; o(1) = 0.; o(2) = 2.; break;
case 6: o(0) = 2.; o(1) = -2.; o(2) = 0.; break;
default: o.setZero(); break;
}
break;
case 2:
BF_Tetrahedron_Curl_Nedelec_Order2(numBF, u, v, w, o);
break;
default:
o.setZero();
break;
}
}