crystalcell 0.0.0 → 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/test/test_atom.rb CHANGED
@@ -1,210 +1,206 @@
1
1
  #! /usr/bin/ruby
2
2
 
3
- require "test/unit"
4
- require "crystalcell/atom.rb"
5
- require "rubygems"
6
- gem "mageo"
7
- require "mageo/vector3d.rb"
3
+ require "helper"
8
4
 
9
5
  class TC_Atom < Test::Unit::TestCase
10
- $tolerance = 10.0 ** (-10)
11
-
12
- def setup
13
- @a0 = Atom.new("Li", [ 0.0, 0.0, 0.0 ])
14
- @a1 = Atom.new("Li", [ 1.0, 1.0, 1.0 ])
15
- @a2 = Atom.new("Li", [ 0.0, 0.0, 0.0 ])
16
- @a3 = Atom.new("Be", [ 0.0, 0.0, 0.0 ])
17
- @a4 = Atom.new("Li", [ 1.0, 2.3, 4.5 ])
18
- @a5 = Atom.new("Li", [-1.0,-2.3,-4.5 ])
19
- @a6 = Atom.new( 3, [-1.0,-2.3,-4.5 ])
20
- end
21
-
22
- def test_initialize
23
- assert_raise(Atom::TypeError){ Atom.new(nil, nil, nil) }
24
- assert_raise(Atom::TypeError){ Atom.new(nil, nil, "A") }
25
- assert_raise(Atom::TypeError){ Atom.new(nil, [0.0, 0.0], "A") }
26
- assert_raise(Atom::TypeError){ Atom.new(nil, [0.0, 0.0, 0.0, 0.0], "A") }
27
- a0 = Atom.new(nil, [ 0.0, 0.0, 0.0], nil)
28
- a1 = Atom.new(nil, [ 0.0, 0.0, 0.0], "A")
29
- assert_equal(nil, a0.name)
30
- assert_equal("A", a1.name)
31
- end
32
-
33
- def test_equal_in_delta?
34
- assert_equal(true , Atom.equal_in_delta?(@a0, @a0))
35
- assert_equal(false, Atom.equal_in_delta?(@a0, @a1))
36
- assert_equal(true , Atom.equal_in_delta?(@a0, @a2))
37
- assert_equal(false, Atom.equal_in_delta?(@a0, @a3))
38
- assert_equal(false, Atom.equal_in_delta?(@a1, @a0))
39
- assert_equal(true , Atom.equal_in_delta?(@a1, @a1))
40
- assert_equal(false, Atom.equal_in_delta?(@a1, @a2))
41
- assert_equal(false, Atom.equal_in_delta?(@a1, @a3))
42
- assert_equal(true , Atom.equal_in_delta?(@a2, @a0))
43
- assert_equal(false, Atom.equal_in_delta?(@a2, @a1))
44
- assert_equal(true , Atom.equal_in_delta?(@a2, @a2))
45
- assert_equal(false, Atom.equal_in_delta?(@a2, @a3))
46
- assert_equal(false, Atom.equal_in_delta?(@a3, @a0))
47
- assert_equal(false, Atom.equal_in_delta?(@a3, @a1))
48
- assert_equal(false, Atom.equal_in_delta?(@a3, @a2))
49
- assert_equal(true , Atom.equal_in_delta?(@a3, @a3))
50
-
51
- assert_equal(true , Atom.equal_in_delta?(@a0, @a0, 2.0))
52
- assert_equal(true , Atom.equal_in_delta?(@a0, @a1, 2.0))
53
- assert_equal(true , Atom.equal_in_delta?(@a0, @a2, 2.0))
54
- assert_equal(false, Atom.equal_in_delta?(@a0, @a3, 2.0))
55
- assert_equal(true , Atom.equal_in_delta?(@a1, @a0, 2.0))
56
- assert_equal(true , Atom.equal_in_delta?(@a1, @a1, 2.0))
57
- assert_equal(true , Atom.equal_in_delta?(@a1, @a2, 2.0))
58
- assert_equal(false, Atom.equal_in_delta?(@a1, @a3, 2.0))
59
- assert_equal(true , Atom.equal_in_delta?(@a2, @a0, 2.0))
60
- assert_equal(true , Atom.equal_in_delta?(@a2, @a1, 2.0))
61
- assert_equal(true , Atom.equal_in_delta?(@a2, @a2, 2.0))
62
- assert_equal(false, Atom.equal_in_delta?(@a2, @a3, 2.0))
63
- assert_equal(false, Atom.equal_in_delta?(@a3, @a0, 2.0))
64
- assert_equal(false, Atom.equal_in_delta?(@a3, @a1, 2.0))
65
- assert_equal(false, Atom.equal_in_delta?(@a3, @a2, 2.0))
66
- assert_equal(true , Atom.equal_in_delta?(@a3, @a3, 2.0))
67
-
68
- assert_equal(true , @a0.equal_in_delta?(@a0))
69
- assert_equal(false, @a0.equal_in_delta?(@a1))
70
- assert_equal(true , @a0.equal_in_delta?(@a2))
71
- assert_equal(false, @a0.equal_in_delta?(@a3))
72
- assert_equal(false, @a1.equal_in_delta?(@a0))
73
- assert_equal(true , @a1.equal_in_delta?(@a1))
74
- assert_equal(false, @a1.equal_in_delta?(@a2))
75
- assert_equal(false, @a1.equal_in_delta?(@a3))
76
- assert_equal(true , @a2.equal_in_delta?(@a0))
77
- assert_equal(false, @a2.equal_in_delta?(@a1))
78
- assert_equal(true , @a2.equal_in_delta?(@a2))
79
- assert_equal(false, @a2.equal_in_delta?(@a3))
80
- assert_equal(false, @a3.equal_in_delta?(@a0))
81
- assert_equal(false, @a3.equal_in_delta?(@a1))
82
- assert_equal(false, @a3.equal_in_delta?(@a2))
83
- assert_equal(true , @a3.equal_in_delta?(@a3))
84
-
85
- assert_equal(true , @a0.equal_in_delta?(@a0, 2.0))
86
- assert_equal(true , @a0.equal_in_delta?(@a1, 2.0))
87
- assert_equal(true , @a0.equal_in_delta?(@a2, 2.0))
88
- assert_equal(false, @a0.equal_in_delta?(@a3, 2.0))
89
- assert_equal(true , @a1.equal_in_delta?(@a0, 2.0))
90
- assert_equal(true , @a1.equal_in_delta?(@a1, 2.0))
91
- assert_equal(true , @a1.equal_in_delta?(@a2, 2.0))
92
- assert_equal(false, @a1.equal_in_delta?(@a3, 2.0))
93
- assert_equal(true , @a2.equal_in_delta?(@a0, 2.0))
94
- assert_equal(true , @a2.equal_in_delta?(@a1, 2.0))
95
- assert_equal(true , @a2.equal_in_delta?(@a2, 2.0))
96
- assert_equal(false, @a2.equal_in_delta?(@a3, 2.0))
97
- assert_equal(false, @a3.equal_in_delta?(@a0, 2.0))
98
- assert_equal(false, @a3.equal_in_delta?(@a1, 2.0))
99
- assert_equal(false, @a3.equal_in_delta?(@a2, 2.0))
100
- assert_equal(true , @a3.equal_in_delta?(@a3, 2.0))
101
- end
102
-
103
- def test_equal
104
- assert_equal(true, @a0 == Atom.new("Li", [0.0, 0.0, 0.0]))
105
- assert_equal(true, @a1 == Atom.new("Li", [1.0, 1.0, 1.0]))
106
- assert_equal(true, @a2 == Atom.new("Li", [0.0, 0.0, 0.0]))
107
- assert_equal(true, @a3 == Atom.new("Be", [0.0, 0.0, 0.0]))
108
-
109
- assert_equal(false, @a0 == Atom.new("Li", [0.9, 0.0, 0.0]))
110
- assert_equal(false, @a1 == Atom.new("Li", [1.1, 1.0, 1.0]))
111
- assert_equal(false, @a2 == Atom.new("Li", [0.9, 0.0, 0.0]))
112
- assert_equal(false, @a3 == Atom.new("Be", [0.9, 0.0, 0.0]))
113
- end
114
-
115
- def test_internal_coordinates
116
- assert_equal(Vector3DInternal[ 0.0, 0.0, 0.0 ], @a0.internal_coordinates)
117
- assert_equal(Vector3DInternal[ 0.0, 0.0, 0.0 ], @a1.internal_coordinates)
118
- assert_equal(Vector3DInternal[ 0.0, 0.0, 0.0 ], @a2.internal_coordinates)
119
- assert_equal(Vector3DInternal[ 0.0, 0.0, 0.0 ], @a3.internal_coordinates)
120
-
121
- assert_equal(Vector3DInternal, @a4.internal_coordinates.class)
122
- assert_in_delta(0.0, @a4.internal_coordinates[0], $tolerance)
123
- assert_in_delta(0.3, @a4.internal_coordinates[1], $tolerance)
124
- assert_in_delta(0.5, @a4.internal_coordinates[2], $tolerance)
125
-
126
- assert_equal(Vector3DInternal, @a5.internal_coordinates.class)
127
- assert_in_delta(0.0, @a5.internal_coordinates[0], $tolerance)
128
- assert_in_delta(0.7, @a5.internal_coordinates[1], $tolerance)
129
- assert_in_delta(0.5, @a5.internal_coordinates[2], $tolerance)
130
- end
131
-
132
- def test_translation_symmetry_operation
133
- assert_equal(Vector3DInternal[ 0, 0, 0 ], @a0.translation_symmetry_operation)
134
- assert_equal(Vector3DInternal[ 1, 1, 1 ], @a1.translation_symmetry_operation)
135
- assert_equal(Vector3DInternal[ 0, 0, 0 ], @a2.translation_symmetry_operation)
136
- assert_equal(Vector3DInternal[ 0, 0, 0 ], @a3.translation_symmetry_operation)
137
- assert_equal(Vector3DInternal[ 1, 2, 4 ], @a4.translation_symmetry_operation)
138
- assert_equal(Vector3DInternal[-1,-3,-5 ], @a5.translation_symmetry_operation)
139
- end
140
-
141
- def test_set_position
142
- assert_equal(Vector3DInternal[ 1.2, 2.3, 3.4 ], @a3.set_position([ 1.2, 2.3, 3.4 ]))
143
- assert_equal(Vector3DInternal[ 2.3, 3.4, 4.5 ], @a4.set_position([ 2.3, 3.4, 4.5 ]))
144
- assert_raise(Atom::TypeError){
145
- @a4.set_position(Vector3D[ 2.3, 3.4, 4.5 ])
146
- }
147
- end
148
-
149
- def test_element
150
- @a6.element = "Li"
151
- assert_equal(@a5, @a6)
152
- end
153
-
154
- def test_translate!
155
- @a0.translate!([ 1.2, 3.4, 5.6 ])
156
- assert_equal("Li", @a0.element)
157
- assert_in_delta(1.2 , @a0.position[0], $tolerance)
158
- assert_in_delta(3.4 , @a0.position[1], $tolerance)
159
- assert_in_delta(5.6 , @a0.position[2], $tolerance)
160
-
161
- @a3.translate!([ 1.2, 3.4, 5.6 ])
162
- assert_equal("Be", @a3.element)
163
- assert_in_delta(1.2 , @a3.position[0], $tolerance)
164
- assert_in_delta(3.4 , @a3.position[1], $tolerance)
165
- assert_in_delta(5.6 , @a3.position[2], $tolerance)
166
-
167
-
168
- @a5.translate!([ 1.0, 1.0, 1.0 ])
169
- assert_equal("Li", @a5.element)
170
- assert_in_delta(0.0 , @a5.position[0], $tolerance)
171
- assert_in_delta(-1.3 , @a5.position[1], $tolerance)
172
- assert_in_delta(-3.5 , @a5.position[2], $tolerance)
173
-
174
- # Vector3D なら例外
175
- assert_raise(Atom::TypeError){ @a0.translate!(Vector3D[ 0.0, 0.0, 0.0 ]) }
176
-
177
- # 3次元でなければ例外
178
- assert_raise(Atom::TypeError){ @a0.translate!([ 0.0, 0.0 ]) }
179
- assert_raise(Atom::TypeError){ @a0.translate!([ 0.0, 0.0, 0.0, 0.0 ]) }
180
- end
181
-
182
- def test_translate
183
- t = @a0.translate([ 1.2, 3.4, 5.6 ])
184
- assert_equal("Li", t.element)
185
- assert_in_delta(1.2, t.position[0], $tolerance)
186
- assert_in_delta(3.4, t.position[1], $tolerance)
187
- assert_in_delta(5.6, t.position[2], $tolerance)
188
-
189
- t = @a3.translate([ 1.2, 3.4, 5.6 ])
190
- assert_equal("Be", t.element)
191
- assert_in_delta(1.2, t.position[0], $tolerance)
192
- assert_in_delta(3.4, t.position[1], $tolerance)
193
- assert_in_delta(5.6, t.position[2], $tolerance)
194
-
195
- t = @a5.translate([ 1.0, 1.0, 1.0 ])
196
- assert_equal("Li", t.element)
197
- assert_in_delta(0.0, t.position[0], $tolerance)
198
- assert_in_delta(-1.3, t.position[1], $tolerance)
199
- assert_in_delta(-3.5, t.position[2], $tolerance)
200
-
201
- # Vector3D なら例外
202
- assert_raise(Atom::TypeError){ @a0.translate(Vector3D[ 0.0, 0.0, 0.0 ]) }
203
-
204
- # 3次元でなければ例外
205
- assert_raise(Atom::TypeError){ @a0.translate([ 0.0, 0.0 ]) }
206
- assert_raise(Atom::TypeError){ @a0.translate([ 0.0, 0.0, 0.0, 0.0 ]) }
207
- end
6
+ $tolerance = 10.0 ** (-10)
7
+
8
+ def setup
9
+ @a0 = CrystalCell::Atom.new("Li", [ 0.0, 0.0, 0.0 ])
10
+ @a1 = CrystalCell::Atom.new("Li", [ 1.0, 1.0, 1.0 ])
11
+ @a2 = CrystalCell::Atom.new("Li", [ 0.0, 0.0, 0.0 ])
12
+ @a3 = CrystalCell::Atom.new("Be", [ 0.0, 0.0, 0.0 ])
13
+ @a4 = CrystalCell::Atom.new("Li", [ 1.0, 2.3, 4.5 ])
14
+ @a5 = CrystalCell::Atom.new("Li", [-1.0,-2.3,-4.5 ])
15
+ @a6 = CrystalCell::Atom.new( 3, [-1.0,-2.3,-4.5 ])
16
+ end
17
+
18
+ def test_initialize
19
+ assert_raise(CrystalCell::Atom::TypeError){ CrystalCell::Atom.new(nil, nil, nil) }
20
+ assert_raise(CrystalCell::Atom::TypeError){ CrystalCell::Atom.new(nil, nil, "A") }
21
+ assert_raise(CrystalCell::Atom::TypeError){ CrystalCell::Atom.new(nil, [0.0, 0.0], "A") }
22
+ assert_raise(CrystalCell::Atom::TypeError){ CrystalCell::Atom.new(nil, [0.0, 0.0, 0.0, 0.0], "A") }
23
+ a0 = CrystalCell::Atom.new(nil, [ 0.0, 0.0, 0.0], nil)
24
+ a1 = CrystalCell::Atom.new(nil, [ 0.0, 0.0, 0.0], "A")
25
+ assert_equal(nil, a0.name)
26
+ assert_equal("A", a1.name)
27
+ end
28
+
29
+ def test_equal_in_delta?
30
+ assert_equal(true , CrystalCell::Atom.equal_in_delta?(@a0, @a0))
31
+ assert_equal(false, CrystalCell::Atom.equal_in_delta?(@a0, @a1))
32
+ assert_equal(true , CrystalCell::Atom.equal_in_delta?(@a0, @a2))
33
+ assert_equal(false, CrystalCell::Atom.equal_in_delta?(@a0, @a3))
34
+ assert_equal(false, CrystalCell::Atom.equal_in_delta?(@a1, @a0))
35
+ assert_equal(true , CrystalCell::Atom.equal_in_delta?(@a1, @a1))
36
+ assert_equal(false, CrystalCell::Atom.equal_in_delta?(@a1, @a2))
37
+ assert_equal(false, CrystalCell::Atom.equal_in_delta?(@a1, @a3))
38
+ assert_equal(true , CrystalCell::Atom.equal_in_delta?(@a2, @a0))
39
+ assert_equal(false, CrystalCell::Atom.equal_in_delta?(@a2, @a1))
40
+ assert_equal(true , CrystalCell::Atom.equal_in_delta?(@a2, @a2))
41
+ assert_equal(false, CrystalCell::Atom.equal_in_delta?(@a2, @a3))
42
+ assert_equal(false, CrystalCell::Atom.equal_in_delta?(@a3, @a0))
43
+ assert_equal(false, CrystalCell::Atom.equal_in_delta?(@a3, @a1))
44
+ assert_equal(false, CrystalCell::Atom.equal_in_delta?(@a3, @a2))
45
+ assert_equal(true , CrystalCell::Atom.equal_in_delta?(@a3, @a3))
46
+
47
+ assert_equal(true , CrystalCell::Atom.equal_in_delta?(@a0, @a0, 2.0))
48
+ assert_equal(true , CrystalCell::Atom.equal_in_delta?(@a0, @a1, 2.0))
49
+ assert_equal(true , CrystalCell::Atom.equal_in_delta?(@a0, @a2, 2.0))
50
+ assert_equal(false, CrystalCell::Atom.equal_in_delta?(@a0, @a3, 2.0))
51
+ assert_equal(true , CrystalCell::Atom.equal_in_delta?(@a1, @a0, 2.0))
52
+ assert_equal(true , CrystalCell::Atom.equal_in_delta?(@a1, @a1, 2.0))
53
+ assert_equal(true , CrystalCell::Atom.equal_in_delta?(@a1, @a2, 2.0))
54
+ assert_equal(false, CrystalCell::Atom.equal_in_delta?(@a1, @a3, 2.0))
55
+ assert_equal(true , CrystalCell::Atom.equal_in_delta?(@a2, @a0, 2.0))
56
+ assert_equal(true , CrystalCell::Atom.equal_in_delta?(@a2, @a1, 2.0))
57
+ assert_equal(true , CrystalCell::Atom.equal_in_delta?(@a2, @a2, 2.0))
58
+ assert_equal(false, CrystalCell::Atom.equal_in_delta?(@a2, @a3, 2.0))
59
+ assert_equal(false, CrystalCell::Atom.equal_in_delta?(@a3, @a0, 2.0))
60
+ assert_equal(false, CrystalCell::Atom.equal_in_delta?(@a3, @a1, 2.0))
61
+ assert_equal(false, CrystalCell::Atom.equal_in_delta?(@a3, @a2, 2.0))
62
+ assert_equal(true , CrystalCell::Atom.equal_in_delta?(@a3, @a3, 2.0))
63
+
64
+ assert_equal(true , @a0.equal_in_delta?(@a0))
65
+ assert_equal(false, @a0.equal_in_delta?(@a1))
66
+ assert_equal(true , @a0.equal_in_delta?(@a2))
67
+ assert_equal(false, @a0.equal_in_delta?(@a3))
68
+ assert_equal(false, @a1.equal_in_delta?(@a0))
69
+ assert_equal(true , @a1.equal_in_delta?(@a1))
70
+ assert_equal(false, @a1.equal_in_delta?(@a2))
71
+ assert_equal(false, @a1.equal_in_delta?(@a3))
72
+ assert_equal(true , @a2.equal_in_delta?(@a0))
73
+ assert_equal(false, @a2.equal_in_delta?(@a1))
74
+ assert_equal(true , @a2.equal_in_delta?(@a2))
75
+ assert_equal(false, @a2.equal_in_delta?(@a3))
76
+ assert_equal(false, @a3.equal_in_delta?(@a0))
77
+ assert_equal(false, @a3.equal_in_delta?(@a1))
78
+ assert_equal(false, @a3.equal_in_delta?(@a2))
79
+ assert_equal(true , @a3.equal_in_delta?(@a3))
80
+
81
+ assert_equal(true , @a0.equal_in_delta?(@a0, 2.0))
82
+ assert_equal(true , @a0.equal_in_delta?(@a1, 2.0))
83
+ assert_equal(true , @a0.equal_in_delta?(@a2, 2.0))
84
+ assert_equal(false, @a0.equal_in_delta?(@a3, 2.0))
85
+ assert_equal(true , @a1.equal_in_delta?(@a0, 2.0))
86
+ assert_equal(true , @a1.equal_in_delta?(@a1, 2.0))
87
+ assert_equal(true , @a1.equal_in_delta?(@a2, 2.0))
88
+ assert_equal(false, @a1.equal_in_delta?(@a3, 2.0))
89
+ assert_equal(true , @a2.equal_in_delta?(@a0, 2.0))
90
+ assert_equal(true , @a2.equal_in_delta?(@a1, 2.0))
91
+ assert_equal(true , @a2.equal_in_delta?(@a2, 2.0))
92
+ assert_equal(false, @a2.equal_in_delta?(@a3, 2.0))
93
+ assert_equal(false, @a3.equal_in_delta?(@a0, 2.0))
94
+ assert_equal(false, @a3.equal_in_delta?(@a1, 2.0))
95
+ assert_equal(false, @a3.equal_in_delta?(@a2, 2.0))
96
+ assert_equal(true , @a3.equal_in_delta?(@a3, 2.0))
97
+ end
98
+
99
+ def test_equal
100
+ assert_equal(true, @a0 == CrystalCell::Atom.new("Li", [0.0, 0.0, 0.0]))
101
+ assert_equal(true, @a1 == CrystalCell::Atom.new("Li", [1.0, 1.0, 1.0]))
102
+ assert_equal(true, @a2 == CrystalCell::Atom.new("Li", [0.0, 0.0, 0.0]))
103
+ assert_equal(true, @a3 == CrystalCell::Atom.new("Be", [0.0, 0.0, 0.0]))
104
+
105
+ assert_equal(false, @a0 == CrystalCell::Atom.new("Li", [0.9, 0.0, 0.0]))
106
+ assert_equal(false, @a1 == CrystalCell::Atom.new("Li", [1.1, 1.0, 1.0]))
107
+ assert_equal(false, @a2 == CrystalCell::Atom.new("Li", [0.9, 0.0, 0.0]))
108
+ assert_equal(false, @a3 == CrystalCell::Atom.new("Be", [0.9, 0.0, 0.0]))
109
+ end
110
+
111
+ def test_internal_coordinates
112
+ assert_equal(Mageo::Vector3DInternal[ 0.0, 0.0, 0.0 ], @a0.internal_coordinates)
113
+ assert_equal(Mageo::Vector3DInternal[ 0.0, 0.0, 0.0 ], @a1.internal_coordinates)
114
+ assert_equal(Mageo::Vector3DInternal[ 0.0, 0.0, 0.0 ], @a2.internal_coordinates)
115
+ assert_equal(Mageo::Vector3DInternal[ 0.0, 0.0, 0.0 ], @a3.internal_coordinates)
116
+
117
+ assert_equal(Mageo::Vector3DInternal, @a4.internal_coordinates.class)
118
+ assert_in_delta(0.0, @a4.internal_coordinates[0], $tolerance)
119
+ assert_in_delta(0.3, @a4.internal_coordinates[1], $tolerance)
120
+ assert_in_delta(0.5, @a4.internal_coordinates[2], $tolerance)
121
+
122
+ assert_equal(Mageo::Vector3DInternal, @a5.internal_coordinates.class)
123
+ assert_in_delta(0.0, @a5.internal_coordinates[0], $tolerance)
124
+ assert_in_delta(0.7, @a5.internal_coordinates[1], $tolerance)
125
+ assert_in_delta(0.5, @a5.internal_coordinates[2], $tolerance)
126
+ end
127
+
128
+ def test_translation_symmetry_operation
129
+ assert_equal(Mageo::Vector3DInternal[ 0, 0, 0 ], @a0.translation_symmetry_operation)
130
+ assert_equal(Mageo::Vector3DInternal[ 1, 1, 1 ], @a1.translation_symmetry_operation)
131
+ assert_equal(Mageo::Vector3DInternal[ 0, 0, 0 ], @a2.translation_symmetry_operation)
132
+ assert_equal(Mageo::Vector3DInternal[ 0, 0, 0 ], @a3.translation_symmetry_operation)
133
+ assert_equal(Mageo::Vector3DInternal[ 1, 2, 4 ], @a4.translation_symmetry_operation)
134
+ assert_equal(Mageo::Vector3DInternal[-1,-3,-5 ], @a5.translation_symmetry_operation)
135
+ end
136
+
137
+ def test_set_position
138
+ assert_equal(Mageo::Vector3DInternal[ 1.2, 2.3, 3.4 ], @a3.set_position([ 1.2, 2.3, 3.4 ]))
139
+ assert_equal(Mageo::Vector3DInternal[ 2.3, 3.4, 4.5 ], @a4.set_position([ 2.3, 3.4, 4.5 ]))
140
+ assert_raise(CrystalCell::Atom::TypeError){
141
+ @a4.set_position(Mageo::Vector3D[ 2.3, 3.4, 4.5 ])
142
+ }
143
+ end
144
+
145
+ def test_element
146
+ @a6.element = "Li"
147
+ assert_equal(@a5, @a6)
148
+ end
149
+
150
+ def test_translate!
151
+ @a0.translate!([ 1.2, 3.4, 5.6 ])
152
+ assert_equal("Li", @a0.element)
153
+ assert_in_delta(1.2 , @a0.position[0], $tolerance)
154
+ assert_in_delta(3.4 , @a0.position[1], $tolerance)
155
+ assert_in_delta(5.6 , @a0.position[2], $tolerance)
156
+
157
+ @a3.translate!([ 1.2, 3.4, 5.6 ])
158
+ assert_equal("Be", @a3.element)
159
+ assert_in_delta(1.2 , @a3.position[0], $tolerance)
160
+ assert_in_delta(3.4 , @a3.position[1], $tolerance)
161
+ assert_in_delta(5.6 , @a3.position[2], $tolerance)
162
+
163
+
164
+ @a5.translate!([ 1.0, 1.0, 1.0 ])
165
+ assert_equal("Li", @a5.element)
166
+ assert_in_delta(0.0 , @a5.position[0], $tolerance)
167
+ assert_in_delta(-1.3 , @a5.position[1], $tolerance)
168
+ assert_in_delta(-3.5 , @a5.position[2], $tolerance)
169
+
170
+ # Mageo::Vector3D なら例外
171
+ assert_raise(CrystalCell::Atom::TypeError){ @a0.translate!(Mageo::Vector3D[ 0.0, 0.0, 0.0 ]) }
172
+
173
+ # 3次元でなければ例外
174
+ assert_raise(CrystalCell::Atom::TypeError){ @a0.translate!([ 0.0, 0.0 ]) }
175
+ assert_raise(CrystalCell::Atom::TypeError){ @a0.translate!([ 0.0, 0.0, 0.0, 0.0 ]) }
176
+ end
177
+
178
+ def test_translate
179
+ t = @a0.translate([ 1.2, 3.4, 5.6 ])
180
+ assert_equal("Li", t.element)
181
+ assert_in_delta(1.2, t.position[0], $tolerance)
182
+ assert_in_delta(3.4, t.position[1], $tolerance)
183
+ assert_in_delta(5.6, t.position[2], $tolerance)
184
+
185
+ t = @a3.translate([ 1.2, 3.4, 5.6 ])
186
+ assert_equal("Be", t.element)
187
+ assert_in_delta(1.2, t.position[0], $tolerance)
188
+ assert_in_delta(3.4, t.position[1], $tolerance)
189
+ assert_in_delta(5.6, t.position[2], $tolerance)
190
+
191
+ t = @a5.translate([ 1.0, 1.0, 1.0 ])
192
+ assert_equal("Li", t.element)
193
+ assert_in_delta(0.0, t.position[0], $tolerance)
194
+ assert_in_delta(-1.3, t.position[1], $tolerance)
195
+ assert_in_delta(-3.5, t.position[2], $tolerance)
196
+
197
+ # Mageo::Vector3D なら例外
198
+ assert_raise(CrystalCell::Atom::TypeError){ @a0.translate(Mageo::Vector3D[ 0.0, 0.0, 0.0 ]) }
199
+
200
+ # 3次元でなければ例外
201
+ assert_raise(CrystalCell::Atom::TypeError){ @a0.translate([ 0.0, 0.0 ]) }
202
+ assert_raise(CrystalCell::Atom::TypeError){ @a0.translate([ 0.0, 0.0, 0.0, 0.0 ]) }
203
+ end
208
204
 
209
205
  end
210
206
 
data/test/test_cell.rb CHANGED
@@ -1,1167 +1,1507 @@
1
1
  #! /usr/bin/ruby1.9 -W
2
2
 
3
- require 'test/unit'
3
+ require "helper"
4
4
  require 'stringio'
5
- require 'crystalcell/cell.rb'
6
- require "rubygems"
7
- gem "mageo"
8
- require "mageo/vector3dinternal.rb"
9
5
 
10
- class FooCell < Cell; end
6
+ class CrystalCell::Cell
7
+ public :symmetry_operations
8
+ end
9
+
10
+ class FooCell < CrystalCell::Cell; end
11
11
 
12
12
  class TC_Cell < Test::Unit::TestCase
13
- $tolerance = 10 ** (-10)
14
-
15
- def setup
16
- # 原子のないセル。
17
- vectors00 = [[2.0, 2.0, 2.0], [0.0, 2.0, 2.0], [0.0, 0.0, 2.0]]
18
- #@c00 = Cell.new(vectors00)
19
- #
20
- axes00 = LatticeAxes.new([[2.0, 2.0, 2.0], [0.0, 2.0, 2.0], [0.0, 0.0, 2.0]])
21
- @c00 = Cell.new(axes00)
22
- @c00.comment = 'c00'
23
-
24
- # 元素の識別子を数字にしたもの。
25
- atoms = [
26
- Atom.new( 0, [0.0, 0.0, 0.0] ),
27
- Atom.new( 1, [0.1, 0.2, 0.3] ),
28
- ]
29
- @c01 = Cell.new(axes00, atoms)
30
- @c01.comment = 'c01'
31
-
32
- # Li と O を1つずつ入れたセル。
33
- # @c02 = Cell.new( [ [1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0] ] )
34
- atoms = [
35
- Atom.new( 'Li', [0.0, 0.0, 0.0] ),
36
- Atom.new( 'O' , [0.2, 0.2, 0.2] ),
37
- ]
38
- @c02 = Cell.new(vectors00, atoms)
39
- @c02.comment = 'c02'
40
-
41
- # 原子の順序を逆にしたもの。
42
- atoms = [
43
- Atom.new( 'O' , [0.2, 0.2, 0.2] ),
44
- Atom.new( 'Li', [0.0, 0.0, 0.0] ),
45
- ]
46
- @c03 = Cell.new(vectors00, atoms)
47
- @c03.comment = 'c03'
48
-
49
- # 原子の順序がいりまじったもの
50
- atoms = [
51
- Atom.new( 'Li', [0.0, 0.0, 0.0] ),
52
- Atom.new( 'O' , [0.2, 0.2, 0.2] ),
53
- Atom.new( 'Li', [0.1, 0.2, 0.3] ),
54
- ]
55
- @c04 = Cell.new(vectors00, atoms)
56
- @c04.comment = 'c04'
57
-
58
- # 原子が不足しているもの。
59
- atoms = [
60
- Atom.new( 'Li', [0.0, 0.0, 0.0] ),
61
- ]
62
- @c05 = Cell.new(vectors00, atoms)
63
- @c05.comment = 'c05'
64
-
65
- # Selective dynamics をいれたもの。
66
- atoms = [
67
- Atom.new( 'Li', [0.0, 0.0, 0.0], nil, [true, false, false ] ),
68
- Atom.new( 'O' , [0.2, 0.2, 0.2] ),
69
- ]
70
- @c06 = Cell.new(vectors00, atoms)
71
- @c06.comment = 'c06'
72
-
73
- # 元素の識別子を数字にしたもの。
74
- atoms = [
75
- Atom.new( 0, Vector3DInternal[0.0, 0.0, 0.0] ),
76
- Atom.new( 1, Vector3DInternal[0.2, 0.2, 0.2] ),
77
- ]
78
- @c07 = Cell.new(vectors00, atoms)
79
- @c07.comment = 'c07'
80
-
81
- # セル外の座標の原子を追加。
82
- atoms = [
83
- Atom.new( 'Li', [ 1.2, 3.4, 5.6], "atom0", [ false, false, true] ),
84
- Atom.new( 'O', [-1.2, -3.4, -5.6] ),
85
- ]
86
- @c08 = Cell.new(vectors00, atoms)
87
- @c08.comment = 'c08'
88
- end
89
-
90
- def test_initialize
91
- la = LatticeAxes.new( [ [2.0, 2.0, 2.0], [0.0, 2.0, 2.0], [0.0, 0.0, 2.0] ] )
92
- c10 = Cell.new( la )
93
- c10.comment = 'c00'
94
- assert_equal( Cell, c10.class )
95
- assert_in_delta( 2.0, c10.axes[0][0], $tolerance )
96
- assert_in_delta( 2.0, c10.axes[0][1], $tolerance )
97
- assert_in_delta( 2.0, c10.axes[0][2], $tolerance )
98
- assert_in_delta( 0.0, c10.axes[1][0], $tolerance )
99
- assert_in_delta( 2.0, c10.axes[1][1], $tolerance )
100
- assert_in_delta( 2.0, c10.axes[1][2], $tolerance )
101
- assert_in_delta( 0.0, c10.axes[2][0], $tolerance )
102
- assert_in_delta( 0.0, c10.axes[2][1], $tolerance )
103
- assert_in_delta( 2.0, c10.axes[2][2], $tolerance )
104
-
105
-
106
- end
107
-
108
- def test_positions
109
- assert_equal( [], @c00.positions)
110
- assert_equal( [ Vector3DInternal[0.0, 0.0, 0.0], Vector3DInternal[0.2, 0.2, 0.2] ], @c02.positions )
111
- assert_equal( [ Vector3DInternal[0.0, 0.0, 0.0], Vector3DInternal[0.1, 0.2, 0.3] ], @c01.positions )
112
- end
113
-
114
- def test_select_indices
115
- assert_equal( [], @c00.select_indices{ |i| i.element == "" } )
116
- assert_equal( [], @c00.select_indices{ |i| i.element == "Li" } )
117
-
118
- assert_equal( [] , @c01.select_indices{ |i| i.element == "" } )
119
- assert_equal( [] , @c01.select_indices{ |i| i.element == "Li" } )
120
- #@c01.select_indices{ |i| p i.element }
121
- assert_equal( [0], @c01.select_indices{ |i| i.element == 0 } )
122
-
123
- assert_equal( [1], @c01.select_indices{ |i| i.element == 1 } )
124
-
125
- assert_equal( [] , @c04.select_indices{ |i| i.element == "" } )
126
- assert_equal( [0, 2], @c04.select_indices{ |i| i.element == "Li" } )
127
- assert_equal( [1], @c04.select_indices{ |i| i.element == "O" } )
128
- assert_equal( [ ], @c04.select_indices{ |i| i.element == 0 } )
129
- assert_equal( [ ], @c04.select_indices{ |i| i.element == 1 } )
130
-
131
- assert_equal( [1, 2], @c04.select_indices{ |i| i.position[0] > 0.05 } )
132
- end
133
-
134
- def test_atoms_in_supercell
135
- t = @c02.atoms_in_supercell( 0, 0, 0, 0, 0, 1 )
136
- assert_equal( 'Li', t[0].element )
137
- assert_equal( 'Li', t[1].element )
138
- assert_equal( 'O' , t[2].element )
139
- assert_equal( 'O' , t[3].element )
140
-
141
- assert_equal( Vector3DInternal[0.0, 0.0, 0.0], t[0].position )
142
- assert_equal( Vector3DInternal[0.0, 0.0, 1.0], t[1].position )
143
- assert_equal( Vector3DInternal[0.2, 0.2, 0.2], t[2].position )
144
- assert_equal( Vector3DInternal[0.2, 0.2, 1.2], t[3].position )
145
-
146
- t = @c02.atoms_in_supercell(-1, 1,-1, 1,-1, 1 )
147
- assert_equal( ['Li']*27 + ['O'] * 27 , t.map{|i| i.element} )
148
- assert_equal( Vector3DInternal[-1.0, -1.0, -1.0], t[ 0].position )
149
- assert_equal( Vector3DInternal[-1.0, -1.0, 0.0], t[ 1].position )
150
- assert_equal( Vector3DInternal[-1.0, -1.0, 1.0], t[ 2].position )
151
- assert_equal( Vector3DInternal[-1.0, 0.0, -1.0], t[ 3].position )
152
- assert_equal( Vector3DInternal[-1.0, 0.0, 0.0], t[ 4].position )
153
- assert_equal( Vector3DInternal[-1.0, 0.0, 1.0], t[ 5].position )
154
- assert_equal( Vector3DInternal[-1.0, 1.0, -1.0], t[ 6].position )
155
- assert_equal( Vector3DInternal[-1.0, 1.0, 0.0], t[ 7].position )
156
- assert_equal( Vector3DInternal[-1.0, 1.0, 1.0], t[ 8].position )
157
- assert_equal( Vector3DInternal[ 0.0, -1.0, -1.0], t[ 9].position )
158
- assert_equal( Vector3DInternal[ 0.0, -1.0, 0.0], t[10].position )
159
- assert_equal( Vector3DInternal[ 0.0, -1.0, 1.0], t[11].position )
160
- assert_equal( Vector3DInternal[ 0.0, 0.0, -1.0], t[12].position )
161
- assert_equal( Vector3DInternal[ 0.0, 0.0, 0.0], t[13].position )
162
- assert_equal( Vector3DInternal[ 0.0, 0.0, 1.0], t[14].position )
163
- assert_equal( Vector3DInternal[ 0.0, 1.0, -1.0], t[15].position )
164
- assert_equal( Vector3DInternal[ 0.0, 1.0, 0.0], t[16].position )
165
- assert_equal( Vector3DInternal[ 0.0, 1.0, 1.0], t[17].position )
166
- assert_equal( Vector3DInternal[ 1.0, -1.0, -1.0], t[18].position )
167
- assert_equal( Vector3DInternal[ 1.0, -1.0, 0.0], t[19].position )
168
- assert_equal( Vector3DInternal[ 1.0, -1.0, 1.0], t[20].position )
169
- assert_equal( Vector3DInternal[ 1.0, 0.0, -1.0], t[21].position )
170
- assert_equal( Vector3DInternal[ 1.0, 0.0, 0.0], t[22].position )
171
- assert_equal( Vector3DInternal[ 1.0, 0.0, 1.0], t[23].position )
172
- assert_equal( Vector3DInternal[ 1.0, 1.0, -1.0], t[24].position )
173
- assert_equal( Vector3DInternal[ 1.0, 1.0, 0.0], t[25].position )
174
- assert_equal( Vector3DInternal[ 1.0, 1.0, 1.0], t[26].position )
175
- assert_equal( Vector3DInternal[-0.8, -0.8, -0.8], t[27].position )
176
- assert_equal( Vector3DInternal[-0.8, -0.8, 0.2], t[28].position )
177
- assert_equal( Vector3DInternal[-0.8, -0.8, 1.2], t[29].position )
178
- assert_equal( Vector3DInternal[-0.8, 0.2, -0.8], t[30].position )
179
- assert_equal( Vector3DInternal[-0.8, 0.2, 0.2], t[31].position )
180
- assert_equal( Vector3DInternal[-0.8, 0.2, 1.2], t[32].position )
181
- assert_equal( Vector3DInternal[-0.8, 1.2, -0.8], t[33].position )
182
- assert_equal( Vector3DInternal[-0.8, 1.2, 0.2], t[34].position )
183
- assert_equal( Vector3DInternal[-0.8, 1.2, 1.2], t[35].position )
184
- assert_equal( Vector3DInternal[ 0.2, -0.8, -0.8], t[36].position )
185
- assert_equal( Vector3DInternal[ 0.2, -0.8, 0.2], t[37].position )
186
- assert_equal( Vector3DInternal[ 0.2, -0.8, 1.2], t[38].position )
187
- assert_equal( Vector3DInternal[ 0.2, 0.2, -0.8], t[39].position )
188
- assert_equal( Vector3DInternal[ 0.2, 0.2, 0.2], t[40].position )
189
- assert_equal( Vector3DInternal[ 0.2, 0.2, 1.2], t[41].position )
190
- assert_equal( Vector3DInternal[ 0.2, 1.2, -0.8], t[42].position )
191
- assert_equal( Vector3DInternal[ 0.2, 1.2, 0.2], t[43].position )
192
- assert_equal( Vector3DInternal[ 0.2, 1.2, 1.2], t[44].position )
193
- assert_equal( Vector3DInternal[ 1.2, -0.8, -0.8], t[45].position )
194
- assert_equal( Vector3DInternal[ 1.2, -0.8, 0.2], t[46].position )
195
- assert_equal( Vector3DInternal[ 1.2, -0.8, 1.2], t[47].position )
196
- assert_equal( Vector3DInternal[ 1.2, 0.2, -0.8], t[48].position )
197
- assert_equal( Vector3DInternal[ 1.2, 0.2, 0.2], t[49].position )
198
- assert_equal( Vector3DInternal[ 1.2, 0.2, 1.2], t[50].position )
199
- assert_equal( Vector3DInternal[ 1.2, 1.2, -0.8], t[51].position )
200
- assert_equal( Vector3DInternal[ 1.2, 1.2, 0.2], t[52].position )
201
- assert_equal( Vector3DInternal[ 1.2, 1.2, 1.2], t[53].position )
202
- end
203
-
204
- def test_elements
205
- assert_equal( [], @c00.elements)
206
- assert_equal( [ 'Li', 'O' ], @c02.elements )
207
- assert_equal( [ 0, 1 ], @c01.elements )
208
- end
209
-
210
- def test_add_atom
211
- assert_raise(ArgumentError){
212
- @c00.add_atom('Li', [0.5, 0.5, 0.5] )
213
- }
214
-
215
- @c00.add_atom(Atom.new( 'Li', [0.5, 0.5, 0.5] ))
216
- assert_equal( 1 , @c00.atoms.size)
217
- assert_equal( 'Li' , @c00.atoms[0].element)
218
- assert_equal( Vector3DInternal[0.5, 0.5, 0.5], @c00.atoms[0].position)
219
- assert_equal( nil , @c00.atoms[0].name )
220
-
221
- @c00.add_atom(Atom.new( nil , [0.5, 0.5, 0.5], 'A' ))
222
- assert_equal( 2 , @c00.atoms.size)
223
- assert_equal( nil , @c00.atoms[1].element)
224
- assert_equal( Vector3DInternal[0.5, 0.5, 0.5], @c00.atoms[1].position)
225
- assert_equal( 'A' , @c00.atoms[1].name )
226
-
227
- @c02.add_atom(Atom.new( 'Li', [0.5, 0.5, 0.5] ))
228
- assert_equal( 3 , @c02.atoms.size)
229
- assert_equal( 'Li' , @c02.atoms[0].element)
230
- assert_equal( Vector3DInternal[0.0, 0.0, 0.0], @c02.atoms[0].position)
231
- assert_equal( 'O' , @c02.atoms[1].element)
232
- assert_equal( Vector3DInternal[0.2, 0.2, 0.2], @c02.atoms[1].position)
233
- assert_equal( 'Li' , @c02.atoms[2].element)
234
- assert_equal( Vector3DInternal[0.5, 0.5, 0.5], @c02.atoms[2].position)
235
-
236
- @c01.add_atom(Atom.new( 'Li', [0.5, 0.5, 0.5] ))
237
- assert_equal( 3 , @c01.atoms.size)
238
- assert_equal( 0 , @c01.atoms[0].element)
239
- assert_equal( Vector3DInternal[0.0, 0.0, 0.0], @c01.atoms[0].position)
240
- assert_equal( 1 , @c01.atoms[1].element)
241
- assert_equal( Vector3DInternal[0.1, 0.2, 0.3], @c01.atoms[1].position)
242
- assert_equal( 'Li' , @c01.atoms[2].element)
243
- assert_equal( Vector3DInternal[0.5, 0.5, 0.5], @c01.atoms[2].position)
244
-
245
- end
246
-
247
- def test_delete_atom
248
- # assert_raise(RuntimeError ) {@c00.delete_atom( 0 ) }
249
- assert_equal(nil, @c00.delete_atom( 0 ) )
250
- assert_equal([], @c00.positions )
251
- assert_equal([], @c00.elements )
252
-
253
- @c02.delete_atom( 0 )
254
- assert_equal( [ Vector3DInternal[0.2, 0.2, 0.2] ], @c02.positions)
255
- assert_equal( [ 'O' ], @c02.elements )
256
- @c02.delete_atom( 0 )
257
- assert_equal( [], @c02.positions)
258
- assert_equal( [], @c02.elements )
259
-
260
- @c01.delete_atom( 0 )
261
- assert_equal( [ Vector3DInternal[0.1, 0.2, 0.3] ], @c01.positions)
262
- assert_equal( [ 1 ], @c01.elements )
263
- end
264
-
265
- def test_set_elements
266
- # 原子がないので変更されない。
267
- @c00.set_elements( [] )
268
- assert_equal( [], @c00.atoms )
269
-
270
- # 0 -> 'Li、 1 -> 'O' に変更。
271
- tmp = Marshal.load( Marshal.dump( @c01 ))
272
- tmp.set_elements( [ 'Li', 'O' ] )
273
- assert_equal( 'Li', tmp.atoms[0].element )
274
- assert_equal( 'O', tmp.atoms[1].element )
275
-
276
- # 0 -> 'Li, 片方だけ変更。
277
- tmp = Marshal.load( Marshal.dump( @c01 ))
278
- tmp.set_elements( [ 'Li' ] )
279
- assert_equal( 'Li', tmp.atoms[0].element )
280
- assert_equal( 1, tmp.atoms[1].element )
281
-
282
- # 元々整数値以外にセットされているのでマッチせず変更されない。
283
- tmp = Marshal.load( Marshal.dump( @c02 ))
284
- tmp.set_elements( [ 'O', 'Li' ] )
285
- assert_equal( 'Li', tmp.atoms[0].element )
286
- assert_equal( 'O', tmp.atoms[1].element )
287
-
288
- # Hash argument.
289
- # 0 -> 'Li、 1 -> 'O' に変更。
290
- tmp = Marshal.load( Marshal.dump( @c01 ))
291
- tmp.set_elements( { 0 => 'Li', 1 => 'O' } )
292
- assert_equal( 'Li', tmp.atoms[0].element )
293
- assert_equal( 'O', tmp.atoms[1].element )
294
-
295
- # 'Li' -> 'Na', 'O' -> 'S' に変更。
296
- tmp = Marshal.load( Marshal.dump( @c02 ))
297
- tmp.set_elements( { 'Li' => 'Na', 'O' => 'S' } )
298
- assert_equal( 'Na', tmp.atoms[0].element )
299
- assert_equal( 'S', tmp.atoms[1].element )
300
-
301
- # 'Li' -> 'Na'、 片方だけ変更。
302
- tmp = Marshal.load( Marshal.dump( @c02 ))
303
- tmp.set_elements( { 'Li' => 'Na' } )
304
- assert_equal( 'Na', tmp.atoms[0].element )
305
- assert_equal( 'O', tmp.atoms[1].element )
306
- end
307
-
308
- def test_equal_lattice_in_delta?
309
- assert_equal( true , @c00.equal_lattice_in_delta?(@c00, 0.001, 0.1) )
310
- assert_equal( true , @c00.equal_lattice_in_delta?(@c02, 0.001, 0.1) )
311
- assert_equal( true , @c00.equal_lattice_in_delta?(@c01, 0.001, 0.1) )
312
- assert_equal( true , @c02.equal_lattice_in_delta?(@c00, 0.001, 0.1) )
313
- assert_equal( true , @c02.equal_lattice_in_delta?(@c02, 0.001, 0.1) )
314
- assert_equal( true , @c02.equal_lattice_in_delta?(@c01, 0.001, 0.1) )
315
- assert_equal( true , @c01.equal_lattice_in_delta?(@c00, 0.001, 0.1) )
316
- assert_equal( true , @c01.equal_lattice_in_delta?(@c02, 0.001, 0.1) )
317
- assert_equal( true , @c01.equal_lattice_in_delta?(@c01, 0.001, 0.1) )
318
-
319
- end
320
-
321
- def test_equal_atoms_in_delta?
322
- assert_equal( true , @c00.equal_atoms_in_delta?( @c00, 0.01 ) )
323
- assert_equal( false, @c00.equal_atoms_in_delta?( @c02, 0.01 ) )
324
- assert_equal( false, @c00.equal_atoms_in_delta?( @c01, 0.01 ) )
325
- assert_equal( false, @c00.equal_atoms_in_delta?( @c03, 0.01 ) )
326
- assert_equal( false, @c00.equal_atoms_in_delta?( @c04, 0.01 ) )
327
- assert_equal( false, @c00.equal_atoms_in_delta?( @c05, 0.01 ) )
328
- assert_equal( false, @c02.equal_atoms_in_delta?( @c00, 0.01 ) )
329
- assert_equal( true , @c02.equal_atoms_in_delta?( @c02, 0.01 ) )
330
- assert_equal( false, @c02.equal_atoms_in_delta?( @c01, 0.01 ) )
331
- assert_equal( true , @c02.equal_atoms_in_delta?( @c03, 0.01 ) )
332
- assert_equal( false, @c02.equal_atoms_in_delta?( @c04, 0.01 ) )
333
- assert_equal( false, @c02.equal_atoms_in_delta?( @c05, 0.01 ) )
334
- assert_equal( false, @c01.equal_atoms_in_delta?( @c00, 0.01 ) )
335
- assert_equal( false, @c01.equal_atoms_in_delta?( @c02, 0.01 ) )
336
- assert_equal( true , @c01.equal_atoms_in_delta?( @c01, 0.01 ) )
337
- assert_equal( false, @c01.equal_atoms_in_delta?( @c03, 0.01 ) )
338
- assert_equal( false, @c01.equal_atoms_in_delta?( @c04, 0.01 ) )
339
- assert_equal( false, @c01.equal_atoms_in_delta?( @c05, 0.01 ) )
340
- assert_equal( false, @c03.equal_atoms_in_delta?( @c00, 0.01 ) )
341
- assert_equal( true , @c03.equal_atoms_in_delta?( @c02, 0.01 ) )
342
- assert_equal( false, @c03.equal_atoms_in_delta?( @c01, 0.01 ) )
343
- assert_equal( true , @c03.equal_atoms_in_delta?( @c03, 0.01 ) )
344
- assert_equal( false, @c03.equal_atoms_in_delta?( @c04, 0.01 ) )
345
- assert_equal( false, @c03.equal_atoms_in_delta?( @c05, 0.01 ) )
346
- assert_equal( false, @c04.equal_atoms_in_delta?( @c00, 0.01 ) )
347
- assert_equal( false, @c04.equal_atoms_in_delta?( @c02, 0.01 ) )
348
- assert_equal( false, @c04.equal_atoms_in_delta?( @c01, 0.01 ) )
349
- assert_equal( false, @c04.equal_atoms_in_delta?( @c03, 0.01 ) )
350
- assert_equal( true , @c04.equal_atoms_in_delta?( @c04, 0.01 ) )
351
- assert_equal( false, @c04.equal_atoms_in_delta?( @c05, 0.01 ) )
352
- assert_equal( false, @c05.equal_atoms_in_delta?( @c00, 0.01 ) )
353
- assert_equal( false, @c05.equal_atoms_in_delta?( @c02, 0.01 ) )
354
- assert_equal( false, @c05.equal_atoms_in_delta?( @c01, 0.01 ) )
355
- assert_equal( false, @c05.equal_atoms_in_delta?( @c03, 0.01 ) )
356
- assert_equal( false, @c05.equal_atoms_in_delta?( @c04, 0.01 ) )
357
- assert_equal( true , @c05.equal_atoms_in_delta?( @c05, 0.01 ) )
358
- end
359
-
360
- def test_equal_in_delta?
361
- assert_equal(true , @c00.equal_in_delta?( @c00, 0.001, 0.1, 0.01 ) )
362
- assert_equal(false, @c00.equal_in_delta?( @c01, 0.001, 0.1, 0.01 ) )
363
- assert_equal(false, @c00.equal_in_delta?( @c02, 0.001, 0.1, 0.01 ) )
364
- assert_equal(false, @c00.equal_in_delta?( @c03, 0.001, 0.1, 0.01 ) )
365
- assert_equal(false, @c00.equal_in_delta?( @c04, 0.001, 0.1, 0.01 ) )
366
- assert_equal(false, @c00.equal_in_delta?( @c05, 0.001, 0.1, 0.01 ) )
367
-
368
- assert_equal(false, @c02.equal_in_delta?( @c00, 0.001, 0.1, 0.01 ) )
369
- assert_equal(false, @c02.equal_in_delta?( @c01, 0.001, 0.1, 0.01 ) )
370
- assert_equal(true , @c02.equal_in_delta?( @c02, 0.001, 0.1, 0.01 ) )
371
- assert_equal(true , @c02.equal_in_delta?( @c03, 0.001, 0.1, 0.01 ) )
372
- assert_equal(false, @c02.equal_in_delta?( @c04, 0.001, 0.1, 0.01 ) )
373
- assert_equal(false, @c02.equal_in_delta?( @c05, 0.001, 0.1, 0.01 ) )
374
-
375
- assert_equal(false, @c01.equal_in_delta?( @c00, 0.001, 0.1, 0.01 ) )
376
- assert_equal(true , @c01.equal_in_delta?( @c01, 0.001, 0.1, 0.01 ) )
377
- assert_equal(false, @c01.equal_in_delta?( @c02, 0.001, 0.1, 0.01 ) )
378
- assert_equal(false, @c01.equal_in_delta?( @c03, 0.001, 0.1, 0.01 ) )
379
- assert_equal(false, @c01.equal_in_delta?( @c04, 0.001, 0.1, 0.01 ) )
380
- assert_equal(false, @c01.equal_in_delta?( @c05, 0.001, 0.1, 0.01 ) )
381
-
382
- assert_equal(false, @c03.equal_in_delta?( @c00, 0.001, 0.1, 0.01 ) )
383
- assert_equal(false, @c03.equal_in_delta?( @c01, 0.001, 0.1, 0.01 ) )
384
- assert_equal(true , @c03.equal_in_delta?( @c02, 0.001, 0.1, 0.01 ) )
385
- assert_equal(true , @c03.equal_in_delta?( @c03, 0.001, 0.1, 0.01 ) )
386
- assert_equal(false, @c03.equal_in_delta?( @c04, 0.001, 0.1, 0.01 ) )
387
- assert_equal(false, @c03.equal_in_delta?( @c05, 0.001, 0.1, 0.01 ) )
388
-
389
- assert_equal(false, @c04.equal_in_delta?( @c00, 0.001, 0.1, 0.01 ) )
390
- assert_equal(false, @c04.equal_in_delta?( @c01, 0.001, 0.1, 0.01 ) )
391
- assert_equal(false, @c04.equal_in_delta?( @c02, 0.001, 0.1, 0.01 ) )
392
- assert_equal(false, @c04.equal_in_delta?( @c03, 0.001, 0.1, 0.01 ) )
393
- assert_equal(true , @c04.equal_in_delta?( @c04, 0.001, 0.1, 0.01 ) )
394
- assert_equal(false, @c04.equal_in_delta?( @c05, 0.001, 0.1, 0.01 ) )
395
-
396
- assert_equal(false, @c05.equal_in_delta?( @c00, 0.001, 0.1, 0.01 ) )
397
- assert_equal(false, @c05.equal_in_delta?( @c01, 0.001, 0.1, 0.01 ) )
398
- assert_equal(false, @c05.equal_in_delta?( @c02, 0.001, 0.1, 0.01 ) )
399
- assert_equal(false, @c05.equal_in_delta?( @c03, 0.001, 0.1, 0.01 ) )
400
- assert_equal(false, @c05.equal_in_delta?( @c04, 0.001, 0.1, 0.01 ) )
401
- assert_equal(true , @c05.equal_in_delta?( @c05, 0.001, 0.1, 0.01 ) )
402
- end
403
-
404
- def test_equal
405
- cell = Cell.new( LatticeAxes.new([ [2.0, 2.0, 2.0], [0.0, 2.0, 2.0], [0.0, 0.0, 2.0]]))
406
- assert_equal( true , @c00 == cell )
407
- assert_equal( false, @c01 == cell )
408
-
409
- cell = Cell.new( LatticeAxes.new([ [2.0, 2.0, 2.0], [0.0, 2.0, 2.0], [0.0, 0.0, 2.0]]))
410
- cell.add_atom(Atom.new( 0, [0.0, 0.0, 0.0] ))
411
- cell.add_atom(Atom.new( 1, [0.1, 0.2, 0.3] ))
412
- assert_equal( false, @c00 == cell )
413
- assert_equal( true , @c01 == cell )
414
- end
415
-
416
- def test_distance
417
- assert_raise(Cell::TypeError){@c00.distance([0,0,0], [1,1,1])}
418
- assert_raise(Cell::TypeError){@c00.distance([0,0,0], Vector3DInternal[1,1,1])}
419
- assert_raise(Cell::TypeError){@c00.distance([0,0,0], Vector3D[1,1,1])}
420
-
421
- assert_in_delta(
422
- Math::sqrt(0.56),
423
- @c00.distance(Vector3DInternal[0.0, 0.0, 0.0], Vector3DInternal[0.1, 0.1, 0.1] ),
424
- $tolerance
425
- )
426
- assert_in_delta( Math::sqrt( 1.6**2 + 3.4**2 + 5.4**2),
427
- @c00.distance( Vector3DInternal[0.0, 0.0, 0.0], Vector3DInternal[0.8, 0.9, 1.0] ), $tolerance
428
- )
429
-
430
- assert_in_delta( Math::sqrt(0.56), @c00.distance( Vector3DInternal[0.0, 0.0, 0.0], Vector3DInternal[0.1, 0.1, 0.1] ), $tolerance )
431
- assert_in_delta( Math::sqrt( 1.6**2 + 3.4**2 + 5.4**2),
432
- @c00.distance( Vector3DInternal[0.0, 0.0, 0.0], Vector3DInternal[0.8, 0.9, 1.0] ), $tolerance
433
- )
434
- end
435
-
436
- def test_dump_poscar
437
- c00_str = [
438
- 'c00',
439
- '1.0',
440
- ' 2.00000000000000 2.00000000000000 2.00000000000000',
441
- ' 0.00000000000000 2.00000000000000 2.00000000000000',
442
- ' 0.00000000000000 0.00000000000000 2.00000000000000',
443
- '',
444
- 'Direct'
445
- ].join("\n")
446
-
447
- c02_str = [
448
- 'c02',
449
- '1.0',
450
- ' 2.00000000000000 2.00000000000000 2.00000000000000',
451
- ' 0.00000000000000 2.00000000000000 2.00000000000000',
452
- ' 0.00000000000000 0.00000000000000 2.00000000000000',
453
- ' 1 1',
454
- 'Direct',
455
- ' 0.00000000000000 0.00000000000000 0.00000000000000',
456
- ' 0.20000000000000 0.20000000000000 0.20000000000000'
457
- ].join("\n")
458
-
459
- c01_str = [
460
- 'c01',
461
- '1.0',
462
- ' 2.00000000000000 2.00000000000000 2.00000000000000',
463
- ' 0.00000000000000 2.00000000000000 2.00000000000000',
464
- ' 0.00000000000000 0.00000000000000 2.00000000000000',
465
- ' 1 1',
466
- 'Direct',
467
- ' 0.00000000000000 0.00000000000000 0.00000000000000',
468
- ' 0.10000000000000 0.20000000000000 0.30000000000000'
469
- ].join("\n")
470
-
471
- c03_str = [
472
- 'c03',
473
- '1.0',
474
- ' 2.00000000000000 2.00000000000000 2.00000000000000',
475
- ' 0.00000000000000 2.00000000000000 2.00000000000000',
476
- ' 0.00000000000000 0.00000000000000 2.00000000000000',
477
- ' 1 1',
478
- 'Direct',
479
- ' 0.00000000000000 0.00000000000000 0.00000000000000',
480
- ' 0.20000000000000 0.20000000000000 0.20000000000000'
481
- ].join("\n")
482
-
483
- c04_str = [
484
- 'c04',
485
- '1.0',
486
- ' 2.00000000000000 2.00000000000000 2.00000000000000',
487
- ' 0.00000000000000 2.00000000000000 2.00000000000000',
488
- ' 0.00000000000000 0.00000000000000 2.00000000000000',
489
- ' 2 1',
490
- 'Direct',
491
- ' 0.00000000000000 0.00000000000000 0.00000000000000',
492
- ' 0.10000000000000 0.20000000000000 0.30000000000000',
493
- ' 0.20000000000000 0.20000000000000 0.20000000000000'
494
- ].join("\n")
495
-
496
- c05_str = [
497
- 'c05',
498
- '1.0',
499
- ' 2.00000000000000 2.00000000000000 2.00000000000000',
500
- ' 0.00000000000000 2.00000000000000 2.00000000000000',
501
- ' 0.00000000000000 0.00000000000000 2.00000000000000',
502
- ' 1',
503
- 'Direct',
504
- ' 0.00000000000000 0.00000000000000 0.00000000000000'
505
- ].join("\n")
506
-
507
- c06_str = [
508
- 'c06',
509
- '1.0',
510
- ' 2.00000000000000 2.00000000000000 2.00000000000000',
511
- ' 0.00000000000000 2.00000000000000 2.00000000000000',
512
- ' 0.00000000000000 0.00000000000000 2.00000000000000',
513
- ' 1 1',
514
- 'Selective dynamics',
515
- 'Direct',
516
- ' 0.00000000000000 0.00000000000000 0.00000000000000 T F F',
517
- ' 0.20000000000000 0.20000000000000 0.20000000000000 T T T'
518
- ].join("\n")
519
-
520
- # Raise exception
521
- # assert_raise( RuntimeError ){ @c00.dump_poscar( [], io ) }
522
- assert_raise( RuntimeError ){ @c00.dump_poscar( [0] ) }
523
- assert_raise( RuntimeError ){ @c00.dump_poscar( [0, 1] ) }
524
- assert_raise( RuntimeError ){ @c00.dump_poscar( ['Li'] ) }
525
- assert_raise( RuntimeError ){ @c00.dump_poscar( ['Li', 'O'] ) }
526
- assert_raise( RuntimeError ){ @c02.dump_poscar( [] ) }
527
- assert_raise( RuntimeError ){ @c02.dump_poscar( [0] ) }
528
- assert_raise( RuntimeError ){ @c02.dump_poscar( [0, 1] ) }
529
- assert_raise( RuntimeError ){ @c02.dump_poscar( ['Li'] ) }
530
- assert_raise( RuntimeError ){ @c01.dump_poscar( [] ) }
531
- assert_raise( RuntimeError ){ @c01.dump_poscar( [0] ) }
532
- assert_raise( RuntimeError ){ @c01.dump_poscar( ['Li'] ) }
533
- assert_raise( RuntimeError ){ @c01.dump_poscar( ['Li', 'O'] ) }
534
- assert_raise( RuntimeError ){ @c04.dump_poscar( [] ) }
535
- assert_raise( RuntimeError ){ @c04.dump_poscar( [0] ) }
536
- assert_raise( RuntimeError ){ @c04.dump_poscar( [0, 1] ) }
537
- assert_raise( RuntimeError ){ @c04.dump_poscar( ['Li'] ) }
538
- assert_raise( RuntimeError ){ @c05.dump_poscar( [] ) }
539
- assert_raise( RuntimeError ){ @c05.dump_poscar( [0] ) }
540
- assert_raise( RuntimeError ){ @c05.dump_poscar( [0, 1] ) }
541
- assert_raise( RuntimeError ){ @c05.dump_poscar( ['Li', 'O'] ) }
542
- assert_raise( RuntimeError ){ @c03.dump_poscar( [] ) }
543
- assert_raise( RuntimeError ){ @c03.dump_poscar( [0] ) }
544
- assert_raise( RuntimeError ){ @c03.dump_poscar( [0, 1] ) }
545
- assert_raise( RuntimeError ){ @c03.dump_poscar( ['Li'] ) }
546
-
547
- #
548
- StringIO.new do |io|
549
- @c00.dump_poscar( [], io )
550
- assert_equal( c00_str, io.read )
551
- end
552
-
553
- StringIO.new do |io|
554
- @c02.dump_poscar( [ 'Li', 'O' ], io )
555
- assert_equal( c02, io.read )
556
- end
557
-
558
- StringIO.new do |io|
559
- @c01.dump_poscar( [ 0, 1 ], io )
560
- assert_equal( c01, io.read )
561
- end
562
-
563
- StringIO.new do |io|
564
- @c03.dump_poscar( [ 'Li', 'O' ], io )
565
- assert_equal( c03, io.read )
566
- end
567
-
568
- StringIO.new do |io|
569
- @c04.dump_poscar( [ 'Li', 'O' ], io )
570
- assert_equal( c04, io.read )
571
- end
572
-
573
- StringIO.new do |io|
574
- @c05.dump_poscar( [ 'Li', 'O' ], io )
575
- assert_equal( c05, io.read )
576
- end
577
-
578
- assert_equal( c00_str, @c00.dump_poscar( [ ], nil ) )
579
- assert_equal( c01_str, @c01.dump_poscar( [ 0 , 1 ], nil ) )
580
- assert_equal( c02_str, @c02.dump_poscar( [ 'Li', 'O' ], nil ) )
581
- assert_equal( c03_str, @c03.dump_poscar( [ 'Li', 'O' ], nil ) )
582
- assert_equal( c04_str, @c04.dump_poscar( [ 'Li', 'O' ], nil ) )
583
- assert_equal( c05_str, @c05.dump_poscar( [ 'Li' ], nil ) )
584
-
585
- assert_equal( c00_str, @c00.dump_poscar( [ ] ) )
586
- assert_equal( c01_str, @c01.dump_poscar( [ 0 , 1 ] ) )
587
- assert_equal( c02_str, @c02.dump_poscar( [ 'Li', 'O' ] ) )
588
- assert_equal( c03_str, @c03.dump_poscar( [ 'Li', 'O' ] ) )
589
- assert_equal( c04_str, @c04.dump_poscar( [ 'Li', 'O' ] ) )
590
- assert_equal( c05_str, @c05.dump_poscar( [ 'Li' ] ) )
591
-
592
- assert_equal( c06_str, @c06 .dump_poscar( [ 'Li', 'O' ] ) )
593
-
594
- end
595
-
596
- def test_rotate
597
- @c02.add_atom(Atom.new( 'Li', [1.1, 1.2, 1.3] ))
598
- assert_equal(
599
- [ Vector3DInternal[ 0.0, 0.0, 0.0 ],
600
- Vector3DInternal[ -0.2, -0.2, -0.2 ],
601
- Vector3DInternal[ -1.1, -1.2, -1.3 ]
602
- ],
603
- @c02.rotate( [[-1, 0, 0],[0, -1, 0],[0, 0, -1]] ).positions
604
- )
605
-
606
- # Check not destructed.
607
- assert_equal(
608
- [ Vector3DInternal[ 0.0, 0.0, 0.0 ],
609
- Vector3DInternal[ 0.2, 0.2, 0.2 ],
610
- Vector3DInternal[ 1.1, 1.2, 1.3 ]
611
- ],
612
- @c02.positions
613
- )
614
- end
615
-
616
- def test_rotate!
617
- @c02.add_atom(Atom.new( 'Li', [0.1, 0.2, 0.3] ))
618
- @c02.rotate!( [[-1, 0, 0],[0, -1, 0],[0, 0, -1]] )
619
- assert_equal(
620
- [ Vector3DInternal[ 0.0, 0.0, 0.0 ],
621
- Vector3DInternal[ -0.2, -0.2, -0.2 ],
622
- Vector3DInternal[ -0.1, -0.2, -0.3 ]
623
- ],
624
- @c02.positions
625
- )
626
- end
627
-
628
- def test_translate
629
- poss = @c02.translate( [1.1, 1.2, 1.3] ).positions
630
- assert_in_delta( 1.1, poss[0][0], $tolerance )
631
- assert_in_delta( 1.2, poss[0][1], $tolerance )
632
- assert_in_delta( 1.3, poss[0][2], $tolerance )
633
- assert_in_delta( 1.3, poss[1][0], $tolerance )
634
- assert_in_delta( 1.4, poss[1][1], $tolerance )
635
- assert_in_delta( 1.5, poss[1][2], $tolerance )
636
-
637
- poss = @c02.translate( [-0.3,-0.3,-0.3] ).positions
638
- assert_in_delta( -0.3, poss[0][0], $tolerance )
639
- assert_in_delta( -0.3, poss[0][1], $tolerance )
640
- assert_in_delta( -0.3, poss[0][2], $tolerance )
641
- assert_in_delta( -0.1, poss[1][0], $tolerance )
642
- assert_in_delta( -0.1, poss[1][1], $tolerance )
643
- assert_in_delta( -0.1, poss[1][2], $tolerance )
644
-
645
- # Check not destructed.
646
- assert_equal(
647
- [ Vector3DInternal[ 0.0, 0.0, 0.0 ],
648
- Vector3DInternal[ 0.2, 0.2, 0.2 ]
649
- ],
650
- @c02.positions
651
- )
652
- end
653
-
654
- def test_translate!
655
- @c02.translate!( [1.1, 1.2, 1.3] )
656
- poss = @c02.positions
657
-
658
- assert_in_delta( 1.1, poss[0][0], $tolerance )
659
- assert_in_delta( 1.2, poss[0][1], $tolerance )
660
- assert_in_delta( 1.3, poss[0][2], $tolerance )
661
- assert_in_delta( 1.3, poss[1][0], $tolerance )
662
- assert_in_delta( 1.4, poss[1][1], $tolerance )
663
- assert_in_delta( 1.5, poss[1][2], $tolerance )
664
- end
665
-
666
- def test_center_of_atoms
667
- # No atom in the cell.
668
- assert_raise( Cell::NoAtomError ){ @c00.center_of_atoms }
669
-
670
- assert_equal( Vector3DInternal[0.05, 0.1, 0.15], @c01.center_of_atoms )
671
- assert_equal( Vector3DInternal[0.1, 0.1, 0.1], @c02.center_of_atoms )
672
- assert_equal( Vector3DInternal[0.1, 0.1, 0.1], @c03.center_of_atoms )
673
- assert_equal( Vector3DInternal[0.1, 4.0/30.0, 5.0/30.0], @c04.center_of_atoms )
674
- assert_equal( Vector3DInternal[0.0, 0.0, 0.0], @c05.center_of_atoms )
675
- assert_equal( Vector3DInternal[0.1, 0.1, 0.1], @c06.center_of_atoms )
676
- assert_equal( Vector3DInternal[0.1, 0.1, 0.1], @c07.center_of_atoms )
677
- end
678
-
679
- def test_calc_volume
680
- # @c00 = Cell.new( [ [2.0, 2.0, 2.0], [0.0, 2.0, 2.0], [0.0, 0.0, 2.0] ] )
681
- assert_in_delta( 8.00, @c00.calc_volume, $tolerance)
682
-
683
- c10 = Cell.new( [ [1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0] ] )
684
- c11 = Cell.new( [ [0.5, 0.5, 0.0], [0.5, 0.0, 0.5], [0.0, 0.5, 0.5] ] )
685
- assert_in_delta( 1.00, c10.calc_volume, $tolerance)
686
- assert_in_delta( 0.25, c11.calc_volume, $tolerance)
687
- end
688
-
689
- def test_cell_of_elements
690
- t = @c04.cell_of_elements( [ 'Li' ] )
691
- assert_equal( Cell, t.class )
692
- assert_in_delta( 2.0, t.axes[0][0], $tolerance )
693
- assert_in_delta( 2.0, t.axes[0][1], $tolerance )
694
- assert_in_delta( 2.0, t.axes[0][2], $tolerance )
695
- assert_in_delta( 0.0, t.axes[1][0], $tolerance )
696
- assert_in_delta( 2.0, t.axes[1][1], $tolerance )
697
- assert_in_delta( 2.0, t.axes[1][2], $tolerance )
698
- assert_in_delta( 0.0, t.axes[2][0], $tolerance )
699
- assert_in_delta( 0.0, t.axes[2][1], $tolerance )
700
- assert_in_delta( 2.0, t.axes[2][2], $tolerance )
701
- assert_equal( 2, t.atoms.size )
702
- # checking atom 0
703
- assert_equal( 'Li' , t.atoms[0].element)
704
- assert_equal( Vector3DInternal[0.0, 0.0, 0.0], t.atoms[0].position)
705
- assert_equal( nil , t.atoms[0].name )
706
- # checking atom 1
707
- assert_equal( 'Li' , t.atoms[1].element)
708
- assert_equal( Vector3DInternal[0.1, 0.2, 0.3], t.atoms[1].position)
709
- assert_equal( nil , t.atoms[1].name )
710
-
711
- t = @c04.cell_of_elements( [ 'Li', 'O' ] )
712
- assert_equal( Cell, t.class )
713
- assert_in_delta( 2.0, t.axes[0][0], $tolerance )
714
- assert_in_delta( 2.0, t.axes[0][1], $tolerance )
715
- assert_in_delta( 2.0, t.axes[0][2], $tolerance )
716
- assert_in_delta( 0.0, t.axes[1][0], $tolerance )
717
- assert_in_delta( 2.0, t.axes[1][1], $tolerance )
718
- assert_in_delta( 2.0, t.axes[1][2], $tolerance )
719
- assert_in_delta( 0.0, t.axes[2][0], $tolerance )
720
- assert_in_delta( 0.0, t.axes[2][1], $tolerance )
721
- assert_in_delta( 2.0, t.axes[2][2], $tolerance )
722
- assert_equal( 3, t.atoms.size )
723
- # checking atom 0
724
- assert_equal( 'Li' , t.atoms[0].element)
725
- assert_equal( Vector3DInternal[0.0, 0.0, 0.0], t.atoms[0].position)
726
- assert_equal( nil , t.atoms[0].name )
727
- # checking atom 1
728
- assert_equal( 'O' , t.atoms[1].element)
729
- assert_equal( Vector3DInternal[0.2, 0.2, 0.2], t.atoms[1].position)
730
- assert_equal( nil , t.atoms[1].name )
731
- # checking atom 2
732
- assert_equal( 'Li' , t.atoms[2].element)
733
- assert_equal( Vector3DInternal[0.1, 0.2, 0.3], t.atoms[2].position)
734
- assert_equal( nil , t.atoms[2].name )
735
-
736
- t = @c04.cell_of_elements( [ 'O' ] )
737
- assert_equal( Cell, t.class )
738
- assert_in_delta( 2.0, t.axes[0][0], $tolerance )
739
- assert_in_delta( 2.0, t.axes[0][1], $tolerance )
740
- assert_in_delta( 2.0, t.axes[0][2], $tolerance )
741
- assert_in_delta( 0.0, t.axes[1][0], $tolerance )
742
- assert_in_delta( 2.0, t.axes[1][1], $tolerance )
743
- assert_in_delta( 2.0, t.axes[1][2], $tolerance )
744
- assert_in_delta( 0.0, t.axes[2][0], $tolerance )
745
- assert_in_delta( 0.0, t.axes[2][1], $tolerance )
746
- assert_in_delta( 2.0, t.axes[2][2], $tolerance )
747
- assert_equal( 1, t.atoms.size )
748
- # checking atom 0
749
- assert_equal( 'O' , t.atoms[0].element)
750
- assert_equal( Vector3DInternal[0.2, 0.2, 0.2], t.atoms[0].position)
751
- assert_equal( nil , t.atoms[0].name )
752
-
753
- t = @c04.cell_of_elements( [ 'F' ] )
754
- assert_equal( Cell, t.class )
755
- assert_in_delta( 2.0, t.axes[0][0], $tolerance )
756
- assert_in_delta( 2.0, t.axes[0][1], $tolerance )
757
- assert_in_delta( 2.0, t.axes[0][2], $tolerance )
758
- assert_in_delta( 0.0, t.axes[1][0], $tolerance )
759
- assert_in_delta( 2.0, t.axes[1][1], $tolerance )
760
- assert_in_delta( 2.0, t.axes[1][2], $tolerance )
761
- assert_in_delta( 0.0, t.axes[2][0], $tolerance )
762
- assert_in_delta( 0.0, t.axes[2][1], $tolerance )
763
- assert_in_delta( 2.0, t.axes[2][2], $tolerance )
764
- assert_equal( 0, t.atoms.size )
765
-
766
-
767
- # サブクラスで使用したときに、サブクラスで作られるか?
768
- fc04 = FooCell.new( [ [2.0, 2.0, 2.0], [0.0, 2.0, 2.0], [0.0, 0.0, 2.0] ] )
769
- fc04.add_atom(Atom.new( 'Li', [0.0, 0.0, 0.0] ))
770
- fc04.add_atom(Atom.new( 'O' , [0.2, 0.2, 0.2] ))
771
- fc04.add_atom(Atom.new( 'Li', [0.1, 0.2, 0.3] ))
772
- fc04.comment = 'fc04'
773
- t = fc04.cell_of_elements( [ 'Li' ] )
774
- assert_equal( FooCell, t.class )
775
- assert_in_delta( 2.0, t.axes[0][0], $tolerance )
776
- assert_in_delta( 2.0, t.axes[0][1], $tolerance )
777
- assert_in_delta( 2.0, t.axes[0][2], $tolerance )
778
- assert_in_delta( 0.0, t.axes[1][0], $tolerance )
779
- assert_in_delta( 2.0, t.axes[1][1], $tolerance )
780
- assert_in_delta( 2.0, t.axes[1][2], $tolerance )
781
- assert_in_delta( 0.0, t.axes[2][0], $tolerance )
782
- assert_in_delta( 0.0, t.axes[2][1], $tolerance )
783
- assert_in_delta( 2.0, t.axes[2][2], $tolerance )
784
- assert_equal( 2, t.atoms.size )
785
- # checking atom 0
786
- assert_equal( 'Li' , t.atoms[0].element)
787
- assert_equal( Vector3DInternal[0.0, 0.0, 0.0], t.atoms[0].position)
788
- assert_equal( nil , t.atoms[0].name )
789
- # checking atom 1
790
- assert_equal( 'Li' , t.atoms[1].element)
791
- assert_equal( Vector3DInternal[0.1, 0.2, 0.3], t.atoms[1].position)
792
- assert_equal( nil , t.atoms[1].name )
793
- end
794
-
795
- def test_unite
796
- ## 格子定数が違えば例外。将来的な feature.
797
- #t = Cell.new( [ [2.0, 0.0, 0.0], [0.0, 2.0, 0.0], [0.0, 0.0, 2.0] ] )
798
- #t.add_atom(Atom.new( 'Li', [0.0, 0.0, 0.0] ))
799
- #t.comment = 't'
800
- #assert_raise( Cell::AxesMismatchError ){ @c05.unite( t ) }
801
- t = Cell.new( [ [2.0, 0.0, 0.0], [0.0, 2.0, 0.0], [0.0, 0.0, 2.0] ] )
802
- t.add_atom(Atom.new( 'Li', [0.0, 0.0, 0.0] ))
803
- t.comment = 't'
804
- assert_nothing_raised{ @c05.unite( t ) }
805
-
806
- # unite
807
- # 同じ座標のものがあっても気にせず統合する。
808
- t = @c05.unite( @c06 )
809
- assert_equal( Cell, t.class )
810
- assert_in_delta( 2.0, t.axes[0][0], $tolerance )
811
- assert_in_delta( 2.0, t.axes[0][1], $tolerance )
812
- assert_in_delta( 2.0, t.axes[0][2], $tolerance )
813
- assert_in_delta( 0.0, t.axes[1][0], $tolerance )
814
- assert_in_delta( 2.0, t.axes[1][1], $tolerance )
815
- assert_in_delta( 2.0, t.axes[1][2], $tolerance )
816
- assert_in_delta( 0.0, t.axes[2][0], $tolerance )
817
- assert_in_delta( 0.0, t.axes[2][1], $tolerance )
818
- assert_in_delta( 2.0, t.axes[2][2], $tolerance )
819
- assert_equal( 3, t.atoms.size )
820
- # checking atom 0
821
- assert_equal( 'Li' , t.atoms[0].element)
822
- assert_equal( Vector3DInternal[0.0, 0.0, 0.0], t.atoms[0].position)
823
- assert_equal( nil , t.atoms[0].name )
824
- # checking atom 1
825
- assert_equal( 'Li' , t.atoms[1].element)
826
- assert_equal( Vector3DInternal[0.0, 0.0, 0.0], t.atoms[1].position)
827
- assert_equal( nil , t.atoms[1].name )
828
- # checking atom 2
829
- assert_equal( 'O' , t.atoms[2].element)
830
- assert_equal( Vector3DInternal[0.2, 0.2, 0.2], t.atoms[2].position)
831
- assert_equal( nil , t.atoms[2].name )
832
- end
833
-
834
- def test_inverse_axis!
835
- @c02.inverse_axis!( 0 )
836
- t = @c02
837
- assert_equal( Cell, t.class )
838
- assert_in_delta(-2.0, t.axes[0][0], $tolerance )
839
- assert_in_delta(-2.0, t.axes[0][1], $tolerance )
840
- assert_in_delta(-2.0, t.axes[0][2], $tolerance )
841
- assert_in_delta( 0.0, t.axes[1][0], $tolerance )
842
- assert_in_delta( 2.0, t.axes[1][1], $tolerance )
843
- assert_in_delta( 2.0, t.axes[1][2], $tolerance )
844
- assert_in_delta( 0.0, t.axes[2][0], $tolerance )
845
- assert_in_delta( 0.0, t.axes[2][1], $tolerance )
846
- assert_in_delta( 2.0, t.axes[2][2], $tolerance )
847
- assert_equal( 2, t.atoms.size )
848
- # checking atom 0
849
- assert_equal( 'Li' , t.atoms[0].element)
850
- assert_equal( Vector3DInternal[0.0, 0.0, 0.0], t.atoms[0].position)
851
- assert_equal( nil , t.atoms[0].name )
852
- # checking atom 1
853
- assert_equal( 'O' , t.atoms[1].element)
854
- assert_equal( Vector3DInternal[-0.2, 0.2, 0.2], t.atoms[1].position)
855
- assert_equal( nil , t.atoms[1].name )
856
- end
857
-
858
- def test_inverse_axis
859
- assert_raise( Cell::AxesRangeError ){ @c02.inverse_axis( -1 ) }
860
- assert_raise( Cell::AxesRangeError ){ @c02.inverse_axis( 3 ) }
861
-
862
- # x 軸反転
863
- t = @c02.inverse_axis( 0 )
864
- assert_equal( Cell, t.class )
865
- assert_in_delta( -2.0, t.axes[0][0], $tolerance )
866
- assert_in_delta( -2.0, t.axes[0][1], $tolerance )
867
- assert_in_delta( -2.0, t.axes[0][2], $tolerance )
868
- assert_in_delta( 0.0, t.axes[1][0], $tolerance )
869
- assert_in_delta( 2.0, t.axes[1][1], $tolerance )
870
- assert_in_delta( 2.0, t.axes[1][2], $tolerance )
871
- assert_in_delta( 0.0, t.axes[2][0], $tolerance )
872
- assert_in_delta( 0.0, t.axes[2][1], $tolerance )
873
- assert_in_delta( 2.0, t.axes[2][2], $tolerance )
874
- assert_equal( 2, t.atoms.size )
875
- # checking atom 0
876
- assert_equal( 'Li' , t.atoms[0].element)
877
- assert_equal( Vector3DInternal[0.0, 0.0, 0.0], t.atoms[0].position)
878
- assert_equal( nil , t.atoms[0].name )
879
- # checking atom 1
880
- assert_equal( 'O' , t.atoms[1].element)
881
- assert_equal( Vector3DInternal[-0.2, 0.2, 0.2], t.atoms[1].position)
882
- assert_equal( nil , t.atoms[1].name )
883
- # checking non-destructive
884
- assert_equal( Cell, t.class )
885
- assert_in_delta( 2.0, @c02.axes[0][0], $tolerance )
886
- assert_in_delta( 2.0, @c02.axes[0][1], $tolerance )
887
- assert_in_delta( 2.0, @c02.axes[0][2], $tolerance )
888
- assert_in_delta( 0.0, @c02.axes[1][0], $tolerance )
889
- assert_in_delta( 2.0, @c02.axes[1][1], $tolerance )
890
- assert_in_delta( 2.0, @c02.axes[1][2], $tolerance )
891
- assert_in_delta( 0.0, @c02.axes[2][0], $tolerance )
892
- assert_in_delta( 0.0, @c02.axes[2][1], $tolerance )
893
- assert_in_delta( 2.0, @c02.axes[2][2], $tolerance )
894
- assert_equal( 2, @c02.atoms.size )
895
- # checking atom 0
896
- assert_equal( 'Li' , @c02.atoms[0].element)
897
- assert_equal( Vector3DInternal[0.0, 0.0, 0.0], @c02.atoms[0].position)
898
- assert_equal( nil , @c02.atoms[0].name )
899
- # checking atom 1
900
- assert_equal( 'O' , @c02.atoms[1].element)
901
- assert_equal( Vector3DInternal[ 0.2, 0.2, 0.2], @c02.atoms[1].position)
902
- assert_equal( nil , @c02.atoms[1].name )
903
-
904
- # y 軸反転
905
- # [ [ ax, ay, az], [ 0, by, bz], [ 0, 0, cz] ]
906
- # ↓ y 軸反転
907
- # [ [ ax, ay, az], [ 0,-by,-bz], [ 0, 0, cz] ]
908
- # b vector の y 成分が正になるようにする。
909
- # すなわち z 軸回りに半回転し、全ての x, y 成分が反転する。
910
- # [ [-ax,-ay, az], [ 0, by,-bz], [ 0, 0, cz] ]
911
- t = @c02.inverse_axis( 1 )
912
- assert_equal( Cell, t.class )
913
- assert_in_delta( -2.0, t.axes[0][0], $tolerance )
914
- assert_in_delta( -2.0, t.axes[0][1], $tolerance )
915
- assert_in_delta( 2.0, t.axes[0][2], $tolerance )
916
- assert_in_delta( 0.0, t.axes[1][0], $tolerance )
917
- assert_in_delta( 2.0, t.axes[1][1], $tolerance )
918
- assert_in_delta( -2.0, t.axes[1][2], $tolerance )
919
- assert_in_delta( 0.0, t.axes[2][0], $tolerance )
920
- assert_in_delta( 0.0, t.axes[2][1], $tolerance )
921
- assert_in_delta( 2.0, t.axes[2][2], $tolerance )
922
- assert_equal( 2, t.atoms.size )
923
- # checking atom 0
924
- assert_equal( 'Li' , t.atoms[0].element)
925
- assert_equal( Vector3DInternal[0.0, 0.0, 0.0], t.atoms[0].position)
926
- assert_equal( nil , t.atoms[0].name )
927
- # checking atom 1
928
- assert_equal( 'O' , t.atoms[1].element)
929
- assert_equal( Vector3DInternal[ 0.2,-0.2, 0.2], t.atoms[1].position)
930
- assert_equal( nil , t.atoms[1].name )
931
-
932
- # z 軸反転
933
- # [ [ ax, ay, az], [ 0, by, bz], [ 0, 0, cz] ]
934
- # z 軸反転
935
- # [ [ ax, ay, az], [ 0, by, bz], [ 0, 0,-cz] ]
936
- # c vector の z 成分が正になるようにする。
937
- # b vector の y 成分も正であることを保存する回転は、
938
- # y 軸回りに半回転し、全ての x, z 成分が反転する。
939
- # [ [-ax, ay,-az], [ 0, by,-bz], [ 0, 0, cz] ]
940
- t = @c02.inverse_axis( 2 )
941
- assert_equal( Cell, t.class )
942
- assert_in_delta(-2.0, t.axes[0][0], $tolerance )
943
- assert_in_delta( 2.0, t.axes[0][1], $tolerance )
944
- assert_in_delta(-2.0, t.axes[0][2], $tolerance )
945
- assert_in_delta( 0.0, t.axes[1][0], $tolerance )
946
- assert_in_delta( 2.0, t.axes[1][1], $tolerance )
947
- assert_in_delta(-2.0, t.axes[1][2], $tolerance )
948
- assert_in_delta( 0.0, t.axes[2][0], $tolerance )
949
- assert_in_delta( 0.0, t.axes[2][1], $tolerance )
950
- assert_in_delta( 2.0, t.axes[2][2], $tolerance )
951
- assert_equal( 2, t.atoms.size )
952
- # checking atom 0
953
- assert_equal( 'Li' , t.atoms[0].element)
954
- assert_equal( Vector3DInternal[0.0, 0.0, 0.0], t.atoms[0].position)
955
- assert_equal( nil , t.atoms[0].name )
956
- # checking atom 1
957
- assert_equal( 'O' , t.atoms[1].element)
958
- assert_equal( Vector3DInternal[ 0.2, 0.2,-0.2], t.atoms[1].position)
959
- assert_equal( nil , t.atoms[1].name )
960
-
961
- end
962
-
963
- def test_exchange_axes!
964
- # b, c の交換。
965
- @c08.exchange_axes!( [ 1, 2 ] )
966
- t = @c08
967
- assert_equal( Cell, t.class )
968
- lc = t.axes.get_lattice_constants
969
- assert_in_delta( 2.0 * Math::sqrt( 3.0 ) , lc[0], $tolerance )
970
- assert_in_delta( 2.0 , lc[1], $tolerance )
971
- assert_in_delta( 2.0 * Math::sqrt( 2.0 ) , lc[2], $tolerance )
972
- assert_in_delta( 45.0000000000000, lc[3], $tolerance )
973
- assert_in_delta( 35.2643896827547, lc[4], $tolerance )
974
- assert_in_delta( 54.7356103172453, lc[5], $tolerance )
975
- assert_equal( true, t.axes.lefthand? )
976
- assert_equal( 2, t.atoms.size )
977
- # checking atom 0
978
- assert_equal( 'Li' , t.atoms[0].element)
979
- assert_equal( Vector3DInternal[ 1.2, 5.6, 3.4], t.atoms[0].position)
980
- assert_equal( 'atom0' , t.atoms[0].name )
981
- assert_equal( [ false, false, true] , t.atoms[0].movable_flags )
982
- # checking atom 1
983
- assert_equal( 'O' , t.atoms[1].element)
984
- assert_equal( Vector3DInternal[-1.2, -5.6, -3.4], t.atoms[1].position)
985
- assert_equal( nil , t.atoms[1].name )
986
- end
987
-
988
- def test_exchange_axes
989
- assert_raise( Cell::ArgumentError ){ @c02.exchange_axes( [ 0 ] ) }
990
- assert_raise( Cell::ArgumentError ){ @c02.exchange_axes( [ 0, 1, 2] ) }
991
- assert_raise( Cell::AxesRangeError ){ @c02.exchange_axes( [0, 3] ) }
992
- assert_raise( Cell::AxesRangeError ){ @c02.exchange_axes( [-1, 2] ) }
993
- assert_raise( Cell::SameAxesError ){ @c02.exchange_axes( [ 1,1] ) }
994
-
995
- # b, c の交換。
996
- t = @c08.exchange_axes( [ 1, 2 ] )
997
- assert_equal( Cell, t.class )
998
- lc = t.axes.get_lattice_constants
999
- assert_in_delta( 2.0 * Math::sqrt( 3.0 ) , lc[0], $tolerance )
1000
- assert_in_delta( 2.0 , lc[1], $tolerance )
1001
- assert_in_delta( 2.0 * Math::sqrt( 2.0 ) , lc[2], $tolerance )
1002
- assert_in_delta( 45.0000000000000, lc[3], $tolerance )
1003
- assert_in_delta( 35.2643896827547, lc[4], $tolerance )
1004
- assert_in_delta( 54.7356103172453, lc[5], $tolerance )
1005
- assert_equal( true, t.axes.lefthand? )
1006
- assert_equal( 2, t.atoms.size )
1007
- # checking atom 0
1008
- assert_equal( 'Li' , t.atoms[0].element)
1009
- assert_equal( Vector3DInternal[ 1.2, 5.6, 3.4], t.atoms[0].position)
1010
- assert_equal( 'atom0' , t.atoms[0].name )
1011
- # checking atom 1
1012
- assert_equal( 'O' , t.atoms[1].element)
1013
- assert_equal( Vector3DInternal[-1.2, -5.6, -3.4], t.atoms[1].position)
1014
- assert_equal( nil , t.atoms[1].name )
1015
-
1016
- # b, c の交換によって非破壊であることを確認。
1017
- t = @c08
1018
- assert_equal( Cell, t.class )
1019
- lc = t.axes.get_lattice_constants
1020
- assert_in_delta( 2.0 * Math::sqrt( 3.0 ) , lc[0], $tolerance )
1021
- assert_in_delta( 2.0 * Math::sqrt( 2.0 ) , lc[1], $tolerance )
1022
- assert_in_delta( 2.0 , lc[2], $tolerance )
1023
- assert_in_delta( 45.0000000000000, lc[3], $tolerance )
1024
- assert_in_delta( 54.7356103172453, lc[4], $tolerance )
1025
- assert_in_delta( 35.2643896827547, lc[5], $tolerance )
1026
- assert_equal( true, t.axes.righthand? )
1027
- assert_equal( 2, t.atoms.size )
1028
- # checking atom 0
1029
- assert_equal( 'Li' , t.atoms[0].element)
1030
- assert_equal( Vector3DInternal[ 1.2, 3.4, 5.6], t.atoms[0].position)
1031
- assert_equal( 'atom0' , t.atoms[0].name )
1032
- # checking atom 1
1033
- assert_equal( 'O' , t.atoms[1].element)
1034
- assert_equal( Vector3DInternal[-1.2, -3.4, -5.6], t.atoms[1].position)
1035
- assert_equal( nil , t.atoms[1].name )
1036
-
1037
- end
1038
-
1039
- def test_reflect!
1040
- @c08.reflect!
1041
- t = @c08
1042
- assert_equal( Cell, t.class )
1043
- lc = t.axes.get_lattice_constants
1044
- assert_in_delta( 2.0 * Math::sqrt( 3.0 ) , lc[0], $tolerance )
1045
- assert_in_delta( 2.0 * Math::sqrt( 2.0 ) , lc[1], $tolerance )
1046
- assert_in_delta( 2.0 , lc[2], $tolerance )
1047
- assert_in_delta( 45.0000000000000, lc[3], $tolerance )
1048
- assert_in_delta( 54.7356103172453, lc[4], $tolerance )
1049
- assert_in_delta( 35.2643896827547, lc[5], $tolerance )
1050
- assert_equal( true, t.axes.lefthand? )
1051
- assert_equal( 2, t.atoms.size )
1052
- # checking atom 0
1053
- assert_equal( 'Li' , t.atoms[0].element)
1054
- assert_equal( Vector3DInternal[ 1.2, 3.4, 5.6], t.atoms[0].position)
1055
- assert_equal( 'atom0' , t.atoms[0].name )
1056
- # checking atom 1
1057
- assert_equal( 'O' , t.atoms[1].element)
1058
- assert_equal( Vector3DInternal[-1.2, -3.4, -5.6], t.atoms[1].position)
1059
- assert_equal( nil , t.atoms[1].name )
1060
- end
1061
-
1062
- def test_reflect
1063
- t = @c08.reflect
1064
- assert_equal( Cell, t.class )
1065
- lc = t.axes.get_lattice_constants
1066
- assert_in_delta( 2.0 * Math::sqrt( 3.0 ) , lc[0], $tolerance )
1067
- assert_in_delta( 2.0 * Math::sqrt( 2.0 ) , lc[1], $tolerance )
1068
- assert_in_delta( 2.0 , lc[2], $tolerance )
1069
- assert_in_delta( 45.0000000000000, lc[3], $tolerance )
1070
- assert_in_delta( 54.7356103172453, lc[4], $tolerance )
1071
- assert_in_delta( 35.2643896827547, lc[5], $tolerance )
1072
- assert_equal( true, t.axes.lefthand? )
1073
- assert_equal( 2, t.atoms.size )
1074
- # checking atom 0
1075
- assert_equal( 'Li' , t.atoms[0].element)
1076
- assert_equal( Vector3DInternal[ 1.2, 3.4, 5.6], t.atoms[0].position)
1077
- assert_equal( 'atom0' , t.atoms[0].name )
1078
- # checking atom 1
1079
- assert_equal( 'O' , t.atoms[1].element)
1080
- assert_equal( Vector3DInternal[-1.2, -3.4, -5.6], t.atoms[1].position)
1081
- assert_equal( nil , t.atoms[1].name )
1082
-
1083
- # 非破壊であることを確認。
1084
- t = @c08
1085
- assert_equal( Cell, t.class )
1086
- lc = t.axes.get_lattice_constants
1087
- assert_in_delta( 2.0 * Math::sqrt( 3.0 ) , lc[0], $tolerance )
1088
- assert_in_delta( 2.0 * Math::sqrt( 2.0 ) , lc[1], $tolerance )
1089
- assert_in_delta( 2.0 , lc[2], $tolerance )
1090
- assert_in_delta( 45.0000000000000, lc[3], $tolerance )
1091
- assert_in_delta( 54.7356103172453, lc[4], $tolerance )
1092
- assert_in_delta( 35.2643896827547, lc[5], $tolerance )
1093
- assert_equal( true, t.axes.righthand? )
1094
- assert_equal( 2, t.atoms.size )
1095
- # checking atom 0
1096
- assert_equal( 'Li' , t.atoms[0].element)
1097
- assert_equal( Vector3DInternal[ 1.2, 3.4, 5.6], t.atoms[0].position)
1098
- assert_equal( 'atom0' , t.atoms[0].name )
1099
- # checking atom 1
1100
- assert_equal( 'O' , t.atoms[1].element)
1101
- assert_equal( Vector3DInternal[-1.2, -3.4, -5.6], t.atoms[1].position)
1102
- assert_equal( nil , t.atoms[1].name )
1103
- end
1104
-
1105
- def test_operate
1106
- # identity operation
1107
- rotation = [
1108
- [1, 0, 0],
1109
- [0, 1, 0],
1110
- [0, 0, 1],
1111
- ]
1112
- translation = [0.0, 0.0, 0.0]
1113
- result = @c01.operate(rotation, translation)
1114
- assert_in_delta( 0.0, result.atoms[0].position[0], $tolerance)
1115
- assert_in_delta( 0.0, result.atoms[0].position[1], $tolerance)
1116
- assert_in_delta( 0.0, result.atoms[0].position[2], $tolerance)
1117
- assert_in_delta( 0.1, result.atoms[1].position[0], $tolerance)
1118
- assert_in_delta( 0.2, result.atoms[1].position[1], $tolerance)
1119
- assert_in_delta( 0.3, result.atoms[1].position[2], $tolerance)
1120
-
1121
- # rotation
1122
- rotation = [
1123
- [1, 0, 0],
1124
- [0, 1, 0],
1125
- [0, 0,-1],
1126
- ]
1127
- translation = [0.0, 0.0, 0.0]
1128
- result = @c01.operate(rotation, translation)
1129
- assert_in_delta( 0.0, result.atoms[0].position[0], $tolerance)
1130
- assert_in_delta( 0.0, result.atoms[0].position[1], $tolerance)
1131
- assert_in_delta( 0.0, result.atoms[0].position[2], $tolerance)
1132
- assert_in_delta( 0.1, result.atoms[1].position[0], $tolerance)
1133
- assert_in_delta( 0.2, result.atoms[1].position[1], $tolerance)
1134
- assert_in_delta(-0.3, result.atoms[1].position[2], $tolerance)
1135
-
1136
- # translation
1137
- rotation = [
1138
- [1, 0, 0],
1139
- [0, 1, 0],
1140
- [0, 0, 1],
1141
- ]
1142
- translation = [0.1, 0.2, 0.3]
1143
- result = @c01.operate(rotation, translation)
1144
- assert_in_delta(0.1, result.atoms[0].position[0], $tolerance)
1145
- assert_in_delta(0.2, result.atoms[0].position[1], $tolerance)
1146
- assert_in_delta(0.3, result.atoms[0].position[2], $tolerance)
1147
- assert_in_delta(0.2, result.atoms[1].position[0], $tolerance)
1148
- assert_in_delta(0.4, result.atoms[1].position[1], $tolerance)
1149
- assert_in_delta(0.6, result.atoms[1].position[2], $tolerance)
1150
-
1151
- # rotation & translation
1152
- rotation = [
1153
- [1, 0, 0],
1154
- [0, 1, 0],
1155
- [0, 0,-1],
1156
- ]
1157
- translation = [0.1, 0.2, 0.3]
1158
- result = @c01.operate(rotation, translation)
1159
- assert_in_delta(0.1, result.atoms[0].position[0], $tolerance)
1160
- assert_in_delta(0.2, result.atoms[0].position[1], $tolerance)
1161
- assert_in_delta(0.3, result.atoms[0].position[2], $tolerance)
1162
- assert_in_delta(0.2, result.atoms[1].position[0], $tolerance)
1163
- assert_in_delta(0.4, result.atoms[1].position[1], $tolerance)
1164
- assert_in_delta(0.0, result.atoms[1].position[2], $tolerance)
1165
- end
13
+ $tolerance = 10 ** (-10)
14
+ $symprec = 1.0e-05
15
+ $angle_tolerance = -1.0
16
+
17
+ def setup
18
+ # 原子のないセル。
19
+ vectors00 = [[2.0, 2.0, 2.0], [0.0, 2.0, 2.0], [0.0, 0.0, 2.0]]
20
+ axes00 = CrystalCell::LatticeAxes.new([[2.0, 2.0, 2.0], [0.0, 2.0, 2.0], [0.0, 0.0, 2.0]])
21
+ @c00 = CrystalCell::Cell.new(axes00)
22
+ @c00.comment = 'c00'
23
+
24
+ # 元素の識別子を数字にしたもの。
25
+ atoms = [
26
+ CrystalCell::Atom.new( 0, [0.0, 0.0, 0.0] ),
27
+ CrystalCell::Atom.new( 1, [0.1, 0.2, 0.3] ),
28
+ ]
29
+ @c01 = CrystalCell::Cell.new(axes00, atoms)
30
+ @c01.comment = 'c01'
31
+
32
+ # Li と O を1つずつ入れたセル。
33
+ # @c02 = CrystalCell::Cell.new( [ [1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0] ] )
34
+ atoms = [
35
+ CrystalCell::Atom.new( 'Li', [0.0, 0.0, 0.0] ),
36
+ CrystalCell::Atom.new( 'O' , [0.2, 0.2, 0.2] ),
37
+ ]
38
+ @c02 = CrystalCell::Cell.new(vectors00, atoms)
39
+ @c02.comment = 'c02'
40
+
41
+ # 原子の順序を逆にしたもの。
42
+ atoms = [
43
+ CrystalCell::Atom.new( 'O' , [0.2, 0.2, 0.2] ),
44
+ CrystalCell::Atom.new( 'Li', [0.0, 0.0, 0.0] ),
45
+ ]
46
+ @c03 = CrystalCell::Cell.new(vectors00, atoms)
47
+ @c03.comment = 'c03'
48
+
49
+ # 原子の順序がいりまじったもの
50
+ atoms = [
51
+ CrystalCell::Atom.new( 'Li', [0.0, 0.0, 0.0] ),
52
+ CrystalCell::Atom.new( 'O' , [0.2, 0.2, 0.2] ),
53
+ CrystalCell::Atom.new( 'Li', [0.1, 0.2, 0.3] ),
54
+ ]
55
+ @c04 = CrystalCell::Cell.new(vectors00, atoms)
56
+ @c04.comment = 'c04'
57
+
58
+ # 原子が不足しているもの。
59
+ atoms = [
60
+ CrystalCell::Atom.new( 'Li', [0.0, 0.0, 0.0] ),
61
+ ]
62
+ @c05 = CrystalCell::Cell.new(vectors00, atoms)
63
+ @c05.comment = 'c05'
64
+
65
+ # Selective dynamics をいれたもの。
66
+ atoms = [
67
+ CrystalCell::Atom.new( 'Li', [0.0, 0.0, 0.0], nil, [true, false, false ] ),
68
+ CrystalCell::Atom.new( 'O' , [0.2, 0.2, 0.2] ),
69
+ ]
70
+ @c06 = CrystalCell::Cell.new(vectors00, atoms)
71
+ @c06.comment = 'c06'
72
+
73
+ # 元素の識別子を数字にしたもの。
74
+ atoms = [
75
+ CrystalCell::Atom.new( 0, Mageo::Vector3DInternal[0.0, 0.0, 0.0] ),
76
+ CrystalCell::Atom.new( 1, Mageo::Vector3DInternal[0.2, 0.2, 0.2] ),
77
+ ]
78
+ @c07 = CrystalCell::Cell.new(vectors00, atoms)
79
+ @c07.comment = 'c07'
80
+
81
+ # セル外の座標の原子を追加。
82
+ atoms = [
83
+ CrystalCell::Atom.new( 'Li', [ 1.2, 3.4, 5.6], "atom0", [ false, false, true] ),
84
+ CrystalCell::Atom.new( 'O', [-1.2, -3.4, -5.6] ),
85
+ ]
86
+ @c08 = CrystalCell::Cell.new(vectors00, atoms)
87
+ @c08.comment = 'c08'
88
+
89
+ #cubic
90
+ axes = CrystalCell::LatticeAxes.new(
91
+ [[1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0]]
92
+ )
93
+ atoms = [
94
+ CrystalCell::Atom.new( 0, [0.0, 0.0, 0.0] )
95
+ ]
96
+ @c10 = CrystalCell::Cell.new( axes, atoms)
97
+ @c10.comment = 'cubic'
98
+
99
+ #hexagonal
100
+ axes = CrystalCell::LatticeAxes.new(
101
+ [
102
+ [0.86602540378443864676, 0.5, 0.0],
103
+ [0.0, 1.0, 0.0],
104
+ [0.0, 0.0, 1.0],
105
+ ]
106
+ )
107
+ atoms = [
108
+ CrystalCell::Atom.new( 0, [0.0, 0.0, 0.0] )
109
+ ]
110
+ @c11 = CrystalCell::Cell.new( axes, atoms)
111
+ @c11.comment = 'hexagonal'
112
+
113
+ #monoclinic
114
+ axes = CrystalCell::LatticeAxes.new(
115
+ [ [1.5, 1.4, 0.0],
116
+ [0.0, 1.2, 0.0],
117
+ [0.0, 0.0, 1.0],
118
+ ]
119
+ )
120
+ atoms = [
121
+ CrystalCell::Atom.new( 0, [0.0, 0.0, 0.0]),
122
+ #CrystalCell::Atom.new( 0, [0.1, 0.2, 0.3]),
123
+ #CrystalCell::Atom.new( 0, [0.2, 0.3, 0.4]),
124
+ ]
125
+ @c12 = CrystalCell::Cell.new( axes, atoms)
126
+ @c12.comment = 'monoclinic'
127
+
128
+ #orthorhombic
129
+ axes = CrystalCell::LatticeAxes.new(
130
+ [
131
+ [3.0, 0.0, 0.0],
132
+ [0.0, 2.0, 0.0],
133
+ [0.0, 0.0, 1.0],
134
+ ]
135
+ )
136
+ atoms = [
137
+ CrystalCell::Atom.new( 0, [0.0, 0.0, 0.0])
138
+ ]
139
+ @c13 = CrystalCell::Cell.new( axes, atoms)
140
+ @c13.comment = 'orthorhombic'
141
+
142
+ #tetragonal
143
+ axes = CrystalCell::LatticeAxes.new(
144
+ [
145
+ [2.0, 0.0, 0.0],
146
+ [0.0, 2.0, 0.0],
147
+ [0.0, 0.0, 1.0],
148
+ ]
149
+ )
150
+ atoms = [
151
+ CrystalCell::Atom.new( 0, [0.0, 0.0, 0.0], )
152
+ ]
153
+ @c14 = CrystalCell::Cell.new( axes, atoms)
154
+ @c14.comment = 'tetragonal'
155
+
156
+ #tetragonal-b
157
+ axes = CrystalCell::LatticeAxes.new(
158
+ [
159
+ [2.0, 0.0, 0.0],
160
+ [0.0, 1.0, 0.0],
161
+ [0.0, 0.0, 2.0],
162
+ ]
163
+ )
164
+ atoms = [
165
+ CrystalCell::Atom.new( 0, [0.0, 0.0, 0.0], )
166
+ ]
167
+ @c14b = CrystalCell::Cell.new( axes, atoms)
168
+ @c14b.comment = 'tetragonal-b'
169
+
170
+ #triclinic
171
+ axes = CrystalCell::LatticeAxes.new(
172
+ [
173
+ [1.5, 1.4, 1.3],
174
+ [0.0, 1.2, 1.1],
175
+ [0.0, 0.0, 1.0],
176
+ ]
177
+ )
178
+ atoms = [
179
+ CrystalCell::Atom.new( 0, [0.0, 0.0, 0.0] ),
180
+ CrystalCell::Atom.new( 0, [0.1, 0.2, 0.3] ),
181
+ CrystalCell::Atom.new( 0, [0.2, 0.3, 0.4] ),
182
+ ]
183
+ @c15 = CrystalCell::Cell.new( axes, atoms)
184
+ @c15.comment = 'triclinic'
185
+
186
+ #trigonal
187
+ axes = CrystalCell::LatticeAxes.new(
188
+ [
189
+ [0.86602540378443864676, 0.5, 0.0],
190
+ [0.0, 1.0, 0.0],
191
+ [0.0, 0.0, 1.0],
192
+ ]
193
+ )
194
+ atoms = [
195
+ CrystalCell::Atom.new( 0, [0.0, 0.0, 0.0]),
196
+ CrystalCell::Atom.new( 0, [0.333333333333333, 0.333333333333333, 0.333333333333333] ),
197
+ ]
198
+ @c16 = CrystalCell::Cell.new( axes, atoms)
199
+ @c16.comment = 'trigonal'
200
+ end
201
+
202
+ def test_initialize
203
+ la = CrystalCell::LatticeAxes.new( [ [2.0, 2.0, 2.0], [0.0, 2.0, 2.0], [0.0, 0.0, 2.0] ] )
204
+ c10 = CrystalCell::Cell.new( la )
205
+ c10.comment = 'c00'
206
+ assert_equal( CrystalCell::Cell, c10.class )
207
+ assert_in_delta( 2.0, c10.axes[0][0], $tolerance )
208
+ assert_in_delta( 2.0, c10.axes[0][1], $tolerance )
209
+ assert_in_delta( 2.0, c10.axes[0][2], $tolerance )
210
+ assert_in_delta( 0.0, c10.axes[1][0], $tolerance )
211
+ assert_in_delta( 2.0, c10.axes[1][1], $tolerance )
212
+ assert_in_delta( 2.0, c10.axes[1][2], $tolerance )
213
+ assert_in_delta( 0.0, c10.axes[2][0], $tolerance )
214
+ assert_in_delta( 0.0, c10.axes[2][1], $tolerance )
215
+ assert_in_delta( 2.0, c10.axes[2][2], $tolerance )
216
+
217
+
218
+ end
219
+
220
+ def test_positions
221
+ assert_equal( [], @c00.positions)
222
+ assert_equal( [ Mageo::Vector3DInternal[0.0, 0.0, 0.0], Mageo::Vector3DInternal[0.2, 0.2, 0.2] ], @c02.positions )
223
+ assert_equal( [ Mageo::Vector3DInternal[0.0, 0.0, 0.0], Mageo::Vector3DInternal[0.1, 0.2, 0.3] ], @c01.positions )
224
+ end
225
+
226
+ def test_select_indices
227
+ assert_equal( [], @c00.select_indices{ |i| i.element == "" } )
228
+ assert_equal( [], @c00.select_indices{ |i| i.element == "Li" } )
229
+
230
+ assert_equal( [] , @c01.select_indices{ |i| i.element == "" } )
231
+ assert_equal( [] , @c01.select_indices{ |i| i.element == "Li" } )
232
+ #@c01.select_indices{ |i| p i.element }
233
+ assert_equal( [0], @c01.select_indices{ |i| i.element == 0 } )
234
+
235
+ assert_equal( [1], @c01.select_indices{ |i| i.element == 1 } )
236
+
237
+ assert_equal( [] , @c04.select_indices{ |i| i.element == "" } )
238
+ assert_equal( [0, 2], @c04.select_indices{ |i| i.element == "Li" } )
239
+ assert_equal( [1], @c04.select_indices{ |i| i.element == "O" } )
240
+ assert_equal( [ ], @c04.select_indices{ |i| i.element == 0 } )
241
+ assert_equal( [ ], @c04.select_indices{ |i| i.element == 1 } )
242
+
243
+ assert_equal( [1, 2], @c04.select_indices{ |i| i.position[0] > 0.05 } )
244
+ end
245
+
246
+ def test_atoms_in_supercell
247
+ t = @c02.atoms_in_supercell( 0, 0, 0, 0, 0, 1 )
248
+ assert_equal( 'Li', t[0].element )
249
+ assert_equal( 'Li', t[1].element )
250
+ assert_equal( 'O' , t[2].element )
251
+ assert_equal( 'O' , t[3].element )
252
+
253
+ assert_equal( Mageo::Vector3DInternal[0.0, 0.0, 0.0], t[0].position )
254
+ assert_equal( Mageo::Vector3DInternal[0.0, 0.0, 1.0], t[1].position )
255
+ assert_equal( Mageo::Vector3DInternal[0.2, 0.2, 0.2], t[2].position )
256
+ assert_equal( Mageo::Vector3DInternal[0.2, 0.2, 1.2], t[3].position )
257
+
258
+ t = @c02.atoms_in_supercell(-1, 1,-1, 1,-1, 1 )
259
+ assert_equal( ['Li']*27 + ['O'] * 27 , t.map{|i| i.element} )
260
+ assert_equal( Mageo::Vector3DInternal[-1.0, -1.0, -1.0], t[ 0].position )
261
+ assert_equal( Mageo::Vector3DInternal[-1.0, -1.0, 0.0], t[ 1].position )
262
+ assert_equal( Mageo::Vector3DInternal[-1.0, -1.0, 1.0], t[ 2].position )
263
+ assert_equal( Mageo::Vector3DInternal[-1.0, 0.0, -1.0], t[ 3].position )
264
+ assert_equal( Mageo::Vector3DInternal[-1.0, 0.0, 0.0], t[ 4].position )
265
+ assert_equal( Mageo::Vector3DInternal[-1.0, 0.0, 1.0], t[ 5].position )
266
+ assert_equal( Mageo::Vector3DInternal[-1.0, 1.0, -1.0], t[ 6].position )
267
+ assert_equal( Mageo::Vector3DInternal[-1.0, 1.0, 0.0], t[ 7].position )
268
+ assert_equal( Mageo::Vector3DInternal[-1.0, 1.0, 1.0], t[ 8].position )
269
+ assert_equal( Mageo::Vector3DInternal[ 0.0, -1.0, -1.0], t[ 9].position )
270
+ assert_equal( Mageo::Vector3DInternal[ 0.0, -1.0, 0.0], t[10].position )
271
+ assert_equal( Mageo::Vector3DInternal[ 0.0, -1.0, 1.0], t[11].position )
272
+ assert_equal( Mageo::Vector3DInternal[ 0.0, 0.0, -1.0], t[12].position )
273
+ assert_equal( Mageo::Vector3DInternal[ 0.0, 0.0, 0.0], t[13].position )
274
+ assert_equal( Mageo::Vector3DInternal[ 0.0, 0.0, 1.0], t[14].position )
275
+ assert_equal( Mageo::Vector3DInternal[ 0.0, 1.0, -1.0], t[15].position )
276
+ assert_equal( Mageo::Vector3DInternal[ 0.0, 1.0, 0.0], t[16].position )
277
+ assert_equal( Mageo::Vector3DInternal[ 0.0, 1.0, 1.0], t[17].position )
278
+ assert_equal( Mageo::Vector3DInternal[ 1.0, -1.0, -1.0], t[18].position )
279
+ assert_equal( Mageo::Vector3DInternal[ 1.0, -1.0, 0.0], t[19].position )
280
+ assert_equal( Mageo::Vector3DInternal[ 1.0, -1.0, 1.0], t[20].position )
281
+ assert_equal( Mageo::Vector3DInternal[ 1.0, 0.0, -1.0], t[21].position )
282
+ assert_equal( Mageo::Vector3DInternal[ 1.0, 0.0, 0.0], t[22].position )
283
+ assert_equal( Mageo::Vector3DInternal[ 1.0, 0.0, 1.0], t[23].position )
284
+ assert_equal( Mageo::Vector3DInternal[ 1.0, 1.0, -1.0], t[24].position )
285
+ assert_equal( Mageo::Vector3DInternal[ 1.0, 1.0, 0.0], t[25].position )
286
+ assert_equal( Mageo::Vector3DInternal[ 1.0, 1.0, 1.0], t[26].position )
287
+ assert_equal( Mageo::Vector3DInternal[-0.8, -0.8, -0.8], t[27].position )
288
+ assert_equal( Mageo::Vector3DInternal[-0.8, -0.8, 0.2], t[28].position )
289
+ assert_equal( Mageo::Vector3DInternal[-0.8, -0.8, 1.2], t[29].position )
290
+ assert_equal( Mageo::Vector3DInternal[-0.8, 0.2, -0.8], t[30].position )
291
+ assert_equal( Mageo::Vector3DInternal[-0.8, 0.2, 0.2], t[31].position )
292
+ assert_equal( Mageo::Vector3DInternal[-0.8, 0.2, 1.2], t[32].position )
293
+ assert_equal( Mageo::Vector3DInternal[-0.8, 1.2, -0.8], t[33].position )
294
+ assert_equal( Mageo::Vector3DInternal[-0.8, 1.2, 0.2], t[34].position )
295
+ assert_equal( Mageo::Vector3DInternal[-0.8, 1.2, 1.2], t[35].position )
296
+ assert_equal( Mageo::Vector3DInternal[ 0.2, -0.8, -0.8], t[36].position )
297
+ assert_equal( Mageo::Vector3DInternal[ 0.2, -0.8, 0.2], t[37].position )
298
+ assert_equal( Mageo::Vector3DInternal[ 0.2, -0.8, 1.2], t[38].position )
299
+ assert_equal( Mageo::Vector3DInternal[ 0.2, 0.2, -0.8], t[39].position )
300
+ assert_equal( Mageo::Vector3DInternal[ 0.2, 0.2, 0.2], t[40].position )
301
+ assert_equal( Mageo::Vector3DInternal[ 0.2, 0.2, 1.2], t[41].position )
302
+ assert_equal( Mageo::Vector3DInternal[ 0.2, 1.2, -0.8], t[42].position )
303
+ assert_equal( Mageo::Vector3DInternal[ 0.2, 1.2, 0.2], t[43].position )
304
+ assert_equal( Mageo::Vector3DInternal[ 0.2, 1.2, 1.2], t[44].position )
305
+ assert_equal( Mageo::Vector3DInternal[ 1.2, -0.8, -0.8], t[45].position )
306
+ assert_equal( Mageo::Vector3DInternal[ 1.2, -0.8, 0.2], t[46].position )
307
+ assert_equal( Mageo::Vector3DInternal[ 1.2, -0.8, 1.2], t[47].position )
308
+ assert_equal( Mageo::Vector3DInternal[ 1.2, 0.2, -0.8], t[48].position )
309
+ assert_equal( Mageo::Vector3DInternal[ 1.2, 0.2, 0.2], t[49].position )
310
+ assert_equal( Mageo::Vector3DInternal[ 1.2, 0.2, 1.2], t[50].position )
311
+ assert_equal( Mageo::Vector3DInternal[ 1.2, 1.2, -0.8], t[51].position )
312
+ assert_equal( Mageo::Vector3DInternal[ 1.2, 1.2, 0.2], t[52].position )
313
+ assert_equal( Mageo::Vector3DInternal[ 1.2, 1.2, 1.2], t[53].position )
314
+ end
315
+
316
+ def test_elements
317
+ assert_equal( [], @c00.elements)
318
+ assert_equal( [ 'Li', 'O' ], @c02.elements )
319
+ assert_equal( [ 0, 1 ], @c01.elements )
320
+ end
321
+
322
+ def test_add_atom
323
+ assert_raise(ArgumentError){
324
+ @c00.add_atom('Li', [0.5, 0.5, 0.5] )
325
+ }
326
+
327
+ @c00.add_atom(CrystalCell::Atom.new( 'Li', [0.5, 0.5, 0.5] ))
328
+ assert_equal( 1 , @c00.atoms.size)
329
+ assert_equal( 'Li' , @c00.atoms[0].element)
330
+ assert_equal( Mageo::Vector3DInternal[0.5, 0.5, 0.5], @c00.atoms[0].position)
331
+ assert_equal( nil , @c00.atoms[0].name )
332
+
333
+ @c00.add_atom(CrystalCell::Atom.new( nil , [0.5, 0.5, 0.5], 'A' ))
334
+ assert_equal( 2 , @c00.atoms.size)
335
+ assert_equal( nil , @c00.atoms[1].element)
336
+ assert_equal( Mageo::Vector3DInternal[0.5, 0.5, 0.5], @c00.atoms[1].position)
337
+ assert_equal( 'A' , @c00.atoms[1].name )
338
+
339
+ @c02.add_atom(CrystalCell::Atom.new( 'Li', [0.5, 0.5, 0.5] ))
340
+ assert_equal( 3 , @c02.atoms.size)
341
+ assert_equal( 'Li' , @c02.atoms[0].element)
342
+ assert_equal( Mageo::Vector3DInternal[0.0, 0.0, 0.0], @c02.atoms[0].position)
343
+ assert_equal( 'O' , @c02.atoms[1].element)
344
+ assert_equal( Mageo::Vector3DInternal[0.2, 0.2, 0.2], @c02.atoms[1].position)
345
+ assert_equal( 'Li' , @c02.atoms[2].element)
346
+ assert_equal( Mageo::Vector3DInternal[0.5, 0.5, 0.5], @c02.atoms[2].position)
347
+
348
+ @c01.add_atom(CrystalCell::Atom.new( 'Li', [0.5, 0.5, 0.5] ))
349
+ assert_equal( 3 , @c01.atoms.size)
350
+ assert_equal( 0 , @c01.atoms[0].element)
351
+ assert_equal( Mageo::Vector3DInternal[0.0, 0.0, 0.0], @c01.atoms[0].position)
352
+ assert_equal( 1 , @c01.atoms[1].element)
353
+ assert_equal( Mageo::Vector3DInternal[0.1, 0.2, 0.3], @c01.atoms[1].position)
354
+ assert_equal( 'Li' , @c01.atoms[2].element)
355
+ assert_equal( Mageo::Vector3DInternal[0.5, 0.5, 0.5], @c01.atoms[2].position)
356
+
357
+ end
358
+
359
+ def test_delete_atom
360
+ # assert_raise(RuntimeError ) {@c00.delete_atom( 0 ) }
361
+ assert_equal(nil, @c00.delete_atom( 0 ) )
362
+ assert_equal([], @c00.positions )
363
+ assert_equal([], @c00.elements )
364
+
365
+ @c02.delete_atom( 0 )
366
+ assert_equal( [ Mageo::Vector3DInternal[0.2, 0.2, 0.2] ], @c02.positions)
367
+ assert_equal( [ 'O' ], @c02.elements )
368
+ @c02.delete_atom( 0 )
369
+ assert_equal( [], @c02.positions)
370
+ assert_equal( [], @c02.elements )
371
+
372
+ @c01.delete_atom( 0 )
373
+ assert_equal( [ Mageo::Vector3DInternal[0.1, 0.2, 0.3] ], @c01.positions)
374
+ assert_equal( [ 1 ], @c01.elements )
375
+ end
376
+
377
+ def test_set_elements
378
+ # 原子がないので変更されない。
379
+ @c00.set_elements( [] )
380
+ assert_equal( [], @c00.atoms )
381
+
382
+ # 0 -> 'Li、 1 -> 'O' に変更。
383
+ tmp = Marshal.load( Marshal.dump( @c01 ))
384
+ tmp.set_elements( [ 'Li', 'O' ] )
385
+ assert_equal( 'Li', tmp.atoms[0].element )
386
+ assert_equal( 'O', tmp.atoms[1].element )
387
+
388
+ # 0 -> 'Li, 片方だけ変更。
389
+ tmp = Marshal.load( Marshal.dump( @c01 ))
390
+ tmp.set_elements( [ 'Li' ] )
391
+ assert_equal( 'Li', tmp.atoms[0].element )
392
+ assert_equal( 1, tmp.atoms[1].element )
393
+
394
+ # 元々整数値以外にセットされているのでマッチせず変更されない。
395
+ tmp = Marshal.load( Marshal.dump( @c02 ))
396
+ tmp.set_elements( [ 'O', 'Li' ] )
397
+ assert_equal( 'Li', tmp.atoms[0].element )
398
+ assert_equal( 'O', tmp.atoms[1].element )
399
+
400
+ # Hash argument.
401
+ # 0 -> 'Li、 1 -> 'O' に変更。
402
+ tmp = Marshal.load( Marshal.dump( @c01 ))
403
+ tmp.set_elements( { 0 => 'Li', 1 => 'O' } )
404
+ assert_equal( 'Li', tmp.atoms[0].element )
405
+ assert_equal( 'O', tmp.atoms[1].element )
406
+
407
+ # 'Li' -> 'Na', 'O' -> 'S' に変更。
408
+ tmp = Marshal.load( Marshal.dump( @c02 ))
409
+ tmp.set_elements( { 'Li' => 'Na', 'O' => 'S' } )
410
+ assert_equal( 'Na', tmp.atoms[0].element )
411
+ assert_equal( 'S', tmp.atoms[1].element )
412
+
413
+ # 'Li' -> 'Na'、 片方だけ変更。
414
+ tmp = Marshal.load( Marshal.dump( @c02 ))
415
+ tmp.set_elements( { 'Li' => 'Na' } )
416
+ assert_equal( 'Na', tmp.atoms[0].element )
417
+ assert_equal( 'O', tmp.atoms[1].element )
418
+ end
419
+
420
+ def test_equal_lattice_in_delta?
421
+ assert_equal( true , @c00.equal_lattice_in_delta?(@c00, 0.001, 0.1) )
422
+ assert_equal( true , @c00.equal_lattice_in_delta?(@c02, 0.001, 0.1) )
423
+ assert_equal( true , @c00.equal_lattice_in_delta?(@c01, 0.001, 0.1) )
424
+ assert_equal( true , @c02.equal_lattice_in_delta?(@c00, 0.001, 0.1) )
425
+ assert_equal( true , @c02.equal_lattice_in_delta?(@c02, 0.001, 0.1) )
426
+ assert_equal( true , @c02.equal_lattice_in_delta?(@c01, 0.001, 0.1) )
427
+ assert_equal( true , @c01.equal_lattice_in_delta?(@c00, 0.001, 0.1) )
428
+ assert_equal( true , @c01.equal_lattice_in_delta?(@c02, 0.001, 0.1) )
429
+ assert_equal( true , @c01.equal_lattice_in_delta?(@c01, 0.001, 0.1) )
430
+
431
+ end
432
+
433
+ def test_equal_atoms_in_delta?
434
+ assert_equal( true , @c00.equal_atoms_in_delta?( @c00, 0.01 ) )
435
+ assert_equal( false, @c00.equal_atoms_in_delta?( @c02, 0.01 ) )
436
+ assert_equal( false, @c00.equal_atoms_in_delta?( @c01, 0.01 ) )
437
+ assert_equal( false, @c00.equal_atoms_in_delta?( @c03, 0.01 ) )
438
+ assert_equal( false, @c00.equal_atoms_in_delta?( @c04, 0.01 ) )
439
+ assert_equal( false, @c00.equal_atoms_in_delta?( @c05, 0.01 ) )
440
+ assert_equal( false, @c02.equal_atoms_in_delta?( @c00, 0.01 ) )
441
+ assert_equal( true , @c02.equal_atoms_in_delta?( @c02, 0.01 ) )
442
+ assert_equal( false, @c02.equal_atoms_in_delta?( @c01, 0.01 ) )
443
+ assert_equal( true , @c02.equal_atoms_in_delta?( @c03, 0.01 ) )
444
+ assert_equal( false, @c02.equal_atoms_in_delta?( @c04, 0.01 ) )
445
+ assert_equal( false, @c02.equal_atoms_in_delta?( @c05, 0.01 ) )
446
+ assert_equal( false, @c01.equal_atoms_in_delta?( @c00, 0.01 ) )
447
+ assert_equal( false, @c01.equal_atoms_in_delta?( @c02, 0.01 ) )
448
+ assert_equal( true , @c01.equal_atoms_in_delta?( @c01, 0.01 ) )
449
+ assert_equal( false, @c01.equal_atoms_in_delta?( @c03, 0.01 ) )
450
+ assert_equal( false, @c01.equal_atoms_in_delta?( @c04, 0.01 ) )
451
+ assert_equal( false, @c01.equal_atoms_in_delta?( @c05, 0.01 ) )
452
+ assert_equal( false, @c03.equal_atoms_in_delta?( @c00, 0.01 ) )
453
+ assert_equal( true , @c03.equal_atoms_in_delta?( @c02, 0.01 ) )
454
+ assert_equal( false, @c03.equal_atoms_in_delta?( @c01, 0.01 ) )
455
+ assert_equal( true , @c03.equal_atoms_in_delta?( @c03, 0.01 ) )
456
+ assert_equal( false, @c03.equal_atoms_in_delta?( @c04, 0.01 ) )
457
+ assert_equal( false, @c03.equal_atoms_in_delta?( @c05, 0.01 ) )
458
+ assert_equal( false, @c04.equal_atoms_in_delta?( @c00, 0.01 ) )
459
+ assert_equal( false, @c04.equal_atoms_in_delta?( @c02, 0.01 ) )
460
+ assert_equal( false, @c04.equal_atoms_in_delta?( @c01, 0.01 ) )
461
+ assert_equal( false, @c04.equal_atoms_in_delta?( @c03, 0.01 ) )
462
+ assert_equal( true , @c04.equal_atoms_in_delta?( @c04, 0.01 ) )
463
+ assert_equal( false, @c04.equal_atoms_in_delta?( @c05, 0.01 ) )
464
+ assert_equal( false, @c05.equal_atoms_in_delta?( @c00, 0.01 ) )
465
+ assert_equal( false, @c05.equal_atoms_in_delta?( @c02, 0.01 ) )
466
+ assert_equal( false, @c05.equal_atoms_in_delta?( @c01, 0.01 ) )
467
+ assert_equal( false, @c05.equal_atoms_in_delta?( @c03, 0.01 ) )
468
+ assert_equal( false, @c05.equal_atoms_in_delta?( @c04, 0.01 ) )
469
+ assert_equal( true , @c05.equal_atoms_in_delta?( @c05, 0.01 ) )
470
+ end
471
+
472
+ def test_equal_in_delta?
473
+ assert_equal(true , @c00.equal_in_delta?( @c00, 0.001, 0.1, 0.01 ) )
474
+ assert_equal(false, @c00.equal_in_delta?( @c01, 0.001, 0.1, 0.01 ) )
475
+ assert_equal(false, @c00.equal_in_delta?( @c02, 0.001, 0.1, 0.01 ) )
476
+ assert_equal(false, @c00.equal_in_delta?( @c03, 0.001, 0.1, 0.01 ) )
477
+ assert_equal(false, @c00.equal_in_delta?( @c04, 0.001, 0.1, 0.01 ) )
478
+ assert_equal(false, @c00.equal_in_delta?( @c05, 0.001, 0.1, 0.01 ) )
479
+
480
+ assert_equal(false, @c02.equal_in_delta?( @c00, 0.001, 0.1, 0.01 ) )
481
+ assert_equal(false, @c02.equal_in_delta?( @c01, 0.001, 0.1, 0.01 ) )
482
+ assert_equal(true , @c02.equal_in_delta?( @c02, 0.001, 0.1, 0.01 ) )
483
+ assert_equal(true , @c02.equal_in_delta?( @c03, 0.001, 0.1, 0.01 ) )
484
+ assert_equal(false, @c02.equal_in_delta?( @c04, 0.001, 0.1, 0.01 ) )
485
+ assert_equal(false, @c02.equal_in_delta?( @c05, 0.001, 0.1, 0.01 ) )
486
+
487
+ assert_equal(false, @c01.equal_in_delta?( @c00, 0.001, 0.1, 0.01 ) )
488
+ assert_equal(true , @c01.equal_in_delta?( @c01, 0.001, 0.1, 0.01 ) )
489
+ assert_equal(false, @c01.equal_in_delta?( @c02, 0.001, 0.1, 0.01 ) )
490
+ assert_equal(false, @c01.equal_in_delta?( @c03, 0.001, 0.1, 0.01 ) )
491
+ assert_equal(false, @c01.equal_in_delta?( @c04, 0.001, 0.1, 0.01 ) )
492
+ assert_equal(false, @c01.equal_in_delta?( @c05, 0.001, 0.1, 0.01 ) )
493
+
494
+ assert_equal(false, @c03.equal_in_delta?( @c00, 0.001, 0.1, 0.01 ) )
495
+ assert_equal(false, @c03.equal_in_delta?( @c01, 0.001, 0.1, 0.01 ) )
496
+ assert_equal(true , @c03.equal_in_delta?( @c02, 0.001, 0.1, 0.01 ) )
497
+ assert_equal(true , @c03.equal_in_delta?( @c03, 0.001, 0.1, 0.01 ) )
498
+ assert_equal(false, @c03.equal_in_delta?( @c04, 0.001, 0.1, 0.01 ) )
499
+ assert_equal(false, @c03.equal_in_delta?( @c05, 0.001, 0.1, 0.01 ) )
500
+
501
+ assert_equal(false, @c04.equal_in_delta?( @c00, 0.001, 0.1, 0.01 ) )
502
+ assert_equal(false, @c04.equal_in_delta?( @c01, 0.001, 0.1, 0.01 ) )
503
+ assert_equal(false, @c04.equal_in_delta?( @c02, 0.001, 0.1, 0.01 ) )
504
+ assert_equal(false, @c04.equal_in_delta?( @c03, 0.001, 0.1, 0.01 ) )
505
+ assert_equal(true , @c04.equal_in_delta?( @c04, 0.001, 0.1, 0.01 ) )
506
+ assert_equal(false, @c04.equal_in_delta?( @c05, 0.001, 0.1, 0.01 ) )
507
+
508
+ assert_equal(false, @c05.equal_in_delta?( @c00, 0.001, 0.1, 0.01 ) )
509
+ assert_equal(false, @c05.equal_in_delta?( @c01, 0.001, 0.1, 0.01 ) )
510
+ assert_equal(false, @c05.equal_in_delta?( @c02, 0.001, 0.1, 0.01 ) )
511
+ assert_equal(false, @c05.equal_in_delta?( @c03, 0.001, 0.1, 0.01 ) )
512
+ assert_equal(false, @c05.equal_in_delta?( @c04, 0.001, 0.1, 0.01 ) )
513
+ assert_equal(true , @c05.equal_in_delta?( @c05, 0.001, 0.1, 0.01 ) )
514
+ end
515
+
516
+ def test_equal
517
+ cell = CrystalCell::Cell.new( CrystalCell::LatticeAxes.new([ [2.0, 2.0, 2.0], [0.0, 2.0, 2.0], [0.0, 0.0, 2.0]]))
518
+ assert_equal( true , @c00 == cell )
519
+ assert_equal( false, @c01 == cell )
520
+
521
+ cell = CrystalCell::Cell.new( CrystalCell::LatticeAxes.new([ [2.0, 2.0, 2.0], [0.0, 2.0, 2.0], [0.0, 0.0, 2.0]]))
522
+ cell.add_atom(CrystalCell::Atom.new( 0, [0.0, 0.0, 0.0] ))
523
+ cell.add_atom(CrystalCell::Atom.new( 1, [0.1, 0.2, 0.3] ))
524
+ assert_equal( false, @c00 == cell )
525
+ assert_equal( true , @c01 == cell )
526
+ end
527
+
528
+ def test_distance
529
+ assert_raise(CrystalCell::Cell::TypeError){@c00.distance([0,0,0], [1,1,1])}
530
+ assert_raise(CrystalCell::Cell::TypeError){@c00.distance([0,0,0], Mageo::Vector3DInternal[1,1,1])}
531
+ assert_raise(CrystalCell::Cell::TypeError){@c00.distance([0,0,0], Mageo::Vector3D[1,1,1])}
532
+
533
+ assert_in_delta(
534
+ Math::sqrt(0.56),
535
+ @c00.distance(Mageo::Vector3DInternal[0.0, 0.0, 0.0], Mageo::Vector3DInternal[0.1, 0.1, 0.1] ),
536
+ $tolerance
537
+ )
538
+ assert_in_delta( Math::sqrt( 1.6**2 + 3.4**2 + 5.4**2),
539
+ @c00.distance( Mageo::Vector3DInternal[0.0, 0.0, 0.0], Mageo::Vector3DInternal[0.8, 0.9, 1.0] ), $tolerance
540
+ )
541
+
542
+ assert_in_delta( Math::sqrt(0.56), @c00.distance( Mageo::Vector3DInternal[0.0, 0.0, 0.0], Mageo::Vector3DInternal[0.1, 0.1, 0.1] ), $tolerance )
543
+ assert_in_delta( Math::sqrt( 1.6**2 + 3.4**2 + 5.4**2),
544
+ @c00.distance( Mageo::Vector3DInternal[0.0, 0.0, 0.0], Mageo::Vector3DInternal[0.8, 0.9, 1.0] ), $tolerance
545
+ )
546
+ end
547
+
548
+ def test_dump_poscar
549
+ c00_str = [
550
+ 'c00',
551
+ '1.0',
552
+ ' 2.00000000000000 2.00000000000000 2.00000000000000',
553
+ ' 0.00000000000000 2.00000000000000 2.00000000000000',
554
+ ' 0.00000000000000 0.00000000000000 2.00000000000000',
555
+ '',
556
+ 'Direct'
557
+ ].join("\n")
558
+
559
+ c02_str = [
560
+ 'c02',
561
+ '1.0',
562
+ ' 2.00000000000000 2.00000000000000 2.00000000000000',
563
+ ' 0.00000000000000 2.00000000000000 2.00000000000000',
564
+ ' 0.00000000000000 0.00000000000000 2.00000000000000',
565
+ ' 1 1',
566
+ 'Direct',
567
+ ' 0.00000000000000 0.00000000000000 0.00000000000000',
568
+ ' 0.20000000000000 0.20000000000000 0.20000000000000'
569
+ ].join("\n")
570
+
571
+ c01_str = [
572
+ 'c01',
573
+ '1.0',
574
+ ' 2.00000000000000 2.00000000000000 2.00000000000000',
575
+ ' 0.00000000000000 2.00000000000000 2.00000000000000',
576
+ ' 0.00000000000000 0.00000000000000 2.00000000000000',
577
+ ' 1 1',
578
+ 'Direct',
579
+ ' 0.00000000000000 0.00000000000000 0.00000000000000',
580
+ ' 0.10000000000000 0.20000000000000 0.30000000000000'
581
+ ].join("\n")
582
+
583
+ c03_str = [
584
+ 'c03',
585
+ '1.0',
586
+ ' 2.00000000000000 2.00000000000000 2.00000000000000',
587
+ ' 0.00000000000000 2.00000000000000 2.00000000000000',
588
+ ' 0.00000000000000 0.00000000000000 2.00000000000000',
589
+ ' 1 1',
590
+ 'Direct',
591
+ ' 0.00000000000000 0.00000000000000 0.00000000000000',
592
+ ' 0.20000000000000 0.20000000000000 0.20000000000000'
593
+ ].join("\n")
594
+
595
+ c04_str = [
596
+ 'c04',
597
+ '1.0',
598
+ ' 2.00000000000000 2.00000000000000 2.00000000000000',
599
+ ' 0.00000000000000 2.00000000000000 2.00000000000000',
600
+ ' 0.00000000000000 0.00000000000000 2.00000000000000',
601
+ ' 2 1',
602
+ 'Direct',
603
+ ' 0.00000000000000 0.00000000000000 0.00000000000000',
604
+ ' 0.10000000000000 0.20000000000000 0.30000000000000',
605
+ ' 0.20000000000000 0.20000000000000 0.20000000000000'
606
+ ].join("\n")
607
+
608
+ c05_str = [
609
+ 'c05',
610
+ '1.0',
611
+ ' 2.00000000000000 2.00000000000000 2.00000000000000',
612
+ ' 0.00000000000000 2.00000000000000 2.00000000000000',
613
+ ' 0.00000000000000 0.00000000000000 2.00000000000000',
614
+ ' 1',
615
+ 'Direct',
616
+ ' 0.00000000000000 0.00000000000000 0.00000000000000'
617
+ ].join("\n")
618
+
619
+ c06_str = [
620
+ 'c06',
621
+ '1.0',
622
+ ' 2.00000000000000 2.00000000000000 2.00000000000000',
623
+ ' 0.00000000000000 2.00000000000000 2.00000000000000',
624
+ ' 0.00000000000000 0.00000000000000 2.00000000000000',
625
+ ' 1 1',
626
+ 'Selective dynamics',
627
+ 'Direct',
628
+ ' 0.00000000000000 0.00000000000000 0.00000000000000 T F F',
629
+ ' 0.20000000000000 0.20000000000000 0.20000000000000 T T T'
630
+ ].join("\n")
631
+
632
+ # Raise exception
633
+ # assert_raise( RuntimeError ){ @c00.dump_poscar( [], io ) }
634
+ assert_raise( RuntimeError ){ @c00.dump_poscar( [0] ) }
635
+ assert_raise( RuntimeError ){ @c00.dump_poscar( [0, 1] ) }
636
+ assert_raise( RuntimeError ){ @c00.dump_poscar( ['Li'] ) }
637
+ assert_raise( RuntimeError ){ @c00.dump_poscar( ['Li', 'O'] ) }
638
+ assert_raise( RuntimeError ){ @c02.dump_poscar( [] ) }
639
+ assert_raise( RuntimeError ){ @c02.dump_poscar( [0] ) }
640
+ assert_raise( RuntimeError ){ @c02.dump_poscar( [0, 1] ) }
641
+ assert_raise( RuntimeError ){ @c02.dump_poscar( ['Li'] ) }
642
+ assert_raise( RuntimeError ){ @c01.dump_poscar( [] ) }
643
+ assert_raise( RuntimeError ){ @c01.dump_poscar( [0] ) }
644
+ assert_raise( RuntimeError ){ @c01.dump_poscar( ['Li'] ) }
645
+ assert_raise( RuntimeError ){ @c01.dump_poscar( ['Li', 'O'] ) }
646
+ assert_raise( RuntimeError ){ @c04.dump_poscar( [] ) }
647
+ assert_raise( RuntimeError ){ @c04.dump_poscar( [0] ) }
648
+ assert_raise( RuntimeError ){ @c04.dump_poscar( [0, 1] ) }
649
+ assert_raise( RuntimeError ){ @c04.dump_poscar( ['Li'] ) }
650
+ assert_raise( RuntimeError ){ @c05.dump_poscar( [] ) }
651
+ assert_raise( RuntimeError ){ @c05.dump_poscar( [0] ) }
652
+ assert_raise( RuntimeError ){ @c05.dump_poscar( [0, 1] ) }
653
+ assert_raise( RuntimeError ){ @c05.dump_poscar( ['Li', 'O'] ) }
654
+ assert_raise( RuntimeError ){ @c03.dump_poscar( [] ) }
655
+ assert_raise( RuntimeError ){ @c03.dump_poscar( [0] ) }
656
+ assert_raise( RuntimeError ){ @c03.dump_poscar( [0, 1] ) }
657
+ assert_raise( RuntimeError ){ @c03.dump_poscar( ['Li'] ) }
658
+
659
+ #
660
+ StringIO.new do |io|
661
+ @c00.dump_poscar( [], io )
662
+ assert_equal( c00_str, io.read )
663
+ end
664
+
665
+ StringIO.new do |io|
666
+ @c02.dump_poscar( [ 'Li', 'O' ], io )
667
+ assert_equal( c02, io.read )
668
+ end
669
+
670
+ StringIO.new do |io|
671
+ @c01.dump_poscar( [ 0, 1 ], io )
672
+ assert_equal( c01, io.read )
673
+ end
674
+
675
+ StringIO.new do |io|
676
+ @c03.dump_poscar( [ 'Li', 'O' ], io )
677
+ assert_equal( c03, io.read )
678
+ end
679
+
680
+ StringIO.new do |io|
681
+ @c04.dump_poscar( [ 'Li', 'O' ], io )
682
+ assert_equal( c04, io.read )
683
+ end
684
+
685
+ StringIO.new do |io|
686
+ @c05.dump_poscar( [ 'Li', 'O' ], io )
687
+ assert_equal( c05, io.read )
688
+ end
689
+
690
+ assert_equal( c00_str, @c00.dump_poscar( [ ], nil ) )
691
+ assert_equal( c01_str, @c01.dump_poscar( [ 0 , 1 ], nil ) )
692
+ assert_equal( c02_str, @c02.dump_poscar( [ 'Li', 'O' ], nil ) )
693
+ assert_equal( c03_str, @c03.dump_poscar( [ 'Li', 'O' ], nil ) )
694
+ assert_equal( c04_str, @c04.dump_poscar( [ 'Li', 'O' ], nil ) )
695
+ assert_equal( c05_str, @c05.dump_poscar( [ 'Li' ], nil ) )
696
+
697
+ assert_equal( c00_str, @c00.dump_poscar( [ ] ) )
698
+ assert_equal( c01_str, @c01.dump_poscar( [ 0 , 1 ] ) )
699
+ assert_equal( c02_str, @c02.dump_poscar( [ 'Li', 'O' ] ) )
700
+ assert_equal( c03_str, @c03.dump_poscar( [ 'Li', 'O' ] ) )
701
+ assert_equal( c04_str, @c04.dump_poscar( [ 'Li', 'O' ] ) )
702
+ assert_equal( c05_str, @c05.dump_poscar( [ 'Li' ] ) )
703
+
704
+ assert_equal( c06_str, @c06 .dump_poscar( [ 'Li', 'O' ] ) )
705
+
706
+ end
707
+
708
+ def test_rotate
709
+ @c02.add_atom(CrystalCell::Atom.new( 'Li', [1.1, 1.2, 1.3] ))
710
+ assert_equal(
711
+ [ Mageo::Vector3DInternal[ 0.0, 0.0, 0.0 ],
712
+ Mageo::Vector3DInternal[ -0.2, -0.2, -0.2 ],
713
+ Mageo::Vector3DInternal[ -1.1, -1.2, -1.3 ]
714
+ ],
715
+ @c02.rotate( [[-1, 0, 0],[0, -1, 0],[0, 0, -1]] ).positions
716
+ )
717
+
718
+ # Check not destructed.
719
+ assert_equal(
720
+ [ Mageo::Vector3DInternal[ 0.0, 0.0, 0.0 ],
721
+ Mageo::Vector3DInternal[ 0.2, 0.2, 0.2 ],
722
+ Mageo::Vector3DInternal[ 1.1, 1.2, 1.3 ]
723
+ ],
724
+ @c02.positions
725
+ )
726
+ end
727
+
728
+ def test_rotate!
729
+ @c02.add_atom(CrystalCell::Atom.new( 'Li', [0.1, 0.2, 0.3] ))
730
+ @c02.rotate!( [[-1, 0, 0],[0, -1, 0],[0, 0, -1]] )
731
+ assert_equal(
732
+ [ Mageo::Vector3DInternal[ 0.0, 0.0, 0.0 ],
733
+ Mageo::Vector3DInternal[ -0.2, -0.2, -0.2 ],
734
+ Mageo::Vector3DInternal[ -0.1, -0.2, -0.3 ]
735
+ ],
736
+ @c02.positions
737
+ )
738
+ end
739
+
740
+ def test_translate
741
+ poss = @c02.translate( [1.1, 1.2, 1.3] ).positions
742
+ assert_in_delta( 1.1, poss[0][0], $tolerance )
743
+ assert_in_delta( 1.2, poss[0][1], $tolerance )
744
+ assert_in_delta( 1.3, poss[0][2], $tolerance )
745
+ assert_in_delta( 1.3, poss[1][0], $tolerance )
746
+ assert_in_delta( 1.4, poss[1][1], $tolerance )
747
+ assert_in_delta( 1.5, poss[1][2], $tolerance )
748
+
749
+ poss = @c02.translate( [-0.3,-0.3,-0.3] ).positions
750
+ assert_in_delta( -0.3, poss[0][0], $tolerance )
751
+ assert_in_delta( -0.3, poss[0][1], $tolerance )
752
+ assert_in_delta( -0.3, poss[0][2], $tolerance )
753
+ assert_in_delta( -0.1, poss[1][0], $tolerance )
754
+ assert_in_delta( -0.1, poss[1][1], $tolerance )
755
+ assert_in_delta( -0.1, poss[1][2], $tolerance )
756
+
757
+ # Check not destructed.
758
+ assert_equal(
759
+ [ Mageo::Vector3DInternal[ 0.0, 0.0, 0.0 ],
760
+ Mageo::Vector3DInternal[ 0.2, 0.2, 0.2 ]
761
+ ],
762
+ @c02.positions
763
+ )
764
+ end
765
+
766
+ def test_translate!
767
+ @c02.translate!( [1.1, 1.2, 1.3] )
768
+ poss = @c02.positions
769
+
770
+ assert_in_delta( 1.1, poss[0][0], $tolerance )
771
+ assert_in_delta( 1.2, poss[0][1], $tolerance )
772
+ assert_in_delta( 1.3, poss[0][2], $tolerance )
773
+ assert_in_delta( 1.3, poss[1][0], $tolerance )
774
+ assert_in_delta( 1.4, poss[1][1], $tolerance )
775
+ assert_in_delta( 1.5, poss[1][2], $tolerance )
776
+ end
777
+
778
+ def test_center_of_atoms
779
+ # No atom in the cell.
780
+ assert_raise( CrystalCell::Cell::NoAtomError ){ @c00.center_of_atoms }
781
+
782
+ assert_equal( Mageo::Vector3DInternal[0.05, 0.1, 0.15], @c01.center_of_atoms )
783
+ assert_equal( Mageo::Vector3DInternal[0.1, 0.1, 0.1], @c02.center_of_atoms )
784
+ assert_equal( Mageo::Vector3DInternal[0.1, 0.1, 0.1], @c03.center_of_atoms )
785
+ assert_equal( Mageo::Vector3DInternal[0.1, 4.0/30.0, 5.0/30.0], @c04.center_of_atoms )
786
+ assert_equal( Mageo::Vector3DInternal[0.0, 0.0, 0.0], @c05.center_of_atoms )
787
+ assert_equal( Mageo::Vector3DInternal[0.1, 0.1, 0.1], @c06.center_of_atoms )
788
+ assert_equal( Mageo::Vector3DInternal[0.1, 0.1, 0.1], @c07.center_of_atoms )
789
+ end
790
+
791
+ def test_calc_volume
792
+ # @c00 = CrystalCell::Cell.new( [ [2.0, 2.0, 2.0], [0.0, 2.0, 2.0], [0.0, 0.0, 2.0] ] )
793
+ assert_in_delta( 8.00, @c00.calc_volume, $tolerance)
794
+
795
+ c10 = CrystalCell::Cell.new( [ [1.0, 0.0, 0.0], [0.0, 1.0, 0.0], [0.0, 0.0, 1.0] ] )
796
+ c11 = CrystalCell::Cell.new( [ [0.5, 0.5, 0.0], [0.5, 0.0, 0.5], [0.0, 0.5, 0.5] ] )
797
+ assert_in_delta( 1.00, c10.calc_volume, $tolerance)
798
+ assert_in_delta( 0.25, c11.calc_volume, $tolerance)
799
+ end
800
+
801
+ def test_cell_of_elements
802
+ t = @c04.cell_of_elements( [ 'Li' ] )
803
+ assert_equal( CrystalCell::Cell, t.class )
804
+ assert_in_delta( 2.0, t.axes[0][0], $tolerance )
805
+ assert_in_delta( 2.0, t.axes[0][1], $tolerance )
806
+ assert_in_delta( 2.0, t.axes[0][2], $tolerance )
807
+ assert_in_delta( 0.0, t.axes[1][0], $tolerance )
808
+ assert_in_delta( 2.0, t.axes[1][1], $tolerance )
809
+ assert_in_delta( 2.0, t.axes[1][2], $tolerance )
810
+ assert_in_delta( 0.0, t.axes[2][0], $tolerance )
811
+ assert_in_delta( 0.0, t.axes[2][1], $tolerance )
812
+ assert_in_delta( 2.0, t.axes[2][2], $tolerance )
813
+ assert_equal( 2, t.atoms.size )
814
+ # checking atom 0
815
+ assert_equal( 'Li' , t.atoms[0].element)
816
+ assert_equal( Mageo::Vector3DInternal[0.0, 0.0, 0.0], t.atoms[0].position)
817
+ assert_equal( nil , t.atoms[0].name )
818
+ # checking atom 1
819
+ assert_equal( 'Li' , t.atoms[1].element)
820
+ assert_equal( Mageo::Vector3DInternal[0.1, 0.2, 0.3], t.atoms[1].position)
821
+ assert_equal( nil , t.atoms[1].name )
822
+
823
+ t = @c04.cell_of_elements( [ 'Li', 'O' ] )
824
+ assert_equal( CrystalCell::Cell, t.class )
825
+ assert_in_delta( 2.0, t.axes[0][0], $tolerance )
826
+ assert_in_delta( 2.0, t.axes[0][1], $tolerance )
827
+ assert_in_delta( 2.0, t.axes[0][2], $tolerance )
828
+ assert_in_delta( 0.0, t.axes[1][0], $tolerance )
829
+ assert_in_delta( 2.0, t.axes[1][1], $tolerance )
830
+ assert_in_delta( 2.0, t.axes[1][2], $tolerance )
831
+ assert_in_delta( 0.0, t.axes[2][0], $tolerance )
832
+ assert_in_delta( 0.0, t.axes[2][1], $tolerance )
833
+ assert_in_delta( 2.0, t.axes[2][2], $tolerance )
834
+ assert_equal( 3, t.atoms.size )
835
+ # checking atom 0
836
+ assert_equal( 'Li' , t.atoms[0].element)
837
+ assert_equal( Mageo::Vector3DInternal[0.0, 0.0, 0.0], t.atoms[0].position)
838
+ assert_equal( nil , t.atoms[0].name )
839
+ # checking atom 1
840
+ assert_equal( 'O' , t.atoms[1].element)
841
+ assert_equal( Mageo::Vector3DInternal[0.2, 0.2, 0.2], t.atoms[1].position)
842
+ assert_equal( nil , t.atoms[1].name )
843
+ # checking atom 2
844
+ assert_equal( 'Li' , t.atoms[2].element)
845
+ assert_equal( Mageo::Vector3DInternal[0.1, 0.2, 0.3], t.atoms[2].position)
846
+ assert_equal( nil , t.atoms[2].name )
847
+
848
+ t = @c04.cell_of_elements( [ 'O' ] )
849
+ assert_equal( CrystalCell::Cell, t.class )
850
+ assert_in_delta( 2.0, t.axes[0][0], $tolerance )
851
+ assert_in_delta( 2.0, t.axes[0][1], $tolerance )
852
+ assert_in_delta( 2.0, t.axes[0][2], $tolerance )
853
+ assert_in_delta( 0.0, t.axes[1][0], $tolerance )
854
+ assert_in_delta( 2.0, t.axes[1][1], $tolerance )
855
+ assert_in_delta( 2.0, t.axes[1][2], $tolerance )
856
+ assert_in_delta( 0.0, t.axes[2][0], $tolerance )
857
+ assert_in_delta( 0.0, t.axes[2][1], $tolerance )
858
+ assert_in_delta( 2.0, t.axes[2][2], $tolerance )
859
+ assert_equal( 1, t.atoms.size )
860
+ # checking atom 0
861
+ assert_equal( 'O' , t.atoms[0].element)
862
+ assert_equal( Mageo::Vector3DInternal[0.2, 0.2, 0.2], t.atoms[0].position)
863
+ assert_equal( nil , t.atoms[0].name )
864
+
865
+ t = @c04.cell_of_elements( [ 'F' ] )
866
+ assert_equal( CrystalCell::Cell, t.class )
867
+ assert_in_delta( 2.0, t.axes[0][0], $tolerance )
868
+ assert_in_delta( 2.0, t.axes[0][1], $tolerance )
869
+ assert_in_delta( 2.0, t.axes[0][2], $tolerance )
870
+ assert_in_delta( 0.0, t.axes[1][0], $tolerance )
871
+ assert_in_delta( 2.0, t.axes[1][1], $tolerance )
872
+ assert_in_delta( 2.0, t.axes[1][2], $tolerance )
873
+ assert_in_delta( 0.0, t.axes[2][0], $tolerance )
874
+ assert_in_delta( 0.0, t.axes[2][1], $tolerance )
875
+ assert_in_delta( 2.0, t.axes[2][2], $tolerance )
876
+ assert_equal( 0, t.atoms.size )
877
+
878
+
879
+ # サブクラスで使用したときに、サブクラスで作られるか?
880
+ fc04 = FooCell.new( [ [2.0, 2.0, 2.0], [0.0, 2.0, 2.0], [0.0, 0.0, 2.0] ] )
881
+ fc04.add_atom(CrystalCell::Atom.new( 'Li', [0.0, 0.0, 0.0] ))
882
+ fc04.add_atom(CrystalCell::Atom.new( 'O' , [0.2, 0.2, 0.2] ))
883
+ fc04.add_atom(CrystalCell::Atom.new( 'Li', [0.1, 0.2, 0.3] ))
884
+ fc04.comment = 'fc04'
885
+ t = fc04.cell_of_elements( [ 'Li' ] )
886
+ assert_equal( FooCell, t.class )
887
+ assert_in_delta( 2.0, t.axes[0][0], $tolerance )
888
+ assert_in_delta( 2.0, t.axes[0][1], $tolerance )
889
+ assert_in_delta( 2.0, t.axes[0][2], $tolerance )
890
+ assert_in_delta( 0.0, t.axes[1][0], $tolerance )
891
+ assert_in_delta( 2.0, t.axes[1][1], $tolerance )
892
+ assert_in_delta( 2.0, t.axes[1][2], $tolerance )
893
+ assert_in_delta( 0.0, t.axes[2][0], $tolerance )
894
+ assert_in_delta( 0.0, t.axes[2][1], $tolerance )
895
+ assert_in_delta( 2.0, t.axes[2][2], $tolerance )
896
+ assert_equal( 2, t.atoms.size )
897
+ # checking atom 0
898
+ assert_equal( 'Li' , t.atoms[0].element)
899
+ assert_equal( Mageo::Vector3DInternal[0.0, 0.0, 0.0], t.atoms[0].position)
900
+ assert_equal( nil , t.atoms[0].name )
901
+ # checking atom 1
902
+ assert_equal( 'Li' , t.atoms[1].element)
903
+ assert_equal( Mageo::Vector3DInternal[0.1, 0.2, 0.3], t.atoms[1].position)
904
+ assert_equal( nil , t.atoms[1].name )
905
+ end
906
+
907
+ def test_unite
908
+ ## 格子定数が違えば例外。将来的な feature.
909
+ #t = CrystalCell::Cell.new( [ [2.0, 0.0, 0.0], [0.0, 2.0, 0.0], [0.0, 0.0, 2.0] ] )
910
+ #t.add_atom(CrystalCell::Atom.new( 'Li', [0.0, 0.0, 0.0] ))
911
+ #t.comment = 't'
912
+ #assert_raise( CrystalCell::Cell::AxesMismatchError ){ @c05.unite( t ) }
913
+ t = CrystalCell::Cell.new( [ [2.0, 0.0, 0.0], [0.0, 2.0, 0.0], [0.0, 0.0, 2.0] ] )
914
+ t.add_atom(CrystalCell::Atom.new( 'Li', [0.0, 0.0, 0.0] ))
915
+ t.comment = 't'
916
+ assert_nothing_raised{ @c05.unite( t ) }
917
+
918
+ # unite
919
+ # 同じ座標のものがあっても気にせず統合する。
920
+ t = @c05.unite( @c06 )
921
+ assert_equal( CrystalCell::Cell, t.class )
922
+ assert_in_delta( 2.0, t.axes[0][0], $tolerance )
923
+ assert_in_delta( 2.0, t.axes[0][1], $tolerance )
924
+ assert_in_delta( 2.0, t.axes[0][2], $tolerance )
925
+ assert_in_delta( 0.0, t.axes[1][0], $tolerance )
926
+ assert_in_delta( 2.0, t.axes[1][1], $tolerance )
927
+ assert_in_delta( 2.0, t.axes[1][2], $tolerance )
928
+ assert_in_delta( 0.0, t.axes[2][0], $tolerance )
929
+ assert_in_delta( 0.0, t.axes[2][1], $tolerance )
930
+ assert_in_delta( 2.0, t.axes[2][2], $tolerance )
931
+ assert_equal( 3, t.atoms.size )
932
+ # checking atom 0
933
+ assert_equal( 'Li' , t.atoms[0].element)
934
+ assert_equal( Mageo::Vector3DInternal[0.0, 0.0, 0.0], t.atoms[0].position)
935
+ assert_equal( nil , t.atoms[0].name )
936
+ # checking atom 1
937
+ assert_equal( 'Li' , t.atoms[1].element)
938
+ assert_equal( Mageo::Vector3DInternal[0.0, 0.0, 0.0], t.atoms[1].position)
939
+ assert_equal( nil , t.atoms[1].name )
940
+ # checking atom 2
941
+ assert_equal( 'O' , t.atoms[2].element)
942
+ assert_equal( Mageo::Vector3DInternal[0.2, 0.2, 0.2], t.atoms[2].position)
943
+ assert_equal( nil , t.atoms[2].name )
944
+ end
945
+
946
+ def test_inverse_axis!
947
+ @c02.inverse_axis!( 0 )
948
+ t = @c02
949
+ assert_equal( CrystalCell::Cell, t.class )
950
+ assert_in_delta(-2.0, t.axes[0][0], $tolerance )
951
+ assert_in_delta(-2.0, t.axes[0][1], $tolerance )
952
+ assert_in_delta(-2.0, t.axes[0][2], $tolerance )
953
+ assert_in_delta( 0.0, t.axes[1][0], $tolerance )
954
+ assert_in_delta( 2.0, t.axes[1][1], $tolerance )
955
+ assert_in_delta( 2.0, t.axes[1][2], $tolerance )
956
+ assert_in_delta( 0.0, t.axes[2][0], $tolerance )
957
+ assert_in_delta( 0.0, t.axes[2][1], $tolerance )
958
+ assert_in_delta( 2.0, t.axes[2][2], $tolerance )
959
+ assert_equal( 2, t.atoms.size )
960
+ # checking atom 0
961
+ assert_equal( 'Li' , t.atoms[0].element)
962
+ assert_equal( Mageo::Vector3DInternal[0.0, 0.0, 0.0], t.atoms[0].position)
963
+ assert_equal( nil , t.atoms[0].name )
964
+ # checking atom 1
965
+ assert_equal( 'O' , t.atoms[1].element)
966
+ assert_equal( Mageo::Vector3DInternal[-0.2, 0.2, 0.2], t.atoms[1].position)
967
+ assert_equal( nil , t.atoms[1].name )
968
+ end
969
+
970
+ def test_inverse_axis
971
+ assert_raise( CrystalCell::Cell::AxesRangeError ){ @c02.inverse_axis( -1 ) }
972
+ assert_raise( CrystalCell::Cell::AxesRangeError ){ @c02.inverse_axis( 3 ) }
973
+
974
+ # x 軸反転
975
+ t = @c02.inverse_axis( 0 )
976
+ assert_equal( CrystalCell::Cell, t.class )
977
+ assert_in_delta( -2.0, t.axes[0][0], $tolerance )
978
+ assert_in_delta( -2.0, t.axes[0][1], $tolerance )
979
+ assert_in_delta( -2.0, t.axes[0][2], $tolerance )
980
+ assert_in_delta( 0.0, t.axes[1][0], $tolerance )
981
+ assert_in_delta( 2.0, t.axes[1][1], $tolerance )
982
+ assert_in_delta( 2.0, t.axes[1][2], $tolerance )
983
+ assert_in_delta( 0.0, t.axes[2][0], $tolerance )
984
+ assert_in_delta( 0.0, t.axes[2][1], $tolerance )
985
+ assert_in_delta( 2.0, t.axes[2][2], $tolerance )
986
+ assert_equal( 2, t.atoms.size )
987
+ # checking atom 0
988
+ assert_equal( 'Li' , t.atoms[0].element)
989
+ assert_equal( Mageo::Vector3DInternal[0.0, 0.0, 0.0], t.atoms[0].position)
990
+ assert_equal( nil , t.atoms[0].name )
991
+ # checking atom 1
992
+ assert_equal( 'O' , t.atoms[1].element)
993
+ assert_equal( Mageo::Vector3DInternal[-0.2, 0.2, 0.2], t.atoms[1].position)
994
+ assert_equal( nil , t.atoms[1].name )
995
+ # checking non-destructive
996
+ assert_equal( CrystalCell::Cell, t.class )
997
+ assert_in_delta( 2.0, @c02.axes[0][0], $tolerance )
998
+ assert_in_delta( 2.0, @c02.axes[0][1], $tolerance )
999
+ assert_in_delta( 2.0, @c02.axes[0][2], $tolerance )
1000
+ assert_in_delta( 0.0, @c02.axes[1][0], $tolerance )
1001
+ assert_in_delta( 2.0, @c02.axes[1][1], $tolerance )
1002
+ assert_in_delta( 2.0, @c02.axes[1][2], $tolerance )
1003
+ assert_in_delta( 0.0, @c02.axes[2][0], $tolerance )
1004
+ assert_in_delta( 0.0, @c02.axes[2][1], $tolerance )
1005
+ assert_in_delta( 2.0, @c02.axes[2][2], $tolerance )
1006
+ assert_equal( 2, @c02.atoms.size )
1007
+ # checking atom 0
1008
+ assert_equal( 'Li' , @c02.atoms[0].element)
1009
+ assert_equal( Mageo::Vector3DInternal[0.0, 0.0, 0.0], @c02.atoms[0].position)
1010
+ assert_equal( nil , @c02.atoms[0].name )
1011
+ # checking atom 1
1012
+ assert_equal( 'O' , @c02.atoms[1].element)
1013
+ assert_equal( Mageo::Vector3DInternal[ 0.2, 0.2, 0.2], @c02.atoms[1].position)
1014
+ assert_equal( nil , @c02.atoms[1].name )
1015
+
1016
+ # y 軸反転
1017
+ # [ [ ax, ay, az], [ 0, by, bz], [ 0, 0, cz] ]
1018
+ # ↓ y 軸反転
1019
+ # [ [ ax, ay, az], [ 0,-by,-bz], [ 0, 0, cz] ]
1020
+ # b vector y 成分が正になるようにする。
1021
+ # すなわち z 軸回りに半回転し、全ての x, y 成分が反転する。
1022
+ # [ [-ax,-ay, az], [ 0, by,-bz], [ 0, 0, cz] ]
1023
+ t = @c02.inverse_axis( 1 )
1024
+ assert_equal( CrystalCell::Cell, t.class )
1025
+ assert_in_delta( -2.0, t.axes[0][0], $tolerance )
1026
+ assert_in_delta( -2.0, t.axes[0][1], $tolerance )
1027
+ assert_in_delta( 2.0, t.axes[0][2], $tolerance )
1028
+ assert_in_delta( 0.0, t.axes[1][0], $tolerance )
1029
+ assert_in_delta( 2.0, t.axes[1][1], $tolerance )
1030
+ assert_in_delta( -2.0, t.axes[1][2], $tolerance )
1031
+ assert_in_delta( 0.0, t.axes[2][0], $tolerance )
1032
+ assert_in_delta( 0.0, t.axes[2][1], $tolerance )
1033
+ assert_in_delta( 2.0, t.axes[2][2], $tolerance )
1034
+ assert_equal( 2, t.atoms.size )
1035
+ # checking atom 0
1036
+ assert_equal( 'Li' , t.atoms[0].element)
1037
+ assert_equal( Mageo::Vector3DInternal[0.0, 0.0, 0.0], t.atoms[0].position)
1038
+ assert_equal( nil , t.atoms[0].name )
1039
+ # checking atom 1
1040
+ assert_equal( 'O' , t.atoms[1].element)
1041
+ assert_equal( Mageo::Vector3DInternal[ 0.2,-0.2, 0.2], t.atoms[1].position)
1042
+ assert_equal( nil , t.atoms[1].name )
1043
+
1044
+ # z 軸反転
1045
+ # [ [ ax, ay, az], [ 0, by, bz], [ 0, 0, cz] ]
1046
+ # z 軸反転
1047
+ # [ [ ax, ay, az], [ 0, by, bz], [ 0, 0,-cz] ]
1048
+ # c vector の z 成分が正になるようにする。
1049
+ # b vector y 成分も正であることを保存する回転は、
1050
+ # y 軸回りに半回転し、全ての x, z 成分が反転する。
1051
+ # [ [-ax, ay,-az], [ 0, by,-bz], [ 0, 0, cz] ]
1052
+ t = @c02.inverse_axis( 2 )
1053
+ assert_equal( CrystalCell::Cell, t.class )
1054
+ assert_in_delta(-2.0, t.axes[0][0], $tolerance )
1055
+ assert_in_delta( 2.0, t.axes[0][1], $tolerance )
1056
+ assert_in_delta(-2.0, t.axes[0][2], $tolerance )
1057
+ assert_in_delta( 0.0, t.axes[1][0], $tolerance )
1058
+ assert_in_delta( 2.0, t.axes[1][1], $tolerance )
1059
+ assert_in_delta(-2.0, t.axes[1][2], $tolerance )
1060
+ assert_in_delta( 0.0, t.axes[2][0], $tolerance )
1061
+ assert_in_delta( 0.0, t.axes[2][1], $tolerance )
1062
+ assert_in_delta( 2.0, t.axes[2][2], $tolerance )
1063
+ assert_equal( 2, t.atoms.size )
1064
+ # checking atom 0
1065
+ assert_equal( 'Li' , t.atoms[0].element)
1066
+ assert_equal( Mageo::Vector3DInternal[0.0, 0.0, 0.0], t.atoms[0].position)
1067
+ assert_equal( nil , t.atoms[0].name )
1068
+ # checking atom 1
1069
+ assert_equal( 'O' , t.atoms[1].element)
1070
+ assert_equal( Mageo::Vector3DInternal[ 0.2, 0.2,-0.2], t.atoms[1].position)
1071
+ assert_equal( nil , t.atoms[1].name )
1072
+
1073
+ end
1074
+
1075
+ def test_exchange_axes!
1076
+ # b, c の交換。
1077
+ @c08.exchange_axes!( [ 1, 2 ] )
1078
+ t = @c08
1079
+ assert_equal( CrystalCell::Cell, t.class )
1080
+ lc = t.axes.get_lattice_constants
1081
+ assert_in_delta( 2.0 * Math::sqrt( 3.0 ) , lc[0], $tolerance )
1082
+ assert_in_delta( 2.0 , lc[1], $tolerance )
1083
+ assert_in_delta( 2.0 * Math::sqrt( 2.0 ) , lc[2], $tolerance )
1084
+ assert_in_delta( 45.0000000000000, lc[3], $tolerance )
1085
+ assert_in_delta( 35.2643896827547, lc[4], $tolerance )
1086
+ assert_in_delta( 54.7356103172453, lc[5], $tolerance )
1087
+ assert_equal( true, t.axes.lefthand? )
1088
+ assert_equal( 2, t.atoms.size )
1089
+ # checking atom 0
1090
+ assert_equal( 'Li' , t.atoms[0].element)
1091
+ assert_equal( Mageo::Vector3DInternal[ 1.2, 5.6, 3.4], t.atoms[0].position)
1092
+ assert_equal( 'atom0' , t.atoms[0].name )
1093
+ assert_equal( [ false, false, true] , t.atoms[0].movable_flags )
1094
+ # checking atom 1
1095
+ assert_equal( 'O' , t.atoms[1].element)
1096
+ assert_equal( Mageo::Vector3DInternal[-1.2, -5.6, -3.4], t.atoms[1].position)
1097
+ assert_equal( nil , t.atoms[1].name )
1098
+ end
1099
+
1100
+ def test_exchange_axes
1101
+ assert_raise( CrystalCell::Cell::ArgumentError ){ @c02.exchange_axes( [ 0 ] ) }
1102
+ assert_raise( CrystalCell::Cell::ArgumentError ){ @c02.exchange_axes( [ 0, 1, 2] ) }
1103
+ assert_raise( CrystalCell::Cell::AxesRangeError ){ @c02.exchange_axes( [0, 3] ) }
1104
+ assert_raise( CrystalCell::Cell::AxesRangeError ){ @c02.exchange_axes( [-1, 2] ) }
1105
+ assert_raise( CrystalCell::Cell::SameAxesError ){ @c02.exchange_axes( [ 1,1] ) }
1106
+
1107
+ # b, c の交換。
1108
+ t = @c08.exchange_axes( [ 1, 2 ] )
1109
+ assert_equal( CrystalCell::Cell, t.class )
1110
+ lc = t.axes.get_lattice_constants
1111
+ assert_in_delta( 2.0 * Math::sqrt( 3.0 ) , lc[0], $tolerance )
1112
+ assert_in_delta( 2.0 , lc[1], $tolerance )
1113
+ assert_in_delta( 2.0 * Math::sqrt( 2.0 ) , lc[2], $tolerance )
1114
+ assert_in_delta( 45.0000000000000, lc[3], $tolerance )
1115
+ assert_in_delta( 35.2643896827547, lc[4], $tolerance )
1116
+ assert_in_delta( 54.7356103172453, lc[5], $tolerance )
1117
+ assert_equal( true, t.axes.lefthand? )
1118
+ assert_equal( 2, t.atoms.size )
1119
+ # checking atom 0
1120
+ assert_equal( 'Li' , t.atoms[0].element)
1121
+ assert_equal( Mageo::Vector3DInternal[ 1.2, 5.6, 3.4], t.atoms[0].position)
1122
+ assert_equal( 'atom0' , t.atoms[0].name )
1123
+ # checking atom 1
1124
+ assert_equal( 'O' , t.atoms[1].element)
1125
+ assert_equal( Mageo::Vector3DInternal[-1.2, -5.6, -3.4], t.atoms[1].position)
1126
+ assert_equal( nil , t.atoms[1].name )
1127
+
1128
+ # b, c の交換によって非破壊であることを確認。
1129
+ t = @c08
1130
+ assert_equal( CrystalCell::Cell, t.class )
1131
+ lc = t.axes.get_lattice_constants
1132
+ assert_in_delta( 2.0 * Math::sqrt( 3.0 ) , lc[0], $tolerance )
1133
+ assert_in_delta( 2.0 * Math::sqrt( 2.0 ) , lc[1], $tolerance )
1134
+ assert_in_delta( 2.0 , lc[2], $tolerance )
1135
+ assert_in_delta( 45.0000000000000, lc[3], $tolerance )
1136
+ assert_in_delta( 54.7356103172453, lc[4], $tolerance )
1137
+ assert_in_delta( 35.2643896827547, lc[5], $tolerance )
1138
+ assert_equal( true, t.axes.righthand? )
1139
+ assert_equal( 2, t.atoms.size )
1140
+ # checking atom 0
1141
+ assert_equal( 'Li' , t.atoms[0].element)
1142
+ assert_equal( Mageo::Vector3DInternal[ 1.2, 3.4, 5.6], t.atoms[0].position)
1143
+ assert_equal( 'atom0' , t.atoms[0].name )
1144
+ # checking atom 1
1145
+ assert_equal( 'O' , t.atoms[1].element)
1146
+ assert_equal( Mageo::Vector3DInternal[-1.2, -3.4, -5.6], t.atoms[1].position)
1147
+ assert_equal( nil , t.atoms[1].name )
1148
+
1149
+ end
1150
+
1151
+ def test_reflect!
1152
+ @c08.reflect!
1153
+ t = @c08
1154
+ assert_equal( CrystalCell::Cell, t.class )
1155
+ lc = t.axes.get_lattice_constants
1156
+ assert_in_delta( 2.0 * Math::sqrt( 3.0 ) , lc[0], $tolerance )
1157
+ assert_in_delta( 2.0 * Math::sqrt( 2.0 ) , lc[1], $tolerance )
1158
+ assert_in_delta( 2.0 , lc[2], $tolerance )
1159
+ assert_in_delta( 45.0000000000000, lc[3], $tolerance )
1160
+ assert_in_delta( 54.7356103172453, lc[4], $tolerance )
1161
+ assert_in_delta( 35.2643896827547, lc[5], $tolerance )
1162
+ assert_equal( true, t.axes.lefthand? )
1163
+ assert_equal( 2, t.atoms.size )
1164
+ # checking atom 0
1165
+ assert_equal( 'Li' , t.atoms[0].element)
1166
+ assert_equal( Mageo::Vector3DInternal[ 1.2, 3.4, 5.6], t.atoms[0].position)
1167
+ assert_equal( 'atom0' , t.atoms[0].name )
1168
+ # checking atom 1
1169
+ assert_equal( 'O' , t.atoms[1].element)
1170
+ assert_equal( Mageo::Vector3DInternal[-1.2, -3.4, -5.6], t.atoms[1].position)
1171
+ assert_equal( nil , t.atoms[1].name )
1172
+ end
1173
+
1174
+ def test_reflect
1175
+ t = @c08.reflect
1176
+ assert_equal( CrystalCell::Cell, t.class )
1177
+ lc = t.axes.get_lattice_constants
1178
+ assert_in_delta( 2.0 * Math::sqrt( 3.0 ) , lc[0], $tolerance )
1179
+ assert_in_delta( 2.0 * Math::sqrt( 2.0 ) , lc[1], $tolerance )
1180
+ assert_in_delta( 2.0 , lc[2], $tolerance )
1181
+ assert_in_delta( 45.0000000000000, lc[3], $tolerance )
1182
+ assert_in_delta( 54.7356103172453, lc[4], $tolerance )
1183
+ assert_in_delta( 35.2643896827547, lc[5], $tolerance )
1184
+ assert_equal( true, t.axes.lefthand? )
1185
+ assert_equal( 2, t.atoms.size )
1186
+ # checking atom 0
1187
+ assert_equal( 'Li' , t.atoms[0].element)
1188
+ assert_equal( Mageo::Vector3DInternal[ 1.2, 3.4, 5.6], t.atoms[0].position)
1189
+ assert_equal( 'atom0' , t.atoms[0].name )
1190
+ # checking atom 1
1191
+ assert_equal( 'O' , t.atoms[1].element)
1192
+ assert_equal( Mageo::Vector3DInternal[-1.2, -3.4, -5.6], t.atoms[1].position)
1193
+ assert_equal( nil , t.atoms[1].name )
1194
+
1195
+ # 非破壊であることを確認。
1196
+ t = @c08
1197
+ assert_equal( CrystalCell::Cell, t.class )
1198
+ lc = t.axes.get_lattice_constants
1199
+ assert_in_delta( 2.0 * Math::sqrt( 3.0 ) , lc[0], $tolerance )
1200
+ assert_in_delta( 2.0 * Math::sqrt( 2.0 ) , lc[1], $tolerance )
1201
+ assert_in_delta( 2.0 , lc[2], $tolerance )
1202
+ assert_in_delta( 45.0000000000000, lc[3], $tolerance )
1203
+ assert_in_delta( 54.7356103172453, lc[4], $tolerance )
1204
+ assert_in_delta( 35.2643896827547, lc[5], $tolerance )
1205
+ assert_equal( true, t.axes.righthand? )
1206
+ assert_equal( 2, t.atoms.size )
1207
+ # checking atom 0
1208
+ assert_equal( 'Li' , t.atoms[0].element)
1209
+ assert_equal( Mageo::Vector3DInternal[ 1.2, 3.4, 5.6], t.atoms[0].position)
1210
+ assert_equal( 'atom0' , t.atoms[0].name )
1211
+ # checking atom 1
1212
+ assert_equal( 'O' , t.atoms[1].element)
1213
+ assert_equal( Mageo::Vector3DInternal[-1.2, -3.4, -5.6], t.atoms[1].position)
1214
+ assert_equal( nil , t.atoms[1].name )
1215
+ end
1216
+
1217
+ def test_operate
1218
+ # identity operation
1219
+ rotation = [
1220
+ [1, 0, 0],
1221
+ [0, 1, 0],
1222
+ [0, 0, 1],
1223
+ ]
1224
+ translation = [0.0, 0.0, 0.0]
1225
+ result = @c01.operate(rotation, translation)
1226
+ assert_in_delta( 0.0, result.atoms[0].position[0], $tolerance)
1227
+ assert_in_delta( 0.0, result.atoms[0].position[1], $tolerance)
1228
+ assert_in_delta( 0.0, result.atoms[0].position[2], $tolerance)
1229
+ assert_in_delta( 0.1, result.atoms[1].position[0], $tolerance)
1230
+ assert_in_delta( 0.2, result.atoms[1].position[1], $tolerance)
1231
+ assert_in_delta( 0.3, result.atoms[1].position[2], $tolerance)
1232
+
1233
+ # rotation
1234
+ rotation = [
1235
+ [1, 0, 0],
1236
+ [0, 1, 0],
1237
+ [0, 0,-1],
1238
+ ]
1239
+ translation = [0.0, 0.0, 0.0]
1240
+ result = @c01.operate(rotation, translation)
1241
+ assert_in_delta( 0.0, result.atoms[0].position[0], $tolerance)
1242
+ assert_in_delta( 0.0, result.atoms[0].position[1], $tolerance)
1243
+ assert_in_delta( 0.0, result.atoms[0].position[2], $tolerance)
1244
+ assert_in_delta( 0.1, result.atoms[1].position[0], $tolerance)
1245
+ assert_in_delta( 0.2, result.atoms[1].position[1], $tolerance)
1246
+ assert_in_delta(-0.3, result.atoms[1].position[2], $tolerance)
1247
+
1248
+ # translation
1249
+ rotation = [
1250
+ [1, 0, 0],
1251
+ [0, 1, 0],
1252
+ [0, 0, 1],
1253
+ ]
1254
+ translation = [0.1, 0.2, 0.3]
1255
+ result = @c01.operate(rotation, translation)
1256
+ assert_in_delta(0.1, result.atoms[0].position[0], $tolerance)
1257
+ assert_in_delta(0.2, result.atoms[0].position[1], $tolerance)
1258
+ assert_in_delta(0.3, result.atoms[0].position[2], $tolerance)
1259
+ assert_in_delta(0.2, result.atoms[1].position[0], $tolerance)
1260
+ assert_in_delta(0.4, result.atoms[1].position[1], $tolerance)
1261
+ assert_in_delta(0.6, result.atoms[1].position[2], $tolerance)
1262
+
1263
+ # rotation & translation
1264
+ rotation = [
1265
+ [1, 0, 0],
1266
+ [0, 1, 0],
1267
+ [0, 0,-1],
1268
+ ]
1269
+ translation = [0.1, 0.2, 0.3]
1270
+ result = @c01.operate(rotation, translation)
1271
+ assert_in_delta(0.1, result.atoms[0].position[0], $tolerance)
1272
+ assert_in_delta(0.2, result.atoms[0].position[1], $tolerance)
1273
+ assert_in_delta(0.3, result.atoms[0].position[2], $tolerance)
1274
+ assert_in_delta(0.2, result.atoms[1].position[0], $tolerance)
1275
+ assert_in_delta(0.4, result.atoms[1].position[1], $tolerance)
1276
+ assert_in_delta(0.0, result.atoms[1].position[2], $tolerance)
1277
+ end
1278
+
1279
+ def test_axis_independencies
1280
+ unless defined? Getspg
1281
+ puts
1282
+ puts "test_axis_independencies() is ignored because spglib is not installed."
1283
+ return
1284
+ end
1285
+
1286
+ assert_equal([false, false, false],
1287
+ @c10 .axis_independencies($symprec, $angle_tolerance))
1288
+ assert_equal([false, false, true ],
1289
+ @c11 .axis_independencies($symprec, $angle_tolerance))
1290
+ assert_equal([true , true , true ],
1291
+ @c12 .axis_independencies($symprec, $angle_tolerance))
1292
+ assert_equal([true , true , true ],
1293
+ @c13 .axis_independencies($symprec, $angle_tolerance))
1294
+ assert_equal([false, false, true ],
1295
+ @c14 .axis_independencies($symprec, $angle_tolerance))
1296
+ assert_equal([false, true , false],
1297
+ @c14b.axis_independencies($symprec, $angle_tolerance))
1298
+ assert_equal([true , true , true ],
1299
+ @c15 .axis_independencies($symprec, $angle_tolerance))
1300
+ assert_equal([false, false, true ],
1301
+ @c16 .axis_independencies($symprec, $angle_tolerance))
1302
+ end
1303
+
1304
+ def test_symmetry_operations
1305
+ unless defined? Getspg
1306
+ puts
1307
+ puts "test_symmetry_operations() is ignored because spglib is not installed."
1308
+ return
1309
+ end
1310
+
1311
+ f13 = 1.0/3.0
1312
+
1313
+ #cubic/POSCAR #Pm-3m (221) / m-3m / -P 4 2 3 (517)
1314
+ corrects = [
1315
+ {:rotation => [[ 1, 0, 0], [ 0, 1, 0], [ 0, 0, 1]], :translation => [0.0, 0.0, 0.0]}, #----01----
1316
+ {:rotation => [[-1, 0, 0], [ 0, -1, 0], [ 0, 0, -1]], :translation => [0.0, 0.0, 0.0]}, #----02----
1317
+ {:rotation => [[ 0, -1, 0], [ 1, 0, 0], [ 0, 0, 1]], :translation => [0.0, 0.0, 0.0]}, #----03----
1318
+ {:rotation => [[ 0, 1, 0], [-1, 0, 0], [ 0, 0, -1]], :translation => [0.0, 0.0, 0.0]}, #----04----
1319
+ {:rotation => [[-1, 0, 0], [ 0, -1, 0], [ 0, 0, 1]], :translation => [0.0, 0.0, 0.0]}, #----05----
1320
+ {:rotation => [[ 1, 0, 0], [ 0, 1, 0], [ 0, 0, -1]], :translation => [0.0, 0.0, 0.0]}, #----06----
1321
+ {:rotation => [[ 0, 1, 0], [-1, 0, 0], [ 0, 0, 1]], :translation => [0.0, 0.0, 0.0]}, #----07----
1322
+ {:rotation => [[ 0, -1, 0], [ 1, 0, 0], [ 0, 0, -1]], :translation => [0.0, 0.0, 0.0]}, #----08----
1323
+ {:rotation => [[ 1, 0, 0], [ 0, -1, 0], [ 0, 0, -1]], :translation => [0.0, 0.0, 0.0]}, #----09----
1324
+ {:rotation => [[-1, 0, 0], [ 0, 1, 0], [ 0, 0, 1]], :translation => [0.0, 0.0, 0.0]}, #----10----
1325
+ {:rotation => [[ 0, -1, 0], [-1, 0, 0], [ 0, 0, -1]], :translation => [0.0, 0.0, 0.0]}, #----11----
1326
+ {:rotation => [[ 0, 1, 0], [ 1, 0, 0], [ 0, 0, 1]], :translation => [0.0, 0.0, 0.0]}, #----12----
1327
+ {:rotation => [[-1, 0, 0], [ 0, 1, 0], [ 0, 0, -1]], :translation => [0.0, 0.0, 0.0]}, #----13----
1328
+ {:rotation => [[ 1, 0, 0], [ 0, -1, 0], [ 0, 0, 1]], :translation => [0.0, 0.0, 0.0]}, #----14----
1329
+ {:rotation => [[ 0, 1, 0], [ 1, 0, 0], [ 0, 0, -1]], :translation => [0.0, 0.0, 0.0]}, #----15----
1330
+ {:rotation => [[ 0, -1, 0], [-1, 0, 0], [ 0, 0, 1]], :translation => [0.0, 0.0, 0.0]}, #----16----
1331
+ {:rotation => [[ 0, 0, 1], [ 1, 0, 0], [ 0, 1, 0]], :translation => [0.0, 0.0, 0.0]}, #----17----
1332
+ {:rotation => [[ 0, 0, -1], [-1, 0, 0], [ 0, -1, 0]], :translation => [0.0, 0.0, 0.0]}, #----18----
1333
+ {:rotation => [[ 0, 0, 1], [ 0, -1, 0], [ 1, 0, 0]], :translation => [0.0, 0.0, 0.0]}, #----19----
1334
+ {:rotation => [[ 0, 0, -1], [ 0, 1, 0], [-1, 0, 0]], :translation => [0.0, 0.0, 0.0]}, #----20----
1335
+ {:rotation => [[ 0, 0, 1], [-1, 0, 0], [ 0, -1, 0]], :translation => [0.0, 0.0, 0.0]}, #----21----
1336
+ {:rotation => [[ 0, 0, -1], [ 1, 0, 0], [ 0, 1, 0]], :translation => [0.0, 0.0, 0.0]}, #----22----
1337
+ {:rotation => [[ 0, 0, 1], [ 0, 1, 0], [-1, 0, 0]], :translation => [0.0, 0.0, 0.0]}, #----23----
1338
+ {:rotation => [[ 0, 0, -1], [ 0, -1, 0], [ 1, 0, 0]], :translation => [0.0, 0.0, 0.0]}, #----24----
1339
+ {:rotation => [[ 0, 0, -1], [ 1, 0, 0], [ 0, -1, 0]], :translation => [0.0, 0.0, 0.0]}, #----25----
1340
+ {:rotation => [[ 0, 0, 1], [-1, 0, 0], [ 0, 1, 0]], :translation => [0.0, 0.0, 0.0]}, #----26----
1341
+ {:rotation => [[ 0, 0, -1], [ 0, -1, 0], [-1, 0, 0]], :translation => [0.0, 0.0, 0.0]}, #----27----
1342
+ {:rotation => [[ 0, 0, 1], [ 0, 1, 0], [ 1, 0, 0]], :translation => [0.0, 0.0, 0.0]}, #----28----
1343
+ {:rotation => [[ 0, 0, -1], [-1, 0, 0], [ 0, 1, 0]], :translation => [0.0, 0.0, 0.0]}, #----29----
1344
+ {:rotation => [[ 0, 0, 1], [ 1, 0, 0], [ 0, -1, 0]], :translation => [0.0, 0.0, 0.0]}, #----30----
1345
+ {:rotation => [[ 0, 0, -1], [ 0, 1, 0], [ 1, 0, 0]], :translation => [0.0, 0.0, 0.0]}, #----31----
1346
+ {:rotation => [[ 0, 0, 1], [ 0, -1, 0], [-1, 0, 0]], :translation => [0.0, 0.0, 0.0]}, #----32----
1347
+ {:rotation => [[ 0, 1, 0], [ 0, 0, 1], [ 1, 0, 0]], :translation => [0.0, 0.0, 0.0]}, #----33----
1348
+ {:rotation => [[ 0, -1, 0], [ 0, 0, -1], [-1, 0, 0]], :translation => [0.0, 0.0, 0.0]}, #----34----
1349
+ {:rotation => [[ 1, 0, 0], [ 0, 0, 1], [ 0, -1, 0]], :translation => [0.0, 0.0, 0.0]}, #----35----
1350
+ {:rotation => [[-1, 0, 0], [ 0, 0, -1], [ 0, 1, 0]], :translation => [0.0, 0.0, 0.0]}, #----36----
1351
+ {:rotation => [[ 0, -1, 0], [ 0, 0, 1], [-1, 0, 0]], :translation => [0.0, 0.0, 0.0]}, #----37----
1352
+ {:rotation => [[ 0, 1, 0], [ 0, 0, -1], [ 1, 0, 0]], :translation => [0.0, 0.0, 0.0]}, #----38----
1353
+ {:rotation => [[-1, 0, 0], [ 0, 0, 1], [ 0, 1, 0]], :translation => [0.0, 0.0, 0.0]}, #----39----
1354
+ {:rotation => [[ 1, 0, 0], [ 0, 0, -1], [ 0, -1, 0]], :translation => [0.0, 0.0, 0.0]}, #----40----
1355
+ {:rotation => [[ 0, -1, 0], [ 0, 0, -1], [ 1, 0, 0]], :translation => [0.0, 0.0, 0.0]}, #----41----
1356
+ {:rotation => [[ 0, 1, 0], [ 0, 0, 1], [-1, 0, 0]], :translation => [0.0, 0.0, 0.0]}, #----42----
1357
+ {:rotation => [[-1, 0, 0], [ 0, 0, -1], [ 0, -1, 0]], :translation => [0.0, 0.0, 0.0]}, #----43----
1358
+ {:rotation => [[ 1, 0, 0], [ 0, 0, 1], [ 0, 1, 0]], :translation => [0.0, 0.0, 0.0]}, #----44----
1359
+ {:rotation => [[ 0, 1, 0], [ 0, 0, -1], [-1, 0, 0]], :translation => [0.0, 0.0, 0.0]}, #----45----
1360
+ {:rotation => [[ 0, -1, 0], [ 0, 0, 1], [ 1, 0, 0]], :translation => [0.0, 0.0, 0.0]}, #----46----
1361
+ {:rotation => [[ 1, 0, 0], [ 0, 0, -1], [ 0, 1, 0]], :translation => [0.0, 0.0, 0.0]}, #----47----
1362
+ {:rotation => [[-1, 0, 0], [ 0, 0, 1], [ 0, -1, 0]], :translation => [0.0, 0.0, 0.0]}, #----48----
1363
+ ]
1364
+ results = @c10 .symmetry_operations($symprec, $angle_tolerance)
1365
+ assert_equal(corrects.size, results.size)
1366
+ corrects.size.times do |index|
1367
+ assert_equal(corrects[index], results[index])
1368
+ end
1369
+
1370
+ #hexagonal/POSCAR #P6/mmm (191) / 6/mmm/ -P 6 2 (485)
1371
+ corrects = [
1372
+ {:rotation => [[ 1, 0, 0], [ 0, 1, 0], [ 0, 0, 1]], :translation => [0.0, 0.0, 0.0]}, #----01----
1373
+ {:rotation => [[-1, 0, 0], [ 0, -1, 0], [ 0, 0, -1]], :translation => [0.0, 0.0, 0.0]}, #----02----
1374
+ {:rotation => [[ 0, -1, 0], [ 1, 1, 0], [ 0, 0, 1]], :translation => [0.0, 0.0, 0.0]}, #----03----
1375
+ {:rotation => [[ 0, 1, 0], [-1, -1, 0], [ 0, 0, -1]], :translation => [0.0, 0.0, 0.0]}, #----04----
1376
+ {:rotation => [[-1, -1, 0], [ 1, 0, 0], [ 0, 0, 1]], :translation => [0.0, 0.0, 0.0]}, #----05----
1377
+ {:rotation => [[ 1, 1, 0], [-1, 0, 0], [ 0, 0, -1]], :translation => [0.0, 0.0, 0.0]}, #----06----
1378
+ {:rotation => [[-1, 0, 0], [ 0, -1, 0], [ 0, 0, 1]], :translation => [0.0, 0.0, 0.0]}, #----07----
1379
+ {:rotation => [[ 1, 0, 0], [ 0, 1, 0], [ 0, 0, -1]], :translation => [0.0, 0.0, 0.0]}, #----08----
1380
+ {:rotation => [[ 0, 1, 0], [-1, -1, 0], [ 0, 0, 1]], :translation => [0.0, 0.0, 0.0]}, #----09----
1381
+ {:rotation => [[ 0, -1, 0], [ 1, 1, 0], [ 0, 0, -1]], :translation => [0.0, 0.0, 0.0]}, #----10----
1382
+ {:rotation => [[ 1, 1, 0], [-1, 0, 0], [ 0, 0, 1]], :translation => [0.0, 0.0, 0.0]}, #----11----
1383
+ {:rotation => [[-1, -1, 0], [ 1, 0, 0], [ 0, 0, -1]], :translation => [0.0, 0.0, 0.0]}, #----12----
1384
+ {:rotation => [[ 0, 1, 0], [ 1, 0, 0], [ 0, 0, -1]], :translation => [0.0, 0.0, 0.0]}, #----13----
1385
+ {:rotation => [[ 0, -1, 0], [-1, 0, 0], [ 0, 0, 1]], :translation => [0.0, 0.0, 0.0]}, #----14----
1386
+ {:rotation => [[ 1, 1, 0], [ 0, -1, 0], [ 0, 0, -1]], :translation => [0.0, 0.0, 0.0]}, #----15----
1387
+ {:rotation => [[-1, -1, 0], [ 0, 1, 0], [ 0, 0, 1]], :translation => [0.0, 0.0, 0.0]}, #----16----
1388
+ {:rotation => [[ 1, 0, 0], [-1, -1, 0], [ 0, 0, -1]], :translation => [0.0, 0.0, 0.0]}, #----17----
1389
+ {:rotation => [[-1, 0, 0], [ 1, 1, 0], [ 0, 0, 1]], :translation => [0.0, 0.0, 0.0]}, #----18----
1390
+ {:rotation => [[ 0, -1, 0], [-1, 0, 0], [ 0, 0, -1]], :translation => [0.0, 0.0, 0.0]}, #----19----
1391
+ {:rotation => [[ 0, 1, 0], [ 1, 0, 0], [ 0, 0, 1]], :translation => [0.0, 0.0, 0.0]}, #----20----
1392
+ {:rotation => [[-1, -1, 0], [ 0, 1, 0], [ 0, 0, -1]], :translation => [0.0, 0.0, 0.0]}, #----21----
1393
+ {:rotation => [[ 1, 1, 0], [ 0, -1, 0], [ 0, 0, 1]], :translation => [0.0, 0.0, 0.0]}, #----22----
1394
+ {:rotation => [[-1, 0, 0], [ 1, 1, 0], [ 0, 0, -1]], :translation => [0.0, 0.0, 0.0]}, #----23----
1395
+ {:rotation => [[ 1, 0, 0], [-1, -1, 0], [ 0, 0, 1]], :translation => [0.0, 0.0, 0.0]}, #----24----
1396
+ ]
1397
+ assert_equal(corrects, @c11 .symmetry_operations($symprec, $angle_tolerance)) #hexagonal
1398
+
1399
+ #monoclinic/POSCAR #P2/m (10) / 2/m / -P 2y (57)
1400
+ corrects = [
1401
+ {:rotation => [[ 1, 0, 0], [ 0, 1, 0], [ 0, 0, 1]], :translation => [0.0, 0.0, 0.0]}, #----01----
1402
+ {:rotation => [[-1, 0, 0], [ 0, -1, 0], [ 0, 0, -1]], :translation => [0.0, 0.0, 0.0]}, #----02----
1403
+ {:rotation => [[-1, 0, 0], [ 0, -1, 0], [ 0, 0, 1]], :translation => [0.0, 0.0, 0.0]}, #----03----
1404
+ {:rotation => [[ 1, 0, 0], [ 0, 1, 0], [ 0, 0, -1]], :translation => [0.0, 0.0, 0.0]}, #----04----
1405
+ ]
1406
+ #pp @c12
1407
+ assert_equal(corrects, @c12 .symmetry_operations($symprec, $angle_tolerance)) #monoclinic
1408
+
1409
+ #orthorhombic/POSCAR #Pmmm (47) / mmm / -P 2 2 (227)
1410
+ corrects = [
1411
+ {:rotation => [[ 1, 0, 0], [ 0, 1, 0], [ 0, 0, 1]], :translation => [0.0, 0.0, 0.0]}, #----01----
1412
+ {:rotation => [[-1, 0, 0], [ 0, -1, 0], [ 0, 0, -1]], :translation => [0.0, 0.0, 0.0]}, #----02----
1413
+ {:rotation => [[-1, 0, 0], [ 0, -1, 0], [ 0, 0, 1]], :translation => [0.0, 0.0, 0.0]}, #----03----
1414
+ {:rotation => [[ 1, 0, 0], [ 0, 1, 0], [ 0, 0, -1]], :translation => [0.0, 0.0, 0.0]}, #----04----
1415
+ {:rotation => [[ 1, 0, 0], [ 0, -1, 0], [ 0, 0, -1]], :translation => [0.0, 0.0, 0.0]}, #----05----
1416
+ {:rotation => [[-1, 0, 0], [ 0, 1, 0], [ 0, 0, 1]], :translation => [0.0, 0.0, 0.0]}, #----06----
1417
+ {:rotation => [[-1, 0, 0], [ 0, 1, 0], [ 0, 0, -1]], :translation => [0.0, 0.0, 0.0]}, #----07----
1418
+ {:rotation => [[ 1, 0, 0], [ 0, -1, 0], [ 0, 0, 1]], :translation => [0.0, 0.0, 0.0]}, #----08----
1419
+ ]
1420
+ assert_equal(corrects, @c13 .symmetry_operations($symprec, $angle_tolerance)) #orthorhombic
1421
+
1422
+ #tetragonal-b/POSCAR #P4/mmm (123) / 4/mmm/ -P 4 2 (400)
1423
+ corrects = [
1424
+ {:rotation => [[ 1, 0, 0], [ 0, 1, 0], [ 0, 0, 1]], :translation => [0.0, 0.0, 0.0]}, #----01----
1425
+ {:rotation => [[-1, 0, 0], [ 0, -1, 0], [ 0, 0, -1]], :translation => [0.0, 0.0, 0.0]}, #----02----
1426
+ {:rotation => [[ 0, 0, 1], [ 0, 1, 0], [-1, 0, 0]], :translation => [0.0, 0.0, 0.0]}, #----03----
1427
+ {:rotation => [[ 0, 0, -1], [ 0, -1, 0], [ 1, 0, 0]], :translation => [0.0, 0.0, 0.0]}, #----04----
1428
+ {:rotation => [[-1, 0, 0], [ 0, 1, 0], [ 0, 0, -1]], :translation => [0.0, 0.0, 0.0]}, #----05----
1429
+ {:rotation => [[ 1, 0, 0], [ 0, -1, 0], [ 0, 0, 1]], :translation => [0.0, 0.0, 0.0]}, #----06----
1430
+ {:rotation => [[ 0, 0, -1], [ 0, 1, 0], [ 1, 0, 0]], :translation => [0.0, 0.0, 0.0]}, #----07----
1431
+ {:rotation => [[ 0, 0, 1], [ 0, -1, 0], [-1, 0, 0]], :translation => [0.0, 0.0, 0.0]}, #----08----
1432
+ {:rotation => [[-1, 0, 0], [ 0, -1, 0], [ 0, 0, 1]], :translation => [0.0, 0.0, 0.0]}, #----09----
1433
+ {:rotation => [[ 1, 0, 0], [ 0, 1, 0], [ 0, 0, -1]], :translation => [0.0, 0.0, 0.0]}, #----10----
1434
+ {:rotation => [[ 0, 0, -1], [ 0, -1, 0], [-1, 0, 0]], :translation => [0.0, 0.0, 0.0]}, #----11----
1435
+ {:rotation => [[ 0, 0, 1], [ 0, 1, 0], [ 1, 0, 0]], :translation => [0.0, 0.0, 0.0]}, #----12----
1436
+ {:rotation => [[ 1, 0, 0], [ 0, -1, 0], [ 0, 0, -1]], :translation => [0.0, 0.0, 0.0]}, #----13----
1437
+ {:rotation => [[-1, 0, 0], [ 0, 1, 0], [ 0, 0, 1]], :translation => [0.0, 0.0, 0.0]}, #----14----
1438
+ {:rotation => [[ 0, 0, 1], [ 0, -1, 0], [ 1, 0, 0]], :translation => [0.0, 0.0, 0.0]}, #----15----
1439
+ {:rotation => [[ 0, 0, -1], [ 0, 1, 0], [-1, 0, 0]], :translation => [0.0, 0.0, 0.0]}, #----16----
1440
+ ]
1441
+ assert_equal(corrects, @c14b .symmetry_operations($symprec, $angle_tolerance)) #tetragonal
1442
+
1443
+ #tetragonal/POSCAR #P4/mmm (123) / 4/mmm/ -P 4 2 (400)
1444
+ corrects = [
1445
+ {:rotation => [[ 1, 0, 0], [ 0, 1, 0], [ 0, 0, 1]], :translation => [0.0, 0.0, 0.0]}, #----01----
1446
+ {:rotation => [[-1, 0, 0], [ 0, -1, 0], [ 0, 0, -1]], :translation => [0.0, 0.0, 0.0]}, #----02----
1447
+ {:rotation => [[ 0, -1, 0], [ 1, 0, 0], [ 0, 0, 1]], :translation => [0.0, 0.0, 0.0]}, #----03----
1448
+ {:rotation => [[ 0, 1, 0], [-1, 0, 0], [ 0, 0, -1]], :translation => [0.0, 0.0, 0.0]}, #----04----
1449
+ {:rotation => [[-1, 0, 0], [ 0, -1, 0], [ 0, 0, 1]], :translation => [0.0, 0.0, 0.0]}, #----05----
1450
+ {:rotation => [[ 1, 0, 0], [ 0, 1, 0], [ 0, 0, -1]], :translation => [0.0, 0.0, 0.0]}, #----06----
1451
+ {:rotation => [[ 0, 1, 0], [-1, 0, 0], [ 0, 0, 1]], :translation => [0.0, 0.0, 0.0]}, #----07----
1452
+ {:rotation => [[ 0, -1, 0], [ 1, 0, 0], [ 0, 0, -1]], :translation => [0.0, 0.0, 0.0]}, #----08----
1453
+ {:rotation => [[ 1, 0, 0], [ 0, -1, 0], [ 0, 0, -1]], :translation => [0.0, 0.0, 0.0]}, #----09----
1454
+ {:rotation => [[-1, 0, 0], [ 0, 1, 0], [ 0, 0, 1]], :translation => [0.0, 0.0, 0.0]}, #----10----
1455
+ {:rotation => [[ 0, -1, 0], [-1, 0, 0], [ 0, 0, -1]], :translation => [0.0, 0.0, 0.0]}, #----11----
1456
+ {:rotation => [[ 0, 1, 0], [ 1, 0, 0], [ 0, 0, 1]], :translation => [0.0, 0.0, 0.0]}, #----12----
1457
+ {:rotation => [[-1, 0, 0], [ 0, 1, 0], [ 0, 0, -1]], :translation => [0.0, 0.0, 0.0]}, #----13----
1458
+ {:rotation => [[ 1, 0, 0], [ 0, -1, 0], [ 0, 0, 1]], :translation => [0.0, 0.0, 0.0]}, #----14----
1459
+ {:rotation => [[ 0, 1, 0], [ 1, 0, 0], [ 0, 0, -1]], :translation => [0.0, 0.0, 0.0]}, #----15----
1460
+ {:rotation => [[ 0, -1, 0], [-1, 0, 0], [ 0, 0, 1]], :translation => [0.0, 0.0, 0.0]}, #----16----
1461
+ ]
1462
+ assert_equal(corrects, @c14.symmetry_operations($symprec, $angle_tolerance)) #tetragonal-b
1463
+
1464
+ #triclinic/POSCAR #P1 (1) / 1 / P 1 (1)
1465
+ corrects = [
1466
+ {:rotation => [[ 1, 0, 0], [ 0, 1, 0], [ 0, 0, 1]], :translation => [0.0, 0.0, 0.0]}, #----01----
1467
+ ]
1468
+ assert_equal(corrects, @c15 .symmetry_operations($symprec, $angle_tolerance)) #triclinic
1469
+
1470
+ #trigonal/POSCAR #P-3m1 (164) / -3m / -P 3 2= (456)
1471
+ corrects = [
1472
+ {:rotation => [[ 1, 0, 0], [ 0, 1, 0], [ 0, 0, 1]], :translation => [0.0, 0.0, 0.0]}, #----01----
1473
+ {:rotation => [[-1, 0, 0], [ 0, -1, 0], [ 0, 0, -1]], :translation => [f13, f13, f13]}, #----02----
1474
+ {:rotation => [[-1, -1, 0], [ 1, 0, 0], [ 0, 0, 1]], :translation => [0.0, 0.0, 1.0]}, #----03----
1475
+ {:rotation => [[ 1, 1, 0], [-1, 0, 0], [ 0, 0, -1]], :translation => [f13, f13, f13]}, #----04----
1476
+ {:rotation => [[ 0, 1, 0], [-1, -1, 0], [ 0, 0, 1]], :translation => [1.0, 0.0, 1.0]}, #----05----
1477
+ {:rotation => [[ 0, -1, 0], [ 1, 1, 0], [ 0, 0, -1]], :translation => [f13, f13, f13]}, #----06----
1478
+ {:rotation => [[ 0, -1, 0], [-1, 0, 0], [ 0, 0, -1]], :translation => [f13, f13, f13]}, #----07----
1479
+ {:rotation => [[ 0, 1, 0], [ 1, 0, 0], [ 0, 0, 1]], :translation => [1.0, 0.0, 1.0]}, #----08----
1480
+ {:rotation => [[-1, 0, 0], [ 1, 1, 0], [ 0, 0, -1]], :translation => [f13, f13, f13]}, #----09----
1481
+ {:rotation => [[ 1, 0, 0], [-1, -1, 0], [ 0, 0, 1]], :translation => [0.0, 0.0, 1.0]}, #----10----
1482
+ {:rotation => [[ 1, 1, 0], [ 0, -1, 0], [ 0, 0, -1]], :translation => [f13, f13, f13]}, #----11----
1483
+ {:rotation => [[-1, -1, 0], [ 0, 1, 0], [ 0, 0, 1]], :translation => [0.0, 0.0, 1.0]}, #----12----
1484
+ ]
1485
+ results = @c16.symmetry_operations($symprec, $angle_tolerance)
1486
+ corrects.size.times do |index|
1487
+ 3.times do |i|
1488
+ 3.times do |j|
1489
+ assert_in_delta(
1490
+ corrects[index][:rotation][i][j],
1491
+ results[index][:rotation][i][j],
1492
+ $tolerance
1493
+ )
1494
+ end
1495
+ end
1496
+
1497
+ 3.times do |i|
1498
+ assert_in_delta(
1499
+ corrects[index][:translation][i],
1500
+ results[index][:translation][i],
1501
+ $tolerance
1502
+ )
1503
+ end
1504
+ end
1505
+ end
1166
1506
 
1167
1507
  end