#include"Post_Base.h" #include"../function/BF.h" #include #include #include #include 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; }