Source code for pyscf.pbc.tools.lattice

# Copyright 2014-2018,2021 The PySCF Developers. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

A2B = 1.889725989

[docs] def get_ase_atom(formula): formula = formula.lower() assert formula in ['lih','lif','licl','mgo', 'c','si','ge','sic','gaas','gan','cds', 'zns','zno','bn','alp'] if formula == 'lih': ase_atom = get_ase_rocksalt('Li','H') elif formula == 'lif': ase_atom = get_ase_rocksalt('Li','F') elif formula == 'licl': ase_atom = get_ase_rocksalt('Li','Cl') elif formula == 'mgo': ase_atom = get_ase_rocksalt('Mg','O') elif formula == 'c': ase_atom = get_ase_diamond_primitive('C') elif formula == 'si': ase_atom = get_ase_diamond_primitive('Si') elif formula == 'ge': ase_atom = get_ase_diamond_primitive('Ge') elif formula == 'sic': ase_atom = get_ase_zincblende('Si','C') elif formula == 'gaas': ase_atom = get_ase_zincblende('Ga','As') elif formula == 'gan': ase_atom = get_ase_zincblende('Ga','N') elif formula == 'bn': ase_atom = get_ase_zincblende('B','N') elif formula == 'alp': ase_atom = get_ase_zincblende('Al','P') elif formula == 'zno': ase_atom = get_ase_wurtzite('Zn','O') elif formula == 'cds': ase_atom = get_ase_zincblende('Cd','S') elif formula == 'zns': ase_atom = get_ase_zincblende('Zn','S') return ase_atom
[docs] def get_ase_wurtzite(A='Zn', B='O'): # Lattice constants taken from wikipedia (TODO: is wikipedia a valid # citation at this point? en.wikipedia.org/wiki/Lattice_constant) assert A in ['Zn'] assert B in ['O'] from ase.lattice import bulk if A=='Zn' and B=='O': ase_atom = bulk('ZnO', 'wurtzite', a=3.25*A2B, c=5.2*A2B) else: raise NotImplementedError('No formula found for system %s %s. ' 'Choose a different system? Or add it to the list!' % (A, B)) return ase_atom
[docs] def get_bandpath_fcc(ase_atom, npoints=30): # Set-up the band-path via special points from ase.dft.kpoints import ibz_points, kpoint_convert, get_bandpath points = ibz_points['fcc'] G = points['Gamma'] X = points['X'] W = points['W'] K = points['K'] L = points['L'] kpts_reduced, kpath, sp_points = get_bandpath([L, G, X, W, K, G], ase_atom.cell, npoints=npoints) kpts_cartes = kpoint_convert(ase_atom.cell, skpts_kc=kpts_reduced) return kpts_reduced, kpts_cartes, kpath, sp_points
[docs] def get_ase_zincblende(A='Ga', B='As'): # Lattice constants from Shishkin and Kresse, PRB 75, 235102 (2007) assert A in ['Si', 'Ga', 'Cd', 'Zn', 'B', 'Al'] assert B in ['C', 'As', 'S', 'O', 'N', 'P'] from ase.lattice import bulk if A=='Si' and B=='C': ase_atom = bulk('SiC', 'zincblende', a=4.350*A2B) elif A=='Ga' and B=='As': ase_atom = bulk('GaAs', 'zincblende', a=5.648*A2B) elif A=='Ga' and B=='N': ase_atom = bulk('GaN', 'zincblende', a=4.520*A2B) elif A=='Cd' and B=='S': ase_atom = bulk('CdS', 'zincblende', a=5.832*A2B) elif A=='Zn' and B=='S': ase_atom = bulk('ZnS', 'zincblende', a=5.420*A2B) elif A=='Zn' and B=='O': ase_atom = bulk('ZnO', 'zincblende', a=4.580*A2B) elif A=='B' and B=='N': ase_atom = bulk('BN', 'zincblende', a=3.615*A2B) elif A=='Al' and B=='P': ase_atom = bulk('AlP', 'zincblende', a=5.451*A2B) else: raise NotImplementedError('No formula found for system %s %s. ' 'Choose a different system? Or add it to the list!' % (A, B)) return ase_atom
[docs] def get_ase_rocksalt(A='Li', B='Cl'): assert A in ['Li', 'Mg'] # Add Na, K assert B in ['H', 'F', 'Cl', 'O'] # Add Br, I from ase.lattice import bulk if A=='Li': if B=='H': ase_atom = bulk('LiH', 'rocksalt', a=4.0834*A2B) elif B=='F': ase_atom = bulk('LiF', 'rocksalt', a=4.0351*A2B) elif B=='Cl': ase_atom = bulk('LiCl', 'rocksalt', a=5.13*A2B) elif A=='Mg' and B=='O': ase_atom = bulk('MgO', 'rocksalt', a=4.213*A2B) else: raise NotImplementedError('No formula found for system %s %s. ' 'Choose a different system? Or add it to the list!' % (A, B)) return ase_atom
[docs] def get_ase_alkali_halide(A='Li', B='Cl'): return get_ase_rocksalt(A,B)
[docs] def get_ase_diamond_primitive(atom='C'): """Get the ASE atoms for primitive (2-atom) diamond unit cell.""" from ase.build import bulk if atom == 'C': ase_atom = bulk('C', 'diamond', a=3.5668*A2B) elif atom == 'Si': ase_atom = bulk('Si', 'diamond', a=5.431*A2B) elif atom == 'Ge': ase_atom = bulk('Ge', 'diamond', a=5.658*A2B) else: raise NotImplementedError('No formula found for system %s. ' 'Choose a different system? Or add it to the list!' % atom) return ase_atom
[docs] def get_ase_diamond_cubic(atom='C'): """Get the ASE atoms for cubic (8-atom) diamond unit cell.""" from ase.lattice.cubic import Diamond if atom == 'C': ase_atom = Diamond(symbol='C', latticeconstant=3.5668*A2B) elif atom == 'Si': ase_atom = Diamond(symbol='Si', latticeconstant=5.431*A2B) else: raise NotImplementedError('No formula found for system %s. ' 'Choose a different system? Or add it to the list!' % atom) return ase_atom
[docs] def get_ase_graphene(vacuum=5.0): """Get the ASE atoms for primitive (2-atom) graphene unit cell.""" from ase.lattice.hexagonal import Graphene ase_atom = Graphene('C', latticeconstant={'a':2.46*A2B,'c':vacuum*A2B}) return ase_atom
[docs] def get_ase_graphene_xxx(vacuum=5.0): """Get the ASE atoms for primitive (2-atom) graphene unit cell.""" from ase.lattice import bulk ase_atom = bulk('C', 'hcp', a=2.46*A2B, c=vacuum*A2B) ase_atom.positions[1,2] = 0.0 return ase_atom