Source code for surfinpy.utils
import numpy as np
from scipy.constants import codata
[docs]def pressure(chemical_potential, t):
r"""Converts chemical potential at a specific
temperature (T) to a pressure value.
.. math::
P = \frac{\mu}{k * T}
where P is the pressure, :math:`\mu` is the chemcial potential, k is the
Boltzmann constant and T is the temperature.
Parameters
----------
chemical_potential : array like
delta mu values
t : int
temperature
Returns
-------
pressure : array like
pressure values as a function of chemcial potential
"""
k = codata.value('Boltzmann constant in eV/K')
pressure = chemical_potential / (k * t * 2.203)
return pressure
[docs]def build_xgrid(x, y):
"""Builds a 2D grip of values for the x axis.
Parameters
----------
x : array like
numpy array
y : array like
numpy array
Returns
-------
xnew : array like
numpy array
"""
xnew = np.tile(x, y.size)
xnew = np.reshape(xnew, (y.size, x.size))
return xnew
[docs]def build_ygrid(x, y):
"""Builds a 2D grip of values for the y axis.
Parameters
----------
x : array like
numpy array
y : array like
numpy array
Returns
-------
xnew : array like
numpy array
"""
ynew = np.tile(y, x.size)
ynew = np.split(ynew, x.size)
ynew = np.column_stack(ynew)
return ynew
[docs]def calculate_coverage(data):
"""Calcualte the coverage of the adsorbing species on each surface.
Parameters
----------
data : list
list of dictionaries containing info on each surface calculation
Returns
-------
coverage : array like
numpy array of coverage values in units of :math:`n/nm^2`
"""
coverage = np.array([])
for i in range(0, len(data)):
coverage = np.append(coverage, (((data[i]['Y'] / (
data[i]['Area'] / 100)) / 2) * 10**18))
return coverage
[docs]def get_labels(ticks, data):
'''Reads the phase diagram data and returns the labels that correspond
to the phases displayed on the phase diagram.
Parameters
----------
ticks : list
Phases that are displayed.
data : list
list of dictionaries.
Returns
-------
labels : list
list of labels.
'''
labels = []
for i in range(0, ticks.size):
val = ticks[i] - 1
val = int(val)
label = data[val]['Label']
labels.append(label)
return labels
[docs]def fit(x, y, t):
'''Fit a polynominal function to thermochemical data from NIST_JANAF
Parameters
----------
x : array like
x axis for fit
y : array like
y axis for fit
t : array like
x axis to be fitted
Returns
-------
shift : array like
data fitted from x and y to t
'''
x = np.delete(x, (0), axis=0)
y = np.delete(y, (0), axis=0)
z = np.polyfit(x, y, 3)
f = np.poly1d(z)
shift = f(t)
return shift
[docs]def get_phase_data(S, nsurfaces):
''' Determines which surface composition is most stable at a
given x and y value.
Parameters
----------
S : array like
2D array of surface energies
nsurfaces : int
Total number of surfaces
Returns
-------
x : array like
array of ints corresponding to the position of
the lowest phase
'''
S = np.split(S, nsurfaces)
S = np.column_stack(S)
x = np.argmin(S, axis=1) + 1
return x
[docs]def read_nist(File):
'''Read a downloaded NIST_JANAF thermochemcial table
Parameters
----------
File : str
filename of table
Returns
-------
data : array_like
table as an array
'''
data = np.genfromtxt(File, skip_header=2)
return data
[docs]def calculate_gibbs(t, s, h):
'''Calculate the gibbs free energy from thermochemcial data
obtained from the NIST_JANAF database
Parameters
----------
t : array like
Temperature range
s : array like
delta s values from nist
h : array like
selta h values from nist
Returns
-------
g : array like
gibbs energy as a function of temperature
'''
deltas = (s * 0.01036) / 1000
deltah = h * 0.01036
g = deltah - t * deltas
return g
[docs]def get_levels(X):
"""Builds the levels used in the contourf plot. This is neccesary to
ensure that each color correpsonds to a single phase.
Parameters
----------
X : array like
2D array of ints corresponding to each phase.
Returns
-------
levels : array like
numpy array of ints
"""
a = np.amax(X) + 1
b = np.amin(X) - 1
levels = np.arange(b, a, 1)
return levels
[docs]def get_ticks(X):
"""I have no idea what this does
"""
t = np.arange(X.size)
t = t - 0.5
ticky = t.tolist()
return ticky