def volume(self, pressure, temperature, params): """ Returns molar volume. :math:`[m^3]` """ T_0 = self.reference_temperature( params ) debye_T = lambda x : self.__debye_temperature(params['V_0']/x, params) gr = lambda x : self.grueneisen_parameter(pressure, temperature, x, params) E_th = lambda x : debye.thermal_energy(temperature, debye_T(x), params['n']) #thermal energy at temperature T E_th_ref = lambda x : debye.thermal_energy(T_0, debye_T(x), params['n']) #thermal energy at reference temperature b_iikk= 9.*params['K_0'] # EQ 28 b_iikkmm= 27.*params['K_0']*(params['Kprime_0']-4.) # EQ 29 f = lambda x: 0.5*(pow(params['V_0']/x,2./3.)-1.) # EQ 24 func = lambda x: (1./3.)*(pow(1.+2.*f(x),5./2.))*((b_iikk*f(x)) \ +(0.5*b_iikkmm*pow(f(x),2.))) + gr(x)*(E_th(x) - E_th_ref(x))/x - pressure #EQ 21 # we need to have a sign change in [a,b] to find a zero. Let us start with a # conservative guess: a = 0.6*params['V_0'] b = 1.2*params['V_0'] # if we have a sign change, we are done: if func(a)*func(b)<0: return opt.brentq(func, a, b) else: tol = 0.0001 sol = opt.fmin(lambda x : func(x)*func(x), 1.0*params['V_0'], ftol=tol, full_output=1, disp=0) if sol[1] > tol*2: raise ValueError('Cannot find volume, likely outside of the range of validity for EOS') else: warnings.warn("May be outside the range of validity for EOS") return sol[0]
def pressure( self, temperature, volume, params): """ Returns the pressure of the mineral at a given temperature and volume [Pa] """ debye_T = self.__debye_temperature(params['V_0']/volume, params) gr = self.grueneisen_parameter(0.0, temperature, volume, params) #does not depend on pressure E_th = debye.thermal_energy(temperature, debye_T, params['n']) E_th_ref = debye.thermal_energy(300., debye_T, params['n']) #thermal energy at reference temperature b_iikk= 9.*params['K_0'] # EQ 28 b_iikkmm= 27.*params['K_0']*(params['Kprime_0']-4.) # EQ 29 f = 0.5*(pow(params['V_0']/volume,2./3.)-1.) # EQ 24 P = (1./3.)*(pow(1.+2.*f,5./2.))*((b_iikk*f) \ +(0.5*b_iikkmm*pow(f,2.))) + gr*(E_th - E_th_ref)/volume #EQ 21 return P
def shear_modulus(self, pressure, temperature, volume, params): """ Returns shear modulus at the pressure, temperature, and volume [Pa] """ debye_T = self.__debye_temperature(params["V_0"] / volume, params) eta_s = self.__isotropic_eta_s(params["V_0"] / volume, params) E_th = debye.thermal_energy(temperature, debye_T, params["n"]) E_th_ref = debye.thermal_energy(300.0, debye_T, params["n"]) if self.order == 2: return bm.shear_modulus_second_order(volume, params) - eta_s * (E_th - E_th_ref) / volume elif self.order == 3: return bm.shear_modulus_third_order(volume, params) - eta_s * (E_th - E_th_ref) / volume else: raise NotImplementedError("")
def shear_modulus(self, pressure, temperature, volume, params): """ Returns shear modulus. :math:`[Pa]` """ T_0 = self.reference_temperature( params ) debye_T = self.__debye_temperature(params['V_0']/volume, params) eta_s = self.__isotropic_eta_s(params['V_0']/volume, params) E_th = debye.thermal_energy(temperature ,debye_T, params['n']) E_th_ref = debye.thermal_energy(T_0,debye_T, params['n']) if self.order==2: return bm.shear_modulus_second_order(volume, params) - eta_s * (E_th-E_th_ref) / volume elif self.order==3: return bm.shear_modulus_third_order(volume, params) - eta_s * (E_th-E_th_ref) / volume else: raise NotImplementedError("")
def pressure(self, temperature, volume, params): """ Returns the pressure of the mineral at a given temperature and volume [Pa] """ debye_T = self.__debye_temperature(params["V_0"] / volume, params) gr = self.grueneisen_parameter(0.0, temperature, volume, params) # does not depend on pressure E_th = debye.thermal_energy(temperature, debye_T, params["n"]) E_th_ref = debye.thermal_energy(300.0, debye_T, params["n"]) # thermal energy at reference temperature b_iikk = 9.0 * params["K_0"] # EQ 28 b_iikkmm = 27.0 * params["K_0"] * (params["Kprime_0"] - 4.0) # EQ 29 f = 0.5 * (pow(params["V_0"] / volume, 2.0 / 3.0) - 1.0) # EQ 24 P = (1.0 / 3.0) * (pow(1.0 + 2.0 * f, 5.0 / 2.0)) * ((b_iikk * f) + (0.5 * b_iikkmm * pow(f, 2.0))) + gr * ( E_th - E_th_ref ) / volume # EQ 21 return P
def isothermal_bulk_modulus(self, pressure,temperature, volume, params): """ Returns isothermal bulk modulus :math:`[Pa]` """ T_0 = self.reference_temperature( params ) debye_T = self.__debye_temperature(params['V_0']/volume, params) gr = self.grueneisen_parameter(pressure, temperature, volume, params) E_th = debye.thermal_energy(temperature, debye_T, params['n']) #thermal energy at temperature T E_th_ref = debye.thermal_energy(T_0,debye_T, params['n']) #thermal energy at reference temperature C_v = debye.heat_capacity_v(temperature, debye_T, params['n']) #heat capacity at temperature T C_v_ref = debye.heat_capacity_v(T_0,debye_T, params['n']) #heat capacity at reference temperature q = self.volume_dependent_q(params['V_0']/volume, params) K = bm.bulk_modulus(volume, params) \ + (gr + 1.-q)* ( gr / volume ) * (E_th - E_th_ref) \ - ( pow(gr , 2.) / volume )*(C_v*temperature - C_v_ref*T_0) return K
def isothermal_bulk_modulus(self, pressure, temperature, volume, params): """ Returns isothermal bulk modulus at the pressure, temperature, and volume [Pa] """ debye_T = self.__debye_temperature(params["V_0"] / volume, params) gr = self.grueneisen_parameter(pressure, temperature, volume, params) E_th = debye.thermal_energy(temperature, debye_T, params["n"]) # thermal energy at temperature T E_th_ref = debye.thermal_energy(300.0, debye_T, params["n"]) # thermal energy at reference temperature C_v = debye.heat_capacity_v(temperature, debye_T, params["n"]) # heat capacity at temperature T C_v_ref = debye.heat_capacity_v(300.0, debye_T, params["n"]) # heat capacity at reference temperature q = self.volume_dependent_q(params["V_0"] / volume, params) K = ( bm.bulk_modulus(volume, params) + (gr + 1.0 - q) * (gr / volume) * (E_th - E_th_ref) - (pow(gr, 2.0) / volume) * (C_v * temperature - C_v_ref * 300.0) ) return K
def __thermal_pressure(self,T,V, params): Debye_T = self.__debye_temperature(params['V_0']/V, params) gr = self.grueneisen_parameter(0., T, V, params) # P not important P_th = gr * debye.thermal_energy(T,Debye_T, params['n'])/V return P_th