qp2/ocaml/Element.ml

1014 lines
20 KiB
OCaml

open Sexplib.Std
open Qptypes
exception ElementError of string
type t = X
|H |He
|Li|Be |B |C |N |O |F |Ne
|Na|Mg |Al|Si|P |S |Cl|Ar
|K |Ca|Sc|Ti|V |Cr|Mn|Fe|Co|Ni|Cu|Zn|Ga|Ge|As|Se|Br|Kr
|Rb|Sr|Y |Zr|Nb|Mo|Tc|Ru|Rh|Pd|Ag|Cd|In|Sn|Sb|Te|I |Xe
|Cs|Ba|La|Hf|Ta|W |Re|Os|Ir|Pt|Au|Hg|Tl|Pb|Bi|Po|At|Rn
|Fr|Ra|Ac|Rf|Db|Sg|Bh|Hs|Mt|Ds|Rg|Cn|Nh|Fl|Mc|Lv|Ts|Og
|Ce|Pr|Nd|Pm|Sm|Eu|Gd|Tb|Dy|Ho|Er|Tm|Yb|Lu
|Th|Pa|U |Np|Pu|Am|Cm|Bk|Cf|Es|Fm|Md|No|Lr
[@@deriving sexp]
let of_string x =
match (String.capitalize_ascii (String.lowercase_ascii x)) with
| "X" | "Ghost" -> X
| "H" | "Hydrogen" -> H
| "He" | "Helium" -> He
| "Li" | "Lithium" -> Li
| "Be" | "Beryllium" -> Be
| "B" | "Boron" -> B
| "C" | "Carbon" -> C
| "N" | "Nitrogen" -> N
| "O" | "Oxygen" -> O
| "F" | "Fluorine" -> F
| "Ne" | "Neon" -> Ne
| "Na" | "Sodium" -> Na
| "Mg" | "Magnesium" -> Mg
| "Al" | "Aluminum" -> Al
| "Si" | "Silicon" -> Si
| "P" | "Phosphorus" -> P
| "S" | "Sulfur" -> S
| "Cl" | "Chlorine" -> Cl
| "Ar" | "Argon" -> Ar
| "K" | "Potassium" -> K
| "Ca" | "Calcium" -> Ca
| "Sc" | "Scandium" -> Sc
| "Ti" | "Titanium" -> Ti
| "V" | "Vanadium" -> V
| "Cr" | "Chromium" -> Cr
| "Mn" | "Manganese" -> Mn
| "Fe" | "Iron" -> Fe
| "Co" | "Cobalt" -> Co
| "Ni" | "Nickel" -> Ni
| "Cu" | "Copper" -> Cu
| "Zn" | "Zinc" -> Zn
| "Ga" | "Gallium" -> Ga
| "Ge" | "Germanium" -> Ge
| "As" | "Arsenic" -> As
| "Se" | "Selenium" -> Se
| "Br" | "Bromine" -> Br
| "Kr" | "Krypton" -> Kr
| "Rb" | "Rubidium" -> Rb
| "Sr" | "Strontium" -> Sr
| "Y" | "Yttrium" -> Y
| "Zr" | "Zirconium" -> Zr
| "Nb" | "Niobium" -> Nb
| "Mo" | "Molybdenum" -> Mo
| "Tc" | "Technetium" -> Tc
| "Ru" | "Ruthenium" -> Ru
| "Rh" | "Rhodium" -> Rh
| "Pd" | "Palladium" -> Pd
| "Ag" | "Silver" -> Ag
| "Cd" | "Cadmium" -> Cd
| "In" | "Indium" -> In
| "Sn" | "Tin" -> Sn
| "Sb" | "Antimony" -> Sb
| "Te" | "Tellurium" -> Te
| "I" | "Iodine" -> I
| "Xe" | "Xenon" -> Xe
| "Cs" | "Cesium" -> Cs
| "Ba" | "Barium" -> Ba
| "La" | "Lanthanum" -> La
| "Ce" | "Cerium" -> Ce
| "Pr" | "Praseodymium" -> Pr
| "Nd" | "Neodymium" -> Nd
| "Pm" | "Promethium" -> Pm
| "Sm" | "Samarium" -> Sm
| "Eu" | "Europium" -> Eu
| "Gd" | "Gadolinium" -> Gd
| "Tb" | "Terbium" -> Tb
| "Dy" | "Dysprosium" -> Dy
| "Ho" | "Holmium" -> Ho
| "Er" | "Erbium" -> Er
| "Tm" | "Thulium" -> Tm
| "Yb" | "Ytterbium" -> Yb
| "Lu" | "Lutetium" -> Lu
| "Hf" | "Hafnium" -> Hf
| "Ta" | "Tantalum" -> Ta
| "W" | "Tungsten" -> W
| "Re" | "Rhenium" -> Re
| "Os" | "Osmium" -> Os
| "Ir" | "Iridium" -> Ir
| "Pt" | "Platinum" -> Pt
| "Au" | "Gold" -> Au
| "Hg" | "Mercury" -> Hg
| "Tl" | "Thallium" -> Tl
| "Pb" | "Lead" -> Pb
| "Bi" | "Bismuth" -> Bi
| "Po" | "Polonium" -> Po
| "At" | "Astatine" -> At
| "Rn" | "Radon" -> Rn
| "Fr" | "Francium" -> Fr
| "Ra" | "Radium" -> Ra
| "Ac" | "Actinium" -> Ac
| "Th" | "Thorium" -> Th
| "Pa" | "Protactinium" -> Pa
| "U" | "Uranium" -> U
| "Np" | "Neptunium" -> Np
| "Pu" | "Plutonium" -> Pu
| "Am" | "Americium" -> Am
| "Cm" | "Curium" -> Cm
| "Bk" | "Berkelium" -> Bk
| "Cf" | "Californium" -> Cf
| "Es" | "Einsteinium" -> Es
| "Fm" | "Fermium" -> Fm
| "Md" | "Mendelevium" -> Md
| "No" | "Nobelium" -> No
| "Lr" | "Lawrencium" -> Lr
| "Rf" | "Rutherfordium"-> Rf
| "Db" | "Dubnium" -> Db
| "Sg" | "Seaborgium" -> Sg
| "Bh" | "Bohrium" -> Bh
| "Hs" | "Hassium" -> Hs
| "Mt" | "Meitnerium" -> Mt
| "Ds" | "Darmstadtium" -> Ds
| "Rg" | "Roentgenium" -> Rg
| "Cn" | "Copernicium" -> Cn
| "Nh" | "Nihonium" -> Nh
| "Fl" | "Flerovium" -> Fl
| "Mc" | "Moscovium" -> Mc
| "Lv" | "Livermorium" -> Lv
| "Ts" | "Tennessine" -> Ts
| "Og" | "Oganesson" -> Og
| x -> raise (ElementError ("Element "^x^" unknown"))
let to_string = function
| X -> "X"
| H -> "H"
| He -> "He"
| Li -> "Li"
| Be -> "Be"
| B -> "B"
| C -> "C"
| N -> "N"
| O -> "O"
| F -> "F"
| Ne -> "Ne"
| Na -> "Na"
| Mg -> "Mg"
| Al -> "Al"
| Si -> "Si"
| P -> "P"
| S -> "S"
| Cl -> "Cl"
| Ar -> "Ar"
| K -> "K"
| Ca -> "Ca"
| Sc -> "Sc"
| Ti -> "Ti"
| V -> "V"
| Cr -> "Cr"
| Mn -> "Mn"
| Fe -> "Fe"
| Co -> "Co"
| Ni -> "Ni"
| Cu -> "Cu"
| Zn -> "Zn"
| Ga -> "Ga"
| Ge -> "Ge"
| As -> "As"
| Se -> "Se"
| Br -> "Br"
| Kr -> "Kr"
| Rb -> "Rb"
| Sr -> "Sr"
| Y -> "Y"
| Zr -> "Zr"
| Nb -> "Nb"
| Mo -> "Mo"
| Tc -> "Tc"
| Ru -> "Ru"
| Rh -> "Rh"
| Pd -> "Pd"
| Ag -> "Ag"
| Cd -> "Cd"
| In -> "In"
| Sn -> "Sn"
| Sb -> "Sb"
| Te -> "Te"
| I -> "I"
| Xe -> "Xe"
| Cs -> "Cs"
| Ba -> "Ba"
| La -> "La"
| Hf -> "Hf"
| Ta -> "Ta"
| W -> "W"
| Re -> "Re"
| Os -> "Os"
| Ir -> "Ir"
| Pt -> "Pt"
| Au -> "Au"
| Hg -> "Hg"
| Tl -> "Tl"
| Pb -> "Pb"
| Bi -> "Bi"
| Po -> "Po"
| At -> "At"
| Rn -> "Rn"
| Fr -> "Fr"
| Ra -> "Ra"
| Ac -> "Ac"
| Rf -> "Rf"
| Db -> "Db"
| Sg -> "Sg"
| Bh -> "Bh"
| Hs -> "Hs"
| Mt -> "Mt"
| Ds -> "Ds"
| Rg -> "Rg"
| Cn -> "Cn"
| Nh -> "Nh"
| Fl -> "Fl"
| Mc -> "Mc"
| Lv -> "Lv"
| Ts -> "Ts"
| Og -> "Og"
| Ce -> "Ce"
| Pr -> "Pr"
| Nd -> "Nd"
| Pm -> "Pm"
| Sm -> "Sm"
| Eu -> "Eu"
| Gd -> "Gd"
| Tb -> "Tb"
| Dy -> "Dy"
| Ho -> "Ho"
| Er -> "Er"
| Tm -> "Tm"
| Yb -> "Yb"
| Lu -> "Lu"
| Th -> "Th"
| Pa -> "Pa"
| U -> "U"
| Np -> "Np"
| Pu -> "Pu"
| Am -> "Am"
| Cm -> "Cm"
| Bk -> "Bk"
| Cf -> "Cf"
| Es -> "Es"
| Fm -> "Fm"
| Md -> "Md"
| No -> "No"
| Lr -> "Lr"
let to_long_string = function
| X -> "Ghost"
| H -> "Hydrogen"
| He -> "Helium"
| Li -> "Lithium"
| Be -> "Beryllium"
| B -> "Boron"
| C -> "Carbon"
| N -> "Nitrogen"
| O -> "Oxygen"
| F -> "Fluorine"
| Ne -> "Neon"
| Na -> "Sodium"
| Mg -> "Magnesium"
| Al -> "Aluminum"
| Si -> "Silicon"
| P -> "Phosphorus"
| S -> "Sulfur"
| Cl -> "Chlorine"
| Ar -> "Argon"
| K -> "Potassium"
| Ca -> "Calcium"
| Sc -> "Scandium"
| Ti -> "Titanium"
| V -> "Vanadium"
| Cr -> "Chromium"
| Mn -> "Manganese"
| Fe -> "Iron"
| Co -> "Cobalt"
| Ni -> "Nickel"
| Cu -> "Copper"
| Zn -> "Zinc"
| Ga -> "Gallium"
| Ge -> "Germanium"
| As -> "Arsenic"
| Se -> "Selenium"
| Br -> "Bromine"
| Kr -> "Krypton"
| Rb -> "Rubidium"
| Sr -> "Strontium"
| Y -> "Yttrium"
| Zr -> "Zirconium"
| Nb -> "Niobium"
| Mo -> "Molybdenum"
| Tc -> "Technetium"
| Ru -> "Ruthenium"
| Rh -> "Rhodium"
| Pd -> "Palladium"
| Ag -> "Silver"
| Cd -> "Cadmium"
| In -> "Indium"
| Sn -> "Tin"
| Sb -> "Antimony"
| Te -> "Tellurium"
| I -> "Iodine"
| Xe -> "Xenon"
| Cs -> "Cesium"
| Ba -> "Barium"
| La -> "Lanthanum"
| Ce -> "Cerium"
| Pr -> "Praseodymium"
| Nd -> "Neodymium"
| Pm -> "Promethium"
| Sm -> "Samarium"
| Eu -> "Europium"
| Gd -> "Gadolinium"
| Tb -> "Terbium"
| Dy -> "Dysprosium"
| Ho -> "Holmium"
| Er -> "Erbium"
| Tm -> "Thulium"
| Yb -> "Ytterbium"
| Lu -> "Lutetium"
| Hf -> "Hafnium"
| Ta -> "Tantalum"
| W -> "Tungsten"
| Re -> "Rhenium"
| Os -> "Osmium"
| Ir -> "Iridium"
| Pt -> "Platinum"
| Au -> "Gold"
| Hg -> "Mercury"
| Tl -> "Thallium"
| Pb -> "Lead"
| Bi -> "Bismuth"
| Po -> "Polonium"
| At -> "Astatine"
| Rn -> "Radon"
| Fr -> "Francium"
| Ra -> "Radium"
| Ac -> "Actinium"
| Th -> "Thorium"
| Pa -> "Protactinium"
| U -> "Uranium"
| Np -> "Neptunium"
| Pu -> "Plutonium"
| Am -> "Americium"
| Cm -> "Curium"
| Bk -> "Berkelium"
| Cf -> "Californium"
| Es -> "Einsteinium"
| Fm -> "Fermium"
| Md -> "Mendelevium"
| No -> "Nobelium"
| Lr -> "Lawrencium"
| Rf -> "Rutherfordium"
| Db -> "Dubnium"
| Sg -> "Seaborgium"
| Bh -> "Bohrium"
| Hs -> "Hassium"
| Mt -> "Meitnerium"
| Ds -> "Darmstadtium"
| Rg -> "Roentgenium"
| Cn -> "Copernicium"
| Nh -> "Nihonium"
| Fl -> "Flerovium"
| Mc -> "Moscovium"
| Lv -> "Livermorium"
| Ts -> "Tennessine"
| Og -> "Oganesson"
let to_charge c =
let result = match c with
| X -> 0
| H -> 1
| He -> 2
| Li -> 3
| Be -> 4
| B -> 5
| C -> 6
| N -> 7
| O -> 8
| F -> 9
| Ne -> 10
| Na -> 11
| Mg -> 12
| Al -> 13
| Si -> 14
| P -> 15
| S -> 16
| Cl -> 17
| Ar -> 18
| K -> 19
| Ca -> 20
| Sc -> 21
| Ti -> 22
| V -> 23
| Cr -> 24
| Mn -> 25
| Fe -> 26
| Co -> 27
| Ni -> 28
| Cu -> 29
| Zn -> 30
| Ga -> 31
| Ge -> 32
| As -> 33
| Se -> 34
| Br -> 35
| Kr -> 36
| Rb -> 37
| Sr -> 38
| Y -> 39
| Zr -> 40
| Nb -> 41
| Mo -> 42
| Tc -> 43
| Ru -> 44
| Rh -> 45
| Pd -> 46
| Ag -> 47
| Cd -> 48
| In -> 49
| Sn -> 50
| Sb -> 51
| Te -> 52
| I -> 53
| Xe -> 54
| Cs -> 55
| Ba -> 56
| La -> 57
| Ce -> 58
| Pr -> 59
| Nd -> 60
| Pm -> 61
| Sm -> 62
| Eu -> 63
| Gd -> 64
| Tb -> 65
| Dy -> 66
| Ho -> 67
| Er -> 68
| Tm -> 69
| Yb -> 70
| Lu -> 71
| Hf -> 72
| Ta -> 73
| W -> 74
| Re -> 75
| Os -> 76
| Ir -> 77
| Pt -> 78
| Au -> 79
| Hg -> 80
| Tl -> 81
| Pb -> 82
| Bi -> 83
| Po -> 84
| At -> 85
| Rn -> 86
| Fr -> 87
| Ra -> 88
| Ac -> 89
| Th -> 90
| Pa -> 91
| U -> 92
| Np -> 93
| Pu -> 94
| Am -> 95
| Cm -> 96
| Bk -> 97
| Cf -> 98
| Es -> 99
| Fm -> 100
| Md -> 101
| No -> 102
| Lr -> 103
| Rf -> 104
| Db -> 105
| Sg -> 106
| Bh -> 107
| Hs -> 108
| Mt -> 109
| Ds -> 110
| Rg -> 111
| Cn -> 112
| Nh -> 113
| Fl -> 114
| Mc -> 115
| Lv -> 116
| Ts -> 117
| Og -> 118
in Charge.of_int result
let of_charge c = match (Charge.to_int c) with
| 0 -> X
| 1 -> H
| 2 -> He
| 3 -> Li
| 4 -> Be
| 5 -> B
| 6 -> C
| 7 -> N
| 8 -> O
| 9 -> F
| 10 -> Ne
| 11 -> Na
| 12 -> Mg
| 13 -> Al
| 14 -> Si
| 15 -> P
| 16 -> S
| 17 -> Cl
| 18 -> Ar
| 19 -> K
| 20 -> Ca
| 21 -> Sc
| 22 -> Ti
| 23 -> V
| 24 -> Cr
| 25 -> Mn
| 26 -> Fe
| 27 -> Co
| 28 -> Ni
| 29 -> Cu
| 30 -> Zn
| 31 -> Ga
| 32 -> Ge
| 33 -> As
| 34 -> Se
| 35 -> Br
| 36 -> Kr
| 37 -> Rb
| 38 -> Sr
| 39 -> Y
| 40 -> Zr
| 41 -> Nb
| 42 -> Mo
| 43 -> Tc
| 44 -> Ru
| 45 -> Rh
| 46 -> Pd
| 47 -> Ag
| 48 -> Cd
| 49 -> In
| 50 -> Sn
| 51 -> Sb
| 52 -> Te
| 53 -> I
| 54 -> Xe
| 55 -> Cs
| 56 -> Ba
| 57 -> La
| 58 -> Ce
| 59 -> Pr
| 60 -> Nd
| 61 -> Pm
| 62 -> Sm
| 63 -> Eu
| 64 -> Gd
| 65 -> Tb
| 66 -> Dy
| 67 -> Ho
| 68 -> Er
| 69 -> Tm
| 70 -> Yb
| 71 -> Lu
| 72 -> Hf
| 73 -> Ta
| 74 -> W
| 75 -> Re
| 76 -> Os
| 77 -> Ir
| 78 -> Pt
| 79 -> Au
| 80 -> Hg
| 81 -> Tl
| 82 -> Pb
| 83 -> Bi
| 84 -> Po
| 85 -> At
| 86 -> Rn
| 87 -> Fr
| 88 -> Ra
| 89 -> Ac
| 90 -> Th
| 91 -> Pa
| 92 -> U
| 93 -> Np
| 94 -> Pu
| 95 -> Am
| 96 -> Cm
| 97 -> Bk
| 98 -> Cf
| 99 -> Es
| 100 -> Fm
| 101 -> Md
| 102 -> No
| 103 -> Lr
| 104 -> Rf
| 105 -> Db
| 106 -> Sg
| 107 -> Bh
| 108 -> Hs
| 109 -> Mt
| 110 -> Ds
| 111 -> Rg
| 112 -> Cn
| 113 -> Nh
| 114 -> Fl
| 115 -> Mc
| 116 -> Lv
| 117 -> Ts
| 118 -> Og
| x -> raise (ElementError ("Element of charge "^(string_of_int x)^" unknown"))
let covalent_radius x =
let result = function
| X -> 0.
| H -> 0.31
| He -> 0.28
| Li -> 1.28
| Be -> 0.96
| B -> 0.85
| C -> 0.76
| N -> 0.71
| O -> 0.66
| F -> 0.57
| Ne -> 0.58
| Na -> 1.66
| Mg -> 1.41
| Al -> 1.21
| Si -> 1.11
| P -> 1.07
| S -> 1.05
| Cl -> 1.02
| Ar -> 1.06
| K -> 2.03
| Ca -> 1.76
| Sc -> 1.70
| Ti -> 1.60
| V -> 1.53
| Cr -> 1.39
| Mn -> 1.39
| Fe -> 1.32
| Co -> 1.26
| Ni -> 1.24
| Cu -> 1.32
| Zn -> 1.22
| Ga -> 1.22
| Ge -> 1.20
| As -> 1.19
| Se -> 1.20
| Br -> 1.20
| Kr -> 1.16
| Rb -> 2.20
| Sr -> 1.95
| Y -> 1.90
| Zr -> 1.75
| Nb -> 1.64
| Mo -> 1.54
| Tc -> 1.47
| Ru -> 1.46
| Rh -> 1.42
| Pd -> 1.39
| Ag -> 1.45
| Cd -> 1.44
| In -> 1.42
| Sn -> 1.39
| Sb -> 1.39
| Te -> 1.38
| I -> 1.39
| Xe -> 1.40
| Cs -> 2.44
| Ba -> 2.15
| La -> 2.07
| Ce -> 2.04
| Pr -> 2.03
| Nd -> 2.01
| Pm -> 1.99
| Sm -> 1.98
| Eu -> 1.98
| Gd -> 1.96
| Tb -> 1.94
| Dy -> 1.92
| Ho -> 1.92
| Er -> 1.89
| Tm -> 1.90
| Yb -> 1.87
| Lu -> 1.87
| Hf -> 1.75
| Ta -> 1.70
| W -> 1.62
| Re -> 1.51
| Os -> 1.44
| Ir -> 1.41
| Pt -> 1.36
| Au -> 1.36
| Hg -> 1.32
| Tl -> 1.45
| Pb -> 1.46
| Bi -> 1.48
| Po -> 1.40
| At -> 1.50
| Rn -> 1.50
| Fr -> 2.60
| Ra -> 2.21
| Ac -> 2.15
| Th -> 2.06
| Pa -> 2.00
| U -> 1.96
| Np -> 1.90
| Pu -> 1.87
| Am -> 1.80
| Cm -> 1.69
| Bk -> raise (ElementError "Covalent radius not defined for Bk")
| Cf -> raise (ElementError "Covalent radius not defined for Cf")
| Es -> raise (ElementError "Covalent radius not defined for Es")
| Fm -> raise (ElementError "Covalent radius not defined for Fm")
| Md -> raise (ElementError "Covalent radius not defined for Md")
| No -> raise (ElementError "Covalent radius not defined for No")
| Lr -> raise (ElementError "Covalent radius not defined for Lr")
| Rf -> raise (ElementError "Covalent radius not defined for Rf")
| Db -> raise (ElementError "Covalent radius not defined for Db")
| Sg -> raise (ElementError "Covalent radius not defined for Sg")
| Bh -> raise (ElementError "Covalent radius not defined for Bh")
| Hs -> raise (ElementError "Covalent radius not defined for Hs")
| Mt -> raise (ElementError "Covalent radius not defined for Mt")
| Ds -> raise (ElementError "Covalent radius not defined for Ds")
| Rg -> raise (ElementError "Covalent radius not defined for Rg")
| Cn -> raise (ElementError "Covalent radius not defined for Cn")
| Nh -> raise (ElementError "Covalent radius not defined for Nh")
| Fl -> raise (ElementError "Covalent radius not defined for Fl")
| Mc -> raise (ElementError "Covalent radius not defined for Mc")
| Lv -> raise (ElementError "Covalent radius not defined for Lv")
| Ts -> raise (ElementError "Covalent radius not defined for Ts")
| Og -> raise (ElementError "Covalent radius not defined for Og")
in
Units.angstrom_to_bohr *. (result x)
|> Positive_float.of_float
let vdw_radius x =
let result = function
| X -> Some 0.
| H -> Some 1.20
| He -> Some 1.40
| Li -> Some 1.82
| Be -> None
| B -> None
| C -> Some 1.70
| N -> Some 1.55
| O -> Some 1.52
| F -> Some 1.47
| Ne -> Some 1.54
| Na -> Some 2.27
| Mg -> Some 1.73
| Al -> Some 1.94
| Si -> Some 2.10
| P -> Some 1.80
| S -> Some 1.80
| Cl -> Some 1.75
| Ar -> Some 1.88
| K -> Some 2.75
| Ca -> None
| Sc -> None
| Ti -> None
| V -> Some 1.98
| Cr -> Some 1.94
| Mn -> Some 1.93
| Fe -> Some 1.93
| Co -> Some 1.92
| Ni -> Some 1.63
| Cu -> Some 1.40
| Zn -> Some 1.39
| Ga -> Some 1.87
| Ge -> None
| As -> Some 1.85
| Se -> Some 1.90
| Br -> Some 1.85
| Kr -> Some 2.02
| Rb -> Some 3.03
| Sr -> Some 2.49
| Y -> None
| Zr -> None
| Nb -> None
| Mo -> None
| Tc -> None
| Ru -> None
| Rh -> None
| Pd -> Some 1.63
| Ag -> Some 1.72
| Cd -> Some 1.58
| In -> Some 1.93
| Sn -> Some 2.17
| Sb -> Some 2.06
| Te -> Some 2.06
| I -> Some 1.98
| Xe -> Some 2.16
| Cs -> None
| Ba -> None
| La -> None
| Ce -> None
| Pr -> None
| Nd -> None
| Pm -> None
| Sm -> None
| Eu -> None
| Gd -> None
| Tb -> None
| Dy -> None
| Ho -> None
| Er -> None
| Tm -> None
| Yb -> None
| Lu -> None
| Hf -> None
| Ta -> None
| W -> None
| Re -> None
| Os -> None
| Ir -> None
| Pt -> Some 1.75
| Au -> Some 1.66
| Hg -> Some 1.55
| Tl -> Some 1.96
| Pb -> Some 2.02
| Bi -> None
| Po -> None
| At -> None
| Rn -> None
| Fr -> None
| Ra -> None
| Ac -> None
| Th -> None
| Pa -> None
| U -> Some 1.86
| Np -> None
| Pu -> None
| Am -> None
| Cm -> None
| Bk -> None
| Cf -> None
| Es -> None
| Fm -> None
| Md -> None
| No -> None
| Lr -> None
| Rf -> None
| Db -> None
| Sg -> None
| Bh -> None
| Hs -> None
| Mt -> None
| Ds -> None
| Rg -> None
| Cn -> None
| Nh -> None
| Fl -> None
| Mc -> None
| Lv -> None
| Ts -> None
| Og -> None
in
match result x with
| Some y -> Some (Positive_float.of_float @@ Units.angstrom_to_bohr *. y )
| None -> None
let mass x =
let result = function
| X -> 0.
| H -> 1.0079
| He -> 4.002602
| Li -> 6.941
| Be -> 9.0121831
| B -> 10.81
| C -> 12.011
| N -> 14.0067
| O -> 15.9994
| F -> 18.998403163
| Ne -> 20.1797
| Na -> 22.98976928
| Mg -> 24.305
| Al -> 26.9815385
| Si -> 28.0855
| P -> 30.973761998
| S -> 32.06
| Cl -> 35.453
| Ar -> 39.948
| K -> 39.0983
| Ca -> 40.078
| Sc -> 44.955908
| Ti -> 47.867
| V -> 50.9415
| Cr -> 51.9961
| Mn -> 54.938044
| Fe -> 55.845
| Co -> 58.933194
| Ni -> 58.6934
| Cu -> 63.546
| Zn -> 65.38
| Ga -> 69.723
| Ge -> 72.630
| As -> 74.921595
| Se -> 78.971
| Br -> 79.904
| Kr -> 83.798
| Rb -> 85.4678
| Sr -> 87.62
| Y -> 88.90584
| Zr -> 91.224
| Nb -> 92.90637
| Mo -> 95.95
| Tc -> 98.
| Ru -> 101.07
| Rh -> 102.90550
| Pd -> 106.42
| Ag -> 107.8682
| Cd -> 112.414
| In -> 114.818
| Sn -> 118.710
| Sb -> 121.760
| Te -> 127.60
| I -> 126.90447
| Xe -> 131.293
| Cs -> 132.90545196
| Ba -> 137.327
| La -> 138.90547
| Ce -> 140.116
| Pr -> 140.90766
| Nd -> 144.242
| Pm -> 145.
| Sm -> 150.36
| Eu -> 151.964
| Gd -> 157.25
| Tb -> 158.92535
| Dy -> 162.500
| Ho -> 164.93033
| Er -> 167.259
| Tm -> 168.93422
| Yb -> 173.045
| Lu -> 174.9668
| Hf -> 178.49
| Ta -> 180.94788
| W -> 183.84
| Re -> 186.207
| Os -> 190.23
| Ir -> 192.217
| Pt -> 195.084
| Au -> 196.966569
| Hg -> 200.592
| Tl -> 204.38
| Pb -> 207.2
| Bi -> 208.98040
| Po -> 209.
| At -> 210.
| Rn -> 222.
| Fr -> 223.
| Ra -> 226.
| Ac -> 227.
| Th -> 232.0377
| Pa -> 231.03588
| U -> 238.02891
| Np -> 237.
| Pu -> 244.
| Am -> 243.
| Cm -> 247.
| Bk -> 247.
| Cf -> 251.
| Es -> 252.
| Fm -> 257.
| Md -> 258.
| No -> 259.
| Lr -> 262.
| Rf -> 267.
| Db -> 270.
| Sg -> 269.
| Bh -> 270.
| Hs -> 270.
| Mt -> 278.
| Ds -> 281.
| Rg -> 281.
| Cn -> 285.
| Nh -> 286.
| Fl -> 289.
| Mc -> 289.
| Lv -> 293.
| Ts -> 293.
| Og -> 294.
in
result x
|> Positive_float.of_float