1# -*- coding: utf-8 -*-
2# Copyright (C) 2011 Atsushi Togo
3# All rights reserved.
4#
5# This file is part of phonopy.
6#
7# Redistribution and use in source and binary forms, with or without
8# modification, are permitted provided that the following conditions
9# are met:
10#
11# * Redistributions of source code must retain the above copyright
12#   notice, this list of conditions and the following disclaimer.
13#
14# * Redistributions in binary form must reproduce the above copyright
15#   notice, this list of conditions and the following disclaimer in
16#   the documentation and/or other materials provided with the
17#   distribution.
18#
19# * Neither the name of the phonopy project nor the names of its
20#   contributors may be used to endorse or promote products derived
21#   from this software without specific prior written permission.
22#
23# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
26# FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
27# COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
28# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
29# BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
30# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
31# CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
32# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
33# ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34# POSSIBILITY OF SUCH DAMAGE.
35
36import warnings
37import numpy as np
38
39
40def Atoms(*args, **kwargs):
41    warnings.warn("phonopy.atoms.Atoms is deprecated. Please use "
42                  "PhonopyAtoms instead of Atoms.", DeprecationWarning)
43    return PhonopyAtoms(*args, **kwargs)
44
45
46class _Atoms(object):
47    """A class compatible with the ASE Atoms class.
48
49    Only the necessary stuffs to phonopy are implemented. The data
50    structure of magnetic moments is incompatible.
51
52    """
53
54    def __init__(self,
55                 symbols=None,
56                 positions=None,
57                 numbers=None,
58                 masses=None,
59                 magmoms=None,
60                 scaled_positions=None,
61                 cell=None,
62                 pbc=None):
63        # cell and positions
64        self._cell = None
65        self._scaled_positions = None
66        self._set_cell_and_positions(cell,
67                                     positions=positions,
68                                     scaled_positions=scaled_positions)
69
70        # Atom symbols
71        self._symbols = symbols
72
73        # Atomic numbers
74        self._numbers = None
75        if numbers is not None:
76            self._numbers = np.array(numbers, dtype='intc')
77
78        # masses
79        self._masses = None
80        self._set_masses(masses)
81
82        # (initial) magnetic moments
83        self._magmoms = None
84        self._set_magnetic_moments(magmoms)
85
86        # numbers and symbols
87        if self._numbers is not None:  # number --> symbol
88            self._numbers_to_symbols()
89        elif self._symbols is not None:  # symbol --> number
90            self._symbols_to_numbers()
91
92        # symbol --> mass
93        if self._symbols and (self._masses is None):
94            self._symbols_to_masses()
95
96        self._check()
97
98    def __len__(self):
99        return len(self.numbers)
100
101    def set_cell(self, cell):
102        self._set_cell(cell)
103        self._check()
104
105    def get_cell(self):
106        return self._cell.copy()
107
108    def set_positions(self, cart_positions):
109        self._set_positions(cart_positions)
110        self._check()
111
112    def get_positions(self):
113        return np.dot(self._scaled_positions, self._cell)
114
115    def set_scaled_positions(self, scaled_positions):
116        self._set_scaled_positions(scaled_positions)
117        self._check()
118
119    def get_scaled_positions(self):
120        return self._scaled_positions.copy()
121
122    def set_masses(self, masses):
123        self._set_masses(masses)
124        self._check()
125
126    def get_masses(self):
127        if self._masses is None:
128            return None
129        else:
130            return self._masses.copy()
131
132    def set_magnetic_moments(self, magmoms):
133        self._set_magnetic_moments(magmoms)
134        self._check()
135
136    def get_magnetic_moments(self):
137        if self._magmoms is None:
138            return None
139        else:
140            return self._magmoms.copy()
141
142    def set_chemical_symbols(self, symbols):
143        self._symbols = symbols
144        self._check()
145        self._symbols_to_numbers()
146        self._symbols_to_masses()
147
148    def get_chemical_symbols(self):
149        return self._symbols[:]
150
151    def get_number_of_atoms(self):
152        return len(self)
153
154    def set_atomic_numbers(self, number):
155        self.number = number
156        self._check()
157        self._numbers_to_symbols()
158        self._symbols_to_masses()
159
160    def get_atomic_numbers(self):
161        return self._numbers.copy()
162
163    def get_volume(self):
164        return np.linalg.det(self._cell)
165
166    def _set_cell(self, cell):
167        _cell = np.array(cell, dtype='double', order='C')
168        if _cell.shape == (3, 3):
169            self._cell = _cell
170        else:
171            raise TypeError("Array shape of cell is not 3x3.")
172
173    def _set_positions(self, cart_positions):
174        self._scaled_positions = np.array(
175            np.dot(cart_positions, np.linalg.inv(self._cell)),
176            dtype='double', order='C')
177
178    def _set_scaled_positions(self, scaled_positions):
179        self._scaled_positions = np.array(scaled_positions,
180                                          dtype='double', order='C')
181
182    def _set_masses(self, masses):
183        if masses is None:
184            self._masses = None
185        else:
186            self._masses = np.array(masses, dtype='double')
187
188    def _set_magnetic_moments(self, magmoms):
189        if magmoms is None:
190            self._magmoms = None
191        else:
192            self._magmoms = np.array(magmoms, dtype='double')
193
194    def _set_cell_and_positions(self,
195                                cell,
196                                positions=None,
197                                scaled_positions=None):
198        self._set_cell(cell)
199        if positions is not None:
200            self._set_positions(positions)
201        elif scaled_positions is not None:
202            self._set_scaled_positions(scaled_positions)
203
204    def _numbers_to_symbols(self):
205        self._symbols = [atom_data[n][1] for n in self._numbers]
206
207    def _symbols_to_numbers(self):
208        self._numbers = np.array(
209            [symbol_map[s] for s in self._symbols], dtype='intc')
210
211    def _symbols_to_masses(self):
212        masses = [atom_data[symbol_map[s]][3] for s in self._symbols]
213        if None in masses:
214            self._masses = None
215        else:
216            self._masses = np.array(masses, dtype='double')
217
218    def _check(self):
219        if self._cell is None:
220            raise RuntimeError('cell is not set.')
221        if self._scaled_positions is None:
222            raise RuntimeError('scaled_positions (positions) is not set.')
223        if self._numbers is None:
224            raise RuntimeError('numbers is not set.')
225        if len(self._numbers) != len(self._scaled_positions):
226            raise RuntimeError('len(numbers) != len(scaled_positions).')
227        if len(self._numbers) != len(self._symbols):
228            raise RuntimeError('len(numbers) != len(symbols).')
229        if self._masses is not None:
230            if len(self._numbers) != len(self._masses):
231                raise RuntimeError('len(numbers) != len(masses).')
232        if self._magmoms is not None:
233            if len(self._numbers) != len(self._magmoms):
234                raise RuntimeError('len(numbers) != len(magmoms).')
235
236
237class PhonopyAtoms(_Atoms):
238    def __init__(self,
239                 symbols=None,
240                 numbers=None,
241                 masses=None,
242                 magmoms=None,
243                 scaled_positions=None,
244                 positions=None,
245                 cell=None,
246                 atoms=None,
247                 pbc=True):  # pbc is dummy argument, and never used.
248        if atoms:
249            try:  # This is for ASE Atoms class compatibility (not guranteed)
250                magmoms = atoms.get_magnetic_moments()
251            except RuntimeError:
252                magmoms = None
253            _Atoms.__init__(self,
254                            numbers=atoms.get_atomic_numbers(),
255                            masses=atoms.get_masses(),
256                            magmoms=magmoms,
257                            scaled_positions=atoms.get_scaled_positions(),
258                            cell=atoms.get_cell(),
259                            pbc=True)
260        else:
261            _Atoms.__init__(self,
262                            symbols=symbols,
263                            numbers=numbers,
264                            masses=masses,
265                            magmoms=magmoms,
266                            scaled_positions=scaled_positions,
267                            positions=positions,
268                            cell=cell,
269                            pbc=True)
270
271    @property
272    def cell(self):
273        return self.get_cell()
274
275    @cell.setter
276    def cell(self, cell):
277        self.set_cell(cell)
278
279    @property
280    def positions(self):
281        return self.get_positions()
282
283    @positions.setter
284    def positions(self, positions):
285        self.set_positions(positions)
286
287    @property
288    def scaled_positions(self):
289        return self.get_scaled_positions()
290
291    @scaled_positions.setter
292    def scaled_positions(self, scaled_positions):
293        self.set_scaled_positions(scaled_positions)
294
295    @property
296    def symbols(self):
297        return self.get_chemical_symbols()
298
299    @symbols.setter
300    def symbols(self, symbols):
301        self.set_chemical_symbols(symbols)
302
303    @property
304    def numbers(self):
305        return self.get_atomic_numbers()
306
307    @numbers.setter
308    def numbers(self, numbers):
309        self.set_atomic_numbers(numbers)
310
311    @property
312    def masses(self):
313        return self.get_masses()
314
315    @masses.setter
316    def masses(self, masses):
317        self.set_masses(masses)
318
319    @property
320    def magnetic_moments(self):
321        return self.get_magnetic_moments()
322
323    @magnetic_moments.setter
324    def magnetic_moments(self, magmoms):
325        self.set_magnetic_moments(magmoms)
326
327    @property
328    def volume(self):
329        return self.get_volume()
330
331    def copy(self):
332        return PhonopyAtoms(cell=self._cell,
333                            scaled_positions=self._scaled_positions,
334                            masses=self._masses,
335                            magmoms=self._magmoms,
336                            symbols=self._symbols,
337                            pbc=True)
338
339    def totuple(self):
340        if self._magmoms is None:
341            return (self._cell, self._scaled_positions, self._numbers)
342        else:
343            return (self._cell, self._scaled_positions, self._numbers,
344                    self._magmoms)
345
346    def to_tuple(self):
347        warnings.warn(
348            "PhonopyAtoms.to_tuple is deprecated. Please use "
349            "PhonopyAtoms.totuple instead.", DeprecationWarning)
350        return self.totuple()
351
352    def get_yaml_lines(self):
353        lines = ["lattice:"]
354        for v, a in zip(self._cell, ('a', 'b', 'c')):
355            lines.append("- [ %21.15f, %21.15f, %21.15f ] # %s" %
356                         (v[0], v[1], v[2], a))
357        lines.append("points:")
358        if self._masses is None:
359            masses = [None] * len(self._symbols)
360        else:
361            masses = self._masses
362        for i, (s, v, m) in enumerate(
363                zip(self._symbols, self._scaled_positions, masses)):
364            lines.append("- symbol: %-2s # %d" % (s, i + 1))
365            lines.append("  coordinates: [ %18.15f, %18.15f, %18.15f ]" %
366                         tuple(v))
367            if m is not None:
368                lines.append("  mass: %f" % m)
369        return lines
370
371    def __str__(self):
372        return "\n".join(self.get_yaml_lines())
373
374
375# Pure Appl. Chem., Vol. 83, No. 2, pp. 359-396, 2011. is available
376# but the following list is from 2006.
377
378# Pure Appl. Chem., Vol. 78, No. 11, pp. 2051-2066, 2006.
379# The masses of following elements are obtained from wikipedia:
380# Ac: 227
381# Np: 237
382# Pm: 145
383# Tc: 98
384atom_data = [
385    [0, "X", "X", None],  # 0
386    [1, "H", "Hydrogen", 1.00794],  # 1
387    [2, "He", "Helium", 4.002602],  # 2
388    [3, "Li", "Lithium", 6.941],  # 3
389    [4, "Be", "Beryllium", 9.012182],  # 4
390    [5, "B", "Boron", 10.811],  # 5
391    [6, "C", "Carbon", 12.0107],  # 6
392    [7, "N", "Nitrogen", 14.0067],  # 7
393    [8, "O", "Oxygen", 15.9994],  # 8
394    [9, "F", "Fluorine", 18.9984032],  # 9
395    [10, "Ne", "Neon", 20.1797],  # 10
396    [11, "Na", "Sodium", 22.98976928],  # 11
397    [12, "Mg", "Magnesium", 24.3050],  # 12
398    [13, "Al", "Aluminium", 26.9815386],  # 13
399    [14, "Si", "Silicon", 28.0855],  # 14
400    [15, "P", "Phosphorus", 30.973762],  # 15
401    [16, "S", "Sulfur", 32.065],  # 16
402    [17, "Cl", "Chlorine", 35.453],  # 17
403    [18, "Ar", "Argon", 39.948],  # 18
404    [19, "K", "Potassium", 39.0983],  # 19
405    [20, "Ca", "Calcium", 40.078],  # 20
406    [21, "Sc", "Scandium", 44.955912],  # 21
407    [22, "Ti", "Titanium", 47.867],  # 22
408    [23, "V", "Vanadium", 50.9415],  # 23
409    [24, "Cr", "Chromium", 51.9961],  # 24
410    [25, "Mn", "Manganese", 54.938045],  # 25
411    [26, "Fe", "Iron", 55.845],  # 26
412    [27, "Co", "Cobalt", 58.933195],  # 27
413    [28, "Ni", "Nickel", 58.6934],  # 28
414    [29, "Cu", "Copper", 63.546],  # 29
415    [30, "Zn", "Zinc", 65.38],  # 30
416    [31, "Ga", "Gallium", 69.723],  # 31
417    [32, "Ge", "Germanium", 72.64],  # 32
418    [33, "As", "Arsenic", 74.92160],  # 33
419    [34, "Se", "Selenium", 78.96],  # 34
420    [35, "Br", "Bromine", 79.904],  # 35
421    [36, "Kr", "Krypton", 83.798],  # 36
422    [37, "Rb", "Rubidium", 85.4678],  # 37
423    [38, "Sr", "Strontium", 87.62],  # 38
424    [39, "Y", "Yttrium", 88.90585],  # 39
425    [40, "Zr", "Zirconium", 91.224],  # 40
426    [41, "Nb", "Niobium", 92.90638],  # 41
427    [42, "Mo", "Molybdenum", 95.96],  # 42
428    [43, "Tc", "Technetium", 98],  # 43 (mass is from wikipedia)
429    [44, "Ru", "Ruthenium", 101.07],  # 44
430    [45, "Rh", "Rhodium", 102.90550],  # 45
431    [46, "Pd", "Palladium", 106.42],  # 46
432    [47, "Ag", "Silver", 107.8682],  # 47
433    [48, "Cd", "Cadmium", 112.411],  # 48
434    [49, "In", "Indium", 114.818],  # 49
435    [50, "Sn", "Tin", 118.710],  # 50
436    [51, "Sb", "Antimony", 121.760],  # 51
437    [52, "Te", "Tellurium", 127.60],  # 52
438    [53, "I", "Iodine", 126.90447],  # 53
439    [54, "Xe", "Xenon", 131.293],  # 54
440    [55, "Cs", "Caesium", 132.9054519],  # 55
441    [56, "Ba", "Barium", 137.327],  # 56
442    [57, "La", "Lanthanum", 138.90547],  # 57
443    [58, "Ce", "Cerium", 140.116],  # 58
444    [59, "Pr", "Praseodymium", 140.90765],  # 59
445    [60, "Nd", "Neodymium", 144.242],  # 60
446    [61, "Pm", "Promethium", 145],  # 61 (mass is from wikipedia)
447    [62, "Sm", "Samarium", 150.36],  # 62
448    [63, "Eu", "Europium", 151.964],  # 63
449    [64, "Gd", "Gadolinium", 157.25],  # 64
450    [65, "Tb", "Terbium", 158.92535],  # 65
451    [66, "Dy", "Dysprosium", 162.500],  # 66
452    [67, "Ho", "Holmium", 164.93032],  # 67
453    [68, "Er", "Erbium", 167.259],  # 68
454    [69, "Tm", "Thulium", 168.93421],  # 69
455    [70, "Yb", "Ytterbium", 173.054],  # 70
456    [71, "Lu", "Lutetium", 174.9668],  # 71
457    [72, "Hf", "Hafnium", 178.49],  # 72
458    [73, "Ta", "Tantalum", 180.94788],  # 73
459    [74, "W", "Tungsten", 183.84],  # 74
460    [75, "Re", "Rhenium", 186.207],  # 75
461    [76, "Os", "Osmium", 190.23],  # 76
462    [77, "Ir", "Iridium", 192.217],  # 77
463    [78, "Pt", "Platinum", 195.084],  # 78
464    [79, "Au", "Gold", 196.966569],  # 79
465    [80, "Hg", "Mercury", 200.59],  # 80
466    [81, "Tl", "Thallium", 204.3833],  # 81
467    [82, "Pb", "Lead", 207.2],  # 82
468    [83, "Bi", "Bismuth", 208.98040],  # 83
469    [84, "Po", "Polonium", None],  # 84
470    [85, "At", "Astatine", None],  # 85
471    [86, "Rn", "Radon", None],  # 86
472    [87, "Fr", "Francium", None],  # 87
473    [88, "Ra", "Radium", None],  # 88
474    [89, "Ac", "Actinium", 227],  # 89 (mass is from wikipedia)
475    [90, "Th", "Thorium", 232.03806],  # 90
476    [91, "Pa", "Protactinium", 231.03588],  # 91
477    [92, "U", "Uranium", 238.02891],  # 92
478    [93, "Np", "Neptunium", 237],  # 93 (mass is from wikipedia)
479    [94, "Pu", "Plutonium", None],  # 94
480    [95, "Am", "Americium", None],  # 95
481    [96, "Cm", "Curium", None],  # 96
482    [97, "Bk", "Berkelium", None],  # 97
483    [98, "Cf", "Californium", None],  # 98
484    [99, "Es", "Einsteinium", None],  # 99
485    [100, "Fm", "Fermium", None],  # 100
486    [101, "Md", "Mendelevium", None],  # 101
487    [102, "No", "Nobelium", None],  # 102
488    [103, "Lr", "Lawrencium", None],  # 103
489    [104, "Rf", "Rutherfordium", None],  # 104
490    [105, "Db", "Dubnium", None],  # 105
491    [106, "Sg", "Seaborgium", None],  # 106
492    [107, "Bh", "Bohrium", None],  # 107
493    [108, "Hs", "Hassium", None],  # 108
494    [109, "Mt", "Meitnerium", None],  # 109
495    [110, "Ds", "Darmstadtium", None],  # 110
496    [111, "Rg", "Roentgenium", None],  # 111
497    [112, "Cn", "Copernicium", None],  # 112
498    [113, "Uut", "Ununtrium", None],  # 113
499    [114, "Uuq", "Ununquadium", None],  # 114
500    [115, "Uup", "Ununpentium", None],  # 115
501    [116, "Uuh", "Ununhexium", None],  # 116
502    [117, "Uus", "Ununseptium", None],  # 117
503    [118, "Uuo", "Ununoctium", None],  # 118
504]
505
506symbol_map = {
507    "H": 1,
508    "He": 2,
509    "Li": 3,
510    "Be": 4,
511    "B": 5,
512    "C": 6,
513    "N": 7,
514    "O": 8,
515    "F": 9,
516    "Ne": 10,
517    "Na": 11,
518    "Mg": 12,
519    "Al": 13,
520    "Si": 14,
521    "P": 15,
522    "S": 16,
523    "Cl": 17,
524    "Ar": 18,
525    "K": 19,
526    "Ca": 20,
527    "Sc": 21,
528    "Ti": 22,
529    "V": 23,
530    "Cr": 24,
531    "Mn": 25,
532    "Fe": 26,
533    "Co": 27,
534    "Ni": 28,
535    "Cu": 29,
536    "Zn": 30,
537    "Ga": 31,
538    "Ge": 32,
539    "As": 33,
540    "Se": 34,
541    "Br": 35,
542    "Kr": 36,
543    "Rb": 37,
544    "Sr": 38,
545    "Y": 39,
546    "Zr": 40,
547    "Nb": 41,
548    "Mo": 42,
549    "Tc": 43,
550    "Ru": 44,
551    "Rh": 45,
552    "Pd": 46,
553    "Ag": 47,
554    "Cd": 48,
555    "In": 49,
556    "Sn": 50,
557    "Sb": 51,
558    "Te": 52,
559    "I": 53,
560    "Xe": 54,
561    "Cs": 55,
562    "Ba": 56,
563    "La": 57,
564    "Ce": 58,
565    "Pr": 59,
566    "Nd": 60,
567    "Pm": 61,
568    "Sm": 62,
569    "Eu": 63,
570    "Gd": 64,
571    "Tb": 65,
572    "Dy": 66,
573    "Ho": 67,
574    "Er": 68,
575    "Tm": 69,
576    "Yb": 70,
577    "Lu": 71,
578    "Hf": 72,
579    "Ta": 73,
580    "W": 74,
581    "Re": 75,
582    "Os": 76,
583    "Ir": 77,
584    "Pt": 78,
585    "Au": 79,
586    "Hg": 80,
587    "Tl": 81,
588    "Pb": 82,
589    "Bi": 83,
590    "Po": 84,
591    "At": 85,
592    "Rn": 86,
593    "Fr": 87,
594    "Ra": 88,
595    "Ac": 89,
596    "Th": 90,
597    "Pa": 91,
598    "U": 92,
599    "Np": 93,
600    "Pu": 94,
601    "Am": 95,
602    "Cm": 96,
603    "Bk": 97,
604    "Cf": 98,
605    "Es": 99,
606    "Fm": 100,
607    "Md": 101,
608    "No": 102,
609    "Lr": 103,
610    "Rf": 104,
611    "Db": 105,
612    "Sg": 106,
613    "Bh": 107,
614    "Hs": 108,
615    "Mt": 109,
616    "Ds": 110,
617    "Rg": 111,
618    "Cn": 112,
619    "Uut": 113,
620    "Uuq": 114,
621    "Uup": 115,
622    "Uuh": 116,
623    "Uus": 117,
624    "Uuo": 118,
625}
626
627# This data are obtained from
628# J. R. de Laeter, J. K. Böhlke, P. De Bièvre, H. Hidaka, H. S. Peiser,
629# K. J. R. Rosman and P. D. P. Taylor (2003).
630# "Atomic weights of the elements. Review 2000 (IUPAC Technical Report)"
631isotope_data = {
632    'H': [[1, 1.0078250319, 0.999885], [2, 2.0141017779, 0.000115]],
633    'He': [[3, 3.0160293094, 0.00000134], [4, 4.0026032497, 0.99999866]],
634    'Li': [[6, 6.0151223, 0.0759], [7, 7.0160041, 0.9241]],
635    'Be': [[9, 9.0121822, 1.0000]],
636    'B': [[10, 10.0129371, 0.199], [11, 11.0093055, 0.801]],
637    'C': [[12, 12, 0.9893], [13, 13.003354838, 0.0107]],
638    'N': [[14, 14.0030740074, 0.99636], [15, 15.000108973, 0.00364]],
639    'O': [[16, 15.9949146223, 0.99757], [17, 16.99913150, 0.00038],
640          [18, 17.9991604, 0.00205]],
641    'F': [[19, 18.99840320, 1.0000]],
642    'Ne': [[20, 19.992440176, 0.9048], [21, 20.99384674, 0.0027],
643           [22, 21.99138550, 0.0925]],
644    'Na': [[23, 22.98976966, 1.0000]],
645    'Mg': [[24, 23.98504187, 0.7899], [25, 24.98583700, 0.1000],
646           [26, 25.98259300, 0.1101]],
647    'Al': [[27, 26.98153841, 1.0000]],
648    'Si': [[28, 27.97692649, 0.92223], [29, 28.97649468, 0.04685],
649           [30, 29.97377018, 0.03092]],
650    'P': [[31, 30.97376149, 1.0000]],
651    'S': [[32, 31.97207073, 0.9499], [33, 32.97145854, 0.0075],
652          [34, 33.96786687, 0.0425], [36, 35.96708088, 0.0001]],
653    'Cl': [[35, 34.96885271, 0.7576], [37, 36.96590260, 0.2424]],
654    'Ar': [[36, 35.96754626, 0.003365], [38, 37.9627322, 0.000632],
655           [40, 39.962383124, 0.996003]],
656    'K': [[39, 38.96370, 0.932581], [40, 39.96399867, 0.000117],
657          [41, 40.96182597, 0.067302]],
658    'Ca': [[40, 39.9625912, 0.96941], [42, 41.9586183, 0.00647],
659           [43, 42.9587668, 0.00135], [44, 43.9554811, 0.02086],
660           [46, 45.9536927, 0.00004], [48, 47.952533, 0.00187]],
661    'Sc': [[45, 44.9559102, 1.0000]],
662    'Ti': [[46, 45.9526295, 0.0825], [47, 46.9517637, 0.0744],
663           [48, 47.9479470, 0.7372], [49, 48.9478707, 0.0541],
664           [50, 49.9447920, 0.0518]],
665    'V': [[50, 49.9471627, 0.00250], [51, 50.9439635, 0.99750]],
666    'Cr': [[50, 49.9460495, 0.04345], [52, 51.9405115, 0.83789],
667           [53, 52.9406534, 0.09501], [54, 53.9388846, 0.02365]],
668    'Mn': [[55, 54.9380493, 1.0000]],
669    'Fe': [[54, 53.9396147, 0.05845], [56, 55.9349418, 0.91754],
670           [57, 56.9353983, 0.02119], [58, 57.9332801, 0.00282]],
671    'Co': [[59, 58.9331999, 1.0000]],
672    'Ni': [[58, 57.9353477, 0.680769], [60, 59.9307903, 0.262231],
673           [61, 60.9310601, 0.011399], [62, 61.9283484, 0.036345],
674           [64, 63.9279692, 0.009256]],
675    'Cu': [[63, 62.9296007, 0.6915], [65, 64.9277938, 0.3085]],
676    'Zn': [[64, 63.9291461, 0.48268], [66, 65.9260364, 0.27975],
677           [67, 66.9271305, 0.04102], [68, 67.9248473, 0.19024],
678           [70, 69.925325, 0.00631]],
679    'Ga': [[69, 68.925581, 0.60108], [71, 70.9247073, 0.39892]],
680    'Ge': [[70, 69.9242500, 0.2038], [72, 71.9220763, 0.2731],
681           [73, 72.9234595, 0.0776], [74, 73.9211784, 0.3672],
682           [76, 75.921402, 0.0783]],
683    'As': [[75, 74.9215966, 1.0000]],
684    'Se': [[74, 73.9224767, 0.0089], [76, 75.9192143, 0.0937],
685           [77, 76.9199148, 0.0763], [78, 77.9173097, 0.2377],
686           [80, 79.9165221, 0.4961], [82, 81.9167003, 0.0873]],
687    'Br': [[79, 78.9183379, 0.5069], [81, 80.916291, 0.4931]],
688    'Kr': [[78, 77.920388, 0.00355], [80, 79.916379, 0.02286],
689           [82, 81.9134850, 0.11593], [83, 82.914137, 0.11500],
690           [84, 83.911508, 0.56987], [86, 85.910615, 0.17279]],
691    'Rb': [[85, 84.9117924, 0.7217], [87, 86.9091858, 0.2783]],
692    'Sr': [[84, 83.913426, 0.0056], [86, 85.9092647, 0.0986],
693           [87, 86.9088816, 0.0700], [88, 87.9056167, 0.8258]],
694    'Y': [[89, 88.9058485, 1.0000]],
695    'Zr': [[90, 89.9047022, 0.5145], [91, 90.9056434, 0.1122],
696           [92, 91.9050386, 0.1715], [94, 93.9063144, 0.1738],
697           [96, 95.908275, 0.0280]],
698    'Nb': [[93, 92.9063762, 1.0000]],
699    'Mo': [[92, 91.906810, 0.1477], [94, 93.9050867, 0.0923],
700           [95, 94.9058406, 0.1590], [96, 95.9046780, 0.1668],
701           [97, 96.9060201, 0.0956], [98, 97.905406, 0.2419],
702           [100, 99.907476, 0.0967]],
703    'Tc': None,
704    'Ru': [[96, 95.907604, 0.0554], [98, 97.905287, 0.0187],
705           [99, 98.9059385, 0.1276], [100, 99.9042189, 0.1260],
706           [101, 100.9055815, 0.1706], [102, 101.9043488, 0.3155],
707           [104, 103.905430, 0.1862]],
708    'Rh': [[103, 102.905504, 1.0000]],
709    'Pd': [[102, 101.905607, 0.0102], [104, 103.904034, 0.1114],
710           [105, 104.905083, 0.2233], [106, 105.903484, 0.2733],
711           [108, 107.903895, 0.2646], [110, 109.905153, 0.1172]],
712    'Ag': [[107, 106.905093, 0.51839], [109, 108.904756, 0.48161]],
713    'Cd': [[106, 105.906458, 0.0125], [108, 107.904183, 0.0089],
714           [110, 109.903006, 0.1249], [111, 110.904182, 0.1280],
715           [112, 111.9027577, 0.2413], [113, 112.9044014, 0.1222],
716           [114, 113.9033586, 0.2873], [116, 115.904756, 0.0749]],
717    'In': [[113, 112.904062, 0.0429], [115, 114.903879, 0.9571]],
718    'Sn': [[112, 111.904822, 0.0097], [114, 113.902783, 0.0066],
719           [115, 114.903347, 0.0034], [116, 115.901745, 0.1454],
720           [117, 116.902955, 0.0768], [118, 117.901608, 0.2422],
721           [119, 118.903311, 0.0859], [120, 119.9021985, 0.3258],
722           [122, 121.9034411, 0.0463], [124, 123.9052745, 0.0579]],
723    'Sb': [[121, 120.9038222, 0.5721], [123, 122.9042160, 0.4279]],
724    'Te': [[120, 119.904026, 0.0009], [122, 121.9030558, 0.0255],
725           [123, 122.9042711, 0.0089], [124, 123.9028188, 0.0474],
726           [125, 124.9044241, 0.0707], [126, 125.9033049, 0.1884],
727           [128, 127.9044615, 0.3174], [130, 129.9062229, 0.3408]],
728    'I': [[127, 126.904468, 1.0000]],
729    'Xe': [[124, 123.9058954, 0.000952], [126, 125.904268, 0.000890],
730           [128, 127.9035305, 0.019102], [129, 128.9047799, 0.264006],
731           [130, 129.9035089, 0.040710], [131, 130.9050828, 0.212324],
732           [132, 131.9041546, 0.269086], [134, 133.9053945, 0.104357],
733           [136, 135.907220, 0.088573]],
734    'Cs': [[133, 132.905447, 1.0000]],
735    'Ba': [[130, 129.906311, 0.00106], [132, 131.905056, 0.00101],
736           [134, 133.904504, 0.02417], [135, 134.905684, 0.06592],
737           [136, 135.904571, 0.07854], [137, 136.905822, 0.11232],
738           [138, 137.905242, 0.71698]],
739    'La': [[138, 137.907108, 0.00090], [139, 138.906349, 0.99910]],
740    'Ce': [[136, 135.907140, 0.00185], [138, 137.905986, 0.00251],
741           [140, 139.905435, 0.88450], [142, 141.909241, 0.11114]],
742    'Pr': [[141, 140.907648, 1.0000]],
743    'Nd': [[142, 141.907719, 0.272], [143, 142.909810, 0.122],
744           [144, 143.910083, 0.238], [145, 144.912569, 0.083],
745           [146, 145.913113, 0.172], [148, 147.916889, 0.057],
746           [150, 149.920887, 0.056]],
747    'Pm': None,
748    'Sm': [[144, 143.911996, 0.0307], [147, 146.914894, 0.1499],
749           [148, 147.914818, 0.1124], [149, 148.917180, 0.1382],
750           [150, 149.917272, 0.0738], [152, 151.919729, 0.2675],
751           [154, 153.922206, 0.2275]],
752    'Eu': [[151, 150.919846, 0.4781], [153, 152.921227, 0.5219]],
753    'Gd': [[152, 151.919789, 0.0020], [154, 153.920862, 0.0218],
754           [155, 154.922619, 0.1480], [156, 155.922120, 0.2047],
755           [157, 156.923957, 0.1565], [158, 157.924101, 0.2484],
756           [160, 159.927051, 0.2186]],
757    'Tb': [[159, 158.925343, 1.0000]],
758    'Dy': [[156, 155.924278, 0.00056], [158, 157.924405, 0.00095],
759           [160, 159.925194, 0.02329], [161, 160.926930, 0.18889],
760           [162, 161.926795, 0.25475], [163, 162.928728, 0.24896],
761           [164, 163.929171, 0.28260]],
762    'Ho': [[165, 164.930319, 1.0000]],
763    'Er': [[162, 161.928775, 0.00139], [164, 163.929197, 0.01601],
764           [166, 165.930290, 0.33503], [167, 166.932046, 0.22869],
765           [168, 167.932368, 0.26978], [170, 169.935461, 0.14910]],
766    'Tm': [[169, 168.934211, 1.0000]],
767    'Yb': [[168, 167.933895, 0.0013], [170, 169.934759, 0.0304],
768           [171, 170.936323, 0.1428], [172, 171.936378, 0.2183],
769           [173, 172.938207, 0.1613], [174, 173.938858, 0.3183],
770           [176, 175.942569, 0.1276]],
771    'Lu': [[175, 174.9407682, 0.9741], [176, 175.9426827, 0.0259]],
772    'Hf': [[174, 173.940042, 0.0016], [176, 175.941403, 0.0526],
773           [177, 176.9432204, 0.1860], [178, 177.9436981, 0.2728],
774           [179, 178.9458154, 0.1362], [180, 179.9465488, 0.3508]],
775    'Ta': [[180, 179.947466, 0.00012], [181, 180.947996, 0.99988]],
776    'W': [[180, 179.946706, 0.0012], [182, 181.948205, 0.2650],
777          [183, 182.9502242, 0.1431], [184, 183.9509323, 0.3064],
778          [186, 185.95436, 0.2843]],
779    'Re': [[185, 184.952955, 0.3740], [187, 186.9557505, 0.6260]],
780    'Os': [[184, 183.952491, 0.0002], [186, 185.953838, 0.0159],
781           [187, 186.9557476, 0.0196], [188, 187.9558357, 0.1324],
782           [189, 188.958145, 0.1615], [190, 189.958445, 0.2626],
783           [192, 191.961479, 0.4078]],
784    'Ir': [[191, 190.960591, 0.373], [193, 192.962923, 0.627]],
785    'Pt': [[190, 189.959930, 0.00014], [192, 191.961035, 0.00782],
786           [194, 193.962663, 0.32967], [195, 194.964774, 0.33832],
787           [196, 195.964934, 0.25242], [198, 197.967875, 0.07163]],
788    'Au': [[197, 196.966551, 1.0000]],
789    'Hg': [[196, 195.965814, 0.0015], [198, 197.966752, 0.0997],
790           [199, 198.968262, 0.1687], [200, 199.968309, 0.2310],
791           [201, 200.970285, 0.1318], [202, 201.970625, 0.2986],
792           [204, 203.973475, 0.0687]],
793    'Tl': [[203, 202.972329, 0.2952], [205, 204.974412, 0.7048]],
794    'Pb': [[204, 203.973028, 0.014], [206, 205.974449, 0.241],
795           [207, 206.975880, 0.221], [208, 207.976636, 0.524]],
796    'Bi': [[209, 208.980384, 1.0000]],
797    'Po': None,
798    'At': None,
799    'Rn': None,
800    'Fr': None,
801    'Ra': None,
802    'Ac': None,
803    'Th': [[232, 232.0380495, 1.0000]],
804    'Pa': [[231, 231.03588, 1.0000]],
805    'U': [[234, 234.0409447, 0.000054], [235, 235.0439222, 0.007204],
806          [238, 238.0507835, 0.992742]]
807}
808