XIAN-FEM-2026June/3D opticsfem-master/kernel/Nedelec3D_Util.cpp

69 lines
1.6 KiB
C++

#include "Nedelec3D_Util.h"
namespace Nedelec3D
{
void buildTetDofMap(Mesh_3D* mesh, int numTet, int elementOrder, int* map, int mapSize)
{
if (elementOrder != 2)
{
if (mapSize < 6)
return;
for (int i = 0; i < 6; i++)
map[i] = mesh->GetEdgeOfTet(numTet, i);
return;
}
if (mapSize < 20)
return;
const int nE = mesh->GetNbrEdge();
const int nF = mesh->GetNbrFace();
for (int i = 0; i < 6; i++)
{
const int e = mesh->GetEdgeOfTet(numTet, i);
map[i * 2] = e;
map[i * 2 + 1] = e + nE;
}
for (int i = 0; i < 4; i++)
{
const int f = mesh->GetFaceOfTet(numTet, i);
map[12 + i * 2] = 2 * nE + f;
map[12 + i * 2 + 1] = 2 * nE + f + nF;
}
}
void sbcFaceSecondOrderBfIndex(int numFace, int bfIndex[8])
{
static const int tbl[4][8] = {
{1, 3, 7, 2, 4, 8, 13, 14},
{1, 5, 9, 2, 6, 10, 15, 16},
{3, 5, 11, 4, 6, 12, 17, 18},
{7, 9, 11, 8, 10, 12, 19, 20}
};
const int fi = numFace - 1;
if (fi < 0 || fi > 3)
return;
for (int i = 0; i < 8; i++)
bfIndex[i] = tbl[fi][i];
}
void buildSbcSecondOrderDofMap(Mesh_3D* mesh, int numTet, int numFace, int mapIdx[8])
{
static const int edgeSlots[4][3] = { {0, 1, 3}, {0, 2, 4}, {1, 2, 5}, {3, 4, 5} };
const int nE = mesh->GetNbrEdge();
const int nF = mesh->GetNbrFace();
const int fi = numFace - 1;
if (fi < 0 || fi > 3)
return;
const int faceId = mesh->GetFaceOfTet(numTet, fi);
for (int j = 0; j < 3; j++)
{
const int e = mesh->GetEdgeOfTet(numTet, edgeSlots[fi][j]);
mapIdx[j] = e;
mapIdx[j + 3] = e + nE;
}
mapIdx[6] = 2 * nE + faceId;
mapIdx[7] = 2 * nE + faceId + nF;
}
}