CASM
AClustersApproachtoStatisticalMechanics
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules
Coordinate_test.cpp
Go to the documentation of this file.
1 #define BOOST_TEST_DYN_LINK
2 #include <boost/test/unit_test.hpp>
3 
6 
7 using namespace CASM;
8 
11  double tol = 1e-5;
12  Coordinate::vector_type tvec(0.1, 0.2, 0.3);
13 
14  {
15  // Make sure that new Coordinate gets correct default values
16  // could introduce bugs if this changes
17  Coordinate tcoord(lat);
18  BOOST_CHECK(almost_zero(tcoord.const_frac(), tol));
19  BOOST_CHECK(almost_zero(tcoord.const_cart(), tol));
20  BOOST_CHECK_EQUAL(tcoord.basis_ind(), Coordinate::size_type(-1));
21  BOOST_CHECK_EQUAL(&(tcoord.home()), &lat);
22  }
23 
24  {
25  Coordinate tcoord(tvec, lat, CART);
26  BOOST_CHECK(almost_equal(tcoord.const_cart(), tvec, tol));
27  BOOST_CHECK(almost_equal(tcoord.const_frac(), lat.inv_lat_column_mat()*tvec, tol));
28  BOOST_CHECK_EQUAL(tcoord.basis_ind(), Coordinate::size_type(-1));
29  BOOST_CHECK_EQUAL(&(tcoord.home()), &lat);
30  }
31 
32  {
33  Coordinate tcoord(tvec, lat, FRAC);
34  BOOST_CHECK(almost_equal(tcoord.const_frac(), tvec, tol));
35  BOOST_CHECK(almost_equal(tcoord.const_cart(), lat.lat_column_mat()*tvec, tol));
36  BOOST_CHECK_EQUAL(tcoord.basis_ind(), Coordinate::size_type(-1));
37  BOOST_CHECK_EQUAL(&(tcoord.home()), &lat);
38  }
39 
40  {
41  Coordinate tcoord(0.1, 0.2, 0.3, lat, CART);
42  BOOST_CHECK(almost_equal(tcoord.const_cart(), tvec, tol));
43  BOOST_CHECK(almost_equal(tcoord.const_frac(), lat.inv_lat_column_mat()*tvec, tol));
44  BOOST_CHECK_EQUAL(tcoord.basis_ind(), Coordinate::size_type(-1));
45  BOOST_CHECK_EQUAL(&(tcoord.home()), &lat);
46  }
47 
48  {
49  Coordinate tcoord(0.1, 0.2, 0.3, lat, FRAC);
50  BOOST_CHECK(almost_equal(tcoord.const_frac(), tvec, tol));
51  BOOST_CHECK(almost_equal(tcoord.const_cart(), lat.lat_column_mat()*tvec, tol));
52  BOOST_CHECK_EQUAL(tcoord.basis_ind(), Coordinate::size_type(-1));
53  BOOST_CHECK_EQUAL(&(tcoord.home()), &lat);
54  }
55 }
56 
59  double tol = 1e-5;
60 
61  Coordinate::vector_type vec1(0.1, 0.2, 0.3);
62  Coordinate::vector_type vec2(0.6, 0.4, 0.2);
64  {
65  Coordinate coord1(lat);
66  coord1.frac() = vec2;
67  BOOST_CHECK(almost_equal(coord1.const_frac(), vec2, tol));
68  BOOST_CHECK(almost_equal(coord1.const_cart(), lat.lat_column_mat()*vec2, tol));
69  }
70 
72  {
73  Coordinate coord1(lat);
74  coord1.frac(0) = vec2[0];
75  coord1.frac(1) = vec2[1];
76  coord1.frac(2) = vec2[2];
77  BOOST_CHECK(almost_equal(coord1.const_frac(), vec2, tol));
78  BOOST_CHECK(almost_equal(coord1.const_cart(), lat.lat_column_mat()*vec2, tol));
79  }
80 
82  {
83  Coordinate coord1(lat);
84  coord1.cart() = vec2;
85 
86  BOOST_CHECK(almost_equal(coord1.const_cart(), vec2, tol));
87  BOOST_CHECK(almost_equal(coord1.const_frac(), lat.inv_lat_column_mat()*vec2, tol));
88  }
89 
91  {
92  Coordinate coord1(lat);
93  coord1.cart(0) = vec2[0];
94  coord1.cart(1) = vec2[1];
95  coord1.cart(2) = vec2[2];
96 
97  BOOST_CHECK(almost_equal(coord1.const_cart(), vec2, tol));
98  BOOST_CHECK(almost_equal(coord1.const_frac(), lat.inv_lat_column_mat()*vec2, tol));
99  }
100 
101  Coordinate coord1(vec1, lat, CART);
102  Coordinate coord2(vec2, lat, CART);
103 
105  {
106  Coordinate tcoord(coord1);
107  tcoord.frac() = coord2.frac();
108  BOOST_CHECK(almost_equal(tcoord.const_cart(), coord2.const_cart(), tol));
109  BOOST_CHECK(almost_equal(tcoord.const_frac(), coord2.const_frac(), tol));
110  }
111 
113  {
114  Coordinate tcoord(coord1);
115  tcoord.frac(0) = coord2.frac(0);
116  tcoord.frac(1) = coord2.frac(1);
117  tcoord.frac(2) = coord2.frac(2);
118  BOOST_CHECK(almost_equal(tcoord.const_cart(), coord2.const_cart(), tol));
119  BOOST_CHECK(almost_equal(tcoord.const_frac(), coord2.const_frac(), tol));
120  }
121 
123  {
124  Coordinate tcoord(coord1);
125  tcoord.cart(0) = coord2.cart(0);
126  tcoord.cart(1) = coord2.cart(1);
127  tcoord.cart(2) = coord2.cart(2);
128 
129  BOOST_CHECK(almost_equal(tcoord.const_cart(), coord2.const_cart(), tol));
130  BOOST_CHECK(almost_equal(tcoord.const_frac(), coord2.const_frac(), tol));
131  }
132 
134  {
135  Coordinate tcoord(lat);
136  tcoord = -coord2;
137  BOOST_CHECK(almost_equal(tcoord.const_cart(), -coord2.const_cart(), tol));
138  BOOST_CHECK(almost_equal(tcoord.const_frac(), -coord2.const_frac(), tol));
139  }
140 
142  {
143  Coordinate tcoord(coord1);
144  tcoord += coord2;
145  BOOST_CHECK(almost_equal(tcoord.const_cart(), vec1 + vec2, tol));
146  BOOST_CHECK(almost_equal(tcoord.const_frac(), lat.inv_lat_column_mat() * (vec1 + vec2), tol));
147  }
148 
150  {
151  Coordinate tcoord(coord1);
152  tcoord -= coord2;
153  BOOST_CHECK(almost_equal(tcoord.const_cart(), vec1 - vec2, tol));
154  BOOST_CHECK(almost_equal(tcoord.const_frac(), lat.inv_lat_column_mat() * (vec1 - vec2), tol));
155  }
156 
158  {
159  Coordinate tcoord(coord1);
160  BOOST_CHECK(tcoord == coord1);
161  BOOST_CHECK(!(tcoord == coord2));
162 
163  BOOST_CHECK(tcoord != coord2);
164  BOOST_CHECK(!(tcoord != coord1));
165  }
166 }
167 
170  double tol = 1e-5;
171 
173  {
174  Coordinate::vector_type vec1(0.1, 0.2, 0.3);
175  Coordinate::vector_type vec2(0.5, 0.35, 0.2);
176  Coordinate coord1(vec1, lat, FRAC);
177  Coordinate coord2(vec2, lat, FRAC);
178  // 27 translations
179  EigenCounter<Eigen::Vector3i> trans_count(Eigen::Vector3i(-2, -2, -2),
180  Eigen::Vector3i(2, 2, 2),
181  Eigen::Vector3i(2, 2, 2));
182  Coordinate transcoord1(lat);
183  Coordinate nearest_trans(lat);
184  for(; trans_count.valid(); ++trans_count) {
185  transcoord1.frac() = trans_count().cast<double>() + coord1.const_frac();
186 
187  // commutativity of min_dist from transcoord1 to coord2
188  BOOST_CHECK(almost_equal(transcoord1.min_dist(coord2), coord2.min_dist(transcoord1), tol));
189 
190  // minimality of min_dist
191  BOOST_CHECK((transcoord1.min_dist(coord2) - (coord1.const_cart() - coord2.const_cart()).norm()) < tol);
192 
193  // min_dist transcoord1 to coord1
194  BOOST_CHECK(almost_zero(transcoord1.min_dist(coord1), tol));
195  BOOST_CHECK(almost_zero(coord1.min_dist(transcoord1), tol));
196 
197  // min_dist transcoord1 to coord1 w/ translation check
198  BOOST_CHECK(almost_zero(transcoord1.min_dist(coord1, nearest_trans), tol));
199  BOOST_CHECK(almost_zero(nearest_trans.const_frac(), tol));
200 
201  // min_dist coord1 to transcoord1 w/ translation check
202  BOOST_CHECK(almost_zero(coord1.min_dist(transcoord1, nearest_trans), tol));
203  BOOST_CHECK(almost_zero(nearest_trans.const_frac(), tol));
204 
205  }
206  }
207 
209  {
210  Coordinate::vector_type vec1(1.1, 2.1, 3.1);
211  Coordinate coord1(vec1, lat, FRAC);
212 
213  // 180 points inside the primitive cell
214  EigenCounter<Eigen::Vector3d> point_count(Eigen::Vector3d(0., 0., 0.),
215  Eigen::Vector3d(1., 1., 1.),
216  Eigen::Vector3d(0.2, 0.2, 0.25));
217  for(; point_count.valid(); ++point_count) {
218  Coordinate coord2(point_count(), lat, FRAC);
219  // optimality of robust_min_dist
220  BOOST_CHECK(coord1.robust_min_dist(coord2) < (coord1.min_dist(coord2) + tol));
221 
222  // commutativity of robust_min_dist
223  BOOST_CHECK(almost_equal(coord2.robust_min_dist(coord1), coord1.robust_min_dist(coord2), tol));
224  Coordinate trans(lat);
225 
226  // equivalence of both versions of robust_min_dist
227  BOOST_CHECK(almost_equal(coord2.robust_min_dist(coord1, trans), coord1.robust_min_dist(coord2), tol));
228  BOOST_CHECK(almost_equal(coord2.robust_min_dist(coord1), coord1.robust_min_dist(coord2, trans), tol));
229 
230  BOOST_CHECK(almost_equal(trans.const_cart().norm(), coord2.robust_min_dist(coord1)));
231  }
232 
233  Eigen::MatrixXd const &vtable = lat.voronoi_table();
234  Coordinate zero_coord(Eigen::Vector3d::Zero(), lat, FRAC);
235 
236  // check robustness of edge cases
237  for(Index i = 0; i < vtable.rows(); i++) {
238  {
239  Coordinate coord2((1 + tol / 2.)*vtable.row(i).transpose() / vtable.row(i).squaredNorm(), lat, CART);
240  BOOST_CHECK(coord2.robust_min_dist(zero_coord) <= coord2.const_cart().norm());
241  }
242  {
243  Coordinate coord2((1 - tol / 2.)*vtable.row(i).transpose() / vtable.row(i).squaredNorm(), lat, CART);
244  BOOST_CHECK(almost_equal(coord2.robust_min_dist(zero_coord), coord2.const_cart().norm(), tol / 2));
245  }
246  }
247  }
248 }
249 
250 BOOST_AUTO_TEST_SUITE(CoordinateTest)
251 
252 BOOST_AUTO_TEST_CASE(ConstructorTest) {
254 }
255 
256 BOOST_AUTO_TEST_CASE(OperationTest) {
258 }
259 
260 BOOST_AUTO_TEST_CASE(PeriodicityTest) {
262 }
263 
264 
265 BOOST_AUTO_TEST_SUITE_END()
Eigen::MatrixXd MatrixXd
bool almost_zero(const T &val, double tol=TOL)
If T is not integral, use std::abs(val) < tol;.
Definition: CASM_math.hh:41
A Counter allows looping over many incrementing variables in one loop.
Definition: Counter.hh:71
Coordinate_impl::CartCoordinate cart()
Set Cartesian coordinate vector and update fractional coordinate vector.
Definition: Coordinate.hh:593
static Lattice hexagonal()
Construct cubic primitive cell of unit volume.
Definition: Lattice.cc:75
void coordinate_constructor_test()
Eigen::MatrixXd const & voronoi_table() const
Return voronoi table, which specifies outward-pointing normals of Lattice Voronoi cell...
Definition: Lattice.hh:90
Main CASM namespace.
Definition: complete.cpp:8
const Eigen::Matrix3d & lat_column_mat() const
3x3 matrix with lattice vectors as its columne
Definition: Lattice.hh:104
const vector_type & const_cart() const
user override to force const Access the Cartesian coordinate vector
Definition: Coordinate.hh:92
const vector_type & const_frac() const
user override to force const Access the fractional coordinate vector
Definition: Coordinate.hh:66
double tol
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
double min_dist(const Coordinate &neighbor) const
Returns distance (in Angstr) to nearest periodic image of neighbor.
Definition: Coordinate.cc:155
void coordinate_operation_test()
Represents cartesian and fractional coordinates.
Definition: Coordinate.hh:34
T norm(const Tensor< T > &ttens)
Definition: Tensor.hh:968
EigenIndex Index
For long integer indexing:
Eigen::Vector3d vector_type
Definition: Coordinate.hh:36
double robust_min_dist(const Coordinate &neighbor) const
Returns distance (in Angstr) to nearest periodic image of neighbor.
Definition: Coordinate.cc:179
void coordinate_periodicity_test()
vector_type::Index size_type
Definition: Coordinate.hh:37
Index basis_ind() const
Access basis Index.
Definition: Coordinate.hh:190
Coordinate_impl::FracCoordinate frac()
Set the fractional coordinate vector.
Definition: Coordinate.hh:581
const Lattice & home() const
Access the home lattice of the coordinate.
Definition: Coordinate.hh:195
bool almost_equal(const GenericCluster< CoordType > &LHS, const GenericCluster< CoordType > &RHS, double tol)
BOOST_AUTO_TEST_CASE(ConstructorTest)