CASM  1.1.0
A Clusters Approach to Statistical Mechanics
IrrepDecompositionImpl.hh
Go to the documentation of this file.
1 #ifndef CASM_symmetry_IrrepDecompositionImpl
2 #define CASM_symmetry_IrrepDecompositionImpl
3 
5 
6 namespace CASM {
7 
8 namespace SymRepTools_v2 {
9 
10 namespace IrrepDecompositionImpl {
11 
14 Eigen::MatrixXcd prettyc(const Eigen::MatrixXcd &M);
15 
19 
20 // these methods are implementation details of IrrepDecomposition, they are
21 // included here for easier testing
22 
23 Eigen::MatrixXd real_I(Index rows, Index cols);
24 
26 
27 Eigen::MatrixXcd complex_I(Index rows, Index cols);
28 
29 Eigen::MatrixXcd complex_Zero(Index rows, Index cols);
30 
35 
36  void reset(Eigen::MatrixXcd const &kernel);
37 
38  bool valid() const;
39 
40  bool increment();
41 
44  std::complex<double> phase;
45 
46  private:
47  bool m_valid;
49  Index m_phase_index; // 0: 1+0i, 1: 0+i
50 };
51 
52 Eigen::MatrixXcd make_commuter(CommuterParamsCounter const &params,
53  MatrixRep const &rep,
54  GroupIndices const &head_group,
55  Eigen::MatrixXcd const &kernel);
56 
57 Eigen::MatrixXcd make_kernel(Eigen::MatrixXcd const &subspace);
59 
61  Eigen::VectorXd const &eigenvalues);
62 
64 Eigen::MatrixXcd make_irrep_subspace(Eigen::MatrixXcd const &KV_matrix,
65  Index begin, Index end,
66  bool allow_complex);
67 
69 Eigen::VectorXcd make_characters(std::vector<Eigen::MatrixXcd> const &rep);
70 
72 Eigen::VectorXd make_characters(std::vector<Eigen::MatrixXd> const &rep);
73 
75 bool make_is_block_diagonal(std::vector<Eigen::MatrixXcd> const &rep,
76  Index begin, Index end, double tol);
77 
79 Eigen::VectorXcd make_irrep_characters(std::vector<Eigen::MatrixXcd> const &rep,
80  Index begin, Index end);
81 
82 double make_squared_norm(Eigen::VectorXcd const &characters);
83 
84 double make_squared_norm(Eigen::VectorXd const &characters);
85 
86 std::complex<double> frobenius_product(Eigen::MatrixXcd const &matrix);
87 
88 Eigen::MatrixXcd normalize_commuter(Eigen::MatrixXcd const &commuter);
89 
91 bool is_extended_by(Eigen::MatrixXcd const &space_A,
92  Eigen::MatrixXcd const &space_B);
93 
95 Eigen::MatrixXcd extend(Eigen::MatrixXcd const &space_A,
96  Eigen::MatrixXcd const &space_B);
97 
100  Eigen::MatrixXd const &space_B);
101 
111  PossibleIrrep(Eigen::VectorXd const &eigenvalues,
112  Eigen::MatrixXcd const &KV_matrix,
113  std::vector<Eigen::MatrixXcd> const &transformed_rep,
114  Index _head_group_size, double _tol, bool allow_complex,
115  Index _begin, Index _end);
116 
118  double tol;
123  Eigen::VectorXcd characters;
125 
127  bool is_irrep;
128 
130  Eigen::MatrixXcd subspace;
131 
133  bool is_identity() const;
134 
136  bool is_gerade() const;
137 
138  bool operator<(PossibleIrrep const &other) const;
139 };
140 
144 std::vector<PossibleIrrep> make_possible_irreps(
145  Eigen::MatrixXcd const &commuter, Eigen::MatrixXcd const &kernel,
146  MatrixRep const &rep, GroupIndices const &head_group, bool allow_complex);
147 
149 std::vector<IrrepInfo> make_irrep_info(std::set<PossibleIrrep> const &irreps);
150 
161 IrrepInfo subspace_to_full_space(IrrepInfo const &subspace_irrep,
162  Eigen::MatrixXd const &subspace);
163 
169 IrrepInfo make_dummy_irrep_info(Eigen::MatrixXcd const &trans_mat);
170 
175 bool is_irrep(MatrixRep const &rep, GroupIndices const &head_group);
176 
178 std::vector<IrrepInfo> irrep_decomposition(MatrixRep const &rep,
179  GroupIndices const &head_group,
180  bool allow_complex);
181 
183 std::vector<IrrepInfo> make_fullspace_irreps(
184  std::vector<IrrepInfo> const &subspace_irreps,
185  Eigen::MatrixXd const &subspace);
186 
189  GroupIndices const &head_group,
190  Eigen::MatrixXd const &subspace);
191 
192 // Create `subspace_rep`, a transformed copy of `fullspace_rep` that acts
193 // on coordinates with `subspace` columns as a basis. Matrices in
194 // `subspace_rep` are shape (subspace.cols() x subspace.cols())
195 MatrixRep make_subspace_rep(MatrixRep const &fullspace_rep,
196  Eigen::MatrixXd const &subspace);
197 
200 std::vector<IrrepInfo> symmetrize_irreps(
201  MatrixRep const &subspace_rep, GroupIndices const &head_group,
202  std::vector<IrrepInfo> const &irreps,
203  GroupIndicesOrbitVector const &cyclic_subgroups,
204  GroupIndicesOrbitVector const &all_subgroups);
205 
206 } // namespace IrrepDecompositionImpl
207 
208 } // namespace SymRepTools_v2
209 
210 } // namespace CASM
211 
212 #endif
Eigen::MatrixXd real_Zero(Index rows, Index cols)
Eigen::MatrixXcd make_commuter(CommuterParamsCounter const &params, MatrixRep const &rep, GroupIndices const &head_group, Eigen::MatrixXcd const &kernel)
std::vector< IrrepInfo > make_fullspace_irreps(std::vector< IrrepInfo > const &subspace_irreps, Eigen::MatrixXd const &subspace)
Convert irreps generated for a subspace to full space dimension.
Eigen::MatrixXd make_invariant_space(MatrixRep const &rep, GroupIndices const &head_group, Eigen::MatrixXd const &subspace)
Expand subspace by application of group, and orthogonalize.
Eigen::VectorXcd make_characters(std::vector< Eigen::MatrixXcd > const &rep)
Calculate character for all matrices in rep.
Eigen::VectorXcd make_irrep_characters(std::vector< Eigen::MatrixXcd > const &rep, Index begin, Index end)
Find characters for block in range [begin, end)
Eigen::MatrixXcd normalize_commuter(Eigen::MatrixXcd const &commuter)
Eigen::MatrixXcd prettyc(const Eigen::MatrixXcd &M)
Round entries that are within tol of being integer to that integer value.
Eigen::MatrixXcd extend(Eigen::MatrixXcd const &space_A, Eigen::MatrixXcd const &space_B)
Return matrix combining columns of space_A and space_B.
Eigen::MatrixXcd make_irrep_subspace(Eigen::MatrixXcd const &KV_matrix, Index begin, Index end, bool allow_complex)
Make an irreducible subspace.
Index find_end_of_equal_eigenvalues(Index begin, Eigen::VectorXd const &eigenvalues)
IrrepInfo make_dummy_irrep_info(Eigen::MatrixXcd const &trans_mat)
bool is_extended_by(Eigen::MatrixXcd const &space_A, Eigen::MatrixXcd const &space_B)
Return true if space_A is extended by space_B.
bool is_irrep(MatrixRep const &rep, GroupIndices const &head_group)
Eigen::MatrixXcd complex_Zero(Index rows, Index cols)
Eigen::MatrixXcd complex_I(Index rows, Index cols)
Eigen::MatrixXcd make_kernel(Eigen::MatrixXcd const &subspace)
IrrepInfo subspace_to_full_space(IrrepInfo const &subspace_irrep, Eigen::MatrixXd const &subspace)
Transforms IrrepInfo constructed for a subspace to be IrrepInfo appropriate for the full space (full ...
Eigen::MatrixXd pretty(const Eigen::MatrixXd &M)
Round entries that are within tol of being integer to that integer value.
bool make_is_block_diagonal(std::vector< Eigen::MatrixXcd > const &rep, Index begin, Index end, double tol)
Check if approximately zero outside block along diagonal.
std::complex< double > frobenius_product(Eigen::MatrixXcd const &matrix)
std::vector< IrrepInfo > irrep_decomposition(MatrixRep const &rep, GroupIndices const &head_group, bool allow_complex)
Finds irreducible subspaces that comprise an underlying subspace.
double make_squared_norm(Eigen::VectorXcd const &characters)
Eigen::MatrixXd real_I(Index rows, Index cols)
std::vector< PossibleIrrep > make_possible_irreps(Eigen::MatrixXcd const &commuter, Eigen::MatrixXcd const &kernel, MatrixRep const &rep, GroupIndices const &head_group, bool allow_complex)
std::vector< IrrepInfo > make_irrep_info(std::set< PossibleIrrep > const &irreps)
Make a vector of IrrepInfo from PossibleIrreps.
MatrixRep make_subspace_rep(MatrixRep const &fullspace_rep, Eigen::MatrixXd const &subspace)
std::vector< IrrepInfo > symmetrize_irreps(MatrixRep const &subspace_rep, GroupIndices const &head_group, std::vector< IrrepInfo > const &irreps, GroupIndicesOrbitVector const &cyclic_subgroups, GroupIndicesOrbitVector const &all_subgroups)
Symmetrize IrrepInfo, by finding high symmetry directions and aligning the irrep subspace basis with ...
std::set< Index > GroupIndices
std::vector< GroupIndicesOrbit > GroupIndicesOrbitVector
std::vector< Eigen::MatrixXd > MatrixRep
Main CASM namespace.
Definition: APICommand.hh:8
Eigen::MatrixXd MatrixXd
INDEX_TYPE Index
For long integer indexing:
Definition: definitions.hh:39
Eigen::VectorXd VectorXd
Data structure used for storing and checking possible irreps.
bool is_irrep
is_block_diagonal && characters_squared_norm ~= head_group_size;
bool is_block_diagonal
irrep dimension / number of equal eigenvalues
Index end
col index in eigenvalues/eigvectors for this irrep
Index irrep_dim
col index in eigenvalues/eigvectors of next irrep
PossibleIrrep(Eigen::VectorXd const &eigenvalues, Eigen::MatrixXcd const &KV_matrix, std::vector< Eigen::MatrixXcd > const &transformed_rep, Index _head_group_size, double _tol, bool allow_complex, Index _begin, Index _end)
Eigen::MatrixXcd subspace
(K * V).block(0, begin, K.rows(), irrep_dim)