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

187 lines
3.4 KiB
C++

#include"BF.h"
int BF::GetNbrBF(int dim, int GeoType, int BFType, int order)
{
_mDim = dim;
_mGeoType = GeoType;
_mBFType = BFType;
if (dim == ONEDIM)
{
if (GeoType == LINE)
{
if (order == BF_LINEFUNC)
_mNbrBF = 2;
else if (order == BF_QUADFUNC)
_mNbrBF = 3;
else
_mNbrBF = 0;
}
else
{
_mNbrBF = 0;
}
}
else if (dim == TWODIM)
{
if (GeoType == TRIANGLE)
{
if ((BFType >= BF_LAGRANGE) && (BFType <= BF_CURL_LAGRANGE))
{
order = Limit_Int(order, BF_MIMORDER, BF_MAXORDER);
_mNbrBF = (order + 1) * (order + 2) / 2;
}
else if ((BFType >= BF_NEDELEC) && (BFType <= BF_CURL_NEDELEC))
{
order = Limit_Int(order, BF_MIMORDER, BF_MAXORDER);
_mNbrBF = order * (order + 2);
}
else
{
_mNbrBF = 0;
}
}
else if (GeoType == QUADRANGLE)
{
if ((BFType >= BF_LAGRANGE) && (BFType <= BF_CURL_LAGRANGE))
{
_mNbrBF = 0;
//order = LimitInt(order, BF_MIMORDER, BF_MAXORDER);
}
else if ((BFType >= BF_NEDELEC) && (BFType <= BF_CURL_NEDELEC))
{
_mNbrBF = 0;
//order = LimitInt(order, BF_MIMORDER, BF_MAXORDER);
}
else
{
_mNbrBF = 0;
}
}
else
{
_mNbrBF = 0;
}
}
else if (dim == THREEDIM)
{
if (GeoType == TETRAHEDRON)
{
if ((BFType >= BF_NEDELEC) && (BFType <= BF_CURL_NEDELEC))
{
order = Limit_Int(order, BF_MIMORDER, BF_MAXORDER);
_mNbrBF = order * (order + 2) * (order + 3) / 2;
}
else
{
_mNbrBF = 0;
}
}
else if (GeoType == PRISM)
{
if ((BFType >= BF_NEDELEC) && (BFType <= BF_CURL_NEDELEC))
{
order = Limit_Int(order, BF_MIMORDER, BF_MAXORDER);
_mNbrBF = 3 * order * (order + 1) * (order + 2) / 2;
}
else
{
_mNbrBF = 0;
}
}
else
{
_mNbrBF = 0;
}
}
else
{
_mNbrBF = 0;
}
_mOrder = order;
return _mNbrBF;
}
int BF::GetNbrBF()
{
return _mNbrBF;
}
void BF::GetValueBF(int numBF, double u, double v, double w, Eigen::Vector3d& o)
{
if (_mDim == ONEDIM)
{
if (_mGeoType == LINE)
{
if (_mBFType == BF_LAGRANGE)
{
BF_Line_Lagrange(_mOrder, numBF, u, v, w, o);
}
else if (_mBFType == BF_GRAD_LAGRANGE)
{
BF_Line_Grad_Lagrange(_mOrder, numBF, u, v, w, o);
}
else if (_mBFType == BF_CURL_LAGRANGE)
{
BF_Line_Curl_Lagrange(_mOrder, numBF, u, v, w, o);
}
}
}
else if (_mDim == TWODIM)
{
if (_mGeoType == TRIANGLE)
{
if (_mBFType == BF_LAGRANGE)
{
BF_Triangle_Lagrange(_mOrder, numBF, u, v, w, o);
}
else if (_mBFType == BF_GRAD_LAGRANGE)
{
BF_Triangle_Grad_Lagrange(_mOrder, numBF, u, v, w, o);
}
else if (_mBFType == BF_CURL_LAGRANGE)
{
BF_Triangle_Curl_Lagrange(_mOrder, numBF, u, v, w, o);
}
else if (_mBFType == BF_NEDELEC)
{
BF_Triangle_Nedelec(_mOrder, numBF, u, v, w, o);
}
else if (_mBFType == BF_CURL_NEDELEC)
{
BF_Triangle_Curl_Nedelec(_mOrder, numBF, u, v, w, o);
}
}
else if (_mGeoType == QUADRANGLE)
{
}
}
else if (_mDim == THREEDIM)
{
if (_mGeoType == TETRAHEDRON)
{
if (_mBFType == BF_NEDELEC)
{
BF_Tetrahedron_Nedelec(_mOrder, numBF, u, v, w, o);
}
else if (_mBFType == BF_CURL_NEDELEC)
{
BF_Tetrahedron_Curl_Nedelec(_mOrder, numBF, u, v, w, o);
}
}
else if (_mGeoType == PRISM)
{
if (_mBFType == BF_NEDELEC)
{
BF_Prism_Nedelec(_mOrder, numBF, u, v, w, o);
}
else if (_mBFType == BF_CURL_NEDELEC)
{
BF_Prism_Curl_Nedelec(_mOrder, numBF, u, v, w, o);
}
}
}
}