CASM
AClustersApproachtoStatisticalMechanics
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules
Coordinate.hh
Go to the documentation of this file.
1 #ifndef COORDINATE_HH
2 #define COORDINATE_HH
3 
4 #include <iostream>
5 #include <cmath>
6 #include <cassert>
7 
11 
12 namespace CASM {
13 
14  class Lattice;
15  class SymOp;
16 
17  namespace Coordinate_impl {
18  class FracCoordinate;
20  class CartCoordinate;
22 
23  }
24 
32  class Coordinate {
35  public:
36  typedef Eigen::Vector3d vector_type;
38 
40  static Coordinate origin(const Lattice &_home);
41 
42  // NOTE: Coordinate does not have a default constructor
43  // e.g: this is not allowed-> Coordinate() : home(nullptr) { is_current[FRAC]=false; is_current[CART]=false;};
44 
46  explicit Coordinate(const Lattice &_home) :
47  m_home(&_home),
48  m_frac_coord(vector_type::Zero()),
49  m_cart_coord(vector_type::Zero()),
50  m_basis_ind(-1) {
51  }
52 
53  Coordinate(const vector_type &_vec, const Lattice &_home, COORD_TYPE _mode);
54 
55  Coordinate(double _x, double _y, double _z, const Lattice &_home, COORD_TYPE _mode);
56 
59 
61  const vector_type &frac() const {
62  return m_frac_coord;
63  }
64 
66  const vector_type &const_frac() const {
67  return m_frac_coord;
68  }
69 
72 
74  const double &frac(size_type index) const {
75  return m_frac_coord(index);
76  }
77 
79  const double &const_frac(size_type index) const {
80  return m_frac_coord(index);
81  }
82 
85 
87  const vector_type &cart() const {
88  return m_cart_coord;
89  }
90 
92  const vector_type &const_cart() const {
93  return m_cart_coord;
94  }
95 
98 
100  const double &cart(size_type index) const {
101  return m_cart_coord(index);
102  }
103 
105  const double &const_cart(size_type index) const {
106  return m_cart_coord(index);
107  }
108 
110  Coordinate &operator+=(const Coordinate &RHS);
111 
113  Coordinate &operator-=(const Coordinate &RHS);
114 
116  Coordinate operator-() const;
117 
118  bool operator==(const Coordinate &RHS) const;
119 
120  bool operator!=(const Coordinate &RHS) const {
121  return !(*this == RHS);
122  }
123 
124  bool almost_equal(const Coordinate &RHS, double tol) const;
125 
127  bool compare(const Coordinate &RHS, double tol = TOL) const;
128 
132  bool compare(const Coordinate &RHS, Coordinate &translation, double tol = TOL) const;
133 
135  bool compare_type(const Coordinate &RHS)const;
136 
139  bool within();
140 
144  bool within(Coordinate &translation);
145 
147  bool is_within() const;
148 
151  int voronoi_number() const;
152 
155  int voronoi_number(const Lattice &cell) const;
156 
158  bool voronoi_within();
159 
163  bool voronoi_within(Coordinate &translation);
164 
166  bool is_lattice_shift(double tol = TOL) const;
167 
182  void set_lattice(const Lattice &new_lat, COORD_TYPE mode); //John G, use to specify whether to keep CART or FRAC the same, when assigning a new lattice
183 
185  void set_basis_ind(Index _basis_ind) {
186  m_basis_ind = _basis_ind;
187  }
188 
190  Index basis_ind() const {
191  return m_basis_ind;
192  }
193 
195  const Lattice &home() const {
196  assert(m_home && "Coordinate doesn't have valid home lattice");
197  return *m_home;
198  }
199 
200  //term is terminal character, prec is precision, pad is field width - precision (should be greater than 3)
201  void read(std::istream &stream, COORD_TYPE mode);
202  void print(std::ostream &stream, COORD_TYPE mode, char term = 0, int prec = 7, int pad = 5) const;
203  void print(std::ostream &stream, char term = 0, int prec = 7, int pad = 5) const;
204 
206  void print_axis(std::ostream &stream, COORD_TYPE mode, char term = 0, int prec = 7, int pad = 5) const;
207 
209  double dist(const Coordinate &neighbor) const;
210 
214  double min_dist(const Coordinate &neighbor) const;
215 
220  double min_dist(const Coordinate &neighbor, Coordinate &translation)const;
221 
226  double robust_min_dist(const Coordinate &neighbor) const;
227 
234  double robust_min_dist(const Coordinate &neighbor, Coordinate &translation)const;
235 
237  double min_dist2(const Coordinate &neighbor, const Eigen::Ref<const Eigen::Matrix3d> &metric) const;
238 
240  Coordinate &apply_sym(const SymOp &op); //AAB
241 
243  Coordinate &apply_sym_no_trans(const SymOp &op); //AAB
244 
245  jsonParser &to_json(jsonParser &json) const;
246  void from_json(const jsonParser &json);
247 
248  private:
249 
250  void _update_cart() {
252  }
253 
254 
255  void _update_frac() {
257  }
258 
259 
260  void _set_frac(const Eigen::Ref<const vector_type> &f) {
261  m_frac_coord = f;
262  _update_cart();
263  }
264 
265 
266  void _set_frac(size_type ind, double val) {
267  m_frac_coord[ind] = val;
268  _update_cart();
269  }
270 
271 
272  void _set_cart(const Eigen::Ref<const vector_type> &c) {
273  m_cart_coord = c;
274  _update_frac();
275  }
276 
277 
278  void _set_cart(size_type ind, double val) {
279  m_cart_coord[ind] = val;
280  _update_frac();
281  }
282 
287 
288  Lattice const *m_home;
289 
291 
293  };
294 
295  inline
297  return Coordinate(_home);
298  }
299 
300  jsonParser &to_json(const Coordinate &value, jsonParser &json);
301 
302  // Lattice must be set already
303  void from_json(Coordinate &value, const jsonParser &json);
304 
305  Coordinate operator*(const SymOp &LHS, const Coordinate &RHS); //AAB
306 
307  inline
308  Coordinate operator+(const Coordinate &LHS, const Coordinate &RHS) {
309  return Coordinate(LHS) += RHS;
310  }
311 
312  inline
313  Coordinate operator-(const Coordinate &LHS, const Coordinate &RHS) {
314  return Coordinate(LHS) -= RHS;
315  }
316 
319  namespace Coordinate_impl {
320 
332  public:
333 
334  explicit FracCoordinate(Coordinate &coord) :
335  m_coord(&coord) {}
336 
337 
338  FracCoordinate &operator=(const Eigen::Ref<const Coordinate::vector_type> &vec) {
339  m_coord->_set_frac(vec);
340  return *this;
341  }
342 
345  return *this;
346  }
347 
348  FracCoordinate &operator+=(const Eigen::Ref<const Coordinate::vector_type> &vec) {
349  (m_coord->m_frac_coord) += vec;
351  return *this;
352  }
353 
354  FracCoordinate &operator-=(const Eigen::Ref<const Coordinate::vector_type> &vec) {
355  (m_coord->m_frac_coord) -= vec;
357  return *this;
358  }
359 
360  FracCoordinate &operator*=(double val) {
361  (m_coord->m_frac_coord) *= val;
362  (m_coord->m_cart_coord) *= val;
363  return *this;
364  }
365 
366  FracCoordinate &operator/=(double val) {
367  (m_coord->m_frac_coord) /= val;
368  (m_coord->m_cart_coord) /= val;
369  return *this;
370  }
371 
372 
373  operator const Eigen::MatrixBase<Eigen::Vector3d> &() const {
374  return m_coord->m_frac_coord;
375  }
376 
377  operator const Eigen::Vector3d &() const {
378  return m_coord->m_frac_coord;
379  }
380 
381  operator Eigen::Ref<const Eigen::Vector3d> () const {
382  return m_coord->m_frac_coord;
383  }
384 
385  private:
386 
388  };
389 
404  public:
405 
407  m_coord(&coord), m_index(index) {}
408 
410  m_coord->_set_frac(m_index, val);
411  return *this;
412  }
413 
416  return *this;
417  }
418 
419 
422  return *this;
423  }
424 
427  return *this;
428  }
429 
432  return *this;
433  }
434 
437  return *this;
438  }
439 
440  operator const double &() const {
441  return m_coord->m_frac_coord(m_index);
442  }
443 
444  private:
445 
448  };
449 
461  public:
462 
463  explicit CartCoordinate(Coordinate &coord) :
464  m_coord(&coord) {}
465 
466  CartCoordinate &operator=(const Eigen::Ref<const Coordinate::vector_type> &vec) {
467  m_coord->_set_cart(vec);
468  return *this;
469  }
470 
473  return *this;
474  }
475 
476  CartCoordinate &operator+=(const Eigen::Ref<const Coordinate::vector_type> &vec) {
477  (m_coord->m_cart_coord) += vec;
479  return *this;
480  }
481 
482  CartCoordinate &operator-=(const Eigen::Ref<const Coordinate::vector_type> &vec) {
483  (m_coord->m_cart_coord) -= vec;
485  return *this;
486  }
487 
488  CartCoordinate &operator*=(double val) {
489  (m_coord->m_frac_coord) *= val;
490  (m_coord->m_cart_coord) *= val;
491  return *this;
492  }
493 
494  CartCoordinate &operator/=(double val) {
495  (m_coord->m_frac_coord) /= val;
496  (m_coord->m_cart_coord) /= val;
497  return *this;
498  }
499 
500  operator const Eigen::MatrixBase<Eigen::Vector3d> &() const {
501  return m_coord->m_cart_coord;
502  }
503 
504  operator const Eigen::Vector3d &() const {
505  return m_coord->m_cart_coord;
506  }
507 
508  operator Eigen::Ref<const Eigen::Vector3d> () const {
509  return m_coord->m_cart_coord;
510  }
511 
512 
513  private:
514 
516  };
517 
532  public:
533 
535  m_coord(&coord), m_index(index) {}
536 
538  m_coord->_set_cart(m_index, val);
539  return *this;
540  }
541 
544  return *this;
545  }
546 
549  return *this;
550  }
551 
554  return *this;
555  }
556 
559  return *this;
560  }
561 
564  return *this;
565  }
566 
567  operator const double &() const {
568  return m_coord->m_cart_coord(m_index);
569  }
570 
571  private:
572 
575  };
576  }
577 
578 
580  inline
582  return Coordinate_impl::FracCoordinate(*this);
583  }
584 
586  inline
588  return Coordinate_impl::FracCoordinateComponent(*this, index);
589  }
590 
592  inline
594  return Coordinate_impl::CartCoordinate(*this);
595  }
596 
598  inline
600  return Coordinate_impl::CartCoordinateComponent(*this, index);
601  }
602 
603 }
604 
605 namespace std {
606  template<>
607  struct is_floating_point<CASM::Coordinate_impl::FracCoordinateComponent> {
608  static const bool value = true;
609  };
610 
611  template<>
612  struct is_floating_point<CASM::Coordinate_impl::CartCoordinateComponent> {
613  static const bool value = true;
614  };
615 }
616 #endif
FracCoordinate & operator+=(const Eigen::Ref< const Coordinate::vector_type > &vec)
Definition: Coordinate.hh:348
A class to enable assignment to a component of the Cartesian vector of a Coordinate.
Definition: Coordinate.hh:531
Coordinate & operator-=(const Coordinate &RHS)
Negative translation of this coordinate by RHS.cart()
Definition: Coordinate.cc:45
const vector_type & frac() const
const Access the fractional coordinate vector
Definition: Coordinate.hh:61
Eigen::MatrixXd pad(const Eigen::MatrixXd &M, int n)
Construct a matrix consisting of blocks M and Identity(n,n)
Definition: PCA.hh:88
FracCoordinateComponent & operator/=(double val)
Definition: Coordinate.hh:435
jsonParser & to_json(jsonParser &json) const
Definition: Coordinate.cc:383
CartCoordinate & operator*=(double val)
Definition: Coordinate.hh:488
const double & const_cart(size_type index) const
const Access a component of the Cartesian coordinate vector
Definition: Coordinate.hh:105
void set_basis_ind(Index _basis_ind)
Set basis Index.
Definition: Coordinate.hh:185
bool voronoi_within()
Map coordinate into the voronoi cell using a lattice translation.
Definition: Coordinate.cc:333
FracCoordinate & operator*=(double val)
Definition: Coordinate.hh:360
void from_json(ClexDescription &desc, const jsonParser &json)
Coordinate_impl::CartCoordinate cart()
Set Cartesian coordinate vector and update fractional coordinate vector.
Definition: Coordinate.hh:593
bool is_lattice_shift(double tol=TOL) const
Checks to see if coordinate is at a lattice translation with respect to the origin.
Definition: Coordinate.cc:367
Coordinate operator-() const
unary minus of this coordinate
Definition: Coordinate.cc:53
const double & frac(size_type index) const
const Access a component of the fractional coordinate vector
Definition: Coordinate.hh:74
FracCoordinate & operator=(const Eigen::Ref< const Coordinate::vector_type > &vec)
Definition: Coordinate.hh:338
CartCoordinateComponent & operator/=(double val)
Definition: Coordinate.hh:562
jsonParser & to_json(const ClexDescription &desc, jsonParser &json)
CartCoordinate & operator=(const CartCoordinate &RHS)
Definition: Coordinate.hh:471
double dist(const Coordinate &neighbor) const
distance (in Angstr) of neighbor from *this
Definition: Coordinate.cc:146
CartCoordinate & operator+=(const Eigen::Ref< const Coordinate::vector_type > &vec)
Definition: Coordinate.hh:476
FracCoordinate & operator=(const FracCoordinate &RHS)
Definition: Coordinate.hh:343
FracCoordinateComponent & operator-=(double val)
Definition: Coordinate.hh:425
Main CASM namespace.
Definition: complete.cpp:8
Coordinate & apply_sym(const SymOp &op)
Transform coordinate by symmetry operation (including translation)
Definition: Coordinate.cc:216
const double TOL
CartCoordinate & operator/=(double val)
Definition: Coordinate.hh:494
const Eigen::Matrix3d & lat_column_mat() const
3x3 matrix with lattice vectors as its columne
Definition: Lattice.hh:104
void from_json(const jsonParser &json)
Definition: Coordinate.cc:398
const vector_type & const_cart() const
user override to force const Access the Cartesian coordinate vector
Definition: Coordinate.hh:92
FracCoordinateComponent & operator+=(double val)
Definition: Coordinate.hh:420
GenericCluster< CoordType > operator+(const GenericCluster< CoordType > &LHS, const Coordinate &RHS)
create translated cluster
const double & const_frac(size_type index) const
user override to force const Access the fractional coordinate vector
Definition: Coordinate.hh:79
const vector_type & const_frac() const
user override to force const Access the fractional coordinate vector
Definition: Coordinate.hh:66
GenericCluster< CoordType > operator-(const GenericCluster< CoordType > &LHS, const Coordinate &RHS)
create translated cluster
vector_type m_frac_coord
Definition: Coordinate.hh:290
static Coordinate origin(const Lattice &_home)
construct a coordinate describing origin of _home lattice
Definition: Coordinate.hh:296
void _set_cart(size_type ind, double val)
Definition: Coordinate.hh:278
CartCoordinateComponent & operator+=(double val)
Definition: Coordinate.hh:547
CartCoordinate & operator-=(const Eigen::Ref< const Coordinate::vector_type > &vec)
Definition: Coordinate.hh:482
FracCoordinateComponent & operator=(double val)
Definition: Coordinate.hh:409
double tol
int voronoi_number() const
Definition: Coordinate.cc:317
const Eigen::Matrix3d & inv_lat_column_mat() const
Inverse of Lattice::lat_column_mat() It is the transformation matrix 'C2F', such that f = C2F * c whe...
Definition: Lattice.hh:113
A class to enable assignment to a component of the fractional vector of a Coordinate.
Definition: Coordinate.hh:403
CartCoordinateComponent & operator=(const CartCoordinateComponent &RHS)
Definition: Coordinate.hh:542
bool operator==(const Coordinate &RHS) const
Definition: Coordinate.cc:59
double min_dist(const Coordinate &neighbor) const
Returns distance (in Angstr) to nearest periodic image of neighbor.
Definition: Coordinate.cc:155
void _set_frac(const Eigen::Ref< const vector_type > &f)
Definition: Coordinate.hh:260
SymOp is the Coordinate representation of a symmetry operation it keeps fraction (FRAC) and Cartesian...
Definition: SymOp.hh:28
BasisSet operator*(const SymOp &LHS, const BasisSet &RHS)
Definition: BasisSet.cc:1154
Represents cartesian and fractional coordinates.
Definition: Coordinate.hh:34
Coordinate & apply_sym_no_trans(const SymOp &op)
Transform coordinate by symmetry operation (without translation)
Definition: Coordinate.cc:226
EigenIndex Index
For long integer indexing:
A class to enable vector assignment to the Cartesian vector of a Coordinate.
Definition: Coordinate.hh:460
FracCoordinateComponent(Coordinate &coord, Coordinate::size_type index)
Definition: Coordinate.hh:406
void print(std::ostream &stream, COORD_TYPE mode, char term=0, int prec=7, int pad=5) const
Definition: Coordinate.cc:112
Eigen::Vector3d vector_type
Definition: Coordinate.hh:36
CartCoordinateComponent(Coordinate &coord, Coordinate::size_type index)
Definition: Coordinate.hh:534
Coordinate & operator+=(const Coordinate &RHS)
Positive translation of this coordinate by RHS.cart()
Definition: Coordinate.cc:38
double robust_min_dist(const Coordinate &neighbor) const
Returns distance (in Angstr) to nearest periodic image of neighbor.
Definition: Coordinate.cc:179
FracCoordinateComponent & operator*=(double val)
Definition: Coordinate.hh:430
bool is_within() const
Checks to see if coordinate is in the unit cell, but does not translate it.
Definition: Coordinate.cc:301
void read(std::istream &stream, COORD_TYPE mode)
Definition: Coordinate.cc:92
void set_lattice(const Lattice &new_lat, COORD_TYPE mode)
Change the home lattice of the coordinate, selecting one representation (either CART or FRAC) that re...
Definition: Coordinate.cc:245
void _set_cart(const Eigen::Ref< const vector_type > &c)
Definition: Coordinate.hh:272
FracCoordinate & operator-=(const Eigen::Ref< const Coordinate::vector_type > &vec)
Definition: Coordinate.hh:354
bool operator!=(const Coordinate &RHS) const
Definition: Coordinate.hh:120
CartCoordinateComponent & operator=(double val)
Definition: Coordinate.hh:537
CartCoordinateComponent & operator-=(double val)
Definition: Coordinate.hh:552
bool compare_type(const Coordinate &RHS) const
Return true – Exists to allow duck-typing with Site.
Definition: Coordinate.cc:86
vector_type::Index size_type
Definition: Coordinate.hh:37
bool compare(const Coordinate &RHS, double tol=TOL) const
Returns true if this->min_dist(RHS)
Definition: Coordinate.cc:73
const double & cart(size_type index) const
const Access a component of the Cartesian coordinate vector
Definition: Coordinate.hh:100
Index basis_ind() const
Access basis Index.
Definition: Coordinate.hh:190
bool almost_equal(const Coordinate &RHS, double tol) const
Definition: Coordinate.cc:66
const vector_type & cart() const
const Access the Cartesian coordinate vector
Definition: Coordinate.hh:87
FracCoordinateComponent & operator=(const FracCoordinateComponent &RHS)
Definition: Coordinate.hh:414
A class to enable vector assignment to the fractional vector of a Coordinate.
Definition: Coordinate.hh:331
Coordinate_impl::FracCoordinate frac()
Set the fractional coordinate vector.
Definition: Coordinate.hh:581
void print_axis(std::ostream &stream, COORD_TYPE mode, char term=0, int prec=7, int pad=5) const
Print normalized vector.
Definition: Coordinate.cc:129
const Lattice & home() const
Access the home lattice of the coordinate.
Definition: Coordinate.hh:195
Lattice const * m_home
Definition: Coordinate.hh:288
FracCoordinate & operator/=(double val)
Definition: Coordinate.hh:366
vector_type m_cart_coord
Definition: Coordinate.hh:290
double min_dist2(const Coordinate &neighbor, const Eigen::Ref< const Eigen::Matrix3d > &metric) const
Finds same shift as min_dist but returns shift(CART).transpose()*metric*shift(CART) ...
Definition: Coordinate.cc:205
Coordinate(const Lattice &_home)
Minimal constructor only takes a lattice.
Definition: Coordinate.hh:46
CartCoordinateComponent & operator*=(double val)
Definition: Coordinate.hh:557
void _set_frac(size_type ind, double val)
Definition: Coordinate.hh:266
CartCoordinate & operator=(const Eigen::Ref< const Coordinate::vector_type > &vec)
Definition: Coordinate.hh:466