kim-tools 0.2.0b0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- kim_tools/__init__.py +14 -0
- kim_tools/aflow_util/__init__.py +4 -0
- kim_tools/aflow_util/core.py +1782 -0
- kim_tools/aflow_util/data/README_PROTO.TXT +3241 -0
- kim_tools/ase/__init__.py +4 -0
- kim_tools/ase/core.py +749 -0
- kim_tools/kimunits.py +162 -0
- kim_tools/symmetry_util/__init__.py +4 -0
- kim_tools/symmetry_util/core.py +552 -0
- kim_tools/symmetry_util/data/possible_primitive_shifts.json +1 -0
- kim_tools/symmetry_util/data/primitive_GENPOS_ops.json +1 -0
- kim_tools/symmetry_util/data/space_groups_for_each_bravais_lattice.json +179 -0
- kim_tools/symmetry_util/data/wyck_pos_xform_under_normalizer.json +1344 -0
- kim_tools/symmetry_util/data/wyckoff_multiplicities.json +2193 -0
- kim_tools/symmetry_util/data/wyckoff_sets.json +232 -0
- kim_tools/test_driver/__init__.py +4 -0
- kim_tools/test_driver/core.py +1932 -0
- kim_tools/vc/__init__.py +4 -0
- kim_tools/vc/core.py +397 -0
- kim_tools-0.2.0b0.dist-info/METADATA +32 -0
- kim_tools-0.2.0b0.dist-info/RECORD +24 -0
- kim_tools-0.2.0b0.dist-info/WHEEL +5 -0
- kim_tools-0.2.0b0.dist-info/licenses/LICENSE.CDDL +380 -0
- kim_tools-0.2.0b0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,552 @@
|
|
1
|
+
"""
|
2
|
+
Crystal Symmetry utilities and data that are (mostly) independent of AFLOW
|
3
|
+
"""
|
4
|
+
|
5
|
+
import json
|
6
|
+
import logging
|
7
|
+
import os
|
8
|
+
from itertools import product
|
9
|
+
from math import ceil
|
10
|
+
from typing import Dict, List, Union
|
11
|
+
|
12
|
+
import numpy as np
|
13
|
+
from ase import Atoms
|
14
|
+
from ase.cell import Cell
|
15
|
+
from ase.geometry import get_duplicate_atoms
|
16
|
+
from numpy.typing import ArrayLike
|
17
|
+
from sympy import Matrix, cos, matrix2numpy, sin, sqrt, symbols
|
18
|
+
|
19
|
+
logger = logging.getLogger(__name__)
|
20
|
+
logging.basicConfig(filename="kim-tools.log", level=logging.INFO, force=True)
|
21
|
+
|
22
|
+
__all__ = [
|
23
|
+
"BRAVAIS_LATTICES",
|
24
|
+
"FORMAL_BRAVAIS_LATTICES",
|
25
|
+
"CENTERING_DIVISORS",
|
26
|
+
"C_CENTERED_ORTHORHOMBIC_GROUPS",
|
27
|
+
"A_CENTERED_ORTHORHOMBIC_GROUPS",
|
28
|
+
"IncorrectCrystallographyException",
|
29
|
+
"IncorrectNumAtomsException",
|
30
|
+
"are_in_same_wyckoff_set",
|
31
|
+
"space_group_numbers_are_enantiomorphic",
|
32
|
+
"cartesian_to_fractional_itc_rotation_from_ase_cell",
|
33
|
+
"cartesian_rotation_is_in_point_group",
|
34
|
+
"get_cell_from_poscar",
|
35
|
+
"get_wyck_pos_xform_under_normalizer",
|
36
|
+
"get_bravais_lattice_from_space_group",
|
37
|
+
"get_formal_bravais_lattice_from_space_group",
|
38
|
+
"get_primitive_wyckoff_multiplicity",
|
39
|
+
"get_symbolic_cell_from_formal_bravais_lattice",
|
40
|
+
"get_change_of_basis_matrix_to_conventional_cell_from_formal_bravais_lattice",
|
41
|
+
"change_of_basis_atoms",
|
42
|
+
"get_possible_primitive_shifts",
|
43
|
+
"get_primitive_genpos_ops",
|
44
|
+
]
|
45
|
+
|
46
|
+
C_CENTERED_ORTHORHOMBIC_GROUPS = (20, 21, 35, 36, 37, 63, 64, 65, 66, 67, 68)
|
47
|
+
A_CENTERED_ORTHORHOMBIC_GROUPS = (38, 39, 40, 41)
|
48
|
+
BRAVAIS_LATTICES = [
|
49
|
+
"aP",
|
50
|
+
"mP",
|
51
|
+
"mC",
|
52
|
+
"oP",
|
53
|
+
"oC",
|
54
|
+
"oI",
|
55
|
+
"oF",
|
56
|
+
"tP",
|
57
|
+
"tI",
|
58
|
+
"hP",
|
59
|
+
"hR",
|
60
|
+
"cP",
|
61
|
+
"cF",
|
62
|
+
"cI",
|
63
|
+
]
|
64
|
+
FORMAL_BRAVAIS_LATTICES = BRAVAIS_LATTICES + ["oA"]
|
65
|
+
CENTERING_DIVISORS = {
|
66
|
+
"P": 1,
|
67
|
+
"C": 2,
|
68
|
+
"A": 2,
|
69
|
+
"I": 2,
|
70
|
+
"F": 4,
|
71
|
+
"R": 3,
|
72
|
+
}
|
73
|
+
DATA_DIR = os.path.join(os.path.dirname(os.path.realpath(__file__)), "data")
|
74
|
+
|
75
|
+
|
76
|
+
class IncorrectCrystallographyException(Exception):
|
77
|
+
"""
|
78
|
+
Raised when incorrect data is provided, e.g. nonexistent Bravais lattice etc.
|
79
|
+
"""
|
80
|
+
|
81
|
+
|
82
|
+
class IncorrectNumAtomsException(Exception):
|
83
|
+
"""
|
84
|
+
Raised when the a disagreement in the number of atoms is found.
|
85
|
+
"""
|
86
|
+
|
87
|
+
|
88
|
+
def _check_space_group(sgnum: Union[int, str]):
|
89
|
+
try:
|
90
|
+
assert 1 <= int(sgnum) <= 230
|
91
|
+
except Exception:
|
92
|
+
raise IncorrectCrystallographyException(
|
93
|
+
f"Got a space group number {sgnum} that is non-numeric or not between 1 "
|
94
|
+
"and 230 inclusive"
|
95
|
+
)
|
96
|
+
|
97
|
+
|
98
|
+
def cartesian_to_fractional_itc_rotation_from_ase_cell(
|
99
|
+
cart_rot: ArrayLike, cell: ArrayLike
|
100
|
+
) -> ArrayLike:
|
101
|
+
"""
|
102
|
+
Convert Cartesian to fractional rotation. Read the arguments and returns carefully,
|
103
|
+
as there is some unfortunate mixing of row and columns because of the different
|
104
|
+
conventions of the ITC and ASE and other simulation packages
|
105
|
+
|
106
|
+
Args:
|
107
|
+
cart_rot:
|
108
|
+
Cartesian rotation. It is assumed that this is for left-multiplying column
|
109
|
+
vectors, although in cases where we don't care if we're working with the
|
110
|
+
rotation or its inverse (e.g. when checking whether or not it's in the
|
111
|
+
point group), this doesn't matter due to orthogonality
|
112
|
+
cell:
|
113
|
+
The cell of the crystal, with each row being a cartesian vector
|
114
|
+
representing a lattice vector. This is consistent with most simulation
|
115
|
+
packages, but transposed from the ITC
|
116
|
+
|
117
|
+
Returns:
|
118
|
+
The fractional rotation in ITC convention, i.e. for left-multiplying column
|
119
|
+
vectors. Here the distinction with a matrix's transpose DOES matter, because
|
120
|
+
the fractional coordinate system is not orthonormal.
|
121
|
+
"""
|
122
|
+
|
123
|
+
cell_arr = np.asarray(cell)
|
124
|
+
cart_rot_arr = np.asarray(cart_rot)
|
125
|
+
|
126
|
+
if not ((cell_arr.shape == (3, 3)) and (cart_rot_arr.shape == (3, 3))):
|
127
|
+
raise IncorrectCrystallographyException(
|
128
|
+
"Either the rotation matrix or the cell provided were not 3x3 matrices"
|
129
|
+
)
|
130
|
+
|
131
|
+
return np.transpose(cell_arr @ cart_rot_arr @ np.linalg.inv(cell_arr))
|
132
|
+
|
133
|
+
|
134
|
+
def cartesian_rotation_is_in_point_group(
|
135
|
+
cart_rot: ArrayLike, sgnum: Union[int, str], cell: ArrayLike
|
136
|
+
) -> bool:
|
137
|
+
"""
|
138
|
+
Check that a Cartesian rotation is in the point group of a crystal given by its
|
139
|
+
space group number and primitive cell
|
140
|
+
|
141
|
+
Args:
|
142
|
+
cart_rot:
|
143
|
+
Cartesian rotation
|
144
|
+
sgnum:
|
145
|
+
space group number
|
146
|
+
cell:
|
147
|
+
The *primitive* cell of the crystal as defined in
|
148
|
+
http://doi.org/10.1016/j.commatsci.2017.01.017, with each row being a
|
149
|
+
cartesian vector representing a lattice vector. This is
|
150
|
+
consistent with most simulation packages, but transposed from the ITC
|
151
|
+
"""
|
152
|
+
# we don't care about properly transposing (i.e. worrying whether it's operating on
|
153
|
+
# row or column vectors) the input cart_rot because that one is orthogonal, and
|
154
|
+
# both it and its inverse must be in the point group
|
155
|
+
frac_rot = cartesian_to_fractional_itc_rotation_from_ase_cell(cart_rot, cell)
|
156
|
+
|
157
|
+
space_group_ops = get_primitive_genpos_ops(sgnum)
|
158
|
+
|
159
|
+
for op in space_group_ops:
|
160
|
+
if np.allclose(frac_rot, op["W"], atol=1e-4):
|
161
|
+
logger.info("Found matching rotation")
|
162
|
+
return True
|
163
|
+
|
164
|
+
logger.info("No matching rotation found")
|
165
|
+
return False
|
166
|
+
|
167
|
+
|
168
|
+
def get_cell_from_poscar(poscar: os.PathLike) -> ArrayLike:
|
169
|
+
"""
|
170
|
+
Extract the unit cell from a POSCAR file, including the specified scaling
|
171
|
+
"""
|
172
|
+
with open(poscar) as f:
|
173
|
+
poscar_lines = f.read().splitlines()
|
174
|
+
|
175
|
+
scaling = float(poscar_lines[1])
|
176
|
+
cell = np.asarray(
|
177
|
+
[[float(num) for num in line.split()] for line in poscar_lines[2:5]]
|
178
|
+
)
|
179
|
+
|
180
|
+
if scaling < 0:
|
181
|
+
desired_volume = -scaling
|
182
|
+
unscaled_volume = Cell(cell).volume
|
183
|
+
scaling = (desired_volume / unscaled_volume) ** (1 / 3)
|
184
|
+
|
185
|
+
return cell * scaling
|
186
|
+
|
187
|
+
|
188
|
+
def are_in_same_wyckoff_set(letter_1: str, letter_2: str, sgnum: Union[str, int]):
|
189
|
+
"""
|
190
|
+
Given two Wyckoff letters and a space group number, return whether or not they are
|
191
|
+
in the same Wyckoff set, meaning that their orbits are related by an operation in
|
192
|
+
the normalizer of the space group
|
193
|
+
"""
|
194
|
+
_check_space_group(sgnum)
|
195
|
+
with open(os.path.join(DATA_DIR, "wyckoff_sets.json")) as f:
|
196
|
+
wyckoff_sets = json.load(f)
|
197
|
+
for wyckoff_set in wyckoff_sets[str(sgnum)]:
|
198
|
+
if letter_1 in wyckoff_set:
|
199
|
+
if letter_2 in wyckoff_set:
|
200
|
+
return True
|
201
|
+
else:
|
202
|
+
return False
|
203
|
+
|
204
|
+
|
205
|
+
def space_group_numbers_are_enantiomorphic(sg_1: int, sg_2: int) -> bool:
|
206
|
+
"""
|
207
|
+
Return whether or not two spacegroups (specified by number) are enantiomorphs of
|
208
|
+
each other
|
209
|
+
"""
|
210
|
+
_check_space_group(sg_1)
|
211
|
+
_check_space_group(sg_2)
|
212
|
+
if sg_1 == sg_2:
|
213
|
+
return True
|
214
|
+
else:
|
215
|
+
enantiomorph_conversion = {
|
216
|
+
78: 76,
|
217
|
+
95: 91,
|
218
|
+
96: 92,
|
219
|
+
145: 144,
|
220
|
+
153: 151,
|
221
|
+
154: 152,
|
222
|
+
170: 169,
|
223
|
+
172: 171,
|
224
|
+
179: 178,
|
225
|
+
181: 180,
|
226
|
+
213: 212,
|
227
|
+
}
|
228
|
+
enantiomorph_conversion_2 = {v: k for k, v in enantiomorph_conversion.items()}
|
229
|
+
enantiomorph_conversion.update(enantiomorph_conversion_2)
|
230
|
+
if enantiomorph_conversion[sg_1] == sg_2:
|
231
|
+
return True
|
232
|
+
else:
|
233
|
+
return False
|
234
|
+
|
235
|
+
|
236
|
+
def get_wyck_pos_xform_under_normalizer(sgnum: Union[int, str]) -> List[List[str]]:
|
237
|
+
"""
|
238
|
+
Get the "Transformed WP" column of the tables at the bottom of the page for each
|
239
|
+
space group from https://cryst.ehu.es/cryst/get_set.html
|
240
|
+
"""
|
241
|
+
_check_space_group(sgnum)
|
242
|
+
with open(os.path.join(DATA_DIR, "wyck_pos_xform_under_normalizer.json")) as f:
|
243
|
+
wyck_pos_xform_under_normalizer = json.load(f)
|
244
|
+
return wyck_pos_xform_under_normalizer[str(sgnum)]
|
245
|
+
|
246
|
+
|
247
|
+
def get_bravais_lattice_from_space_group(sgnum: Union[int, str]):
|
248
|
+
"""
|
249
|
+
Get the symbol (e.g. 'cF') of one of the 14 Bravais lattices from the space group
|
250
|
+
number
|
251
|
+
"""
|
252
|
+
_check_space_group(sgnum)
|
253
|
+
with open(
|
254
|
+
os.path.join(DATA_DIR, "space_groups_for_each_bravais_lattice.json")
|
255
|
+
) as f:
|
256
|
+
space_groups_for_each_bravais_lattice = json.load(f)
|
257
|
+
for bravais_lattice in space_groups_for_each_bravais_lattice:
|
258
|
+
if int(sgnum) in space_groups_for_each_bravais_lattice[bravais_lattice]:
|
259
|
+
return bravais_lattice
|
260
|
+
raise RuntimeError(
|
261
|
+
f"Failed to find space group number f{sgnum} in table of lattice symbols"
|
262
|
+
)
|
263
|
+
|
264
|
+
|
265
|
+
def get_formal_bravais_lattice_from_space_group(sgnum: Union[int, str]):
|
266
|
+
"""
|
267
|
+
Same as :func:`get_bravais_lattice_from_space_group` except distinguish between "oA"
|
268
|
+
and "oC"
|
269
|
+
"""
|
270
|
+
bravais_lattice = get_bravais_lattice_from_space_group(sgnum)
|
271
|
+
if bravais_lattice == "oC":
|
272
|
+
if int(sgnum) in A_CENTERED_ORTHORHOMBIC_GROUPS:
|
273
|
+
return "oA"
|
274
|
+
else:
|
275
|
+
assert int(sgnum) in C_CENTERED_ORTHORHOMBIC_GROUPS
|
276
|
+
return bravais_lattice
|
277
|
+
|
278
|
+
|
279
|
+
def get_primitive_wyckoff_multiplicity(sgnum: Union[int, str], wyckoff: str) -> int:
|
280
|
+
"""
|
281
|
+
Get the multiplicity of a given Wyckoff letter for a primitive cell of the crystal
|
282
|
+
"""
|
283
|
+
_check_space_group(sgnum)
|
284
|
+
centering_divisor = CENTERING_DIVISORS[
|
285
|
+
get_bravais_lattice_from_space_group(sgnum)[1]
|
286
|
+
]
|
287
|
+
with open(os.path.join(DATA_DIR, "wyckoff_multiplicities.json")) as f:
|
288
|
+
wyckoff_multiplicities = json.load(f)
|
289
|
+
multiplicity_per_primitive_cell = (
|
290
|
+
wyckoff_multiplicities[str(sgnum)][wyckoff] / centering_divisor
|
291
|
+
)
|
292
|
+
# check that multiplicity is an integer
|
293
|
+
assert np.isclose(
|
294
|
+
multiplicity_per_primitive_cell, round(multiplicity_per_primitive_cell)
|
295
|
+
)
|
296
|
+
return round(multiplicity_per_primitive_cell)
|
297
|
+
|
298
|
+
|
299
|
+
def get_symbolic_cell_from_formal_bravais_lattice(
|
300
|
+
formal_bravais_lattice: str,
|
301
|
+
) -> Matrix:
|
302
|
+
"""
|
303
|
+
Get the symbolic primitive unit cell as defined in
|
304
|
+
http://doi.org/10.1016/j.commatsci.2017.01.017 in terms of the appropriate
|
305
|
+
(possibly trivial) subset of the parameters a, b, c, alpha, beta, gamma
|
306
|
+
|
307
|
+
Args:
|
308
|
+
formal_bravais_lattice:
|
309
|
+
The symbol for the Bravais lattice, e.g "oA". Specifically, "oA" is
|
310
|
+
distinguished from "oC", meaning there are 15 possibilities, not just the
|
311
|
+
14 Bravais lattices.
|
312
|
+
|
313
|
+
Returns:
|
314
|
+
Symbolic 3x3 matrix with the rows being cell vectors. This is in agreement with
|
315
|
+
most simulation software, but the transpose of how the ITA defines cell vectors.
|
316
|
+
|
317
|
+
Raises:
|
318
|
+
IncorrectCrystallographyException:
|
319
|
+
If a nonexistent Bravais lattice is provided
|
320
|
+
"""
|
321
|
+
if formal_bravais_lattice not in FORMAL_BRAVAIS_LATTICES:
|
322
|
+
raise IncorrectCrystallographyException(
|
323
|
+
f"The provided Bravais lattice type {formal_bravais_lattice} "
|
324
|
+
"does not exist."
|
325
|
+
)
|
326
|
+
|
327
|
+
a, b, c, alpha, beta, gamma = symbols("a b c alpha beta gamma")
|
328
|
+
|
329
|
+
if formal_bravais_lattice == "aP":
|
330
|
+
c_x = c * cos(beta)
|
331
|
+
c_y = c * (cos(alpha) - cos(beta) * cos(gamma)) / sin(gamma)
|
332
|
+
c_z = sqrt(c**2 - c_x**2 - c_y**2)
|
333
|
+
return Matrix([[a, 0, 0], [0, b * cos(gamma), b * sin(gamma)], [c_x, c_y, c_z]])
|
334
|
+
elif formal_bravais_lattice == "mP":
|
335
|
+
return Matrix([[a, 0, 0], [0, b, 0], [c * cos(beta), 0, c * sin(beta)]])
|
336
|
+
elif formal_bravais_lattice == "mC":
|
337
|
+
return Matrix(
|
338
|
+
[[a / 2, -b / 2, 0], [a / 2, b / 2, 0], [c * cos(beta), 0, c * sin(beta)]]
|
339
|
+
)
|
340
|
+
elif formal_bravais_lattice == "oP":
|
341
|
+
return Matrix([[a, 0, 0], [0, b, 0], [0, 0, c]])
|
342
|
+
elif formal_bravais_lattice == "oC":
|
343
|
+
return Matrix([[a / 2, -b / 2, 0], [a / 2, b / 2, 0], [0, 0, c]])
|
344
|
+
elif formal_bravais_lattice == "oA":
|
345
|
+
return Matrix([[a, 0, 0], [0, b / 2, -c / 2], [0, b / 2, c / 2]])
|
346
|
+
elif formal_bravais_lattice == "oI":
|
347
|
+
return Matrix(
|
348
|
+
[[-a / 2, b / 2, c / 2], [a / 2, -b / 2, c / 2], [a / 2, b / 2, -c / 2]]
|
349
|
+
)
|
350
|
+
elif formal_bravais_lattice == "oF":
|
351
|
+
return Matrix([[0, b / 2, c / 2], [a / 2, 0, c / 2], [a / 2, b / 2, 0]])
|
352
|
+
elif formal_bravais_lattice == "tP":
|
353
|
+
return Matrix([[a, 0, 0], [0, a, 0], [0, 0, c]])
|
354
|
+
elif formal_bravais_lattice == "tI":
|
355
|
+
return Matrix(
|
356
|
+
[[-a / 2, a / 2, c / 2], [a / 2, -a / 2, c / 2], [a / 2, a / 2, -c / 2]]
|
357
|
+
)
|
358
|
+
elif formal_bravais_lattice == "hP":
|
359
|
+
return Matrix(
|
360
|
+
[[a / 2, -sqrt(3) * a / 2, 0], [a / 2, sqrt(3) * a / 2, 0], [0, 0, c]]
|
361
|
+
)
|
362
|
+
elif formal_bravais_lattice == "hR":
|
363
|
+
return Matrix(
|
364
|
+
[
|
365
|
+
[a / 2, -a / (2 * sqrt(3)), c / 3],
|
366
|
+
[0, a / sqrt(3), c / 3],
|
367
|
+
[-a / 2, -a / (2 * sqrt(3)), c / 3],
|
368
|
+
]
|
369
|
+
)
|
370
|
+
elif formal_bravais_lattice == "cP":
|
371
|
+
return Matrix(
|
372
|
+
[
|
373
|
+
[a, 0, 0],
|
374
|
+
[0, a, 0],
|
375
|
+
[0, 0, a],
|
376
|
+
]
|
377
|
+
)
|
378
|
+
elif formal_bravais_lattice == "cI":
|
379
|
+
return Matrix(
|
380
|
+
[[-a / 2, a / 2, a / 2], [a / 2, -a / 2, a / 2], [a / 2, a / 2, -a / 2]]
|
381
|
+
)
|
382
|
+
elif formal_bravais_lattice == "cF":
|
383
|
+
return Matrix([[0, a / 2, a / 2], [a / 2, 0, a / 2], [a / 2, a / 2, 0]])
|
384
|
+
else:
|
385
|
+
assert False
|
386
|
+
|
387
|
+
|
388
|
+
def get_change_of_basis_matrix_to_conventional_cell_from_formal_bravais_lattice(
|
389
|
+
formal_bravais_lattice: str,
|
390
|
+
) -> ArrayLike:
|
391
|
+
"""
|
392
|
+
Get a change of basis matrix **P** as defined in ITA 1.5.1.2, with "old basis"
|
393
|
+
being the primitive cell of the provided Bravais lattice, and the "new basis" being
|
394
|
+
the conventional cell, i.e. the cell of the primitive lattice of the same crystal
|
395
|
+
family. E.g. if ``formal_bravais_lattice="oA"``, then "old basis" is oA, and
|
396
|
+
"new basis" is oP. The cell choices are defined in
|
397
|
+
http://doi.org/10.1016/j.commatsci.2017.01.017,
|
398
|
+
including distinguishing between oA and oC.
|
399
|
+
|
400
|
+
The matrices are given in ITC convention, meaning that they expect to operate on
|
401
|
+
column vectors, i.e. The bases are related by the following, where the primed
|
402
|
+
symbols indicate the new basis:
|
403
|
+
|
404
|
+
Relationship between basis vectors:
|
405
|
+
(**a**', **b**', **c**') = (**a**, **b**, **c**) **P**
|
406
|
+
|
407
|
+
Relationship between fractional coordinates in each basis: **x** = **P** **x**'
|
408
|
+
|
409
|
+
For operating on row vectors, as is often given in simulation software, make sure
|
410
|
+
to transpose these relationships appropriately.
|
411
|
+
|
412
|
+
Args:
|
413
|
+
formal_bravais_lattice:
|
414
|
+
The symbol for the Bravais lattice, e.g "oA". Specifically, "oA" is
|
415
|
+
distinguished from "oC", meaning there are 15 possibilities, not just the
|
416
|
+
14 Bravais lattices.
|
417
|
+
|
418
|
+
Returns:
|
419
|
+
Integral 3x3 matrix representing the change of basis
|
420
|
+
|
421
|
+
Raises:
|
422
|
+
IncorrectCrystallographyException:
|
423
|
+
If a nonexistent Bravais lattice is provided
|
424
|
+
"""
|
425
|
+
if formal_bravais_lattice not in FORMAL_BRAVAIS_LATTICES:
|
426
|
+
raise IncorrectCrystallographyException(
|
427
|
+
f"The provided Bravais lattice type {formal_bravais_lattice} "
|
428
|
+
"does not exist."
|
429
|
+
)
|
430
|
+
|
431
|
+
if formal_bravais_lattice[1] == "P": # Already primitive
|
432
|
+
return np.eye(3)
|
433
|
+
|
434
|
+
corresponding_primitive_lattice = formal_bravais_lattice[0] + "P"
|
435
|
+
|
436
|
+
old_basis = get_symbolic_cell_from_formal_bravais_lattice(
|
437
|
+
formal_bravais_lattice
|
438
|
+
).transpose()
|
439
|
+
new_basis = get_symbolic_cell_from_formal_bravais_lattice(
|
440
|
+
corresponding_primitive_lattice
|
441
|
+
).transpose()
|
442
|
+
|
443
|
+
change_of_basis_matrix = matrix2numpy((old_basis**-1) @ new_basis, dtype=float)
|
444
|
+
|
445
|
+
# matrices should be integral
|
446
|
+
assert np.allclose(np.round(change_of_basis_matrix), change_of_basis_matrix)
|
447
|
+
|
448
|
+
return np.round(change_of_basis_matrix)
|
449
|
+
|
450
|
+
|
451
|
+
def change_of_basis_atoms(atoms: Atoms, change_of_basis: ArrayLike) -> Atoms:
|
452
|
+
"""
|
453
|
+
Perform an arbitrary basis change on an ``Atoms`` object, duplicating or cropping
|
454
|
+
atoms as needed. A basic check is made that the determinant of ``change_of_basis``
|
455
|
+
is compatible with the number of atoms, but this is far from fully determining
|
456
|
+
that ``change_of_basis`` is appropriate for the particuar crystal described by
|
457
|
+
``atoms``, which is up to the user.
|
458
|
+
|
459
|
+
NOTE: This requires ASE >= 3.25 to delete atoms that are close across PBCs
|
460
|
+
|
461
|
+
Args:
|
462
|
+
atoms:
|
463
|
+
The object to transform
|
464
|
+
change_of_basis:
|
465
|
+
A change of basis matrix **P** as defined in ITA 1.5.1.2, with ``atoms``
|
466
|
+
corresponding to the "old basis" and the returned ``Atoms`` object being
|
467
|
+
in the "new basis".
|
468
|
+
|
469
|
+
This matrix should be given in ITC convention, meaning that it expects to
|
470
|
+
operate on column vectors, i.e. The bases are related by the following,
|
471
|
+
where the primed symbols indicate the new basis:
|
472
|
+
|
473
|
+
Relationship between basis vectors:
|
474
|
+
(**a**', **b**', **c**') = (**a**, **b**, **c**) **P**
|
475
|
+
|
476
|
+
Relationship between fractional coordinates in each basis:
|
477
|
+
**x** = **P** **x**'
|
478
|
+
|
479
|
+
Returns:
|
480
|
+
The transformed ``Atoms`` object, containing the original number of
|
481
|
+
atoms mutiplied by the determinant of the change of basis.
|
482
|
+
"""
|
483
|
+
old_cell_column = np.transpose(atoms.cell)
|
484
|
+
new_cell_column = old_cell_column @ change_of_basis
|
485
|
+
new_cell = np.transpose(new_cell_column)
|
486
|
+
|
487
|
+
# There are surely better ways to do this, but the simplest way I can think of
|
488
|
+
# is simply to use ``Atoms.repeat()`` to create a supercell big enough to encase
|
489
|
+
# the ``new_cell``, then wrap the atoms back into ``new_cell`` and delete dupes
|
490
|
+
repeat = []
|
491
|
+
for old_cell_vector in atoms.cell:
|
492
|
+
this_repeat = 0
|
493
|
+
old_cell_vector_norm = np.linalg.norm(old_cell_vector)
|
494
|
+
old_cell_vector_unit = old_cell_vector / old_cell_vector_norm
|
495
|
+
# We need to repeat the old vector enough times that it is big enough
|
496
|
+
# to cover all possible combinations of projected new vectors
|
497
|
+
projections = [
|
498
|
+
np.dot(new_cell_vector, old_cell_vector_unit)
|
499
|
+
for new_cell_vector in new_cell
|
500
|
+
]
|
501
|
+
absmax_projected_sum = 0
|
502
|
+
for coeffs in product((-1, 1), repeat=3):
|
503
|
+
projected_sum = np.dot(coeffs, projections)
|
504
|
+
absmax_projected_sum = max(absmax_projected_sum, abs(projected_sum))
|
505
|
+
absmax_projected_sum += 0.1 # pad it a little bit
|
506
|
+
this_repeat = ceil(absmax_projected_sum / old_cell_vector_norm)
|
507
|
+
repeat.append(this_repeat)
|
508
|
+
|
509
|
+
new_atoms = atoms.repeat(repeat)
|
510
|
+
new_atoms.set_cell(new_cell)
|
511
|
+
new_atoms.wrap()
|
512
|
+
get_duplicate_atoms(new_atoms, delete=True)
|
513
|
+
|
514
|
+
volume_change = np.linalg.det(change_of_basis)
|
515
|
+
if not np.isclose(len(atoms) * volume_change, len(new_atoms)):
|
516
|
+
raise IncorrectNumAtomsException(
|
517
|
+
f"The change in the number of atoms from {len(atoms)} to {len(new_atoms)} "
|
518
|
+
f"disagrees with the fractional change in cell volume {volume_change}"
|
519
|
+
)
|
520
|
+
|
521
|
+
return new_atoms
|
522
|
+
|
523
|
+
|
524
|
+
def get_possible_primitive_shifts(sgnum: Union[int, str]) -> List[List[float]]:
|
525
|
+
"""
|
526
|
+
Get all unique translation parts of operations in the space group's normalizer that
|
527
|
+
don't leave the primitive cell. Given in the primitive basis as defined in
|
528
|
+
http://doi.org/10.1016/j.commatsci.2017.01.017
|
529
|
+
|
530
|
+
Args:
|
531
|
+
sgnum: space group number
|
532
|
+
"""
|
533
|
+
_check_space_group(sgnum)
|
534
|
+
with open(os.path.join(DATA_DIR, "possible_primitive_shifts.json")) as f:
|
535
|
+
return json.load(f)[str(sgnum)]
|
536
|
+
|
537
|
+
|
538
|
+
def get_primitive_genpos_ops(sgnum: Union[int, str]) -> List[Dict]:
|
539
|
+
"""
|
540
|
+
Get the matrices and columns of the space group operations in the primitive setting
|
541
|
+
as defined in http://doi.org/10.1016/j.commatsci.2017.01.017
|
542
|
+
|
543
|
+
Args:
|
544
|
+
sgnum: space group number
|
545
|
+
|
546
|
+
Returns:
|
547
|
+
List of dictionaries, with each dictionary containing a matrix 'W' and
|
548
|
+
translation 'w' as generally defined in the ITA, but in the primitive setting.
|
549
|
+
"""
|
550
|
+
_check_space_group(sgnum)
|
551
|
+
with open(os.path.join(DATA_DIR, "primitive_GENPOS_ops.json")) as f:
|
552
|
+
return np.asarray(json.load(f)[str(sgnum)])
|
@@ -0,0 +1 @@
|
|
1
|
+
{"1": [[0.0, 0.0, 0.0]], "2": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.0, 0.5, 0.0], [0.0, 0.5, 0.5], [0.5, 0.0, 0.0], [0.5, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5]], "3": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.5, 0.0, 0.0], [0.5, 0.0, 0.5]], "4": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.5, 0.0, 0.0], [0.5, 0.0, 0.5], [0.0, 0.5, 0.0], [0.0, 0.5, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5]], "5": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5]], "6": [[0.0, 0.0, 0.0], [0.0, 0.5, 0.0]], "7": [[0.0, 0.0, 0.0], [0.0, 0.5, 0.0], [0.0, 0.0, 0.5], [0.0, 0.5, 0.5]], "8": [[0.0, 0.0, 0.0]], "9": [[0.0, 0.0, 0.0], [0.75, 0.25, 0.0], [0.5, 0.5, 0.0], [0.25, 0.75, 0.0], [0.0, 0.0, 0.5], [0.75, 0.25, 0.5], [0.5, 0.5, 0.5], [0.25, 0.75, 0.5]], "10": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.0, 0.5, 0.0], [0.0, 0.5, 0.5], [0.5, 0.0, 0.0], [0.5, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5]], "11": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.0, 0.5, 0.0], [0.0, 0.5, 0.5], [0.5, 0.0, 0.0], [0.5, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5]], "12": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5]], "13": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.0, 0.5, 0.0], [0.0, 0.5, 0.5], [0.5, 0.0, 0.0], [0.5, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5]], "14": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.0, 0.5, 0.0], [0.0, 0.5, 0.5], [0.5, 0.0, 0.0], [0.5, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5]], "15": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.0, 0.5, 0.0], [0.0, 0.5, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5], [0.5, 0.0, 0.0], [0.5, 0.0, 0.5]], "16": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.0, 0.5, 0.0], [0.0, 0.5, 0.5], [0.5, 0.0, 0.0], [0.5, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5]], "17": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.25], [0.0, 0.0, 0.5], [0.0, 0.0, 0.75], [0.0, 0.5, 0.0], [0.0, 0.5, 0.25], [0.0, 0.5, 0.5], [0.0, 0.5, 0.75], [0.5, 0.0, 0.0], [0.5, 0.0, 0.25], [0.5, 0.0, 0.5], [0.5, 0.0, 0.75], [0.5, 0.5, 0.0], [0.5, 0.5, 0.25], [0.5, 0.5, 0.5], [0.5, 0.5, 0.75]], "18": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.0, 0.5, 0.0], [0.0, 0.5, 0.5], [0.5, 0.0, 0.0], [0.5, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5]], "19": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.0, 0.5, 0.0], [0.0, 0.5, 0.5], [0.25, 0.25, 0.25], [0.25, 0.25, 0.75], [0.25, 0.75, 0.25], [0.25, 0.75, 0.75], [0.5, 0.0, 0.0], [0.5, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5], [0.75, 0.25, 0.25], [0.75, 0.25, 0.75], [0.75, 0.75, 0.25], [0.75, 0.75, 0.75]], "20": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.25], [0.0, 0.0, 0.5], [0.0, 0.0, 0.75], [0.5, 0.5, 0.0], [0.5, 0.5, 0.25], [0.5, 0.5, 0.5], [0.5, 0.5, 0.75]], "21": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5]], "22": [[0.0, 0.0, 0.0], [0.25, 0.25, 0.25], [0.5, 0.5, 0.5], [0.75, 0.75, 0.75]], "23": [[0.0, 0.0, 0.0], [0.5, 0.0, 0.5], [0.0, 0.5, 0.5], [0.5, 0.5, 0.0]], "24": [[0.0, 0.0, 0.0], [0.5, 0.0, 0.5], [0.5, 0.5, 0.5], [0.0, 0.5, 0.0], [0.0, 0.5, 0.5], [0.5, 0.5, 0.0], [0.5, 0.0, 0.0], [0.0, 0.0, 0.5]], "25": [[0.0, 0.0, 0.0], [0.0, 0.5, 0.0], [0.5, 0.0, 0.0], [0.5, 0.5, 0.0]], "26": [[0.0, 0.0, 0.0], [0.0, 0.5, 0.0], [0.5, 0.0, 0.0], [0.5, 0.5, 0.0], [0.0, 0.0, 0.5], [0.0, 0.5, 0.5], [0.5, 0.0, 0.5], [0.5, 0.5, 0.5]], "27": [[0.0, 0.0, 0.0], [0.0, 0.5, 0.0], [0.5, 0.0, 0.0], [0.5, 0.5, 0.0], [0.0, 0.0, 0.5], [0.0, 0.5, 0.5], [0.5, 0.0, 0.5], [0.5, 0.5, 0.5]], "28": [[0.0, 0.0, 0.0], [0.0, 0.5, 0.0], [0.5, 0.0, 0.0], [0.5, 0.5, 0.0]], "29": [[0.0, 0.0, 0.0], [0.0, 0.5, 0.0], [0.5, 0.0, 0.0], [0.5, 0.5, 0.0], [0.0, 0.0, 0.5], [0.0, 0.5, 0.5], [0.5, 0.0, 0.5], [0.5, 0.5, 0.5]], "30": [[0.0, 0.0, 0.0], [0.0, 0.5, 0.0], [0.5, 0.0, 0.0], [0.5, 0.5, 0.0], [0.0, 0.5, 0.5], [0.0, 0.0, 0.5], [0.5, 0.5, 0.5], [0.5, 0.0, 0.5]], "31": [[0.0, 0.0, 0.0], [0.0, 0.5, 0.0], [0.5, 0.0, 0.0], [0.5, 0.5, 0.0], [0.5, 0.0, 0.5], [0.5, 0.5, 0.5], [0.0, 0.0, 0.5], [0.0, 0.5, 0.5]], "32": [[0.0, 0.0, 0.0], [0.0, 0.5, 0.0], [0.5, 0.0, 0.0], [0.5, 0.5, 0.0]], "33": [[0.0, 0.0, 0.0], [0.0, 0.5, 0.0], [0.5, 0.0, 0.0], [0.5, 0.5, 0.0], [0.0, 0.0, 0.5], [0.0, 0.5, 0.5], [0.5, 0.0, 0.5], [0.5, 0.5, 0.5]], "34": [[0.0, 0.0, 0.0], [0.0, 0.5, 0.0], [0.5, 0.0, 0.0], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5], [0.5, 0.0, 0.5], [0.0, 0.5, 0.5], [0.0, 0.0, 0.5]], "35": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.0]], "36": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.0], [0.0, 0.0, 0.5], [0.5, 0.5, 0.5]], "37": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.0], [0.0, 0.0, 0.5], [0.5, 0.5, 0.5]], "38": [[0.0, 0.0, 0.0], [0.5, 0.0, 0.0]], "39": [[0.0, 0.0, 0.0], [0.5, 0.0, 0.0], [0.0, 0.5, 0.5], [0.5, 0.5, 0.5]], "40": [[0.0, 0.0, 0.0], [0.5, 0.0, 0.0]], "41": [[0.0, 0.0, 0.0], [0.5, 0.0, 0.0], [0.5, 0.5, 0.5], [0.0, 0.5, 0.5]], "42": [[0.0, 0.0, 0.0]], "43": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.25, 0.25, 0.25], [0.25, 0.25, 0.75]], "44": [[0.0, 0.0, 0.0], [0.0, 0.5, 0.5]], "45": [[0.0, 0.0, 0.0], [0.0, 0.5, 0.5], [0.5, 0.5, 0.0], [0.5, 0.0, 0.5]], "46": [[0.0, 0.0, 0.0], [0.0, 0.5, 0.5]], "47": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.0, 0.5, 0.0], [0.0, 0.5, 0.5], [0.5, 0.0, 0.0], [0.5, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5]], "48": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.0, 0.5, 0.0], [0.0, 0.5, 0.5], [0.5, 0.0, 0.0], [0.5, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5]], "49": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.0, 0.5, 0.0], [0.0, 0.5, 0.5], [0.5, 0.0, 0.0], [0.5, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5]], "50": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.0, 0.5, 0.0], [0.0, 0.5, 0.5], [0.5, 0.0, 0.0], [0.5, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5]], "51": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.0, 0.5, 0.0], [0.0, 0.5, 0.5], [0.5, 0.0, 0.0], [0.5, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5]], "52": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.0, 0.5, 0.0], [0.0, 0.5, 0.5], [0.5, 0.0, 0.0], [0.5, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5]], "53": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.0, 0.5, 0.0], [0.0, 0.5, 0.5], [0.5, 0.0, 0.0], [0.5, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5]], "54": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.0, 0.5, 0.0], [0.0, 0.5, 0.5], [0.5, 0.0, 0.0], [0.5, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5]], "55": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.0, 0.5, 0.0], [0.0, 0.5, 0.5], [0.5, 0.0, 0.0], [0.5, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5]], "56": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.0, 0.5, 0.0], [0.0, 0.5, 0.5], [0.5, 0.0, 0.0], [0.5, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5]], "57": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.0, 0.5, 0.0], [0.0, 0.5, 0.5], [0.5, 0.0, 0.0], [0.5, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5]], "58": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.0, 0.5, 0.0], [0.0, 0.5, 0.5], [0.5, 0.0, 0.0], [0.5, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5]], "59": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.0, 0.5, 0.0], [0.0, 0.5, 0.5], [0.5, 0.0, 0.0], [0.5, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5]], "60": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.0, 0.5, 0.0], [0.0, 0.5, 0.5], [0.5, 0.0, 0.0], [0.5, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5]], "61": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.0, 0.5, 0.0], [0.0, 0.5, 0.5], [0.5, 0.0, 0.0], [0.5, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5]], "62": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.0, 0.5, 0.0], [0.0, 0.5, 0.5], [0.5, 0.0, 0.0], [0.5, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5]], "63": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5]], "64": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5]], "65": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5]], "66": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5]], "67": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.5, 0.0, 0.0], [0.5, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5], [0.0, 0.5, 0.0], [0.0, 0.5, 0.5]], "68": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.5, 0.0, 0.0], [0.5, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5], [0.0, 0.5, 0.0], [0.0, 0.5, 0.5]], "69": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.5]], "70": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.5], [0.0, 0.0, 0.5], [0.5, 0.5, 0.0], [0.0, 0.5, 0.0], [0.5, 0.0, 0.5], [0.5, 0.0, 0.0], [0.0, 0.5, 0.5]], "71": [[0.0, 0.0, 0.0], [0.5, 0.0, 0.5], [0.0, 0.5, 0.5], [0.5, 0.5, 0.0]], "72": [[0.0, 0.0, 0.0], [0.5, 0.0, 0.5], [0.0, 0.5, 0.5], [0.5, 0.5, 0.0]], "73": [[0.0, 0.0, 0.0], [0.5, 0.0, 0.5], [0.5, 0.5, 0.5], [0.0, 0.5, 0.0], [0.0, 0.5, 0.5], [0.5, 0.5, 0.0], [0.5, 0.0, 0.0], [0.0, 0.0, 0.5]], "74": [[0.0, 0.0, 0.0], [0.5, 0.0, 0.5], [0.0, 0.5, 0.0], [0.5, 0.5, 0.5], [0.0, 0.5, 0.5], [0.5, 0.5, 0.0], [0.0, 0.0, 0.5], [0.5, 0.0, 0.0]], "75": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.0]], "76": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.0], [0.0, 0.0, 0.5], [0.5, 0.5, 0.5], [0.0, 0.0, 0.25], [0.5, 0.5, 0.25], [0.0, 0.0, 0.75], [0.5, 0.5, 0.75]], "77": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.0], [0.0, 0.0, 0.5], [0.5, 0.5, 0.5]], "78": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.0], [0.0, 0.0, 0.5], [0.5, 0.5, 0.5], [0.0, 0.0, 0.75], [0.5, 0.5, 0.75], [0.0, 0.0, 0.25], [0.5, 0.5, 0.25]], "79": [[0.0, 0.0, 0.0]], "80": [[0.0, 0.0, 0.0], [0.0, 0.5, 0.5], [0.75, 0.25, 0.5], [0.75, 0.75, 0.0]], "81": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5]], "82": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.0], [0.25, 0.75, 0.5], [0.75, 0.25, 0.5]], "83": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5]], "84": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5]], "85": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5], [0.5, 0.0, 0.0], [0.5, 0.0, 0.5], [0.0, 0.5, 0.0], [0.0, 0.5, 0.5]], "86": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5], [0.0, 0.5, 0.5], [0.0, 0.5, 0.0], [0.5, 0.0, 0.5], [0.5, 0.0, 0.0]], "87": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.0]], "88": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5], [0.0, 0.0, 0.5], [0.5, 0.0, 0.5], [0.0, 0.5, 0.5], [0.0, 0.5, 0.0], [0.5, 0.0, 0.0]], "89": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5]], "90": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5]], "91": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5], [0.0, 0.0, 0.25], [0.0, 0.0, 0.75], [0.5, 0.5, 0.25], [0.5, 0.5, 0.75]], "92": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5], [0.5, 0.5, 0.25], [0.5, 0.5, 0.75], [0.0, 0.0, 0.25], [0.0, 0.0, 0.75]], "93": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5]], "94": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5]], "95": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5], [0.0, 0.0, 0.75], [0.0, 0.0, 0.25], [0.5, 0.5, 0.75], [0.5, 0.5, 0.25]], "96": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5], [0.5, 0.5, 0.75], [0.5, 0.5, 0.25], [0.0, 0.0, 0.75], [0.0, 0.0, 0.25]], "97": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.0]], "98": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.0], [0.25, 0.75, 0.5], [0.75, 0.25, 0.5]], "99": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.0]], "100": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.0]], "101": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.0], [0.0, 0.0, 0.5], [0.5, 0.5, 0.5]], "102": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5], [0.0, 0.0, 0.5]], "103": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.0], [0.0, 0.0, 0.5], [0.5, 0.5, 0.5]], "104": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5], [0.0, 0.0, 0.5]], "105": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.0], [0.0, 0.0, 0.5], [0.5, 0.5, 0.5]], "106": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.0], [0.0, 0.0, 0.5], [0.5, 0.5, 0.5]], "107": [[0.0, 0.0, 0.0]], "108": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.0]], "109": [[0.0, 0.0, 0.0], [0.0, 0.5, 0.5], [0.75, 0.25, 0.5], [0.75, 0.75, 0.0]], "110": [[0.0, 0.0, 0.0], [0.0, 0.5, 0.5], [0.75, 0.25, 0.5], [0.75, 0.75, 0.0], [0.5, 0.5, 0.0], [0.5, 0.0, 0.5], [0.25, 0.75, 0.5], [0.25, 0.25, 0.0]], "111": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5]], "112": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5]], "113": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5]], "114": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5]], "115": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5]], "116": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5]], "117": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5]], "118": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5]], "119": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.0], [0.25, 0.75, 0.5], [0.75, 0.25, 0.5]], "120": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.0], [0.25, 0.75, 0.5], [0.75, 0.25, 0.5]], "121": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.0]], "122": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.0], [0.25, 0.75, 0.5], [0.75, 0.25, 0.5]], "123": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5]], "124": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5]], "125": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5], [0.5, 0.0, 0.0], [0.5, 0.0, 0.5], [0.0, 0.5, 0.0], [0.0, 0.5, 0.5]], "126": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5], [0.5, 0.0, 0.0], [0.5, 0.0, 0.5], [0.0, 0.5, 0.0], [0.0, 0.5, 0.5]], "127": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5]], "128": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5]], "129": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5], [0.5, 0.0, 0.0], [0.5, 0.0, 0.5], [0.0, 0.5, 0.0], [0.0, 0.5, 0.5]], "130": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5], [0.5, 0.0, 0.0], [0.5, 0.0, 0.5], [0.0, 0.5, 0.0], [0.0, 0.5, 0.5]], "131": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5]], "132": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5]], "133": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5], [0.5, 0.0, 0.5], [0.5, 0.0, 0.0], [0.0, 0.5, 0.5], [0.0, 0.5, 0.0]], "134": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5], [0.5, 0.0, 0.5], [0.5, 0.0, 0.0], [0.0, 0.5, 0.5], [0.0, 0.5, 0.0]], "135": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5]], "136": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5]], "137": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5], [0.5, 0.0, 0.5], [0.5, 0.0, 0.0], [0.0, 0.5, 0.5], [0.0, 0.5, 0.0]], "138": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5], [0.5, 0.0, 0.5], [0.5, 0.0, 0.0], [0.0, 0.5, 0.5], [0.0, 0.5, 0.0]], "139": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.0]], "140": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.0]], "141": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.0], [0.5, 0.0, 0.5], [0.0, 0.5, 0.5], [0.0, 0.5, 0.0], [0.5, 0.0, 0.0], [0.0, 0.0, 0.5], [0.5, 0.5, 0.5]], "142": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.0], [0.5, 0.0, 0.5], [0.0, 0.5, 0.5], [0.0, 0.5, 0.0], [0.5, 0.0, 0.0], [0.0, 0.0, 0.5], [0.5, 0.5, 0.5]], "143": [[0.0, 0.0, 0.0], [0.3333333333333333, 0.6666666666666666, 0.0], [0.6666666666666666, 0.3333333333333333, 0.0]], "144": [[0.0, 0.0, 0.0], [0.3333333333333333, 0.6666666666666666, 0.0], [0.6666666666666666, 0.3333333333333333, 0.0], [0.0, 0.0, 0.3333333333333333], [0.3333333333333333, 0.6666666666666666, 0.3333333333333333], [0.6666666666666666, 0.3333333333333333, 0.3333333333333333], [0.0, 0.0, 0.6666666666666666], [0.3333333333333333, 0.6666666666666666, 0.6666666666666666], [0.6666666666666666, 0.3333333333333333, 0.6666666666666666]], "145": [[0.0, 0.0, 0.0], [0.3333333333333333, 0.6666666666666666, 0.0], [0.6666666666666666, 0.3333333333333333, 0.0], [0.0, 0.0, 0.6666666666666666], [0.3333333333333333, 0.6666666666666666, 0.6666666666666666], [0.6666666666666666, 0.3333333333333333, 0.6666666666666666], [0.0, 0.0, 0.3333333333333333], [0.3333333333333333, 0.6666666666666666, 0.3333333333333333], [0.6666666666666666, 0.3333333333333333, 0.3333333333333333]], "146": [[0.0, 0.0, 0.0]], "147": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5]], "148": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.5]], "149": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.3333333333333333, 0.6666666666666666, 0.0], [0.3333333333333333, 0.6666666666666666, 0.5], [0.6666666666666666, 0.3333333333333333, 0.0], [0.6666666666666666, 0.3333333333333333, 0.5]], "150": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5]], "151": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.3333333333333333, 0.6666666666666666, 0.0], [0.3333333333333333, 0.6666666666666666, 0.5], [0.6666666666666666, 0.3333333333333333, 0.0], [0.6666666666666666, 0.3333333333333333, 0.5], [0.0, 0.0, 0.3333333333333333], [0.0, 0.0, 0.8333333333333333], [0.3333333333333333, 0.6666666666666666, 0.3333333333333333], [0.3333333333333333, 0.6666666666666666, 0.8333333333333333], [0.6666666666666666, 0.3333333333333333, 0.3333333333333333], [0.6666666666666666, 0.3333333333333333, 0.8333333333333333], [0.0, 0.0, 0.6666666666666666], [0.0, 0.0, 0.16666666666666652], [0.3333333333333333, 0.6666666666666666, 0.6666666666666666], [0.3333333333333333, 0.6666666666666666, 0.16666666666666652], [0.6666666666666666, 0.3333333333333333, 0.6666666666666666], [0.6666666666666666, 0.3333333333333333, 0.16666666666666652]], "152": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.0, 0.0, 0.3333333333333333], [0.0, 0.0, 0.8333333333333333], [0.0, 0.0, 0.6666666666666666], [0.0, 0.0, 0.16666666666666652]], "153": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.3333333333333333, 0.6666666666666666, 0.0], [0.3333333333333333, 0.6666666666666666, 0.5], [0.6666666666666666, 0.3333333333333333, 0.0], [0.6666666666666666, 0.3333333333333333, 0.5], [0.0, 0.0, 0.6666666666666666], [0.0, 0.0, 0.16666666666666652], [0.3333333333333333, 0.6666666666666666, 0.6666666666666666], [0.3333333333333333, 0.6666666666666666, 0.16666666666666652], [0.6666666666666666, 0.3333333333333333, 0.6666666666666666], [0.6666666666666666, 0.3333333333333333, 0.16666666666666652], [0.0, 0.0, 0.3333333333333333], [0.0, 0.0, 0.8333333333333333], [0.3333333333333333, 0.6666666666666666, 0.3333333333333333], [0.3333333333333333, 0.6666666666666666, 0.8333333333333333], [0.6666666666666666, 0.3333333333333333, 0.3333333333333333], [0.6666666666666666, 0.3333333333333333, 0.8333333333333333]], "154": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.0, 0.0, 0.6666666666666666], [0.0, 0.0, 0.16666666666666652], [0.0, 0.0, 0.3333333333333333], [0.0, 0.0, 0.8333333333333333]], "155": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.5]], "156": [[0.0, 0.0, 0.0], [0.3333333333333333, 0.6666666666666666, 0.0], [0.6666666666666666, 0.3333333333333333, 0.0]], "157": [[0.0, 0.0, 0.0]], "158": [[0.0, 0.0, 0.0], [0.3333333333333333, 0.6666666666666666, 0.0], [0.6666666666666666, 0.3333333333333333, 0.0], [0.0, 0.0, 0.5], [0.3333333333333333, 0.6666666666666666, 0.5], [0.6666666666666666, 0.3333333333333333, 0.5]], "159": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5]], "160": [[0.0, 0.0, 0.0]], "161": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.5]], "162": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5]], "163": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5]], "164": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5]], "165": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5]], "166": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.5]], "167": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.5]], "168": [[0.0, 0.0, 0.0]], "169": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.3333333333333333], [0.0, 0.0, 0.6666666666666666], [0.0, 0.0, 0.5], [0.0, 0.0, 0.8333333333333334], [0.0, 0.0, 0.16666666666666666]], "170": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.6666666666666666], [0.0, 0.0, 0.3333333333333333], [0.0, 0.0, 0.5], [0.0, 0.0, 0.16666666666666666], [0.0, 0.0, 0.8333333333333334]], "171": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.6666666666666666], [0.0, 0.0, 0.3333333333333333]], "172": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.3333333333333333], [0.0, 0.0, 0.6666666666666666]], "173": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5]], "174": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.3333333333333333, 0.6666666666666666, 0.0], [0.3333333333333333, 0.6666666666666666, 0.5], [0.6666666666666666, 0.3333333333333333, 0.0], [0.6666666666666666, 0.3333333333333333, 0.5]], "175": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5]], "176": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5]], "177": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5]], "178": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.0, 0.0, 0.3333333333333333], [0.0, 0.0, 0.8333333333333333], [0.0, 0.0, 0.6666666666666666], [0.0, 0.0, 0.16666666666666652]], "179": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.0, 0.0, 0.6666666666666666], [0.0, 0.0, 0.16666666666666652], [0.0, 0.0, 0.3333333333333333], [0.0, 0.0, 0.8333333333333333]], "180": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.0, 0.0, 0.6666666666666666], [0.0, 0.0, 0.16666666666666652], [0.0, 0.0, 0.3333333333333333], [0.0, 0.0, 0.8333333333333333]], "181": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.0, 0.0, 0.3333333333333333], [0.0, 0.0, 0.8333333333333333], [0.0, 0.0, 0.6666666666666666], [0.0, 0.0, 0.16666666666666652]], "182": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5]], "183": [[0.0, 0.0, 0.0]], "184": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5]], "185": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5]], "186": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5]], "187": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.3333333333333333, 0.6666666666666666, 0.0], [0.3333333333333333, 0.6666666666666666, 0.5], [0.6666666666666666, 0.3333333333333333, 0.0], [0.6666666666666666, 0.3333333333333333, 0.5]], "188": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5], [0.3333333333333333, 0.6666666666666666, 0.0], [0.3333333333333333, 0.6666666666666666, 0.5], [0.6666666666666666, 0.3333333333333333, 0.0], [0.6666666666666666, 0.3333333333333333, 0.5]], "189": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5]], "190": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5]], "191": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5]], "192": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5]], "193": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5]], "194": [[0.0, 0.0, 0.0], [0.0, 0.0, 0.5]], "195": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.5]], "196": [[0.0, 0.0, 0.0], [0.25, 0.25, 0.25], [0.5, 0.5, 0.5], [0.75, 0.75, 0.75]], "197": [[0.0, 0.0, 0.0]], "198": [[0.0, 0.0, 0.0], [0.25, 0.25, 0.25], [0.5, 0.5, 0.5], [0.75, 0.75, 0.75], [0.5, 0.0, 0.5], [0.75, 0.25, 0.75], [0.0, 0.5, 0.0], [0.25, 0.75, 0.25], [0.0, 0.5, 0.5], [0.25, 0.75, 0.75], [0.5, 0.0, 0.0], [0.75, 0.25, 0.25], [0.5, 0.5, 0.0], [0.75, 0.75, 0.25], [0.0, 0.0, 0.5], [0.25, 0.25, 0.75]], "199": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.5], [0.5, 0.0, 0.5], [0.0, 0.5, 0.0], [0.0, 0.5, 0.5], [0.5, 0.0, 0.0], [0.5, 0.5, 0.0], [0.0, 0.0, 0.5]], "200": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.5]], "201": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.5], [0.5, 0.5, 0.0], [0.0, 0.0, 0.5], [0.5, 0.0, 0.5], [0.0, 0.5, 0.0], [0.0, 0.5, 0.5], [0.5, 0.0, 0.0]], "202": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.5]], "203": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.5], [0.0, 0.0, 0.5], [0.5, 0.5, 0.0], [0.0, 0.5, 0.0], [0.5, 0.0, 0.5], [0.5, 0.0, 0.0], [0.0, 0.5, 0.5]], "204": [[0.0, 0.0, 0.0]], "205": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.5], [0.5, 0.0, 0.5], [0.0, 0.5, 0.0], [0.0, 0.5, 0.5], [0.5, 0.0, 0.0], [0.5, 0.5, 0.0], [0.0, 0.0, 0.5]], "206": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.5], [0.5, 0.0, 0.5], [0.0, 0.5, 0.0], [0.0, 0.5, 0.5], [0.5, 0.0, 0.0], [0.5, 0.5, 0.0], [0.0, 0.0, 0.5]], "207": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.5]], "208": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.5]], "209": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.5]], "210": [[0.0, 0.0, 0.0], [0.25, 0.25, 0.25], [0.5, 0.5, 0.5], [0.75, 0.75, 0.75]], "211": [[0.0, 0.0, 0.0]], "212": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.5], [0.5, 0.0, 0.5], [0.0, 0.5, 0.0], [0.0, 0.5, 0.5], [0.5, 0.0, 0.0], [0.5, 0.5, 0.0], [0.0, 0.0, 0.5], [0.25, 0.75, 0.75], [0.75, 0.25, 0.25], [0.25, 0.25, 0.25], [0.75, 0.75, 0.75], [0.75, 0.75, 0.25], [0.25, 0.25, 0.75], [0.75, 0.25, 0.75], [0.25, 0.75, 0.25]], "213": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.5], [0.5, 0.0, 0.5], [0.0, 0.5, 0.0], [0.0, 0.5, 0.5], [0.5, 0.0, 0.0], [0.5, 0.5, 0.0], [0.0, 0.0, 0.5], [0.75, 0.25, 0.25], [0.25, 0.75, 0.75], [0.75, 0.75, 0.75], [0.25, 0.25, 0.25], [0.25, 0.25, 0.75], [0.75, 0.75, 0.25], [0.25, 0.75, 0.25], [0.75, 0.25, 0.75]], "214": [[0.0, 0.0, 0.0], [0.5, 0.0, 0.5], [0.0, 0.5, 0.5], [0.5, 0.5, 0.0], [0.5, 0.0, 0.0], [0.5, 0.5, 0.5], [0.0, 0.0, 0.5], [0.0, 0.5, 0.0]], "215": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.5]], "216": [[0.0, 0.0, 0.0], [0.25, 0.25, 0.25], [0.5, 0.5, 0.5], [0.75, 0.75, 0.75]], "217": [[0.0, 0.0, 0.0]], "218": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.5]], "219": [[0.0, 0.0, 0.0], [0.25, 0.25, 0.25], [0.5, 0.5, 0.5], [0.75, 0.75, 0.75]], "220": [[0.0, 0.0, 0.0], [0.5, 0.0, 0.5], [0.0, 0.5, 0.5], [0.5, 0.5, 0.0], [0.5, 0.5, 0.5], [0.5, 0.0, 0.0], [0.0, 0.5, 0.0], [0.0, 0.0, 0.5]], "221": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.5]], "222": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.5], [0.5, 0.5, 0.0], [0.0, 0.0, 0.5], [0.5, 0.0, 0.5], [0.0, 0.5, 0.0], [0.0, 0.5, 0.5], [0.5, 0.0, 0.0]], "223": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.5]], "224": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.5], [0.5, 0.5, 0.0], [0.0, 0.0, 0.5], [0.5, 0.0, 0.5], [0.0, 0.5, 0.0], [0.0, 0.5, 0.5], [0.5, 0.0, 0.0]], "225": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.5]], "226": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.5]], "227": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.5], [0.0, 0.0, 0.5], [0.5, 0.5, 0.0], [0.0, 0.5, 0.0], [0.5, 0.0, 0.5], [0.5, 0.0, 0.0], [0.0, 0.5, 0.5]], "228": [[0.0, 0.0, 0.0], [0.5, 0.5, 0.5], [0.0, 0.0, 0.5], [0.5, 0.5, 0.0], [0.0, 0.5, 0.0], [0.5, 0.0, 0.5], [0.5, 0.0, 0.0], [0.0, 0.5, 0.5]], "229": [[0.0, 0.0, 0.0]], "230": [[0.0, 0.0, 0.0], [0.5, 0.0, 0.5], [0.0, 0.5, 0.5], [0.5, 0.5, 0.0], [0.5, 0.0, 0.0], [0.5, 0.5, 0.5], [0.0, 0.0, 0.5], [0.0, 0.5, 0.0]]}
|