import numpy as np
np.seterr(divide='ignore')
[docs]class Anharmonicity:
"""
Instance for the excess contribution to the free energy.
:param float s0,s1,s2: Parameters of the A(V) term.
"""
def __init__(self, s0: float, s1: float, s2: float) -> None:
self.panh = s0, s1, s2
self.s0 = s0
self.s1 = s1
self.s2 = s2
[docs] def A(self, V: float) -> float:
"""
A(V) = s0+s0*V+s1*V**2, where A is the polynomial model for the excess contribution to the free energy, A(V)*T.
:param float V: Volume
:return: s0+s0*V+s1*V**2
:rtype: float
"""
return self.s0 + self.s1 * V + self.s2 * V ** 2
[docs] def dAdV_T(self, V: float) -> float:
"""
Volume derivative of A at fixed T.
:param float V: Volume
:return: s1+2*V*s2
:rtype: float
"""
return 2 * V * self.s2 + self.s1
[docs] def d2AdV2_T(self, V: float) -> float:
"""
Second order volume derivative of A at fixed T.
:param float V: Volume
:return: 2*s2
:rtype: float
"""
return 2 * self.s2
[docs] def d3AdV3_T(self, V: float) -> float:
"""
Third order volume derivative of A at fixed T.
:param float V: Volume
:return: 0
:rtype: float
"""
return 0
[docs] def d4AdV4_T(self, V: float) -> float:
"""
Fourth order volume derivative of A at fixed T.
:param float V: Volume.
:return: 0
:rtype: float.
"""
return 0
[docs] def E(self, T, V: float) -> float:
"""
Internal energy due the excess term.
:param float T: Temperature.
:param float V: Volume.
:return: A(V)*T**2/2
:rtype: float
"""
return 1 / 2 * self.A(V) * T ** 2
[docs] def S(self, T, V: float) -> float:
"""
Entropy due the excess term.
:param float T: Temperature.
:param float V: Volume.
:return: A(V)*T
:rtype: float
"""
return self.A(V) * T
[docs] def F(self, T, V: float) -> float:
"""
Free energy due the excess term.
:param float T: Temperature.
:param float V: Volume.
:return: -A(V)*T**2/2
:rtype: float
"""
return -1 / 2 * self.A(V) * T ** 2
[docs] def dFdV_T(self, T, V: float) -> float:
"""
Volume derivative of the free energy due the excess term, at fixed T.
:param float T: Temperature.
:param float V: Volume.
:return: -(dA(V)/dV)_T*T**2/2
:rtype: float
"""
return -1 / 2 * self.dAdV_T(V) * T ** 2
[docs] def dFdT_V(self, T, V: float) -> float:
"""
Temperature derivative of the free energy due the excess term, at fixed V.
:param float T: Temperature.
:param float V: Volume.
:return: -A(V)
:rtype: float
"""
return -T*self.A(V)
[docs] def d2FdT2_V(self, T, V: float) -> float:
"""
Second order Temperature derivative of the free energy due the excess term, at fixed V.
:param float T: Temperature.
:param float V: Volume.
:return: -A(V)
:rtype: float
"""
return -self.A(V)
[docs] def d2FdV2_T(self, T, V: float) -> float:
"""
Second order volume derivative of the free energy due the excess term, at fixed T.
:param float T: Temperature.
:param float V: Volume.
:return: -(d2A(V)/dV2)_T*T**2/2
:rtype: float
"""
return -self.d2AdV2_T(V) * T ** 2 / 2
[docs] def d3FdV3_T(self, T, V: float) -> float:
"""
Third order volume derivative of the free energy due the excess term, at fixed T.
:param float T: Temperature.
:param float V: Volume.
:return: -(d3A(V)/dV3)_T*T**2/2
:rtype: float
"""
return -self.d3AdV3_T(V) * T ** 2 / 2
[docs] def d4FdV4_T(self, T, V: float) -> float:
"""
Fourth order volume derivative of the free energy due the excess term, at fixed T.
:param float T: Temperature.
:param float V: Volume.
:return: -(d4A(V)/dV4)_T*T**2/2
:rtype: float
"""
return -self.d4AdV4_T(V) * T ** 2 / 2
[docs] def d2FdVdT(self, T, V: float) -> float:
"""
Second order derivative of the free energy due the excess term, with respect to T and V.
:param float T: Temperature.
:param float V: Volume.
:return: -(dA(V)/dV)_T*T
:rtype: float
"""
return -self.dAdV_T(V) * T
[docs] def d3FdV2dT(self, T, V: float) -> float:
"""
Third order derivative of the free energy due the excess term, with respect to T, V, and V.
:param float T: Temperature.
:param float V: Volume.
:return: -(d2A(V)/dV2)_T*T
:rtype: float
"""
return -self.d2AdV2_T(V) * T
[docs] def d3FdVdT2(self, T, V: float) -> float:
"""
Third order derivative of the free energy due the excess term, with respect to T, T, and V.
:param float T: Temperature.
:param float V: Volume.
:return: -(dA(V)/dV)_T
:rtype: float
"""
return -self.dAdV_T(V)
class intAnharmonicity:
def __init__(self, a0: float = 0, m0: float = 1, V0: float = 1):
"""
Instantiate the corrections required to consider temperature dependence on the Debye temperature.
:param float a0: Parameter of the intrinsic anharmonicity correction function.
:param float m0: Pseudo-Gruneisen parameter of the intrinsic anharmonicity correction function.
:param float V0: Equilibrium volume.
"""
self.pintanh = a0, m0, V0
self.d3AnhdV2dT_val = None
self.d3AnhdVdT2_val = None
self.d2AnhdVdT_val = None
self.d3AnhdV3_T_val = None
self.d2AnhdV2_T_val = None
self.dAnhdV_T_val = None
self.d4AnhdT4_V_val = None
self.d3AnhdT3_V_val = None
self.d2AnhdT2_V_val = None
self.Anh_val = None
self.an_val = None
self.dAnhdT_V_val = None
self.a0 = a0
self.m0 = m0
self.V0 = V0
def an(self, V: float) -> float:
"""
Intrinsic anharmonicity parameter.
:param float V: Volume
:return: a0*(V/V0)^m0
:rtype: float
"""
return self.a0 * (V / self.V0) ** self.m0
def Anh(self, T, V: float) -> float:
"""
Intrinsic anharmonicity correction to the Debye temperature.
:param float T: Temperature.
:param float V: Volume.
:returns: Intrinsic anharmonicity correction
:rtype: float
"""
self.an_val = self.an(V)
self.Anh_val = np.exp(1 / 2 * self.an_val * T)
return self.Anh_val
def dAnhdT_V(self) -> float:
"""
Temperature derivative of the intrinsic anharmonicity correction of the Debye temperature, at fixed V.
:param float V: Volume
:return: an_val*Anh_val/2
:rtype: float
"""
self.dAnhdT_V_val = (1 / 2) * self.an_val * self.Anh_val
return self.dAnhdT_V_val
def d2AnhdT2_V(self) -> float:
"""
Second order temperature derivative of the intrinsic anharmonicity correction of the Debye temperature,
at fixed V.
:param float V: Volume
:return: an_val*(d2Anh_val/dT2)_V/2
:rtype: float
"""
self.d2AnhdT2_V_val = (1 / 2) * self.an_val * self.dAnhdT_V_val
return self.d2AnhdT2_V_val
def d3AnhdT3_V(self) -> float:
"""
Third order temperature derivative of the intrinsic anharmonicity correction of the Debye temperature,
at fixed V.
:param float V: Volume
:return: an_val*(d2Anh_val/dT2)_V/2
:rtype: float
"""
self.d3AnhdT3_V_val = (1 / 2) * self.an_val * self.d2AnhdT2_V_val
return self.d3AnhdT3_V_val
def d4AnhdT4_V(self) -> float:
"""
Fourth order temperature derivative of the intrinsic anharmonicity correction of the Debye temperature,
at fixed V.
:param float V: Volume.
:return: an_val*(d3Anh_val/dT3)_V/2
:rtype: float
"""
self.d4AnhdT4_V_val = (1 / 2) * self.an_val * self.d3AnhdT3_V_val
return self.d4AnhdT4_V_val
def dAnhdV_T(self, T: float, V: float) -> float:
"""
Volume derivative of the intrinsic anharmonicity correction of the Debye temperature, at fixed T.
:param float T: Temperature
:param float V: Volume
:return: m0*T*an_val*Anh_val/(2*V)
:rtype: float
"""
self.dAnhdV_T_val = self.m0 * T * self.an_val * self.Anh_val / (2 * V)
return self.dAnhdV_T_val
def d2AnhdV2_T(self, T: float, V: float) -> float:
"""
Second order Volume derivative of the intrinsic anharmonicity correction of the Debye temperature, at fixed T.
:param float T: Temperature
:param float V: Volume
:return: dAnhdV_T_val*(T*an_val*m0+2*m0-2)/(2*V)
:rtype: float
"""
self.d2AnhdV2_T_val = self.dAnhdV_T_val * (T * self.an_val * self.m0 + 2 * self.m0 - 2) / (2 * V)
return self.d2AnhdV2_T_val
def d3AnhdV3_T(self, T: float, V: float) -> float:
"""
Third order Volume derivative of the intrinsic anharmonicity correction of the Debye temperature, at fixed T.
:param float T: Temperature
:param float V: Volume
:return: dAnhdV_T_val*(T^2*an_val^2*m0^2+6*T*an_val*m0^2-6*T*an_val*m0+4*m0^2-12*m0+8)/(4*V^2)
:rtype: float
"""
self.d3AnhdV3_T_val = self.dAnhdV_T_val * (
T ** 2 * self.an_val ** 2 * self.m0 ** 2 + 6 * T * self.an_val * self.m0 ** 2 - 6 * T * self.an_val * self.m0 + 4 * self.m0 ** 2 - 12 * self.m0 + 8) / (
4 * V ** 2)
return self.d3AnhdV3_T_val
def d4AnhdV4_T(self, T: float, V: float) -> float:
"""
Fourth order Volume derivative of the intrinsic anharmonicity correction of the Debye temperature, at fixed T.
:param float T: Temperature
:param float V: Volume
:return: dAnhdV_T_val*(T^3*an_val^3*m0^3+12*T^2*an_val^2*m0^3 - 12*T^2*an_val^2*m0^2+28*T*an_val*m0^3-72*T*an_val*m0^2+44T*an_val*m0+8+m0^3-48*m0^2+88*m0-48)/(8*V^3)
:rtype: float
"""
self.d4AnhdT4_V_val = self.dAnhdV_T_val * (
T ** 3 * self.an_val ** 3 * self.m0 ** 3 + 12 * T ** 2 * self.an_val ** 2 * self.m0 ** 3 - 12 * T ** 2 * self.an_val ** 2 * self.m0 ** 2 + 28 * T * self.an_val * self.m0 ** 3 - 72 * T * self.an_val * self.m0 ** 2 + 44 * T * self.an_val * self.m0 + 8 * self.m0 ** 3 - 48 * self.m0 ** 2 + 88 * self.m0 - 48) / (
8 * V ** 3)
return self.d4AnhdT4_V_val
def d2AnhdVdT(self, T: float) -> float:
"""
Second order derivative of the intrinsic anharmonicity correction of the Debye temperature,
with respect to T and V.
:param float T: Temperature
:return: dAnhdV_T_val * (1 / T + an_val / 2)
:rtype: float
"""
self.d2AnhdVdT_val = self.dAnhdV_T_val * (1 / T + self.an_val / 2)
return self.d2AnhdVdT_val
def d3AnhdVdT2(self, T: float) -> float:
"""
Third order derivative of the intrinsic anharmonicity correction of the Debye temperature,
with respect to T, T, and V.
:param float T: Temperature
:return: dAnhdV_T_val * an_val * (1 / T + an_val / 4)
:rtype: float
"""
self.d3AnhdVdT2_val = self.dAnhdV_T_val * self.an_val * (1 / T + self.an_val / 4)
return self.d3AnhdVdT2_val
def d3AnhdV2dT(self, T: float, V: float) -> float:
"""
Third order derivative of the intrinsic anharmonicity correction of the Debye temperature,
with respect to T, V, and V.
:param float T: Temperature
:param float V: Volume
:return: dAnhdV_T_val/V*(m0/T-1/T+3/2*an_val*m0-an_val/2+an_val^2*m0*T/4)
:rtype: float
"""
self.d3AnhdV2dT_val = self.dAnhdV_T_val / V * (
self.m0 / T - 1 / T + 3 / 2 * self.an_val * self.m0 - self.an_val / 2 + self.an_val ** 2 * self.m0 * T / 4)
return self.d3AnhdV2dT_val