#pragma once #include"../material/Material_Base.h" #include"../mesh/Mesh_Base.h" #include"../phy/Phy_Base.h" #include"../solver/Solver_Base.h" #include"../post/Post_Base.h" #include"../Eigen/Sparse" #include"../Eigen/Dense" #include #include #include class OpticsFEM_2D_EigenMode { public: void GetMaterial(MaterialLib* matLib); void GetMesh(Mesh_2D* mesh); void GetPhy(Phy_WaveOpticsModel* phy); void GetSolver(Solver_EigenMode* solver); void GetPost(Post_2D_EigenMode* post); void Assemble(); void Run(); void Post(std::string str); void Test_OutputMatrix(); void Test_OutputLambda(); private: void Assemble_WaveEquation(); void Assemble_PEC_PBC(); MaterialLib* _mMatLib; Mesh_2D* _mMesh; Phy_WaveOpticsModel* _mPhy; Solver_EigenMode* _mSolver; Post_2D_EigenMode* _mPost; bool _mIsReal; int _mDof; Eigen::MatrixXcd _mX; Eigen::VectorXcd _mLambda;//neff std::vector> _mTripleA_real, _mTripleB_real; Eigen::SparseMatrix _mA_real; Eigen::SparseMatrix _mB_real; Eigen::SparseMatrix _mP_real; std::vector>> _mTripleA_complex, _mTripleB_complex; Eigen::SparseMatrix, Eigen::RowMajor> _mA_complex; Eigen::SparseMatrix, Eigen::RowMajor> _mB_complex; Eigen::SparseMatrix, Eigen::RowMajor> _mP_complex; }; class OpticsFEM_2D_EigenFreq { public: void GetMaterial(MaterialLib* matLib); void GetMesh(Mesh_2D* mesh); void GetPhy(Phy_WaveOpticsModel* phy); void GetSolver(Solver_EigenFreq* solver); void GetPost(Post_2D_EigenFreq* post); void Assemble(); void Run(); void Post(std::string str); void Test_OutputMatrix(); private: void Assemble_WaveEquation(); void Assemble_PEC_PBC(); MaterialLib* _mMatLib; Mesh_2D* _mMesh; Phy_WaveOpticsModel* _mPhy; Solver_EigenFreq* _mSolver; Post_2D_EigenFreq* _mPost; bool _mIsReal; int _mDof; int _mElectricType; Eigen::MatrixXcd _mX; Eigen::VectorXcd _mLambda;//eigenfreq std::vector> _mTripleA_real, _mTripleB_real; Eigen::SparseMatrix _mA_real; Eigen::SparseMatrix _mB_real; Eigen::SparseMatrix _mP_real; std::vector>> _mTripleA_complex, _mTripleB_complex; Eigen::SparseMatrix, Eigen::RowMajor> _mA_complex; Eigen::SparseMatrix, Eigen::RowMajor> _mB_complex; Eigen::SparseMatrix, Eigen::RowMajor> _mP_complex; }; class OpticsFEM_2D_Scatter { public: void GetMaterial(MaterialLib* matLib); void GetMesh(Mesh_2D* mesh); void GetPhy(Phy_WaveOpticsModel* phy); void GetSolver(Solver_LdaDom* solver); void GetPost(Post_2D_Scatter* post); void Assemble(); void Run(); void Post(std::string str); void Test_OutputMatrix(); private: void Assemble_WaveEquation(); void Assemble_SBC(); void Assemble_BELE(); void Assemble_MAG(); void Assemble_SCD(); void Assemble_MPD(); void Assemble_EPD(); void Assemble_PEC_ELE(); void Assemble_PBC(); void Assemble_Port(); MaterialLib* _mMatLib; Mesh_2D* _mMesh; Phy_WaveOpticsModel* _mPhy; Solver_LdaDom* _mSolver; Post_2D_Scatter* _mPost; bool _mIsReal; int _mDof; Eigen::VectorXcd _mX; std::vector> _mTripleA_real; Eigen::SparseMatrix _mA_real; Eigen::SparseMatrix _mP_real; Eigen::VectorXd _mB_real; std::vector>> _mTripleA_complex; Eigen::SparseMatrix, Eigen::RowMajor> _mA_complex; Eigen::SparseMatrix, Eigen::RowMajor> _mP_complex; Eigen::VectorXcd _mB_complex; std::vector>> _mTriplePort_A_complex; Eigen::SparseMatrix, Eigen::RowMajor> _mPort_A_complex; Eigen::SparseMatrix, Eigen::RowMajor> _mPort_P_complex; Eigen::VectorXcd _mPort_B_complex; Eigen::VectorXcd _mS_complex; Eigen::VectorXcd _mG1_complex; Eigen::VectorXcd _mG2_complex; Eigen::VectorXcd _mT_complex; complexP1, P2, b1; }; class OpticsFEM_3D_EigenFreq { public: void GetMaterial(MaterialLib* matLib); void GetMesh(Mesh_3D* mesh); void GetPhy(Phy_WaveOpticsModel* phy); void GetSolver(Solver_EigenFreq* solver); void GetPost(Post_3D_EigenFreq* post); void Assemble(); private: void Assemble_WaveEquation(); void Assemble_PEC_PBC(); MaterialLib* _mMatLib; Mesh_3D* _mMesh; Phy_WaveOpticsModel* _mPhy; Solver_EigenFreq* _mSolver; Post_3D_EigenFreq* _mPost; bool _mIsReal; int _mDof; std::vector> _mTripleA_real, _mTripleB_real; Eigen::SparseMatrix _mA_real; Eigen::SparseMatrix _mB_real; Eigen::SparseMatrix _mP_real; std::vector>> _mTripleA_complex, _mTripleB_complex; Eigen::SparseMatrix, Eigen::RowMajor> _mA_complex; Eigen::SparseMatrix, Eigen::RowMajor> _mB_complex; Eigen::SparseMatrix, Eigen::RowMajor> _mP_complex; }; class OpticsFEM_3D_Scatter { public: void GetMaterial(MaterialLib* matLib); void GetMesh(Mesh_3D* mesh); void GetPhy(Phy_WaveOpticsModel* phy); void GetSolver(Solver_LdaDom* solver); void GetPost(Post_3D_Scatter* post); void Assemble(); void Run(); void Post(std::string str); void Test_OutputMatrix(const std::string& outDir = "."); private: void Assemble_WaveEquation(); void Assemble_SBC(); void Assemble_PEC_ELE(); MaterialLib* _mMatLib; Mesh_3D* _mMesh; Phy_WaveOpticsModel* _mPhy; Solver_LdaDom* _mSolver; Post_3D_Scatter* _mPost; bool _mIsReal; int _mDof; Eigen::VectorXcd _mX; std::vector> _mTripleA_real; Eigen::SparseMatrix _mA_real; Eigen::SparseMatrix _mP_real; Eigen::VectorXd _mB_real; std::vector>> _mTripleA_complex; Eigen::SparseMatrix, Eigen::RowMajor> _mA_complex; Eigen::SparseMatrix, Eigen::RowMajor> _mP_complex; Eigen::VectorXcd _mB_complex; }; class OpticsFEM_3D_Scatter2 { public: void GetMaterial(MaterialLib* matLib); void GetMesh(Mesh_3D* mesh); void GetPhy(Phy_WaveOpticsModel* phy); void GetSolver(Solver_LdaDom* solver); void GetPost(Post_3D_Scatter* post); void Assemble(); private: void Assemble_WaveEquation(); void Assemble_SBC(); void Assemble_PEC_ELE(); MaterialLib* _mMatLib; Mesh_3D* _mMesh; Phy_WaveOpticsModel* _mPhy; Solver_LdaDom* _mSolver; Post_3D_Scatter* _mPost; OpticsFEM_2D_EigenMode* _mPortFEM; bool _mIsReal; int _mDof; std::vector> _mTripleA_real; Eigen::SparseMatrix _mA_real; Eigen::SparseMatrix _mP_real; Eigen::VectorXd _mB_real; std::vector>> _mTripleA_complex; Eigen::SparseMatrix, Eigen::RowMajor> _mA_complex; Eigen::SparseMatrix, Eigen::RowMajor> _mP_complex; Eigen::VectorXcd _mB_complex; };