Spaces:
Running
Running
from mp_api.client import MPRester | |
from ase import Atom | |
from ase.data import covalent_radii | |
from ase.spacegroup import crystal | |
fcc_elements = [ | |
"Ac", | |
"Ag", | |
"Al", | |
"Ar", | |
"Au", | |
"Ba", | |
"Be", | |
"Ca", | |
"Cd", | |
"Ce", | |
"Co", | |
"Cs", | |
"Cu", | |
"Dy", | |
"Er", | |
"Fe", | |
"Ga", | |
"Ge", | |
"He", | |
"Hf", | |
"Ho", | |
"In", | |
"Ir", | |
"K", | |
"Kr", | |
"La", | |
"Li", | |
"Mg", | |
"Mn", | |
"Na", | |
"Ni", | |
"Os", | |
"Pa", | |
"Pb", | |
"Pd", | |
"Pr", | |
"Pt", | |
"Rb", | |
"Re", | |
"Rh", | |
"Ru", | |
"Sc", | |
"Sn", | |
"Sr", | |
"Ta", | |
"Tb", | |
"Tc", | |
"Th", | |
"Ti", | |
"Tl", | |
"W", | |
"Xe", | |
"Y", | |
"Zr" | |
] | |
def get_fcc_pristine(mp_api_key = None): | |
for element in fcc_elements: | |
with MPRester(mp_api_key) as mpr: | |
docs = mpr.materials.summary.search( | |
formula=element, spacegroup_number=225, fields=["structure", "energy_above_hull"] | |
) | |
docs = sorted(docs, key=lambda x: x.energy_above_hull) | |
if len(docs) != 0: | |
pristine = docs[0].structure.to_conventional().to_ase_atoms(msonable=False) * (3, 3, 3) | |
if len(pristine) != 108: | |
v = pristine.get_volume() / len(pristine) | |
r = v**(1/3) | |
a = 2*(2**0.5)*r | |
pristine = crystal( | |
symbols=[element]*4, | |
basis=[(0, 0, 0), (0.5, 0.5, 0), (0.5, 0, 0.5), (0, 0.5, 0.5)], | |
spacegroup=225, | |
cellpar=[a, a, a, 90, 90, 90], | |
) * (3, 3, 3) | |
else: | |
r = covalent_radii[Atom(element).number] or 4 | |
a = 2*(2**0.5)*r | |
pristine = crystal( | |
symbols=[element]*4, | |
basis=[(0, 0, 0), (0.5, 0.5, 0), (0.5, 0, 0.5), (0, 0.5, 0.5)], | |
spacegroup=225, | |
cellpar=[a, a, a, 90, 90, 90], | |
) * (3, 3, 3) | |
yield pristine | |
hcp_elements = [ | |
"Ag", | |
"Al", | |
"Ar", | |
"Au", | |
"Ba", | |
"Be", | |
"Ca", | |
"Cd", | |
"Ce", | |
"Co", | |
"Cr", | |
"Cs", | |
"Cu", | |
"Fe", | |
"Ga", | |
"Ge", | |
"He", | |
"Hf", | |
"Ho", | |
"In", | |
"Ir", | |
"K", | |
"Kr", | |
"La", | |
"Li", | |
"Mg", | |
"Mn", | |
"Mo", | |
"Nb", | |
"Ne", | |
"Ni", | |
"Os", | |
"P", | |
"Pb", | |
"Pd", | |
"Pt", | |
"Rb", | |
"Re", | |
"Rh", | |
"Ru", | |
"Sc", | |
"Si", | |
"Sn", | |
"Sr", | |
"Ta", | |
"Tc", | |
"Te", | |
"Th", | |
"Ti", | |
"Tl", | |
"V", | |
"W", | |
"Xe", | |
"Y", | |
"Zn", | |
"Zr" | |
] | |
def get_hcp_pristine(mp_api_key = None): | |
for element in hcp_elements: | |
with MPRester(mp_api_key) as mpr: | |
docs = mpr.materials.summary.search( | |
formula=element, spacegroup_number=194, fields=["structure", "energy_above_hull"] | |
) | |
docs = sorted(docs, key=lambda x: x.energy_above_hull) | |
if len(docs) != 0: | |
pristine = docs[0].structure.to_conventional().to_ase_atoms(msonable=False) * (3, 3, 1) | |
if len(pristine) != 36: | |
v = pristine.get_volume() / len(pristine) | |
r = v**(1/3) | |
a = 2*r | |
c = 4 * ((2/3) ** 0.5) * r | |
pristine = crystal( | |
[element], | |
[(1.0 / 3.0, 2.0 / 3.0, 3.0 / 4.0)], | |
spacegroup=194, | |
cellpar=[a, a, c, 90, 90, 120], | |
) * (3, 3, 2) | |
else: | |
r = covalent_radii[Atom(element).number] or 4 | |
a = 2*r | |
c = 4 * ((2/3) ** 0.5) * r | |
pristine = crystal( | |
[element], | |
[(1.0 / 3.0, 2.0 / 3.0, 3.0 / 4.0)], | |
spacegroup=194, | |
cellpar=[a, a, c, 90, 90, 120], | |
) * (3, 3, 2) | |
yield pristine |