Simpatico  v1.10
PointSymmetry.cpp
1 
2 
3 #include "PointSymmetry.h"
4 
5 #include <util/format/Int.h>
6 #include <util/space/IntVector.h>
7 
8 namespace Util
9 {
10 
11  // Define static members
12 
13  PointSymmetry PointSymmetry::identity_;
14  bool PointSymmetry::hasIdentity_ = false;
15 
16  // Define methods
17 
18  /*
19  * Default constructor.
20  */
22  : R_()
23  {
24  int i, j;
25  for (i = 0; i < Dimension; ++i) {
26  for (j = 0; j < Dimension; ++j) {
27  R_(i, j) = 0;
28  }
29  }
30  }
31 
32  /*
33  * Copy constructor.
34  */
36  {
37  int i, j;
38  for (i = 0; i < Dimension; ++i) {
39  for (j = 0; j < Dimension; ++j) {
40  R_(i, j) = other.R_(i,j);
41  }
42  }
43  }
44 
45  /*
46  * Make identity (private static method).
47  */
48  void PointSymmetry::makeIdentity()
49  {
50  int i, j;
51  for (i = 0; i < Dimension; ++i) {
52  for (j = 0; j < Dimension; ++j) {
53  if (i == j) {
54  identity_.R_(i, j) = 1;
55  } else {
56  identity_.R_(i, j) = 0;
57  }
58  }
59  }
60  }
61 
62  /*
63  * Return inverse of this PointSymmetry.
64  */
66  {
67  PointSymmetry C;
68  int i, j;
69  for (i = 0; i < Dimension; ++i) {
70  for (j = 0; j < Dimension; ++j) {
71  C.R_(i, j) = R_(j, i);
72  }
73  }
74  return C;
75  }
76 
77  /*
78  * Assignment operator.
79  */
81  {
82  if (this != &other) {
83  int i, j;
84  for (i = 0; i < Dimension; ++i) {
85  for (j = 0; j < Dimension; ++j) {
86  R_(i, j) = other.R_(i,j);
87  }
88  }
89  }
90  return *this;
91  }
92 
93  /*
94  * Equality operator.
95  */
96  bool operator == (const PointSymmetry& A, const PointSymmetry& B)
97  {
98  int i, j;
99  for (i = 0; i < Dimension; ++i) {
100  for (j = 0; j < Dimension; ++j) {
101  if (A.R_(i, j) != B.R_(i,j)) {
102  return false;
103  }
104  }
105  }
106  return true;
107  }
108 
109  /*
110  * Group multipication operator for PointSymmetry objects.
111  */
113  {
114  PointSymmetry C;
115  int i, j, k;
116  for (i = 0; i < Dimension; ++i) {
117  for (j = 0; j < Dimension; ++j) {
118  C.R_(i, j) = 0;
119  for (k = 0; k < Dimension; ++k) {
120  C.R_(i, j) += A.R_(i, k)*B.R_(k, j);
121  }
122  }
123  }
124  return C;
125  }
126 
127  /*
128  * Matrix / IntVector multiplication.
129  */
131  {
132  IntVector U;
133  int i, j;
134  for (i = 0; i < Dimension; ++i) {
135  U[i] = 0;
136  for (j = 0; j < Dimension; ++j) {
137  U[i] += S.R_(i,j)*V[j];
138  }
139  }
140  return U;
141  }
142 
143  /*
144  * IntVector / Matrix multiplication.
145  */
147  {
148  IntVector U;
149  int i, j;
150  for (i = 0; i < Dimension; ++i) {
151  U[i] = 0;
152  for (j = 0; j < Dimension; ++j) {
153  U[i] += V[j]*S.R_(j,i);
154  }
155  }
156  return U;
157  }
158 
159  /*
160  * Output stream inserter for a PointSymmetry.
161  */
162  std::ostream& operator << (std::ostream& out, const PointSymmetry& A)
163  {
164  int i, j;
165  for (i = 0; i < Dimension; ++i) {
166  for (j = 0; j < Dimension; ++j) {
167  out << Int(A.R_(i,j));
168  }
169  out << std::endl;
170  }
171  return out;
172  }
173 
174 }
const int Dimension
Dimensionality of space.
Definition: Dimension.h:19
PointSymmetry & operator=(const PointSymmetry &other)
Assignment operator.
friend PointSymmetry operator*(const PointSymmetry &A, const PointSymmetry &B)
Return the product A*B of two symmetry objects.
PointSymmetry inverse() const
Return the inverse of this symmetry element.
Utility classes for scientific computation.
Definition: accumulators.mod:1
Wrapper for an int, for formatted ostream output.
Definition: Int.h:36
PointSymmetry()
Default constructor.
friend std::ostream & operator<<(std::ostream &out, const PointSymmetry &A)
Output stream inserter for a PointSymmetry.
An IntVector is an integer Cartesian vector.
Definition: IntVector.h:73
friend bool operator==(const PointSymmetry &A, const PointSymmetry &B)
Are two PointSymmetry objects equivalent?
A PointSymmetry represents a crystallographic point group symmetry.
Definition: PointSymmetry.h:22