Source code for debyetools.defects

import numpy as np
np.seterr(divide='ignore')

kB   = 0.138064852e-22
NAv  = 0.6022140857e24

[docs]class Defects: """ Implementation of the defects contribution due to monovancies to the free energy. :param float Evac00: Fomration energy of vacancies. :param float Svac00: Fomration entropy of vacancies. :param float Tm: Melting temperature. :param float a: Volume ratio of a mono vacancie relative to the equilibrium volume. :param float P2: Bulk modulus. :param float V0: Equilibrium volume. """ def __init__(self, Evac00: float, Svac00: float, Tm: float, a: float, P2: float, V0: float): self.pdef = Evac00,Svac00,Tm,a,P2,V0 self.Evac00 = Evac00 self.Svac00 = Svac00 self.Svac0 = Svac00*kB self.Evac0 = Evac00*kB*Tm self.Tm=Tm self.a = a self.P2 = P2 self.V0=V0
[docs] def Svac(self, V: float) -> float: """ Entropy of formation of vacancies. :param float V: Volume. :return: Svac0 :rtype: float """ return self.Svac0
[docs] def dSvacdV_T(self, V: float) -> float: """ Volume-derivative of the entropy of formation of vacancies. :param float V: Volume. :return: 0 """ return 0
[docs] def d2SvacdV2_T(self, V: float) -> float: """ Volume-derivative of the entropy of formation of vacancies. :param float V: Volume. :return: 0 """ return 0
[docs] def d3SvacdV3_T(self, V: float) -> float: """ Volume-derivative of the entropy of formation of vacancies. :param float V: Volume. :return: 0 """ return 0
[docs] def d4SvacdV4_T(self, V: float) -> float: """ Volume-derivative of the entropy of formation of vacancies. :param float V: Volume. :return: 0 """ return 0
[docs] def Evac(self, V: float) -> float: """ Enthalpy of formation of vacancies. :param float V: Volume. :return: Ef(V) :rtype: float """ return self.Evac0 - self.V0*self.a*(V - self.V0)*self.P2/(NAv*V)
[docs] def dEvacdV_T(self, V: float) -> float: """ Volume-derivative of the enthalpy of formation of vacancies. :param float V: Volume. :return: Volume-derivative of the enthalpy of formation of vacancies. :rtype: float """ return -self.V0*self.a*self.P2/(NAv*V)+self.V0*self.a*(V-self.V0)*self.P2/(NAv*V**2)
[docs] def d2EvacdV2_T(self, V: float) -> float: """ Volume-derivative of the enthalpy of formation of vacancies. :param float V: Volume. :return: Volume-derivative of the enthalpy of formation of vacancies. :rtype: float """ return 2*self.V0*self.a*self.P2/(NAv*V**2)-2*self.V0*self.a*(V-self.V0)*self.P2/(NAv*V**3)
[docs] def d3EvacdV3_T(self, V: float) -> float: """ Volume-derivative of the enthalpy of formation of vacancies. :param float V: Volume. :return: Volume-derivative of the enthalpy of formation of vacancies. :rtype: float """ return -6*self.V0*self.a*self.P2/(NAv*V**3)+6*self.V0*self.a*(V-self.V0)*self.P2/(NAv*V**4)
[docs] def d4EvacdV4_T(self, V: float) -> float: """ Volume-derivative of the enthalpy of formation of vacancies. :param float V: Volume. :return: Volume-derivative of the enthalpy of formation of vacancies. :rtype: float """ return 24*self.V0*self.a*self.P2/(NAv*V**4)-24*self.V0*self.a*(V-self.V0)*self.P2/(NAv*V**5)
[docs] def E(self, T: float, V: float) -> float: """ Defects energy. :param float T: Temperature. :param float V: Volume :return: E_def :rtype: float """ return self.Evac(V)*NAv*np.exp(self.Svac(V)/kB - self.Evac(V)/(kB*T))
[docs] def S(self, T: float, V: float) -> float: """ Defects entropy. :param float T: Temperature. :param float V: Volume :return: S_def :rtype: float """ return (T*kB+self.Evac(V))*NAv*np.exp(self.Svac(V)/kB - self.Evac(V)/(kB*T))/T
[docs] def F(self, T: float, V: float) -> float: """ Implementation of the defects contribution to the free energy. :param float T: Temperature. :param float V: Volume. :return: energy :rtype: float """ return -NAv*T*kB*np.exp((self.Svac(V)*T-self.Evac(V))/(T*kB))
[docs] def dFdV_T(self, T: float, V: float) -> float: """ Derivative of defects contribution to the free energy. :param float T: Temperature. :param float V: Volume. :return: Derivative of F_def :rtype: float """ return -NAv*(self.dSvacdV_T(V)*T-self.dEvacdV_T(V))*np.exp((self.Svac(V)*T-self.Evac(V))/(T*kB))
[docs] def dFdT_V(self, T: float, V: float) -> float: """ Derivative of defects contribution to the free energy. :param float T: Temperature. :param float V: Volume. :return: Derivative of F_def :rtype: float """ return -NAv*kB*np.exp((self.Svac(V)*T-self.Evac(V))/(T*kB))-NAv*T*kB*(self.Svac(V)/(T*kB)-(self.Svac(V)*T-self.Evac(V))/(T**2*kB))*np.exp((self.Svac(V)*T-self.Evac(V))/(T*kB))
[docs] def d2FdT2_V(self, T: float, V: float) -> float: """ Derivative of defects contribution to the free energy. :param float T: Temperature. :param float V: Volume. :return: Derivative of F_def :rtype: float """ return -NAv*self.Evac(V)**2*np.exp((self.Svac(V)*T-self.Evac(V))/(T*kB))/(T**3*kB)
[docs] def d2FdV2_T(self, T: float, V: float) -> float: """ Derivative of defects contribution to the free energy. :param float T: Temperature. :param float V: Volume. :return: Derivative of F_def :rtype: float """ return -(-(self.d2EvacdV2_T(V))*T*kB+(self.d2SvacdV2_T(V))*T**2*kB+((self.dSvacdV_T(V))*T-(self.dEvacdV_T(V)))**2)*np.exp((self.Svac(V)*T-self.Evac(V))/(T*kB))*NAv/(T*kB)
[docs] def d3FdV3_T(self, T: float, V: float) -> float: """ Derivative of defects contribution to the free energy. :param float T: Temperature. :param float V: Volume. :return: Derivative of F_def :rtype: float """ return -NAv*(self.d3SvacdV3_T(V)*T-self.d3EvacdV3_T(V))*np.exp((self.Svac(V)*T-self.Evac(V))/(T*kB))-3*NAv*(self.d2SvacdV2_T(V)*T-self.d2EvacdV2_T(V))*(self.dSvacdV_T(V)*T-self.dEvacdV_T(V))*np.exp((self.Svac(V)*T-self.Evac(V))/(T*kB))/(T*kB)-NAv*(self.dSvacdV_T(V)*T-self.dEvacdV_T(V))**3*np.exp((self.Svac(V)*T-self.Evac(V))/(T*kB))/(T**2*kB**2)
[docs] def d4FdV4_T(self, T: float, V: float) -> float: """ Derivative of defects contribution to the free energy. :param float T: Temperature. :param float V: Volume. :return: Derivative of F_def :rtype: float """ return -NAv*(self.d4SvacdV4_T(V)*T-self.d4EvacdV4_T(V))*np.exp((self.Svac(V)*T-self.Evac(V))/(T*kB))-4*NAv*(self.d3SvacdV3_T(V)*T-self.d3EvacdV3_T(V))*(self.dSvacdV_T(V)*T-self.dEvacdV_T(V))*np.exp((self.Svac(V)*T-self.Evac(V))/(T*kB))/(T*kB)-3*NAv*(self.d2SvacdV2_T(V)*T-self.d2EvacdV2_T(V))**2*np.exp((self.Svac(V)*T-self.Evac(V))/(T*kB))/(T*kB)
[docs] def d2FdVdT(self, T: float, V: float) -> float: """ Derivative of defects contribution to the free energy. :param float T: Temperature. :param float V: Volume. :return: Derivative of F_def :rtype: float """ return -np.exp((self.Svac(V)*T-self.Evac(V))/(T*kB))*(T*(T*kB+self.Evac(V))*(self.dSvacdV_T(V))-(self.dEvacdV_T(V))*self.Evac(V))*NAv/(T**2*kB)
[docs] def d3FdV2dT(self, T: float, V: float) -> float: """ Derivative of defects contribution to the free energy. :param float T: Temperature. :param float V: Volume. :return: Derivative of F_def :rtype: float """ return -NAv*(self.d2SvacdV2_T(V))*np.exp((self.Svac(V)*T-self.Evac(V))/(T*kB))-NAv*((self.d2SvacdV2_T(V))*T-(self.d2EvacdV2_T(V)))*(self.Svac(V)/(T*kB)-(self.Svac(V)*T-self.Evac(V))/(T**2*kB))*np.exp((self.Svac(V)*T-self.Evac(V))/(T*kB))-2*NAv*((self.dSvacdV_T(V))*T-(self.dEvacdV_T(V)))*np.exp((self.Svac(V)*T-self.Evac(V))/(T*kB))*(self.dSvacdV_T(V))/(T*kB)+NAv*((self.dSvacdV_T(V))*T-(self.dEvacdV_T(V)))**2*np.exp((self.Svac(V)*T-self.Evac(V))/(T*kB))/(T**2*kB)-NAv*((self.dSvacdV_T(V))*T-(self.dEvacdV_T(V)))**2*(self.Svac(V)/(T*kB)-(self.Svac(V)*T-self.Evac(V))/(T**2*kB))*np.exp((self.Svac(V)*T-self.Evac(V))/(T*kB))/(T*kB)
[docs] def d3FdVdT2(self, T: float, V: float) -> float: """ Derivative of defects contribution to the free energy. :param float T: Temperature. :param float V: Volume. :return: Derivative of F_def :rtype: float """ return -2*NAv*self.dSvacdV_T(V)*(self.Svac(V)/(T*kB)-(self.Svac(V)*T-self.Evac(V))/(T**2*kB))*np.exp((self.Svac(V)*T-self.Evac(V))/(T*kB))-NAv*(self.dSvacdV_T(V)*T-self.dEvacdV_T(V))*(-2*self.Svac(V)/(T**2*kB)+(2*(self.Svac(V)*T-self.Evac(V)))/(T**3*kB))*np.exp((self.Svac(V)*T-self.Evac(V))/(T*kB))-NAv*(self.dSvacdV_T(V)*T-self.dEvacdV_T(V))*(self.Svac(V)/(T*kB)-(self.Svac(V)*T-self.Evac(V))/(T**2*kB))**2*np.exp((self.Svac(V)*T-self.Evac(V))/(T*kB))