XIAN-FEM-2026June/opticsfem-master/function/Gauss.cpp

394 lines
12 KiB
C++

#include "Gauss.h"
int Gauss::GetNbrGaussPoints(int dim, int type, int order)
{
//one-dimension
if (dim == ONEDIM)
{
//line
if (type == LINE)
{
_mNbrGaussPoints = order / 2 + 1;
if (_mNbrGaussPoints <= 0)
{
_mNbrGaussPoints = 1;
}
else if (_mNbrGaussPoints > 10)
{
_mNbrGaussPoints = 10;
}
}
else
{
_mNbrGaussPoints = 0;
}
}
//two-dimension
else if (dim == TWODIM)
{
//TRIANGLE
if (type == TRIANGLE)
{
if (order <= 1)
{
_mNbrGaussPoints = 1;
}
else if (order <= 2)
{
_mNbrGaussPoints = 4;
}
else if (order <= 4)
{
_mNbrGaussPoints = 7;
}
else if (order <= 6)
{
_mNbrGaussPoints = 12;
}
else
{
_mNbrGaussPoints = 16;
}
}
//QUADRANGLE
else if (type == QUADRANGLE)
{
if (order <= 1)
{
_mNbrGaussPoints = 1;
}
else if (order <= 2)
{
_mNbrGaussPoints = 4;
}
else
{
_mNbrGaussPoints = 7;
}
}
else
{
_mNbrGaussPoints = 0;
}
}
//three-dimension
else if (dim == THREEDIM)
{
//TETRAHEDRON
if (type == TETRAHEDRON)
{
if (order <= 1)
{
_mNbrGaussPoints = 1;
}
else if (order <= 2)
{
_mNbrGaussPoints = 5;
}
else
{
_mNbrGaussPoints = 15;
}
}
//PRISM
else if (type == PRISM)
{
if (order <= 2)
{
_mNbrGaussPoints = 6;
}
else
{
_mNbrGaussPoints = 9;
}
}
else
{
_mNbrGaussPoints = 0;
}
}
else
{
_mNbrGaussPoints = 0;
}
return _mNbrGaussPoints;
}
int Gauss::GetNbrGaussPoints()
{
return _mNbrGaussPoints;
}
void Gauss::GetGaussPoints(int dim, int type, double* u, double* v, double* w, double* wght)
{
//one-dimension
if (dim == ONEDIM)
{
//LINE
if (type == LINE)
{
Guass_Line(u, v, w, wght);
}
}
//two-dimension
else if (dim == TWODIM)
{
//TRIANGLE
if (type == TRIANGLE)
{
Gauss_Triangle(u, v, w, wght);
}
//QUADRANGLE
else if (type == QUADRANGLE)
{
Gauss_Quadrangle(u, v, w, wght);
}
}
//three-dimension
else if (dim == THREEDIM)
{
//TETRAHEDRON
if (type == TETRAHEDRON)
{
Gauss_Tetrahedron(u, v, w, wght);
}
//PRISM
else if (type == PRISM)
{
Gauss_Prism(u, v, w, wght);
}
}
}
void Gauss::Guass_Line(double* u, double* v, double* w, double* wght)
{
switch (_mNbrGaussPoints)
{
case 1:
u[0] = lx1[0]; v[0] = .0; w[0] = .0; wght[0] = lp1[0];
break;
case 2:
u[0] = lx2[0]; v[0] = .0; w[0] = .0; wght[0] = lp2[0];
u[1] = lx2[1]; v[1] = .0; w[1] = .0; wght[1] = lp2[1];
break;
case 3:
u[0] = lx3[0]; v[0] = .0; w[0] = .0; wght[0] = lp3[0];
u[1] = lx3[1]; v[1] = .0; w[1] = .0; wght[1] = lp3[1];
u[2] = lx3[2]; v[2] = .0; w[2] = .0; wght[2] = lp3[2];
break;
case 4:
u[0] = lx4[0]; v[0] = .0; w[0] = .0; wght[0] = lp4[0];
u[1] = lx4[1]; v[1] = .0; w[1] = .0; wght[1] = lp4[1];
u[2] = lx4[2]; v[2] = .0; w[2] = .0; wght[2] = lp4[2];
u[3] = lx4[3]; v[3] = .0; w[3] = .0; wght[3] = lp4[3];
break;
case 5:
u[0] = lx5[0]; v[0] = .0; w[0] = .0; wght[0] = lp5[0];
u[1] = lx5[1]; v[1] = .0; w[1] = .0; wght[1] = lp5[1];
u[2] = lx5[2]; v[2] = .0; w[2] = .0; wght[2] = lp5[2];
u[3] = lx5[3]; v[3] = .0; w[3] = .0; wght[3] = lp5[3];
u[4] = lx5[4]; v[4] = .0; w[4] = .0; wght[4] = lp5[4];
break;
case 6:
u[0] = lx6[0]; v[0] = .0; w[0] = .0; wght[0] = lp6[0];
u[1] = lx6[1]; v[1] = .0; w[1] = .0; wght[1] = lp6[1];
u[2] = lx6[2]; v[2] = .0; w[2] = .0; wght[2] = lp6[2];
u[3] = lx6[3]; v[3] = .0; w[3] = .0; wght[3] = lp6[3];
u[4] = lx6[4]; v[4] = .0; w[4] = .0; wght[4] = lp6[4];
u[5] = lx6[5]; v[5] = .0; w[5] = .0; wght[5] = lp6[5];
break;
case 7:
u[0] = lx7[0]; v[0] = .0; w[0] = .0; wght[0] = lp7[0];
u[1] = lx7[1]; v[1] = .0; w[1] = .0; wght[1] = lp7[1];
u[2] = lx7[2]; v[2] = .0; w[2] = .0; wght[2] = lp7[2];
u[3] = lx7[3]; v[3] = .0; w[3] = .0; wght[3] = lp7[3];
u[4] = lx7[4]; v[4] = .0; w[4] = .0; wght[4] = lp7[4];
u[5] = lx7[5]; v[5] = .0; w[5] = .0; wght[5] = lp7[5];
u[6] = lx7[6]; v[6] = .0; w[6] = .0; wght[6] = lp7[6];
break;
case 8:
u[0] = lx8[0]; v[0] = .0; w[0] = .0; wght[0] = lp8[0];
u[1] = lx8[1]; v[1] = .0; w[1] = .0; wght[1] = lp8[1];
u[2] = lx8[2]; v[2] = .0; w[2] = .0; wght[2] = lp8[2];
u[3] = lx8[3]; v[3] = .0; w[3] = .0; wght[3] = lp8[3];
u[4] = lx8[4]; v[4] = .0; w[4] = .0; wght[4] = lp8[4];
u[5] = lx8[5]; v[5] = .0; w[5] = .0; wght[5] = lp8[5];
u[6] = lx8[6]; v[6] = .0; w[6] = .0; wght[6] = lp8[6];
u[7] = lx8[7]; v[7] = .0; w[7] = .0; wght[7] = lp8[7];
break;
case 9:
u[0] = lx9[0]; v[0] = .0; w[0] = .0; wght[0] = lp9[0];
u[1] = lx9[1]; v[1] = .0; w[1] = .0; wght[1] = lp9[1];
u[2] = lx9[2]; v[2] = .0; w[2] = .0; wght[2] = lp9[2];
u[3] = lx9[3]; v[3] = .0; w[3] = .0; wght[3] = lp9[3];
u[4] = lx9[4]; v[4] = .0; w[4] = .0; wght[4] = lp9[4];
u[5] = lx9[5]; v[5] = .0; w[5] = .0; wght[5] = lp9[5];
u[6] = lx9[6]; v[6] = .0; w[6] = .0; wght[6] = lp9[6];
u[7] = lx9[7]; v[7] = .0; w[7] = .0; wght[7] = lp9[7];
u[8] = lx9[8]; v[8] = .0; w[8] = .0; wght[8] = lp9[8];
break;
case 10:
u[0] = lx10[0]; v[0] = .0; w[0] = .0; wght[0] = lp10[0];
u[1] = lx10[1]; v[1] = .0; w[1] = .0; wght[1] = lp10[1];
u[2] = lx10[2]; v[2] = .0; w[2] = .0; wght[2] = lp10[2];
u[3] = lx10[3]; v[3] = .0; w[3] = .0; wght[3] = lp10[3];
u[4] = lx10[4]; v[4] = .0; w[4] = .0; wght[4] = lp10[4];
u[5] = lx10[5]; v[5] = .0; w[5] = .0; wght[5] = lp10[5];
u[6] = lx10[6]; v[6] = .0; w[6] = .0; wght[6] = lp10[6];
u[7] = lx10[7]; v[7] = .0; w[7] = .0; wght[7] = lp10[7];
u[8] = lx10[8]; v[8] = .0; w[8] = .0; wght[8] = lp10[8];
u[9] = lx10[9]; v[9] = .0; w[9] = .0; wght[9] = lp10[9];
break;
default:
break;
}
}
void Gauss::Gauss_Triangle(double* u, double* v, double* w, double* wght)
{
switch (_mNbrGaussPoints) {
case 1:
u[0] = xt1[0]; v[0] = yt1[0]; w[0] = 0.; wght[0] = pt1[0];
break;
case 4:
u[0] = xt4[0]; v[0] = yt4[0]; w[0] = 0.; wght[0] = pt4[0];
u[1] = xt4[1]; v[1] = yt4[1]; w[1] = 0.; wght[1] = pt4[1];
u[2] = xt4[2]; v[2] = yt4[2]; w[2] = 0.; wght[2] = pt4[2];
u[3] = xt4[3]; v[3] = yt4[3]; w[3] = 0.; wght[3] = pt4[3];
break;
case 7:
u[0] = xt7[0]; v[0] = yt7[0]; w[0] = 0.; wght[0] = pt7[0];
u[1] = xt7[1]; v[1] = yt7[1]; w[1] = 0.; wght[1] = pt7[1];
u[2] = xt7[2]; v[2] = yt7[2]; w[2] = 0.; wght[2] = pt7[2];
u[3] = xt7[3]; v[3] = yt7[3]; w[3] = 0.; wght[3] = pt7[3];
u[4] = xt7[4]; v[4] = yt7[4]; w[4] = 0.; wght[4] = pt7[4];
u[5] = xt7[5]; v[5] = yt7[5]; w[5] = 0.; wght[5] = pt7[5];
u[6] = xt7[6]; v[6] = yt7[6]; w[6] = 0.; wght[6] = pt7[6];
break;
case 12:
u[0] = xt12[0]; v[0] = yt12[0]; w[0] = 0.; wght[0] = pt12[0];
u[1] = xt12[1]; v[1] = yt12[1]; w[1] = 0.; wght[1] = pt12[1];
u[2] = xt12[2]; v[2] = yt12[2]; w[2] = 0.; wght[2] = pt12[2];
u[3] = xt12[3]; v[3] = yt12[3]; w[3] = 0.; wght[3] = pt12[3];
u[4] = xt12[4]; v[4] = yt12[4]; w[4] = 0.; wght[4] = pt12[4];
u[5] = xt12[5]; v[5] = yt12[5]; w[5] = 0.; wght[5] = pt12[5];
u[6] = xt12[6]; v[6] = yt12[6]; w[6] = 0.; wght[6] = pt12[6];
u[7] = xt12[7]; v[7] = yt12[7]; w[7] = 0.; wght[7] = pt12[7];
u[8] = xt12[8]; v[8] = yt12[8]; w[8] = 0.; wght[8] = pt12[8];
u[9] = xt12[9]; v[9] = yt12[9]; w[9] = 0.; wght[9] = pt12[9];
u[10] = xt12[10]; v[10] = yt12[10]; w[10] = 0.; wght[10] = pt12[10];
u[11] = xt12[11]; v[11] = yt12[11]; w[11] = 0.; wght[11] = pt12[11];
break;
case 16:
u[0] = xt16[0]; v[0] = yt16[0]; w[0] = 0.; wght[0] = pt16[0];
u[1] = xt16[1]; v[1] = yt16[1]; w[1] = 0.; wght[1] = pt16[1];
u[2] = xt16[2]; v[2] = yt16[2]; w[2] = 0.; wght[2] = pt16[2];
u[3] = xt16[3]; v[3] = yt16[3]; w[3] = 0.; wght[3] = pt16[3];
u[4] = xt16[4]; v[4] = yt16[4]; w[4] = 0.; wght[4] = pt16[4];
u[5] = xt16[5]; v[5] = yt16[5]; w[5] = 0.; wght[5] = pt16[5];
u[6] = xt16[6]; v[6] = yt16[6]; w[6] = 0.; wght[6] = pt16[6];
u[7] = xt16[7]; v[7] = yt16[7]; w[7] = 0.; wght[7] = pt16[7];
u[8] = xt16[8]; v[8] = yt16[8]; w[8] = 0.; wght[8] = pt16[8];
u[9] = xt16[9]; v[9] = yt16[9]; w[9] = 0.; wght[9] = pt16[9];
u[10] = xt16[10]; v[10] = yt16[10]; w[10] = 0.; wght[10] = pt16[10];
u[11] = xt16[11]; v[11] = yt16[11]; w[11] = 0.; wght[11] = pt16[11];
u[12] = xt16[12]; v[12] = yt16[12]; w[12] = 0.; wght[12] = pt16[12];
u[13] = xt16[13]; v[13] = yt16[13]; w[13] = 0.; wght[13] = pt16[13];
u[14] = xt16[14]; v[14] = yt16[14]; w[14] = 0.; wght[14] = pt16[14];
u[15] = xt16[15]; v[15] = yt16[15]; w[15] = 0.; wght[15] = pt16[15];
break;
default:break;
}
}
void Gauss::Gauss_Quadrangle(double* u, double* v, double* w, double* wght)
{
switch (_mNbrGaussPoints)
{
case 1:
u[0] = xq1[0]; v[0] = yq1[0]; w[0] = 0.; wght[0] = pt1[0];
break;
case 4:
u[0] = xq4[0]; v[0] = yq4[0]; w[0] = 0.; wght[0] = pq4[0];
u[1] = xq4[1]; v[1] = yq4[1]; w[1] = 0.; wght[1] = pq4[1];
u[2] = xq4[2]; v[2] = yq4[2]; w[2] = 0.; wght[2] = pq4[2];
u[3] = xq4[3]; v[3] = yq4[3]; w[3] = 0.; wght[3] = pq4[3];
break;
case 7:
u[0] = xq7[0]; v[0] = yq7[0]; w[0] = 0.; wght[0] = pq7[0];
u[1] = xq7[1]; v[1] = yq7[1]; w[1] = 0.; wght[1] = pq7[1];
u[2] = xq7[2]; v[2] = yq7[2]; w[2] = 0.; wght[2] = pq7[2];
u[3] = xq7[3]; v[3] = yq7[3]; w[3] = 0.; wght[3] = pq7[3];
u[4] = xq7[4]; v[4] = yq7[4]; w[4] = 0.; wght[4] = pq7[4];
u[5] = xq7[5]; v[5] = yq7[5]; w[5] = 0.; wght[5] = pq7[5];
u[6] = xq7[6]; v[6] = yq7[6]; w[6] = 0.; wght[6] = pq7[6];
break;
default:
break;
}
}
void Gauss::Gauss_Tetrahedron(double* u, double* v, double* w, double* wght)
{
switch (_mNbrGaussPoints)
{
case 1:
u[0] = xtet1[0]; v[0] = ytet1[0]; w[0] = ztet1[0]; wght[0] = ptet1[0];
break;
case 5:
u[0] = xtet5[0]; v[0] = ytet5[0]; w[0] = ztet5[0]; wght[0] = ptet5[0];
u[1] = xtet5[1]; v[1] = ytet5[1]; w[1] = ztet5[1]; wght[1] = ptet5[1];
u[2] = xtet5[2]; v[2] = ytet5[2]; w[2] = ztet5[2]; wght[2] = ptet5[2];
u[3] = xtet5[3]; v[3] = ytet5[3]; w[3] = ztet5[3]; wght[3] = ptet5[3];
u[4] = xtet5[4]; v[4] = ytet5[4]; w[4] = ztet5[4]; wght[4] = ptet5[4];
break;
case 15:
u[0] = xtet15[0]; v[0] = ytet15[0]; w[0] = ztet15[0]; wght[0] = ptet15[0];
u[1] = xtet15[1]; v[1] = ytet15[1]; w[1] = ztet15[1]; wght[1] = ptet15[1];
u[2] = xtet15[2]; v[2] = ytet15[2]; w[2] = ztet15[2]; wght[2] = ptet15[2];
u[3] = xtet15[3]; v[3] = ytet15[3]; w[3] = ztet15[3]; wght[3] = ptet15[3];
u[4] = xtet15[4]; v[4] = ytet15[4]; w[4] = ztet15[4]; wght[4] = ptet15[4];
u[5] = xtet15[5]; v[5] = ytet15[5]; w[5] = ztet15[5]; wght[5] = ptet15[5];
u[6] = xtet15[6]; v[6] = ytet15[6]; w[6] = ztet15[6]; wght[6] = ptet15[6];
u[7] = xtet15[7]; v[7] = ytet15[7]; w[7] = ztet15[7]; wght[7] = ptet15[7];
u[8] = xtet15[8]; v[8] = ytet15[8]; w[8] = ztet15[8]; wght[8] = ptet15[8];
u[9] = xtet15[9]; v[9] = ytet15[9]; w[9] = ztet15[9]; wght[9] = ptet15[9];
u[10] = xtet15[10]; v[10] = ytet15[10]; w[10] = ztet15[10]; wght[10] = ptet15[10];
u[11] = xtet15[11]; v[11] = ytet15[11]; w[11] = ztet15[11]; wght[11] = ptet15[11];
u[12] = xtet15[12]; v[12] = ytet15[12]; w[12] = ztet15[12]; wght[12] = ptet15[12];
u[13] = xtet15[13]; v[13] = ytet15[13]; w[13] = ztet15[13]; wght[13] = ptet15[13];
u[14] = xtet15[14]; v[14] = ytet15[14]; w[14] = ztet15[14]; wght[14] = ptet15[14];
break;
default:
break;
}
}
void Gauss::Gauss_Prism(double* u, double* v, double* w, double* wght)
{
switch (_mNbrGaussPoints)
{
case 6:
u[0] = xpri6[0]; v[0] = ypri6[0]; w[0] = zpri6[0]; wght[0] = ppri6[0];
u[1] = xpri6[1]; v[1] = ypri6[1]; w[1] = zpri6[1]; wght[1] = ppri6[1];
u[2] = xpri6[2]; v[2] = ypri6[2]; w[2] = zpri6[2]; wght[2] = ppri6[2];
u[3] = xpri6[3]; v[3] = ypri6[3]; w[3] = zpri6[3]; wght[3] = ppri6[3];
u[4] = xpri6[4]; v[4] = ypri6[4]; w[4] = zpri6[4]; wght[4] = ppri6[4];
u[5] = xpri6[5]; v[5] = ypri6[5]; w[5] = zpri6[5]; wght[5] = ppri6[5];
break;
case 9:
u[0] = xpri9[0]; v[0] = ypri9[0]; w[0] = zpri9[0]; wght[0] = ppri9[0];
u[1] = xpri9[1]; v[1] = ypri9[1]; w[1] = zpri9[1]; wght[1] = ppri9[1];
u[2] = xpri9[2]; v[2] = ypri9[2]; w[2] = zpri9[2]; wght[2] = ppri9[2];
u[3] = xpri9[3]; v[3] = ypri9[3]; w[3] = zpri9[3]; wght[3] = ppri9[3];
u[4] = xpri9[4]; v[4] = ypri9[4]; w[4] = zpri9[4]; wght[4] = ppri9[4];
u[5] = xpri9[5]; v[5] = ypri9[5]; w[5] = zpri9[5]; wght[5] = ppri9[5];
u[6] = xpri9[6]; v[6] = ypri9[6]; w[6] = zpri9[6]; wght[6] = ppri9[6];
u[7] = xpri9[7]; v[7] = ypri9[7]; w[7] = zpri9[7]; wght[7] = ppri9[7];
u[8] = xpri9[8]; v[8] = ypri9[8]; w[8] = zpri9[8]; wght[8] = ppri9[8];
break;
default:
break;
}
}