#!/usr/bin/env python
"""
This module can be used to calculate roughly the lattice parameters of a
lattice type, based on the radii of the species on each site.
"""
import numpy as np
[docs]def cubic_perovskite(shannon_radius): # Cubic Pervoskite
"""The lattice parameters of the cubic perovskite structure.
Args:
shannon_radius (list) : The radii of the a,b,c ions
Returns:
(tuple):
float values of lattics constants and
angles (a, b, c, alpha, beta, gamma)
"""
limiting_factors = [2 * sum(shannon_radius[1:])]
a = max(limiting_factors)
b = a
c = a
# space = a * np.sqrt(3) - 2 * shannon_radius[1]
alpha = 90
beta = 90
gamma = 90
return a, b, c, alpha, beta, gamma
[docs]def wurtzite(shannon_radius):
"""The lattice parameters of the wurtzite structure.
Args:
shannon_radius (list) : The radii of the a,b ions
Returns:
(tuple):
float values of lattics constants and
angles (a, b, c, alpha, beta, gamma)
"""
shannon_radius.sort(reverse=True) # Geometry assumes atom A is larger
# "Ideal" wurtzite structure
# c/a = 1.633, u = 0.375
#
alpha = 90
beta = 90
gamma = 120
#
# Scenario A: A atoms are touching
# i.e. height is that of two tetrahegons with side length a
# = 2 * sqrt(2/3) * a
if shannon_radius[0] > 0.817 * (shannon_radius[0] + shannon_radius[1]):
a = 2 * shannon_radius[0]
b = a
c = 2 * np.sqrt(2.0 / 3.0) * a
else:
# Scenario B: regular wurtzite, similar sizes
# 0.817 is sin(109.6/2)
a = 2 * 0.817 * (shannon_radius[0] + shannon_radius[1])
b = a
c = (shannon_radius[0] + shannon_radius[1]) * (
2 + 2 * 0.335
) # 0.335 is sin(109.6-90)
# inner_space = a * (6**0.5) - (4*shannon_radius[0])
return a, b, c, alpha, beta, gamma
# A1#
[docs]def fcc(covalent_radius):
"""The lattice parameters of the A1.
Args:
shannon_radius (list) : The radii of the a ions
Returns:
(tuple):
float values of lattics constants and
angles (a, b, c, alpha, beta, gamma)
"""
a = 2 * 2**0.5 * covalent_radius
b = 2 * 2**0.5 * covalent_radius
c = 2 * 2**0.5 * covalent_radius
alpha = 90
beta = 90
gamma = 90
return a, b, c, alpha, beta, gamma
# A2#
[docs]def bcc(covalent_radius):
"""The lattice parameters of the A2.
Args:
shannon_radius (list) : The radii of the a ions
Returns:
(tuple):
float values of lattics constants and
angles (a, b, c, alpha, beta, gamma)
"""
a = 4 * covalent_radius / np.sqrt(3)
b = a
c = a
alpha = 90
beta = 90
gamma = 90
return a, b, c, alpha, beta, gamma
# A3#
[docs]def hcp(covalent_radius):
"""The lattice parameters of the hcp.
Args:
shannon_radius (list) : The radii of the a ions
Returns:
(tuple):
float values of lattics constants and
angles (a, b, c, alpha, beta, gamma)
"""
a = 2 * covalent_radius
b = a
c = (4.0 / 3.0) * 6**0.5 * covalent_radius
alpha = 90
beta = 90
gamma = 120
return a, b, c, alpha, beta, gamma
# A4#
[docs]def diamond(covalent_radius):
"""The lattice parameters of the diamond.
Args:
shannon_radius (list) : The radii of the a ions
Returns:
(tuple):
float values of lattics constants and
angles (a, b, c, alpha, beta, gamma)
"""
a = 8 * covalent_radius / np.sqrt(3)
b = a
c = a
alpha = 90
beta = 90
gamma = 90
return a, b, c, alpha, beta, gamma
# A5#
[docs]def bct(covalent_radius):
"""The lattice parameters of the bct.
Args:
shannon_radius (list) : The radii of the a ions
Returns:
(tuple):
float values of lattics constants and
angles (a, b, c, alpha, beta, gamma)
"""
a = 3.86 * covalent_radius
b = a
c = 2 * covalent_radius
alpha = 90
beta = 90
gamma = 90
return a, b, c, alpha, beta, gamma
# B1
[docs]def rocksalt(shannon_radius):
"""The lattice parameters of rocksalt.
Args:
shannon_radius (list) : The radii of the a,b ions
Returns:
(tuple):
float values of lattics constants and
angles (a, b, c, alpha, beta, gamma)
"""
limiting_factors = [
2 * 2**0.2 * shannon_radius[0],
2 * 2**0.2 * shannon_radius[1],
2 * shannon_radius[0] + 2 * shannon_radius[1],
]
a = max(limiting_factors)
b = a
c = a
alpha = 90
beta = 90
gamma = 90
return a, b, c, alpha, beta, gamma
# B2
[docs]def b2(shannon_radius):
"""The lattice parameters of b2.
Args:
shannon_radius (list) : The radii of the a,b ions
Returns:
(tuple):
float values of lattics constants and
angles (a, b, c, alpha, beta, gamma)
"""
limiting_factors = [
2 * (shannon_radius[0] + shannon_radius[0]) / np.sqrt(3),
2 * shannon_radius[1],
2 * shannon_radius[0],
]
a = max(limiting_factors)
b = a
c = a
alpha = 90
beta = 90
gamma = 90
return a, b, c, alpha, beta, gamma
# B3
[docs]def zincblende(shannon_radius):
"""The lattice parameters of Zinc Blende.
Args:
shannon_radius (list) : The radii of the a,b ions
Returns:
(tuple):
float values of lattics constants and
angles (a, b, c, alpha, beta, gamma)
"""
limiting_factors = [
2 * (max(shannon_radius) * np.sqrt(2)),
4 * (shannon_radius[0] + shannon_radius[1]) ** (1.0 / 3.0),
]
a = max(limiting_factors)
b = a
c = a
alpha = 90
beta = 90
gamma = 90
return a, b, c, alpha, beta, gamma
# Zn-S-Zn angle is ~109.5 degrees (from a tetrahedron). It is exactly 2*invCos(-1/3).
# The distance of that Zn-Zn (diagonally to half the face) is (using the cosine rule) is
# root[2(r1+r2)^2 - 2(r1+r2)^(2)cos(ZnSZn angle)].
# B10
[docs]def b10(shannon_radius): # Litharge
"""The lattice parameters of Litharge
Args:
shannon_radius (list) : The radii of the a,b ions
Returns:
(tuple):
float values of lattics constants and
angles (a, b, c, alpha, beta, gamma)
"""
limiting_factors = [
4 * (max(shannon_radius)) / np.sqrt(2),
sum(shannon_radius) * 1.31,
] # Explained below.
a = max(limiting_factors)
b = a
c = a * 1.26 # Value taken for PbO http://www.mindat.org/min-2466.html#
alpha = 90
beta = 90
gamma = 90
return a, b, c, alpha, beta, gamma
[docs]def stuffed_wurtzite(shannon_radii):
"""The stuffed wurtzite structure (e.g. LiGaGe) space group P63/mc.
Args:
shannon_radius (list) : The radii of the a,b,c ions
Returns:
(tuple):
float values of lattics constants and
angles (a, b, c, alpha, beta, gamma)
"""
rac = shannon_radii[2] + shannon_radii[1]
x = rac * np.sin(np.radians(19.5))
c = 2 * rac + x
y = rac * np.sin(np.radians(70.5))
a = y * np.sin(np.radians(120)) / np.sin(np.radians(30))
b = a
alpha = 90
beta = 90
gamma = 120
return a, b, c, alpha, beta, gamma