Example #1
0
    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]
Example #2
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
Example #3
0
    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("")
Example #4
0
    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("")
Example #5
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.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
Example #6
0
    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
Example #7
0
    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
Example #8
0
 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