CASM
AClustersApproachtoStatisticalMechanics
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules
SymGroup.hh
Go to the documentation of this file.
1 #ifndef SYMGROUP_HH
2 #define SYMGROUP_HH
3 
4 #include <iostream>
5 #include <string>
6 #include <iomanip>
7 
8 #include "casm/symmetry/SymOp.hh"
9 
10 namespace CASM {
11 
12  class Lattice;
13 
14  class SymGroup;
15  class MasterSymGroup;
16  class SymGroupRep;
17  struct SymInfo;
18 
19  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
20  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
21 
28  class SymGroup : public Array<SymOp> {
34  public:
39  m_lat_ptr(nullptr),
40  m_group_periodicity(init_type),
41  m_max_error(-1) {
42  name.clear();
43  latex_name.clear();
44  }
45 
46  SymGroup(const Array<SymOp> &from_array, PERIODICITY_TYPE init_type = PERIODIC);
47 
48  virtual void push_back(const SymOp &new_op);
49  virtual void clear();
50  virtual void clear_tables();
51 
52  void set_lattice(const Lattice &new_lat);
53 
54  const Lattice &lattice() const;
55 
56  const MasterSymGroup &master_group() const {
57  assert(size() && at(0).has_valid_master());
58  return at(0).master_group();
59  }
60 
62 
64  //maybe contains and find should account for group_periodicity
65  //bool contains(const SymOp &test_op) const; //Donghee
66 
67  bool contains_periodic(const SymOp &test_op, double tol = TOL) const;
68 
69 
71  //Index find(const SymOp &test_op) const; //Donghee
72 
76  Index find_no_trans(const SymOp &test_op) const;
77 
81  Index find_periodic(const SymOp &test_op, double tol = TOL) const;
82  ReturnArray<Index> find_all_periodic(const Array<SymOp> &subgroup, double tol = TOL) const;
83 
85  virtual void sort();
86 
88  // Should we change the name to something else?
89  SymGroup get_union(const SymGroup &other_group) const; //Ivy do this
90 
92  SymGroup &apply_sym(const SymOp &op);
93 
95  Index ind_prod(Index i, Index j) const;
96 
98  Index ind_inverse(Index i) const;
99 
101  Index class_of_op(Index i) const;
102 
104  void set_irrep_ID(Index i, SymGroupRepID ID) const;
105 
108 
110  SymGroupRepID coord_rep_ID() const;
111 
113  SymGroupRep const &get_irrep(Index i) const;
114 
117 
118 
121  void calc_space_group_in_cell(SymGroup &space_group, const Lattice &_cell) const;
122 
125  void calc_space_group_in_range(SymGroup &space_group, const Lattice &_cell, Eigen::Vector3i min_trans, Eigen::Vector3i max_trans) const;
126 
128  bool is_group(double tol = TOL) const;
130  void enforce_group(double tol = TOL, Index max_size = 200); //AAB
131 
133  void print_locations(std::ostream &stream) const;
134 
136  void write(std::string filename, COORD_TYPE mode) const;
137 
139  void print(std::ostream &out, COORD_TYPE mode) const;
140 
142  SymGroup &operator+=(const Eigen::Ref<const SymOp::vector_type> &shift);
143  SymGroup &operator-=(const Eigen::Ref<const SymOp::vector_type> &shift);
144 
146  double max_error();
147 
148  ReturnArray<Array<Index> > left_cosets(const Array<SymOp> &subgroup, double tol = TOL) const;
149  ReturnArray<Array<Index> > left_cosets(const Array<Index> &subgroup_inds) const;
150 
151  const Array<Index>::X2 &get_multi_table() const;
152  const Array<Index>::X2 &get_alt_multi_table() const;
153  void invalidate_multi_tables() const;
156  const Array<bool> &get_complex_irrep_list() const;
157  const std::string &get_name() const;
158  const std::string &get_latex_name() const;
159 
161  return m_group_periodicity;
162  }
163 
164  std::string possible_space_groups() const {
165  return comment;
166  }
167 
168 
169  const Array<Index>::X3 &subgroups() const;
170 
171  void print_character_table(std::ostream &stream);
173  bool is_irreducible() const;
174 
175  std::vector<SymGroup> unique_subgroups() const;
176 
178  void get_rotation_groups()const;
179  void get_point_group_type()const;
180  void print_space_group_info(std::ostream &out) const;
181 
183  void copy_no_trans(SymGroup &shiftless, bool keep_repeated = false) const;
184 
185  jsonParser &to_json(jsonParser &json) const;
186 
187  void from_json(const jsonParser &json);
188 
189  SymInfo info(Index i) const;
190 
191  protected:
192  void _generate_conjugacy_classes() const;
193  void _generate_character_table() const;
194  void _generate_centralizers() const;
195  void _generate_elem_order_table() const;
196  void _generate_class_names() const;
197  void _generate_irrep_names() const;
198  bool _generate_multi_table() const;
199  void _generate_alt_multi_table() const;
200  void _generate_subgroups() const;
201 
202  // small_groups are cyclic subgroups. Found by taking a group
203  // element and multiplying it by itself until a group is generated
204  // small_groups[i][j][k] is index of symop 'k' in subgroup (i,j) -- the equivalent subroup 'j' of an orbit 'i' of equivalent subgroups
206 
207 
210 
213 
216 
219 
220  // information about conjugacy classes
221  // conjugacy_classes[i][j] gives index of SymOp 'j' in class 'i'
225 
226  // Information about irreducible representations
227  // m_character_table[i][j] is character of conjugacy class 'j' in irrep 'i'
232 
233  // subgroups are found by finding the closure for each possible union of small_subgroups
234  // organized the same way as small_subgroups
236 
237 
240 
241  mutable std::string name;
242  mutable std::string latex_name;
243  mutable std::string comment;
244 
245  mutable double m_max_error;
246 
249  mutable std::string crystal_system;
250  mutable bool centric; // if it is centric, special point is same in reciprocal space
251  mutable Array<int> group_number; // space group number (min and max)
252  mutable Array<std::string> group_name; // 0: International 1: Schonflies
253 
254 
255  };
256 
257  jsonParser &to_json(const SymGroup &group, jsonParser &json);
258 
259  // Note: as a hack this expects group[0] to be present and have the right lattice!!!
260  // it's just used to set the lattice for all the Molecules
261  void from_json(SymGroup &group, const jsonParser &json);
262 
263  // return SymGroup with all molecular point group sym ops
264  // I will centerize your coord_map, fyi.
265  SymGroup molecular_point_group(std::map<int, std::vector<Eigen::Vector3d> > coord_map);
266 
267  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
268  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
269 
270  class MasterSymGroup : public SymGroup {
271  //NOTE: It may be useful to store a user-specified set of "favored directions" in MasterSymGroup
272  // e.g., {(0,0,1), (1,0,0), (0,1,0)}, which would be used to arbitrate decisions in symmetry-related algorithms
273  // Relevant applications include
274  // - constucting orbit equivalence map
275  // - optimizing the coordinate system of irreps
276  // - deciding prototype cluster
277 
278  public:
280  SymGroup(init_type),
282  }
283 
284  MasterSymGroup(const MasterSymGroup &RHS);
285  ~MasterSymGroup();
286 
287  Index group_index() const {
288  return m_group_index;
289  }
290 
292 
295  void push_back(const SymOp &op);
296 
299  void clear();
300 
301  void sort();
302  //void sort_by_class();
303 
304  const SymGroup &point_group() const;
305 
307  SymGroupRep const &representation(SymGroupRepID i) const;
308 
309  SymGroupRep const &reg_rep() const;
310 
311  SymGroupRep const &coord_rep() const;
312 
314  SymGroupRepID add_representation(const SymGroupRep &new_rep) const;
315 
318 
319  SymGroupRepID reg_rep_ID() const;
320  SymGroupRepID coord_rep_ID() const;
324  SymGroupRepID add_transformed_rep(SymGroupRepID orig_ID, const Eigen::MatrixXd &trans_mat) const;
326 
327  jsonParser &to_json(jsonParser &json) const;
328 
329  void from_json(const jsonParser &json);
330 
331  private:
332 
334 
335  SymGroupRepID _add_reg_rep() const;
337 
341 
344 
347 
351 
354 
357 
360 
363  };
364 
365  jsonParser &to_json(const SymGroup &group, jsonParser &json);
366 
367  // Note: as a hack this expects group[0] to be present and have the right lattice!!!
368  // it's just used to set the lattice for all the Molecules
369  void from_json(SymGroup &group, const jsonParser &json);
370 
371  bool compare_periodic(const SymOp &a,
372  const SymOp &b,
373  const Lattice &lat,
374  PERIODICITY_TYPE periodicity,
375  double _tol);
376 
377  SymOp within_cell(const SymOp &a, const Lattice &lat, PERIODICITY_TYPE periodicity);
378 
380 }
381 
382 #endif
SymGroupRepID add_rotation_rep() const
Definition: SymGroup.cc:243
Eigen::MatrixXd MatrixXd
PERIODICITY_TYPE m_group_periodicity
Specifies whether to use lattice periodicity when testing for equivalence.
Definition: SymGroup.hh:212
virtual void sort()
Sort SymOp in the SymGroup.
Definition: SymGroup.cc:3574
jsonParser & to_json(jsonParser &json) const
Definition: SymGroup.cc:4571
Array< Array< Index > > multi_table
multi_table[i][j] gives index of operation that is result of at(i)*at(j)
Definition: SymGroup.hh:215
void calc_space_group_in_cell(SymGroup &space_group, const Lattice &_cell) const
Definition: SymGroup.cc:3447
SymInfo info(Index i) const
Definition: SymGroup.cc:927
void _generate_centralizers() const
Definition: SymGroup.cc:1861
ReturnArray< Array< Index > > left_cosets(const Array< SymOp > &subgroup, double tol=TOL) const
Definition: SymGroup.cc:3131
void from_json(ClexDescription &desc, const jsonParser &json)
Array< Array< Index > > alt_multi_table
alt_multi_table[i][j] gives index of operation that is result of at(i).inverse()*at(j) ...
Definition: SymGroup.hh:218
Index size() const
Definition: Array.hh:145
const MasterSymGroup & master_group() const
Definition: SymGroup.hh:56
Type-safe ID object for communicating and accessing Symmetry representation info. ...
SymGroup & apply_sym(const SymOp &op)
Calls 'apply_sym' on all SymOps in the group.
Definition: SymGroup.cc:3413
void get_rotation_groups() const
Space group (added by Donghee );.
Definition: SymGroup.cc:509
void write(std::string filename, COORD_TYPE mode) const
Write the SymGroup to a file.
Definition: SymGroup.cc:3421
SymGroupRepID add_direct_sum_rep(const Array< SymGroupRepID > &rep_IDs) const
Definition: SymGroup.cc:209
virtual void clear()
Definition: SymGroup.cc:490
SymGroupRepID add_transformed_rep(SymGroupRepID orig_ID, const Eigen::MatrixXd &trans_mat) const
Definition: SymGroup.cc:344
const SymGroup & point_group() const
Definition: SymGroup.cc:74
jsonParser & to_json(const ClexDescription &desc, jsonParser &json)
SymGroupRepID add_empty_representation() const
Add a new empty representation.
Definition: SymGroup.cc:353
Array< SymGroupRep * > m_rep_array
Definition: SymGroup.hh:350
SymGroupRepID m_coord_rep_ID
ID of Cartesian representation.
Definition: SymGroup.hh:353
SymGroup molecular_point_group(std::map< int, std::vector< Eigen::Vector3d > > coord_map)
Definition: SymGroup.cc:3941
SymGroup get_union(const SymGroup &other_group) const
Adds SymOps from 'other_group' and enforces the group property.
Main CASM namespace.
Definition: complete.cpp:8
SymGroupRepID add_kronecker_rep(SymGroupRepID ID1, SymGroupRepID ID2) const
Definition: SymGroup.cc:187
Array< std::string > irrep_names
Definition: SymGroup.hh:231
Array< Array< Index > > elem_order_table
Definition: SymGroup.hh:239
Array< std::string > group_name
Definition: SymGroup.hh:252
const double TOL
SymGroupRepID coord_rep_ID() const
Get symrep ID of the representation that stores the Cartesian symop matrices.
Definition: SymGroup.cc:3098
Lattice const * m_lat_ptr
Pointer to a lattice for doing periodic comparisons.
Definition: SymGroup.hh:209
void push_back(const SymOp &op)
Definition: SymGroup.cc:65
std::string latex_name
Definition: SymGroup.hh:242
Index ind_inverse(Index i) const
Get index of operation that is inverse of operation at(i)
Definition: SymGroup.cc:3046
void print(std::ostream &out, COORD_TYPE mode) const
Print the SymGroup to a stream.
Definition: SymGroup.cc:3431
const Array< Index >::X2 & get_multi_table() const
Definition: SymGroup.cc:3170
Array< Index >::X3 _small_subgroups() const
Definition: SymGroup.cc:2776
void print_locations(std::ostream &stream) const
print locations of the symmetry-generating element of each SymOp
Definition: SymGroup.cc:3518
Index group_index() const
Definition: SymGroup.hh:287
jsonParser & to_json(jsonParser &json) const
Definition: SymGroup.cc:3740
SymGroup is a collection of symmetry operations that satisfy the group property The symmetry operatio...
Definition: SymGroup.hh:33
MasterSymGroup & operator=(const MasterSymGroup &RHS)
Definition: SymGroup.cc:49
bool is_irreducible() const
Definition: SymGroup.cc:3674
double tol
Array< X1 > X2
Definition: Array.hh:64
Eigen::Vector3d vector_type
Definition: SymOp.hh:32
SymGroupRep const & coord_rep() const
Definition: SymGroup.cc:132
void _generate_subgroups() const
Definition: SymGroup.cc:2836
SymOp is the Coordinate representation of a symmetry operation it keeps fraction (FRAC) and Cartesian...
Definition: SymOp.hh:28
SymGroupRep const & get_irrep(Index i) const
Get symrep for a particular irrep.
Definition: SymGroup.cc:3121
Array< Array< Index > > centralizer_table
Definition: SymGroup.hh:238
Simple struct to be used as return type for SymOp::info().
Definition: SymInfo.hh:35
void _generate_character_table() const
Definition: SymGroup.cc:1888
SymOp within_cell(const SymOp &a, const Lattice &lat, PERIODICITY_TYPE periodicity)
Definition: SymGroup.cc:4668
double max_error()
This returns the group's max_error.
Definition: SymGroup.cc:933
std::string comment
Definition: SymGroup.hh:243
EigenIndex Index
For long integer indexing:
SymGroupRepID _add_coord_rep() const
Definition: SymGroup.cc:148
void set_irrep_ID(Index i, SymGroupRepID ID) const
set symrep ID of a particular irrep
Definition: SymGroup.cc:3079
const Array< std::complex< double > >::X2 & character_table() const
Definition: SymGroup.cc:3212
const Array< Index >::X3 & subgroups() const
Definition: SymGroup.cc:3243
Array< Array< Index > > conjugacy_classes
Definition: SymGroup.hh:222
const MasterSymGroup & master_group() const
const access of head group
ReturnArray< Index > get_irrep_decomposition() const
Definition: SymGroup.cc:3707
const Array< Index >::X2 & get_alt_multi_table() const
Definition: SymGroup.cc:3180
Array< int > group_number
Definition: SymGroup.hh:251
void invalidate_multi_tables() const
Definition: SymGroup.cc:3189
void enforce_group(double tol=TOL, Index max_size=200)
Enforce group property by adding products of operations to the group.
Definition: SymGroup.cc:3365
bool contains_periodic(const SymOp &test_op, double tol=TOL) const
Check to see if a SymOp is contained in in SymGroup.
Definition: SymGroup.cc:3407
std::string name
Definition: SymGroup.hh:241
Index m_group_index
Index of this group, initialized from value of GROUP_COUNT upon construction.
Definition: SymGroup.hh:346
void _generate_conjugacy_classes() const
Definition: SymGroup.cc:2995
void _generate_elem_order_table() const
Definition: SymGroup.cc:2744
const Array< Index >::X2 & get_conjugacy_classes() const
Definition: SymGroup.cc:3197
SymOp & at(Index ind)
Definition: Array.hh:157
SymGroupRepID _add_representation(SymGroupRep *_rep_ptr) const
Definition: SymGroup.cc:367
Array< Array< std::complex< double > > > m_character_table
Definition: SymGroup.hh:228
SymGroupRepID reg_rep_ID() const
Definition: SymGroup.cc:108
Index find_no_trans(const SymOp &test_op) const
Check to see if a SymOp is contained in in SymGroup and return its index.
Definition: SymGroup.cc:3309
void _generate_alt_multi_table() const
Definition: SymGroup.cc:3286
double m_max_error
Definition: SymGroup.hh:245
bool is_group(double tol=TOL) const
Check to see if SymGroup satisfies the group property.
Definition: SymGroup.cc:3346
void from_json(const jsonParser &json)
Definition: SymGroup.cc:4596
MasterSymGroup(PERIODICITY_TYPE init_type=PERIODIC)
Definition: SymGroup.hh:279
std::vector< SymGroup > unique_subgroups() const
Definition: SymGroup.cc:2913
SymGroupRepID get_irrep_ID(Index i) const
Get symrep ID of a particular irrep.
Definition: SymGroup.cc:3088
const Lattice & lattice() const
Definition: SymGroup.cc:940
Index find_periodic(const SymOp &test_op, double tol=TOL) const
Definition: SymGroup.cc:3321
SymOp::vector_type vector_type
Definition: SymGroup.hh:35
SymOp::matrix_type matrix_type
Definition: SymGroup.hh:36
SymGroup m_point_group
Copy of *this with translations removed.
Definition: SymGroup.hh:362
PERIODICITY_TYPE periodicity() const
Definition: SymGroup.hh:160
SymGroupRep const & reg_rep() const
Definition: SymGroup.cc:140
Eigen::Matrix3d matrix_type
Definition: SymOp.hh:31
Array< SymGroupRepID > irrep_IDs
Definition: SymGroup.hh:229
std::string possible_space_groups() const
Definition: SymGroup.hh:164
virtual void push_back(const SymOp &new_op)
Definition: SymGroup.cc:441
Array< std::string > class_names
Definition: SymGroup.hh:223
SymGroupRepID m_reg_rep_ID
ID of 'regular representation', which is (size() X size()) representation constructed from alt_multi_...
Definition: SymGroup.hh:356
void copy_no_trans(SymGroup &shiftless, bool keep_repeated=false) const
Fill up a SymGroup with *this minus the shifts.
Definition: SymGroup.cc:907
SymGroup(PERIODICITY_TYPE init_type=PERIODIC)
Initialize by setting periodicity mode (default mode is PERIODIC)
Definition: SymGroup.hh:38
SymGroupRep * _representation_ptr(SymGroupRepID _id) const
Definition: SymGroup.cc:379
void set_lattice(const Lattice &new_lat)
Definition: SymGroup.cc:435
SymGroupRepID _add_reg_rep() const
Definition: SymGroup.cc:158
SymGroupRep is an alternative representation of a SymGroup for something other than real space...
Definition: SymGroupRep.hh:30
const std::string & get_latex_name() const
Definition: SymGroup.cc:3236
void print_space_group_info(std::ostream &out) const
Definition: SymGroup.cc:883
SymGroupRepID coord_rep_ID() const
Definition: SymGroup.cc:100
Array< Array< SymOp > > rotation_groups
Space group (added by Donghee );.
Definition: SymGroup.hh:248
Index class_of_op(Index i) const
Get conjugacy class index of operation at(i)
Definition: SymGroup.cc:3071
void from_json(const jsonParser &json)
Definition: SymGroup.cc:3832
void _generate_class_names() const
Definition: SymGroup.cc:1308
void _generate_irrep_names() const
Definition: SymGroup.cc:947
const std::string & get_name() const
Definition: SymGroup.cc:3220
const Array< bool > & get_complex_irrep_list() const
Definition: SymGroup.cc:3204
Array< Index > index2conjugacy_class
Definition: SymGroup.hh:224
SymGroupRepID identity_rep_ID(Index dim) const
Definition: SymGroup.cc:116
Array< SymGroupRepID > m_identity_rep_IDs
identity representations: m_identity_rep_IDs[dim] refers to the Identity representation of dimention ...
Definition: SymGroup.hh:359
bool _generate_multi_table() const
Definition: SymGroup.cc:3251
SymGroupRepID add_representation(const SymGroupRep &new_rep) const
Add a new representation by passing a reference. SymGroup will store a copy.
Definition: SymGroup.cc:361
void print_character_table(std::ostream &stream)
Definition: SymGroup.cc:1545
Index ind_prod(Index i, Index j) const
Get index of operation that is result of multiplication of at(i)*at(j)
Definition: SymGroup.cc:3055
SymGroupRepID add_empty_representation() const
Add a new empty representation.
Definition: SymGroup.cc:3109
ReturnArray< Index > find_all_periodic(const Array< SymOp > &subgroup, double tol=TOL) const
Definition: SymGroup.cc:3332
std::string crystal_system
Definition: SymGroup.hh:249
void calc_space_group_in_range(SymGroup &space_group, const Lattice &_cell, Eigen::Vector3i min_trans, Eigen::Vector3i max_trans) const
Definition: SymGroup.cc:3489
void get_point_group_type() const
Definition: SymGroup.cc:565
SymGroup & operator+=(const Eigen::Ref< const SymOp::vector_type > &shift)
Cartesian translation of SymGroup origin by vector 'shift'.
Definition: SymGroup.cc:3691
Array< bool > complex_irrep
Definition: SymGroup.hh:230
Array< Array< Array< Index > > > m_subgroups
Definition: SymGroup.hh:235
static Index GROUP_COUNT
Counts number of instantiated MasterSymGroups, excluding ones created via copy.
Definition: SymGroup.hh:343
bool compare_periodic(const SymOp &a, const SymOp &b, const Lattice &lat, PERIODICITY_TYPE periodicity, double _tol)
Definition: SymGroup.cc:4646
SymGroup & operator-=(const Eigen::Ref< const SymOp::vector_type > &shift)
Definition: SymGroup.cc:3699
ReturnArray< Index > op_indices() const
Definition: SymGroup.cc:474
SymGroupRep const & representation(SymGroupRepID i) const
Const access of alternate Representations of a SymGroup.
Definition: SymGroup.cc:375
void sort()
Sort SymOp in the SymGroup.
Definition: SymGroup.cc:394
virtual void clear_tables()
Definition: SymGroup.cc:450