1 #ifndef UTIL_SYMMETRY_GROUP_H 2 #define UTIL_SYMMETRY_GROUP_H 28 template <
class Symmetry>
57 bool add(Symmetry& symmetry);
70 const Symmetry*
find(
const Symmetry& symmetry)
const;
104 std::vector<Symmetry> elements_;
116 template <
class Symmetry>
119 identity_ = Symmetry::identity();
120 elements_.push_back(identity_);
126 template <
class Symmetry>
130 for (
int i = 0; i < other.
size(); ++i) {
131 elements_.push_back(other.elements_[i]);
138 template <
class Symmetry>
145 template <
class Symmetry>
149 if (
this != &other) {
152 for (
int i = 0; i < other.
size(); ++i) {
153 elements_.push_back(other.elements_[i]);
164 template <
class Symmetry>
167 for (
int i=0; i <
size(); ++i) {
168 if (symmetry == elements_[i]) {
169 return &(elements_[i]);
179 template <
class Symmetry>
182 const Symmetry* ptr =
find(symmetry);
186 elements_.push_back(symmetry);
197 template <
class Symmetry>
202 bool added, complete;
206 for (i = 0; i < n; ++i) {
207 a = elements_[i].inverse();
216 for (i = 0; i < n; ++i) {
218 for (j = 0; j < n; ++j) {
240 template <
class Symmetry>
247 c = Symmetry::identity();
249 UTIL_THROW(
"Identity element is not in group");
254 for (i = 0; i < n; ++i) {
258 UTIL_THROW(
"Inverse of element not in group");
260 for (j = 0; j < n; ++j) {
264 UTIL_THROW(
"An element of the group is not unique");
269 UTIL_THROW(
"Product of two element is not in group");
282 template <
class Symmetry>
284 {
return elements_.size(); }
289 template <
class Symmetry>
291 {
return identity_; }
296 template <
class Symmetry>
inline 298 {
return elements_[i]; }
303 template <
class Symmetry>
inline 305 {
return elements_[i]; }
Class template for a group of elements of type Symmetry.
bool add(Symmetry &symmetry)
Add a new element to the group.
SymmetryGroup & operator=(const SymmetryGroup &other)
Assignment operator.
Symmetry & operator[](int i)
Element access operator (by reference).
#define UTIL_THROW(msg)
Macro for throwing an Exception, reporting function, file and line number.
Utility classes for scientific computation.
SymmetryGroup()
Default constructor.
const Symmetry & identity() const
Return a reference to the identity element.
bool isValid() const
Return true if valid complete group, or throw an Exception.
void makeCompleteGroup()
Generate a complete group from the current elements.
const Symmetry * find(const Symmetry &symmetry) const
Find a symmetry within a group.
int size() const
Return number of elements in group.
~SymmetryGroup()
Destructor.