#pragma once #include "../Eigen/Dense" #include "../Eigen/Sparse" #include "../mesh/Mesh_Base.h" #include "../phy/Phy_Base.h" #include "../common/util.h" #include #include struct PbcEdgePairs { std::vector src; std::vector dst; std::vector> sign; }; PbcEdgePairs collectPbcEdgePairs( Mesh_3D* mesh, const std::vector& srcDomains, const std::vector& dstDomains, const Eigen::VectorXd& pbcAngles, const Eigen::MatrixXd& pbcWaveVecs, bool useFaceStyleEdgeTol = false); void mergeDoublePbcPairs( const PbcEdgePairs& pairs1, std::complex blochPhi1, const PbcEdgePairs& pairs2, std::complex blochPhi2, PbcEdgePairs& merged, std::vector>& mergedPhi); void sortUniquePbcPairs( Eigen::VectorXi& srcEdgeIndex, Eigen::VectorXi& dstEdgeIndex, Eigen::VectorXcd& edgePhi); void fillPbcGroupFromPhy( const Phy_WaveOpticsModel* phy, int group, std::vector& srcDomains, std::vector& dstDomains, Eigen::VectorXd& pbcAngles, Eigen::MatrixXd& pbcWaveVecs); bool collectMergedPbcConstraints( Mesh_3D* mesh, const Phy_WaveOpticsModel* phy, int elementOrder, Eigen::VectorXi& srcDofIndex, Eigen::VectorXi& dstDofIndex, Eigen::VectorXcd& dofPhi); bool assemblePbcProjectionMatrix( Mesh_3D* mesh, const Phy_WaveOpticsModel* phy, int elementOrder, int dof, bool isReal, Eigen::SparseMatrix& P_real, Eigen::SparseMatrix, Eigen::RowMajor>& P_complex); void buildPeriodicProjectionReal( int dof, const Eigen::VectorXi& dstIndex, const Eigen::VectorXi& srcIndex, const Eigen::VectorXcd& indexPhi, Eigen::SparseMatrix& P); void buildPeriodicProjectionComplex( int dof, const Eigen::VectorXi& dstIndex, const Eigen::VectorXi& srcIndex, const Eigen::VectorXcd& indexPhi, Eigen::SparseMatrix, Eigen::RowMajor>& P);