PSCF v1.3
SpaceSymmetry.h
1#ifndef PRDC_SPACE_SYMMETRY_H
2#define PRDC_SPACE_SYMMETRY_H
3
4/*
5* PSCF - Polymer Self-Consistent Field
6*
7* Copyright 2015 - 2025, The Regents of the University of Minnesota
8* Distributed under the terms of the GNU General Public License.
9*/
10
11#include <pscf/math/IntVec.h>
12#include <util/math/Rational.h>
13#include <util/containers/FMatrix.h>
14#include <util/containers/FArray.h>
15#include <util/format/Int.h>
16
17#include <iostream>
18
19namespace Pscf {
20namespace Prdc {
21
22 using namespace Util;
23
24 template <int D> class SpaceSymmetry;
25
26 // Non-member function declarations
27
36 template <int D>
37 bool operator == (const SpaceSymmetry<D>& A, const SpaceSymmetry<D>& B);
38
47 template <int D>
48 bool operator != (const SpaceSymmetry<D>& A, const SpaceSymmetry<D>& B);
49
58 template <int D>
61
73 template <int D>
75
87 template <int D>
89
98 template <int D>
99 std::ostream& operator << (std::ostream& out, const SpaceSymmetry<D>& A);
100
109 template <int D>
110 std::istream& operator >> (std::istream& in, SpaceSymmetry<D>& A);
111
138 template <int D>
140 {
141
142 public:
143
146
149
156
160 SpaceSymmetry(const SpaceSymmetry<D>& other);
161
166
170 void normalize();
171
183 void shiftOrigin(Translation const & origin);
184
189
194
198 int determinant() const;
199
206 int& R(int i, int j);
207
214 int R(int i, int j) const;
215
221 Rational& t(int i);
222
228 Rational t(int i) const;
229
230 // Static method
231
235 static const SpaceSymmetry<D>& identity();
236
237 private:
238
246 Rotation R_;
247
251 Translation t_;
252
253 // Static member variables
254
256 static SpaceSymmetry<D> identity_;
257
259 static bool hasIdentity_;
260
262 static void makeIdentity();
263
264 // friends:
265
266 friend
267 bool operator == <> (const SpaceSymmetry<D>& A,
268 const SpaceSymmetry<D>& B);
269
270 friend
271 bool operator != <> (const SpaceSymmetry<D>& A,
272 const SpaceSymmetry<D>& B);
273
274 friend
277 const SpaceSymmetry<D>& B);
278
279 friend
281 const SpaceSymmetry<D>& S);
282
283 friend
285
286 friend
287 std::ostream& operator << <> (std::ostream& out,
288 const SpaceSymmetry<D>& A);
289
290 friend
291 std::istream& operator >> <> (std::istream& in,
293
294 };
295
296 // Explicit specialization of members
297
298 template <>
300
301 template <>
303
304 template <>
306
307 template <>
309
310 template <>
312
313 template <>
315
316 // Inline method definitions
317
318 template <int D>
319 inline
321 { return !(A == B); }
322
323 /*
324 * Return an element of the matrix by reference.
325 */
326 template <int D>
327 inline
328 int& SpaceSymmetry<D>::R(int i, int j)
329 { return R_(i, j); }
330
331 /*
332 * Return an element of the matrix by value
333 */
334 template <int D>
335 inline
336 int SpaceSymmetry<D>::R(int i, int j) const
337 { return R_(i, j); }
338
339 /*
340 * Return an element of the translation vector by reference.
341 */
342 template <int D>
343 inline
345 { return t_[i]; }
346
347 /*
348 * Return an element of the translation vector by value
349 */
350 template <int D>
351 inline
353 { return t_[i]; }
354
355 /*
356 * Return the identity symmetry operation.
357 */
358 template <int D>
359 inline
361 {
362 if (!hasIdentity_) makeIdentity();
363 return identity_;
364 }
365
366 // Friend function template definitions
367
368 /*
369 * Equality operator.
370 */
371 template <int D>
373 {
374 int i, j;
375 for (i = 0; i < D; ++i) {
376 if (A.t_[i] != B.t_[i]) {
377 return false;
378 }
379 for (j = 0; j < D; ++j) {
380 if (A.R_(i, j) != B.R_(i,j)) {
381 return false;
382 }
383 }
384 }
385 return true;
386 }
387
388 /*
389 * Group multipication operator for SpaceSymmetry<D> objects.
390 */
391 template <int D>
394 {
396 int i, j, k;
397
398 // Compute rotation matrix (matrix product)
399 for (i = 0; i < D; ++i) {
400 for (j = 0; j < D; ++j) {
401 C.R_(i, j) = 0;
402 for (k = 0; k < D; ++k) {
403 C.R_(i, j) += A.R_(i, k)*B.R_(k, j);
404 }
405 }
406 }
407
408 // Compute translation vector
409 for (i = 0; i < D; ++i) {
410 C.t_[i] = A.t_[i];
411 }
412 for (i = 0; i < D; ++i) {
413 for (j = 0; j < D; ++j) {
414 C.t_[i] += A.R_(i, j)*B.t_[j];
415 }
416 }
417 C.normalize();
418
419 return C;
420 }
421
422 /*
423 * Matrix / IntVec<D> multiplication.
424 */
425 template <int D>
427 {
428 IntVec<D> U;
429 int i, j;
430 for (i = 0; i < D; ++i) {
431 U[i] = 0;
432 for (j = 0; j < D; ++j) {
433 U[i] += S.R_(i,j)*V[j];
434 }
435 }
436 return U;
437 }
438
439 /*
440 * IntVec<D> / Matrix multiplication.
441 */
442 template <int D>
444 {
445 IntVec<D> U;
446 int i, j;
447 for (i = 0; i < D; ++i) {
448 U[i] = 0;
449 for (j = 0; j < D; ++j) {
450 U[i] += V[j]*S.R_(j,i);
451 }
452 }
453 return U;
454 }
455
456 /*
457 * Output stream inserter for a SpaceSymmetry<D>.
458 */
459 template <int D>
460 std::ostream& operator << (std::ostream& out, const SpaceSymmetry<D>& A)
461 {
462 int i, j;
463 for (i = 0; i < D; ++i) {
464 for (j = 0; j < D; ++j) {
465 out << " " << Int(A.R_(i,j),2);
466 }
467 out << std::endl;
468 }
469 for (i = 0; i < D; ++i) {
470 out << " " << A.t_[i];
471 }
472 out << std::endl;
473 return out;
474 }
475
476 /*
477 * Input stream extractor for a SpaceSymmetry<D>.
478 */
479 template <int D>
480 std::istream& operator >> (std::istream& in, SpaceSymmetry<D>& A)
481 {
482 int i, j;
483 for (i = 0; i < D; ++i) {
484 for (j = 0; j < D; ++j) {
485 in >> A.R_(i,j);
486 }
487 }
488 for (i = 0; i < D; ++i) {
489 in >> A.t_[i];
490 }
491 return in;
492 }
493
494 // Define static members
495 template<int D>
496 SpaceSymmetry<D> SpaceSymmetry<D>::identity_ = SpaceSymmetry<D>();
497
498 template<int D>
499 bool SpaceSymmetry<D>::hasIdentity_ = false;
500
501
502 #ifndef PRDC_SPACE_SYMMETRY_TPP
503 // Suppress implicit instantiation
504 extern template class SpaceSymmetry<1>;
505 extern template class SpaceSymmetry<2>;
506 extern template class SpaceSymmetry<3>;
507 #endif
508
509}
510}
511#endif
An IntVec<D, T> is a D-component vector of elements of integer type T.
Definition IntVec.h:27
A SpaceSymmetry represents a crystallographic space group symmetry.
friend std::istream & operator>>(std::istream &in, SpaceSymmetry< D > &A)
Input stream extractor for a SpaceSymmetry<D>
SpaceSymmetry< D > inverse() const
Compute and return the inverse of this symmetry element.
friend bool operator!=(const SpaceSymmetry< D > &A, const SpaceSymmetry< D > &B)
Are two SpaceSymmetry objects not equivalent?
static const SpaceSymmetry< D > & identity()
Return the identity element.
int determinant() const
Compute and return the determinant of the rotation matrix.
FArray< Rational, D > Translation
Typedef for vector used to represent fractional translation.
friend bool operator==(const SpaceSymmetry< D > &A, const SpaceSymmetry< D > &B)
Are two SpaceSymmetry objects equivalent?
SpaceSymmetry< D >::Rotation inverseRotation() const
Compute and return the inverse of the rotation matrix.
friend SpaceSymmetry< D > operator*(const SpaceSymmetry< D > &A, const SpaceSymmetry< D > &B)
Return the product A*B of two symmetry objects.
SpaceSymmetry< D > & operator=(const SpaceSymmetry< D > &other)
Assignment operator.
Rational & t(int i)
Return a component of the translation by reference.
void normalize()
Shift components of translation to [0,1).
int & R(int i, int j)
Return an element of the matrix by reference.
FMatrix< int, D, D > Rotation
Typedef for matrix used to represent point group operation.
void shiftOrigin(Translation const &origin)
Shift the origin of space used in the coordinate system.
SpaceSymmetry()
Default constructor.
A fixed size (static) contiguous array template.
Definition FArray.h:47
Fixed Size Matrix.
Definition FMatrix.h:29
Wrapper for an int, for formatted ostream output.
Definition Int.h:37
A Rational number (a ratio of integers).
Definition Rational.h:34
Periodic fields and crystallography.
Definition CField.cpp:11
PSCF package top-level namespace.
Definition param_pc.dox:1
Rational operator*(Rational const &a, Rational const &b)
Compute product of rationals.
Definition Rational.h:573
bool operator==(Polynomial< T > const &a, Polynomial< T > const &b)
Equality operator for polynomials.
Definition Polynomial.h:675
std::istream & operator>>(std::istream &in, Pair< Data > &pair)
Input a Pair from an istream.
Definition Pair.h:44
std::ostream & operator<<(std::ostream &out, const Pair< Data > &pair)
Output a Pair to an ostream, without line breaks.
Definition Pair.h:57
bool operator!=(Polynomial< T > const &a, Polynomial< T > const &b)
Inequality operator for polynomials.
Definition Polynomial.h:694