397 lines
11 KiB
C++
397 lines
11 KiB
C++
#include"Post_Base.h"
|
|
#include"../function/BF.h"
|
|
|
|
#include <fstream>
|
|
#include <iostream>
|
|
#include <iomanip>
|
|
#include <string>
|
|
|
|
void Post_2D_EigenMode::GetElectric()
|
|
{
|
|
int nbrVertex = _mMesh->GetNbrVertex();
|
|
int nbrEdge = _mMesh->GetNbrEdge();
|
|
int nbrMode = _mSolver->GetNbrMode();
|
|
|
|
_mEx = Eigen::MatrixXcd::Zero(nbrVertex, nbrMode);
|
|
_mEy = Eigen::MatrixXcd::Zero(nbrVertex, nbrMode);
|
|
_mEz = Eigen::MatrixXcd::Zero(nbrVertex, nbrMode);
|
|
_mNormE = Eigen::MatrixXd::Zero(nbrVertex, nbrMode);
|
|
|
|
//calculate Ez
|
|
_mEz = _mX->block(0, 0, nbrVertex, nbrMode);
|
|
Eigen::MatrixXcd Xt= _mX->block(nbrVertex, 0, nbrEdge, nbrMode);
|
|
|
|
//calculate Ex Ey
|
|
Eigen::MatrixXd numEt=Eigen::MatrixXd::Zero(nbrVertex, nbrMode);
|
|
//reference vertex
|
|
int NbrGuassPoints = 3;
|
|
double* u, * v, * w;
|
|
u = new double[NbrGuassPoints];
|
|
v = new double[NbrGuassPoints];
|
|
w = new double[NbrGuassPoints];
|
|
u[0] = 0.; u[1] = 1.; u[2] = 0.;
|
|
v[0] = 0.; v[1] = 0.; v[2] = 1.;
|
|
w[0] = 0.; w[1] = 0.; w[2] = 0.;
|
|
//init of geo
|
|
Eigen::Vector3d* vertex = new Eigen::Vector3d[3];
|
|
Eigen::Matrix3d Jac, InvJac;
|
|
//init of basis function
|
|
BF BF_Nedelec;
|
|
Eigen::Vector3d** Et;
|
|
int vdof=BF_Nedelec.GetNbrBF(TWODIM, TRIANGLE, BF_NEDELEC, BF_LINEFUNC);
|
|
Et = new Eigen::Vector3d * [NbrGuassPoints];
|
|
for (int i = 0; i < NbrGuassPoints; i++)
|
|
Et[i] = new Eigen::Vector3d[vdof];
|
|
//loop over nbrMode
|
|
for (int numMode = 0; numMode < nbrMode; numMode++)
|
|
{
|
|
//loop over tri
|
|
int NbrTri = _mMesh->GetNbrTri();
|
|
for (int n = 0; n < NbrTri; n++)
|
|
{
|
|
//vertex inde
|
|
int Mapping[3];
|
|
for (int i = 0; i < 3; i++)
|
|
Mapping[i] = _mMesh->GetTri(n, i);
|
|
|
|
//coordinate of vertex
|
|
for (int i = 0; i < 3; i++)
|
|
_mMesh->GetVertex(Mapping[i], vertex[i]);
|
|
|
|
//Jac
|
|
Jac(0, 0) = vertex[1](0) - vertex[0](0); Jac(0, 1) = vertex[1](1) - vertex[0](1); Jac(0, 2) = 0.;
|
|
Jac(1, 0) = vertex[2](0) - vertex[0](0); Jac(1, 1) = vertex[2](1) - vertex[0](1); Jac(1, 2) = 0.;
|
|
Jac(2, 0) = 0.; Jac(2, 1) = 0.; Jac(2, 2) = 1.;
|
|
InvJac = Jac.inverse();
|
|
|
|
//basis function
|
|
for (int i = 0; i < NbrGuassPoints; i++)
|
|
{
|
|
for (int j = 0; j < vdof; j++)
|
|
{
|
|
BF_Nedelec.GetValueBF(j + 1, u[i], v[i], w[i], Et[i][j]);
|
|
Et[i][j] = InvJac * Et[i][j];
|
|
}
|
|
}
|
|
|
|
//mapping
|
|
Eigen::VectorXi MappingIndexV = Eigen::VectorXi::Zero(vdof);
|
|
for (int i = 0; i < vdof; i++)
|
|
MappingIndexV(i) = _mMesh->GetEdgeOfTri(n, i);
|
|
|
|
//electric value
|
|
for (int i = 0; i < 3; i++)//nbrVertex
|
|
{
|
|
numEt(Mapping[i], numMode) = numEt(Mapping[i], numMode) + 1.;
|
|
for (int j = 0; j < vdof; j++)
|
|
{
|
|
_mEx(Mapping[i], numMode) = _mEx(Mapping[i], numMode) + Et[i][j][0] * Xt(MappingIndexV(j), numMode);
|
|
_mEy(Mapping[i], numMode) = _mEy(Mapping[i], numMode) + Et[i][j][1] * Xt(MappingIndexV(j), numMode);
|
|
}
|
|
}
|
|
|
|
}//end loop over tri
|
|
|
|
for (int i = 0; i < nbrVertex; i++)
|
|
{
|
|
_mEx(i, numMode) = _mEx(i, numMode) / numEt(i, numMode);
|
|
_mEy(i, numMode) = _mEy(i, numMode) / numEt(i, numMode);
|
|
}
|
|
}//end loop over nbrMode
|
|
|
|
for(int i=0;i< nbrVertex;i++)
|
|
for (int j = 0; j < nbrMode; j++)
|
|
{
|
|
_mNormE(i, j) = sqrt(abs(_mEx(i, j) * _mEx(i, j)) + abs(_mEy(i, j) * _mEy(i, j)) + abs(_mEz(i, j) * _mEz(i, j)));
|
|
}
|
|
|
|
delete[] u, v, w, vertex;
|
|
for (int i = 0; i < NbrGuassPoints; i++)
|
|
{
|
|
delete[] Et[i];
|
|
}
|
|
delete[] Et;
|
|
}
|
|
|
|
void Post_2D_EigenFreq::GetElectric()
|
|
{
|
|
int nbrVertex = _mMesh->GetNbrVertex();
|
|
int nbrEdge = _mMesh->GetNbrEdge();
|
|
int nbrMode = _mSolver->GetNbrMode();
|
|
|
|
_mEx = Eigen::MatrixXcd::Zero(nbrVertex, nbrMode);
|
|
_mEy = Eigen::MatrixXcd::Zero(nbrVertex, nbrMode);
|
|
_mEz = Eigen::MatrixXcd::Zero(nbrVertex, nbrMode);
|
|
_mNormE = Eigen::MatrixXd::Zero(nbrVertex, nbrMode);
|
|
|
|
//calculate Ez
|
|
_mEz = _mX->block(0, 0, nbrVertex, nbrMode);
|
|
Eigen::MatrixXcd Xt = _mX->block(nbrVertex, 0, nbrEdge, nbrMode);
|
|
|
|
//calculate Ex Ey
|
|
Eigen::MatrixXd numEt=Eigen::MatrixXd::Zero(nbrVertex, nbrMode);
|
|
//reference vertex
|
|
int NbrGuassPoints = 3;
|
|
double* u, * v, * w;
|
|
u = new double[NbrGuassPoints];
|
|
v = new double[NbrGuassPoints];
|
|
w = new double[NbrGuassPoints];
|
|
u[0] = 0.; u[1] = 1.; u[2] = 0.;
|
|
v[0] = 0.; v[1] = 0.; v[2] = 1.;
|
|
w[0] = 0.; w[1] = 0.; w[2] = 0.;
|
|
//init of geo
|
|
Eigen::Vector3d* vertex = new Eigen::Vector3d[3];
|
|
Eigen::Matrix3d Jac, InvJac;
|
|
//init of basis function
|
|
BF BF_Nedelec;
|
|
Eigen::Vector3d** Et;
|
|
int vdof = BF_Nedelec.GetNbrBF(TWODIM, TRIANGLE, BF_NEDELEC, BF_LINEFUNC);
|
|
Et = new Eigen::Vector3d * [NbrGuassPoints];
|
|
for (int i = 0; i < NbrGuassPoints; i++)
|
|
Et[i] = new Eigen::Vector3d[vdof];
|
|
//loop over nbrMode
|
|
for (int numMode = 0; numMode < nbrMode; numMode++)
|
|
{
|
|
//loop over tri
|
|
int NbrTri = _mMesh->GetNbrTri();
|
|
for (int n = 0; n < NbrTri; n++)
|
|
{
|
|
//vertex inde
|
|
int Mapping[3];
|
|
for (int i = 0; i < 3; i++)
|
|
Mapping[i] = _mMesh->GetTri(n, i);
|
|
|
|
//coordinate of vertex
|
|
for (int i = 0; i < 3; i++)
|
|
_mMesh->GetVertex(Mapping[i], vertex[i]);
|
|
|
|
//Jac
|
|
Jac(0, 0) = vertex[1](0) - vertex[0](0); Jac(0, 1) = vertex[1](1) - vertex[0](1); Jac(0, 2) = 0.;
|
|
Jac(1, 0) = vertex[2](0) - vertex[0](0); Jac(1, 1) = vertex[2](1) - vertex[0](1); Jac(1, 2) = 0.;
|
|
Jac(2, 0) = 0.; Jac(2, 1) = 0.; Jac(2, 2) = 1.;
|
|
InvJac = Jac.inverse();
|
|
|
|
//basis function
|
|
for (int i = 0; i < NbrGuassPoints; i++)
|
|
{
|
|
for (int j = 0; j < vdof; j++)
|
|
{
|
|
BF_Nedelec.GetValueBF(j + 1, u[i], v[i], w[i], Et[i][j]);
|
|
Et[i][j] = InvJac * Et[i][j];
|
|
}
|
|
}
|
|
|
|
//mapping
|
|
Eigen::VectorXi MappingIndexV = Eigen::VectorXi::Zero(vdof);
|
|
for (int i = 0; i < vdof; i++)
|
|
MappingIndexV(i) = _mMesh->GetEdgeOfTri(n, i);
|
|
|
|
//electric value
|
|
for (int i = 0; i < 3; i++)//nbrVertex
|
|
{
|
|
numEt(Mapping[i], numMode) = numEt(Mapping[i], numMode) + 1.;
|
|
for (int j = 0; j < vdof; j++)
|
|
{
|
|
_mEx(Mapping[i], numMode) = _mEx(Mapping[i], numMode) + Et[i][j][0] * Xt(MappingIndexV(j), numMode);
|
|
_mEy(Mapping[i], numMode) = _mEy(Mapping[i], numMode) + Et[i][j][1] * Xt(MappingIndexV(j), numMode);
|
|
}
|
|
}
|
|
}//end loop over tri
|
|
|
|
for (int i = 0; i < nbrVertex; i++)
|
|
{
|
|
_mEx(i, numMode) = _mEx(i, numMode) / numEt(i, numMode);
|
|
_mEy(i, numMode) = _mEy(i, numMode) / numEt(i, numMode);
|
|
}
|
|
}//end loop over nbrMode
|
|
|
|
for (int i = 0; i < nbrVertex; i++)
|
|
for (int j = 0; j < nbrMode; j++)
|
|
{
|
|
_mNormE(i, j) = sqrt(abs(_mEx(i, j) * _mEx(i, j)) + abs(_mEy(i, j) * _mEy(i, j)) + abs(_mEz(i, j) * _mEz(i, j)));
|
|
}
|
|
|
|
delete[] u, v, w, vertex;
|
|
for (int i = 0; i < NbrGuassPoints; i++)
|
|
{
|
|
delete[] Et[i];
|
|
}
|
|
delete[] Et;
|
|
}
|
|
|
|
void Post_2D_Scatter::GetElectric()
|
|
{
|
|
int nbrVertex = _mMesh->GetNbrVertex();
|
|
int nbrEdge = _mMesh->GetNbrEdge();
|
|
|
|
_mEx = Eigen::VectorXcd::Zero(nbrVertex);
|
|
_mEy = Eigen::VectorXcd::Zero(nbrVertex);
|
|
_mEz = Eigen::VectorXcd::Zero(nbrVertex);
|
|
_mNormE = Eigen::VectorXd::Zero(nbrVertex);
|
|
//calculate Ez
|
|
_mEz = _mX->block(0, 0, nbrVertex, 1);
|
|
Eigen::VectorXcd Xt = _mX->block(nbrVertex, 0, nbrEdge, 1);
|
|
//calculate Ex Ey
|
|
Eigen::VectorXd numEt=Eigen::VectorXd::Zero(nbrVertex);
|
|
//reference vertex
|
|
int NbrGuassPoints = 3;
|
|
double* u, * v, * w;
|
|
u = new double[NbrGuassPoints];
|
|
v = new double[NbrGuassPoints];
|
|
w = new double[NbrGuassPoints];
|
|
u[0] = 0.; u[1] = 1.; u[2] = 0.;
|
|
v[0] = 0.; v[1] = 0.; v[2] = 1.;
|
|
w[0] = 0.; w[1] = 0.; w[2] = 0.;
|
|
//init of geo
|
|
Eigen::Vector3d* vertex = new Eigen::Vector3d[3];
|
|
Eigen::Matrix3d Jac, InvJac;
|
|
//init of basis function
|
|
BF BF_Nedelec;
|
|
Eigen::Vector3d** Et;
|
|
int vdof = BF_Nedelec.GetNbrBF(TWODIM, TRIANGLE, BF_NEDELEC, BF_LINEFUNC);
|
|
Et = new Eigen::Vector3d * [NbrGuassPoints];
|
|
for (int i = 0; i < NbrGuassPoints; i++)
|
|
Et[i] = new Eigen::Vector3d[vdof];
|
|
//loop over tri
|
|
int NbrTri = _mMesh->GetNbrTri();
|
|
for (int n = 0; n < NbrTri; n++)
|
|
{
|
|
//vertex inde
|
|
int Mapping[3];
|
|
for (int i = 0; i < 3; i++)
|
|
Mapping[i] = _mMesh->GetTri(n, i);
|
|
|
|
//coordinate of vertex
|
|
for (int i = 0; i < 3; i++)
|
|
_mMesh->GetVertex(Mapping[i], vertex[i]);
|
|
|
|
//Jac
|
|
Jac(0, 0) = vertex[1](0) - vertex[0](0); Jac(0, 1) = vertex[1](1) - vertex[0](1); Jac(0, 2) = 0.;
|
|
Jac(1, 0) = vertex[2](0) - vertex[0](0); Jac(1, 1) = vertex[2](1) - vertex[0](1); Jac(1, 2) = 0.;
|
|
Jac(2, 0) = 0.; Jac(2, 1) = 0.; Jac(2, 2) = 1.;
|
|
InvJac = Jac.inverse();
|
|
|
|
//basis function
|
|
for (int i = 0; i < NbrGuassPoints; i++)
|
|
{
|
|
for (int j = 0; j < vdof; j++)
|
|
{
|
|
BF_Nedelec.GetValueBF(j + 1, u[i], v[i], w[i], Et[i][j]);
|
|
Et[i][j] = InvJac * Et[i][j];
|
|
}
|
|
}
|
|
|
|
//mapping
|
|
Eigen::VectorXi MappingIndexV = Eigen::VectorXi::Zero(vdof);
|
|
for (int i = 0; i < vdof; i++)
|
|
MappingIndexV(i) = _mMesh->GetEdgeOfTri(n, i);
|
|
|
|
//electric value
|
|
for (int i = 0; i < 3; i++)//nbrVertex
|
|
{
|
|
numEt(Mapping[i]) = numEt(Mapping[i]) + 1.;
|
|
for (int j = 0; j < vdof; j++)
|
|
{
|
|
_mEx(Mapping[i]) = _mEx(Mapping[i]) + Et[i][j][0] * Xt(MappingIndexV(j));
|
|
_mEy(Mapping[i]) = _mEy(Mapping[i]) + Et[i][j][1] * Xt(MappingIndexV(j));
|
|
}
|
|
}
|
|
|
|
}//end loop over tri
|
|
|
|
for (int i = 0; i < nbrVertex; i++)
|
|
{
|
|
_mEx(i) = _mEx(i) / numEt(i);
|
|
_mEy(i) = _mEy(i) / numEt(i);
|
|
}
|
|
|
|
if (_mPhy->GetNbrBELE() > 0)
|
|
{
|
|
GetEb();
|
|
for (int i = 0; i < nbrVertex; i++)
|
|
{
|
|
_mEx(i) = _mEx(i) + _mEbx(i);
|
|
_mEy(i) = _mEy(i) + _mEby(i);
|
|
_mEz(i) = _mEz(i) + _mEbz(i);
|
|
|
|
}
|
|
}
|
|
|
|
for (int i = 0; i < nbrVertex; i++)
|
|
_mNormE(i) = sqrt(abs(_mEx(i) * _mEx(i)) + abs(_mEy(i) * _mEy(i)) + abs(_mEz(i) * _mEz(i)));
|
|
|
|
delete[] u, v, w, vertex;
|
|
for (int i = 0; i < NbrGuassPoints; i++)
|
|
{
|
|
delete[] Et[i];
|
|
}
|
|
delete[] Et;
|
|
}
|
|
|
|
void Post_3D_Scatter::GetElectric()
|
|
{
|
|
const int nbrVertex = _mMesh->GetNbrVertex();
|
|
_mEx = Eigen::VectorXcd::Zero(nbrVertex);
|
|
_mEy = Eigen::VectorXcd::Zero(nbrVertex);
|
|
_mEz = Eigen::VectorXcd::Zero(nbrVertex);
|
|
_mNormE = Eigen::VectorXd::Zero(nbrVertex);
|
|
Eigen::VectorXd nCnt = Eigen::VectorXd::Zero(nbrVertex);
|
|
|
|
BF bfN;
|
|
bfN.GetNbrBF(THREEDIM, TETRAHEDRON, BF_NEDELEC, BF_LINEFUNC);
|
|
Eigen::Vector3d vertex[4];
|
|
Eigen::Matrix3d Jac, InvJac;
|
|
|
|
const double u0[4] = { 1.0, 0.0, 0.0, 0.0 };
|
|
const double v0[4] = { 0.0, 1.0, 0.0, 0.0 };
|
|
const double w0[4] = { 0.0, 0.0, 1.0, 0.0 };
|
|
|
|
for (int n = 0; n < _mMesh->GetNbrTet(); n++)
|
|
{
|
|
for (int i = 0; i < 4; i++)
|
|
_mMesh->GetVertex(_mMesh->GetTet(n, i), vertex[i]);
|
|
|
|
Jac(0, 0) = vertex[0](0) - vertex[3](0); Jac(0, 1) = vertex[0](1) - vertex[3](1); Jac(0, 2) = vertex[0](2) - vertex[3](2);
|
|
Jac(1, 0) = vertex[1](0) - vertex[3](0); Jac(1, 1) = vertex[1](1) - vertex[3](1); Jac(1, 2) = vertex[1](2) - vertex[3](2);
|
|
Jac(2, 0) = vertex[2](0) - vertex[3](0); Jac(2, 1) = vertex[2](1) - vertex[3](1); Jac(2, 2) = vertex[2](2) - vertex[3](2);
|
|
const double detJ = Jac.determinant();
|
|
if (std::abs(detJ) < 1e-30)
|
|
continue;
|
|
InvJac = Jac.inverse();
|
|
|
|
for (int j = 0; j < 4; j++)
|
|
{
|
|
Eigen::Vector3cd Esum = Eigen::Vector3cd::Zero();
|
|
for (int i = 0; i < 6; i++)
|
|
{
|
|
Eigen::Vector3d bf;
|
|
bfN.GetValueBF(i + 1, u0[j], v0[j], w0[j], bf);
|
|
bf = InvJac * bf;
|
|
const int eid = _mMesh->GetEdgeOfTet(n, i);
|
|
const std::complex<double> xe = (*_mX)(eid);
|
|
Esum(0) += bf(0) * xe;
|
|
Esum(1) += bf(1) * xe;
|
|
Esum(2) += bf(2) * xe;
|
|
}
|
|
const int vid = _mMesh->GetTet(n, j);
|
|
_mEx(vid) += Esum(0);
|
|
_mEy(vid) += Esum(1);
|
|
_mEz(vid) += Esum(2);
|
|
nCnt(vid) += 1.0;
|
|
}
|
|
}
|
|
|
|
for (int i = 0; i < nbrVertex; i++)
|
|
{
|
|
if (nCnt(i) > 0.0)
|
|
{
|
|
_mEx(i) /= nCnt(i);
|
|
_mEy(i) /= nCnt(i);
|
|
_mEz(i) /= nCnt(i);
|
|
}
|
|
}
|
|
|
|
for (int i = 0; i < nbrVertex; i++)
|
|
_mNormE(i) = sqrt(abs(_mEx(i) * _mEx(i)) + abs(_mEy(i) * _mEy(i)) + abs(_mEz(i) * _mEz(i)));
|
|
}
|