Source code for chemicals.phase_change

r"""Chemical Engineering Design Library (ChEDL). Utilities for process modeling.
Copyright (C) 2016, 2017, 2018, 2019 Caleb Bell <Caleb.Andrew.Bell@gmail.com>

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

This module contains lookup functions for melting and boiling point, heat of
fusion, various enthalpy of vaporization estimation routines, and dataframes
of fit coefficients.

For reporting bugs, adding feature requests, or submitting pull requests,
please use the `GitHub issue tracker <https://github.com/CalebBell/chemicals/>`_.

.. contents:: :local:

Boiling Point
-------------
.. autofunction:: chemicals.phase_change.Tb
.. autofunction:: chemicals.phase_change.Tb_methods
.. autodata:: chemicals.phase_change.Tb_all_methods

Melting Point
-------------
.. autofunction:: chemicals.phase_change.Tm
.. autofunction:: chemicals.phase_change.Tm_methods
.. autodata:: chemicals.phase_change.Tm_all_methods

Heat of Fusion
--------------
Heat of fusion does not strongly depend on temperature or pressure. This is the
standard value, at 1 atm and the normal melting point.

.. autofunction:: chemicals.phase_change.Hfus
.. autofunction:: chemicals.phase_change.Hfus_methods
.. autodata:: chemicals.phase_change.Hfus_all_methods

Heat of Vaporization at Tb Correlations
---------------------------------------
.. autofunction:: chemicals.phase_change.Riedel
.. autofunction:: chemicals.phase_change.Chen
.. autofunction:: chemicals.phase_change.Liu
.. autofunction:: chemicals.phase_change.Vetere

Heat of Vaporization at T Correlations
--------------------------------------
.. autofunction:: chemicals.phase_change.Pitzer
.. autofunction:: chemicals.phase_change.SMK
.. autofunction:: chemicals.phase_change.MK
.. autofunction:: chemicals.phase_change.Velasco
.. autofunction:: chemicals.phase_change.Clapeyron
.. autofunction:: chemicals.phase_change.Watson
.. autofunction:: chemicals.phase_change.Watson_n

Heat of Vaporization at T Model Equations
-----------------------------------------
.. autofunction:: chemicals.phase_change.Alibakhshi
.. autofunction:: chemicals.phase_change.PPDS12

Heat of Sublimation
-------------------
No specific correlation is provided. This value is fairly strongly temperature
dependent; the dependency comes almost entirely from the vaporization
enthalpy's dependence. To calculate heat of sublimation at any temperature, use
the equation :math:`H_{sub} = H_{fus} + H_{vap}`.

Fit Coefficients
----------------
All of these coefficients are lazy-loaded, so they must be accessed as an
attribute of this module.

.. data:: phase_change_data_Perrys2_150

    A collection of 344 coefficient sets from the DIPPR database published
    openly in [1]_. Provides temperature limits for all its fluids.
    See :obj:`chemicals.dippr.EQ106` for the model equation.

.. data:: phase_change_data_VDI_PPDS_4

    Coefficients for a equation form developed by the PPDS, published
    openly in [2]_. Extrapolates poorly at low temperatures. See :obj:`PPDS12`
    for the model equation.

.. data:: phase_change_data_Alibakhshi_Cs

    One-constant limited temperature range regression coefficients presented
    in [3]_, with constants for ~2000 chemicals from the DIPPR database.
    Valid up to 100 K below the critical point, and 50 K under the boiling
    point. See :obj:`Alibakhshi` for the model equation.

.. [1] Green, Don, and Robert Perry. Perry's Chemical Engineers' Handbook,
    8E. McGraw-Hill Professional, 2007.
.. [2] Gesellschaft, V. D. I., ed. VDI Heat Atlas. 2nd edition.
    Berlin; New York:: Springer, 2010.
.. [3] Alibakhshi, Amin. "Enthalpy of Vaporization, Its Temperature
    Dependence and Correlation with Surface Tension: A Theoretical Approach."
    Fluid Phase Equilibria 432 (January 25, 2017): 62-69.
    https://doi.org/10.1016/j.fluid.2016.10.013.

The structure of each dataframe is shown below:


.. ipython::

    In [1]: import chemicals

    In [2]: chemicals.phase_change.phase_change_data_Perrys2_150

    In [3]: chemicals.phase_change.phase_change_data_VDI_PPDS_4

    In [4]: chemicals.phase_change.phase_change_data_Alibakhshi_Cs

"""

__all__ = ['Tb_methods', 'Tb', 'Tm_methods', 'Tm',
           'Clapeyron', 'Pitzer', 'SMK', 'MK', 'Velasco', 'Riedel', 'Chen',
           'Liu', 'Vetere', 'Alibakhshi','PPDS12', 'Watson', 'Watson_n',
           'Hfus', 'Hfus_methods']


from fluids.constants import N_A, R, pi
from fluids.numerics import log
from fluids.numerics import numpy as np

from chemicals import data_reader as dr
from chemicals import miscdata
from chemicals.data_reader import (
    data_source,
    database_constant_lookup,
    list_available_methods_from_df_dict,
    register_df_source,
    retrieve_any_from_df_dict,
    retrieve_from_df_dict,
)
from chemicals.utils import PY37, can_load_data, mark_numba_incompatible, os_path_join, source_path

###  Register data sources and lazy load them

folder = os_path_join(source_path, 'Phase Change')
register_df_source(folder, 'Yaws Boiling Points.tsv')
register_df_source(folder, 'OpenNotebook Melting Points.tsv')
register_df_source(folder, 'Ghazerati Appendix Vaporization Enthalpy.tsv',
                   csv_kwargs={'dtype': {'Hvap298': float}})
register_df_source(folder, 'CRC Handbook Heat of Vaporization.tsv')
register_df_source(folder, 'CRC Handbook Heat of Fusion.tsv')
register_df_source(folder, 'Ghazerati Appendix Sublimation Enthalpy.tsv')
register_df_source(folder, 'Table 2-150 Heats of Vaporization of Inorganic and Organic Liquids.tsv')
register_df_source(folder, 'VDI PPDS Enthalpies of vaporization.tsv')
register_df_source(folder, 'Alibakhshi one-coefficient enthalpy of vaporization.tsv')

CRC_ORG = 'CRC_ORG'
CRC_INORG = 'CRC_INORG'
YAWS = 'YAWS'
OPEN_NTBKM = 'OPEN_NTBKM'
CRC = 'CRC'

_phase_change_const_loaded = False
@mark_numba_incompatible
def _load_phase_change_constants():
    global Tb_data_Yaws, Tm_ON_data, Hvap_data_Gharagheizi, Hvap_data_CRC
    global Hfus_data_CRC, Hsub_data_Gharagheizi, _phase_change_const_loaded
    global Tb_sources, Tm_sources, Hfus_sources
    Tb_data_Yaws = data_source('Yaws Boiling Points.tsv')
    Tm_ON_data = data_source('OpenNotebook Melting Points.tsv')
    Hvap_data_Gharagheizi = data_source('Ghazerati Appendix Vaporization Enthalpy.tsv')
    Hvap_data_CRC = data_source('CRC Handbook Heat of Vaporization.tsv')
    Hfus_data_CRC = data_source('CRC Handbook Heat of Fusion.tsv')
    Hsub_data_Gharagheizi = data_source('Ghazerati Appendix Sublimation Enthalpy.tsv')
    _phase_change_const_loaded = True
    Tb_sources = {
        miscdata.HEOS: miscdata.heos_data,
        CRC_ORG: miscdata.CRC_organic_data,
        CRC_INORG: miscdata.CRC_inorganic_data,
        miscdata.COMMON_CHEMISTRY: miscdata.common_chemistry_data,
        miscdata.WEBBOOK: miscdata.webbook_data,
        YAWS: Tb_data_Yaws,
        miscdata.WIKIDATA: miscdata.wikidata_data,
        miscdata.JOBACK: miscdata.joback_predictions,
    }
    Tm_sources = {
        OPEN_NTBKM: Tm_ON_data,
        CRC_INORG: miscdata.CRC_inorganic_data,
        CRC_ORG: miscdata.CRC_organic_data,
        miscdata.COMMON_CHEMISTRY: miscdata.common_chemistry_data,
        miscdata.WEBBOOK: miscdata.webbook_data,
        miscdata.WIKIDATA: miscdata.wikidata_data,
        miscdata.JOBACK: miscdata.joback_predictions,
    }
    Hfus_sources = {
        CRC: Hfus_data_CRC,
        miscdata.WEBBOOK: miscdata.webbook_data,
        miscdata.WIKIDATA: miscdata.wikidata_data,
        miscdata.JOBACK: miscdata.joback_predictions,
    }


_phase_change_corrs_loaded = False
@mark_numba_incompatible
def _load_phase_change_correlations():
    global phase_change_data_Perrys2_150, phase_change_values_Perrys2_150
    global phase_change_data_VDI_PPDS_4, phase_change_values_VDI_PPDS_4
    global phase_change_data_Alibakhshi_Cs, _phase_change_corrs_loaded

    # 66554 for pandas; 19264 bytes for numpy
    phase_change_data_Perrys2_150 = data_source('Table 2-150 Heats of Vaporization of Inorganic and Organic Liquids.tsv')
    phase_change_values_Perrys2_150 = np.array(phase_change_data_Perrys2_150.values[:, 1:], dtype=float)

    # 52187 bytes for pandas, 13056 bytes for numpy
    phase_change_data_VDI_PPDS_4 = data_source('VDI PPDS Enthalpies of vaporization.tsv')
    phase_change_values_VDI_PPDS_4 = np.array(phase_change_data_VDI_PPDS_4.values[:, 2:], dtype=float)

    phase_change_data_Alibakhshi_Cs = data_source('Alibakhshi one-coefficient enthalpy of vaporization.tsv')
    _phase_change_corrs_loaded = True

if PY37:
    def __getattr__(name):
        if name in ('Tb_data_Yaws', 'Tm_ON_data', 'Hvap_data_Gharagheizi',
                    'Hvap_data_CRC', 'Hfus_data_CRC', 'Hsub_data_Gharagheizi',
                    'Tb_sources', 'Tm_sources', 'Hfus_sources'):
            _load_phase_change_constants()
            return globals()[name]
        elif name in ('phase_change_data_Perrys2_150',
                      'phase_change_values_Perrys2_150',
                      'phase_change_data_VDI_PPDS_4',
                      'phase_change_values_VDI_PPDS_4',
                      'phase_change_data_Alibakhshi_Cs'):
            _load_phase_change_correlations()
            return globals()[name]
        raise AttributeError(f"module {__name__} has no attribute {name}")
else:
    if can_load_data:
        _load_phase_change_constants()
        _load_phase_change_correlations()

### Phase change functions

### Boiling Point at 1 atm

Tb_all_methods = (miscdata.HEOS, CRC_INORG, CRC_ORG, miscdata.COMMON_CHEMISTRY,
                  miscdata.WEBBOOK, YAWS, miscdata.WIKIDATA, miscdata.JOBACK)
"""Tuple of method name keys. See the `Tbg` for the actual references"""

[docs]@mark_numba_incompatible def Tb_methods(CASRN): """Return all methods available to obtain the normal boiling point for the desired chemical. Parameters ---------- CASRN : str CASRN, [-] Returns ------- methods : list[str] Methods which can be used to obtain the Tb with the given inputs. See Also -------- Tb """ if not _phase_change_const_loaded: _load_phase_change_constants() return list_available_methods_from_df_dict(Tb_sources, CASRN, 'Tb')
[docs]@mark_numba_incompatible def Tb(CASRN, method=None): r'''This function handles the retrieval of a chemical's normal boiling point. Lookup is based on CASRNs. Will automatically select a data source to use if no method is provided; returns None if the data is not available. Function has data for approximately 34000 chemicals. Parameters ---------- CASRN : str CASRN [-] Returns ------- Tb : float Boiling temperature, [K] Other Parameters ---------------- method : string, optional A string for the method name to use, as defined in the variable, `Tb_all_methods`. Notes ----- The available sources are as follows: * 'CRC_ORG', a compillation of data on organics as published in [1]_. * 'CRC_INORG', a compillation of data on inorganic as published in [1]_. * 'WEBBOOK', a NIST resource [6]_ containing mostly experimental and averaged values * 'WIKIDATA', data from the Wikidata project [3]_ * 'COMMON_CHEMISTRY', a project from the CAS [4]_ * 'JOBACK', an estimation method for organic substances in [5]_ * 'YAWS', a large compillation of data from a variety of sources both experimental and predicted; no data points are sourced in the work of [2]_. * 'HEOS', a series of values from the NIST REFPROP Database for Highly Accurate Properties of Industrially Important Fluids (and other high-precision fundamental equations of state) Examples -------- >>> Tb('7732-18-5') 373.124 See Also -------- Tb_methods References ---------- .. [1] Haynes, W.M., Thomas J. Bruno, and David R. Lide. CRC Handbook of Chemistry and Physics, 95E. Boca Raton, FL: CRC press, 2014. .. [2] Yaws, Carl L. Thermophysical Properties of Chemicals and Hydrocarbons, Second Edition. Amsterdam Boston: Gulf Professional Publishing, 2014. .. [3] Wikidata. Wikidata. Accessed via API. https://www.wikidata.org/ .. [4] "CAS Common Chemistry". https://commonchemistry.cas.org/. .. [5] Joback, K.G., and R.C. Reid. "Estimation of Pure-Component Properties from Group-Contributions." Chemical Engineering Communications 57, no. 1-6 (July 1, 1987): 233-43. doi:10.1080/00986448708960487. .. [6] Shen, V.K., Siderius, D.W., Krekelberg, W.P., and Hatch, H.W., Eds., NIST WebBook, NIST, http://doi.org/10.18434/T4M88Q .. [7] Huber, Marcia L., Eric W. Lemmon, Ian H. Bell, and Mark O. McLinden. "The NIST REFPROP Database for Highly Accurate Properties of Industrially Important Fluids." Industrial & Engineering Chemistry Research 61, no. 42 (October 26, 2022): 15449-72. https://doi.org/10.1021/acs.iecr.2c01427. ''' if dr.USE_CONSTANTS_DATABASE and method is None: val, found = database_constant_lookup(CASRN, 'Tb') if found: return val if not _phase_change_const_loaded: _load_phase_change_constants() if method: return retrieve_from_df_dict(Tb_sources, CASRN, 'Tb', method) else: return retrieve_any_from_df_dict(Tb_sources, CASRN, 'Tb')
### Melting Point Tm_all_methods = (OPEN_NTBKM, CRC_INORG, CRC_ORG, miscdata.COMMON_CHEMISTRY, miscdata.WEBBOOK, miscdata.WIKIDATA, miscdata.JOBACK) """Tuple of method name keys. See the `Tm` for the actual references"""
[docs]@mark_numba_incompatible def Tm_methods(CASRN): """Return all methods available to obtain the melting point for the desired chemical. Parameters ---------- CASRN : str CASRN, [-] Returns ------- methods : list[str] Methods which can be used to obtain the Tm with the given inputs. See Also -------- Tm """ if not _phase_change_const_loaded: _load_phase_change_constants() return list_available_methods_from_df_dict(Tm_sources, CASRN, 'Tm')
[docs]@mark_numba_incompatible def Tm(CASRN, method=None): r'''This function handles the retrieval of a chemical's melting point. Lookup is based on CASRNs. Will automatically select a data source to use if no method is provided; returns None if the data is not available. Function has data for approximately 83000 chemicals. Parameters ---------- CASRN : str CASRN [-] Returns ------- Tm : float Melting temperature, [K] Other Parameters ---------------- method : string, optional A string for the method name to use, as defined by the vairable `Tm_all_methods`. Notes ----- The available sources are as follows: * 'OPEN_NTBKM, a compillation of data on organics as published in [1]_ as Open Notebook Melting Points; Averaged (median) values were used when multiple points were available. For more information on this invaluable and excellent collection, see http://onswebservices.wikispaces.com/meltingpoint. * 'CRC_ORG', a compillation of data on organics as published in [2]_. * 'CRC_INORG', a compillation of data on inorganic as published in [2]_. * 'WEBBOOK', a NIST resource [6]_ containing mostly experimental and averaged values * 'WIKIDATA', data from the Wikidata project [3]_ * 'COMMON_CHEMISTRY', a project from the CAS [4]_ * 'JOBACK', an estimation method for organic substances in [5]_ Examples -------- >>> Tm(CASRN='7732-18-5') 273.15 See Also -------- Tm_methods References ---------- .. [1] Bradley, Jean-Claude, Antony Williams, and Andrew Lang. "Jean-Claude Bradley Open Melting Point Dataset", May 20, 2014. https://figshare.com/articles/Jean_Claude_Bradley_Open_Melting_Point_Datset/1031637. .. [2] Haynes, W.M., Thomas J. Bruno, and David R. Lide. CRC Handbook of Chemistry and Physics, 95E. Boca Raton, FL: CRC press, 2014. .. [3] Wikidata. Wikidata. Accessed via API. https://www.wikidata.org/ .. [4] "CAS Common Chemistry". https://commonchemistry.cas.org/. .. [5] Joback, K.G., and R.C. Reid. "Estimation of Pure-Component Properties from Group-Contributions." Chemical Engineering Communications 57, no. 1-6 (July 1, 1987): 233-43. doi:10.1080/00986448708960487. .. [6] Shen, V.K., Siderius, D.W., Krekelberg, W.P., and Hatch, H.W., Eds., NIST WebBook, NIST, http://doi.org/10.18434/T4M88Q ''' if dr.USE_CONSTANTS_DATABASE and method is None: val, found = database_constant_lookup(CASRN, 'Tm') if found: return val if not _phase_change_const_loaded: _load_phase_change_constants() if method: return retrieve_from_df_dict(Tm_sources, CASRN, 'Tm', method) else: return retrieve_any_from_df_dict(Tm_sources, CASRN, 'Tm')
### Enthalpy of Vaporization at T
[docs]def Clapeyron(T, Tc, Pc, dZ=1, Psat=101325): r'''Calculates enthalpy of vaporization at arbitrary temperatures using the Clapeyron equation. The enthalpy of vaporization is given by: .. math:: \Delta H_{vap} = RT \Delta Z \frac{\ln (P_c/Psat)}{(1-T_{r})} Parameters ---------- T : float Temperature of fluid [K] Tc : float Critical temperature of fluid [K] Pc : float Critical pressure of fluid [Pa] dZ : float Change in compressibility factor between liquid and gas, [] Psat : float Saturation pressure of fluid [Pa], optional Returns ------- Hvap : float Enthalpy of vaporization, [J/mol] Notes ----- No original source is available for this equation. [1]_ claims this equation overpredicts enthalpy by several percent. Under Tr = 0.8, dZ = 1 is a reasonable assumption. This equation is most accurate at the normal boiling point. Internal units are bar. WARNING: I believe it possible that the adjustment for pressure may be incorrect Examples -------- Problem from Perry's examples. >>> Clapeyron(T=294.0, Tc=466.0, Pc=5.55E6) 26512.36357131963 References ---------- .. [1] Poling, Bruce E. The Properties of Gases and Liquids. 5th edition. New York: McGraw-Hill Professional, 2000. ''' Tr = T/Tc return R*T*dZ*log(Pc/Psat)/(1. - Tr)
[docs]def Pitzer(T, Tc, omega): r'''Calculates enthalpy of vaporization at arbitrary temperatures using a fit by [2]_ to the work of Pitzer [1]_; requires a chemical's critical temperature and acentric factor. The enthalpy of vaporization is given by: .. math:: \frac{\Delta_{vap} H}{RT_c}=7.08(1-T_r)^{0.354}+10.95\omega(1-T_r)^{0.456} Parameters ---------- T : float Temperature of fluid [K] Tc : float Critical temperature of fluid [K] omega : float Acentric factor [-] Returns ------- Hvap : float Enthalpy of vaporization, [J/mol] Notes ----- This equation is listed in [3]_, page 2-487 as method #2 for estimating Hvap. This cites [2]_. The recommended range is 0.6 to 1 Tr. Users should expect up to 5% error. This function converges to zero at `Tc`. If Tc is larger than T, 0 is returned as the model would return complex numbers. The original article has been reviewed and found to have a set of tabulated values which could be used instead of the fit function to provide additional accuracy. Examples -------- Example as in [3]_, p2-487; exp: 37.51 kJ/mol >>> Pitzer(452, 645.6, 0.35017) 36696.749078320056 References ---------- .. [1] Pitzer, Kenneth S. "The Volumetric and Thermodynamic Properties of Fluids. I. Theoretical Basis and Virial Coefficients." Journal of the American Chemical Society 77, no. 13 (July 1, 1955): 3427-33. doi:10.1021/ja01618a001 .. [2] Poling, Bruce E. The Properties of Gases and Liquids. 5th edition. New York: McGraw-Hill Professional, 2000. .. [3] Green, Don, and Robert Perry. Perry's Chemical Engineers' Handbook, Eighth Edition. McGraw-Hill Professional, 2007. ''' if T >= Tc: return 0.0 Tr = T/Tc return R*Tc * (7.08*(1. - Tr)**0.354 + 10.95*omega*(1. - Tr)**0.456)
[docs]def SMK(T, Tc, omega): r'''Calculates enthalpy of vaporization at arbitrary temperatures using a the work of [1]_; requires a chemical's critical temperature and acentric factor. The enthalpy of vaporization is given by: .. math:: \frac{\Delta H_{vap}} {RT_c} = \left( \frac{\Delta H_{vap}} {RT_c} \right)^{(R1)} + \left( \frac{\omega - \omega^{(R1)}} {\omega^{(R2)} - \omega^{(R1)}} \right) \left[\left( \frac{\Delta H_{vap}} {RT_c} \right)^{(R2)} - \left( \frac{\Delta H_{vap}} {RT_c} \right)^{(R1)} \right] .. math:: \left( \frac{\Delta H_{vap}} {RT_c} \right)^{(R1)} = 6.537 \tau^{1/3} - 2.467 \tau^{5/6} - 77.251 \tau^{1.208} + 59.634 \tau + 36.009 \tau^2 - 14.606 \tau^3 .. math:: \left( \frac{\Delta H_{vap}} {RT_c} \right)^{(R2)} - \left( \frac{\Delta H_{vap}} {RT_c} \right)^{(R1)}=-0.133 \tau^{1/3} - 28.215 \tau^{5/6} - 82.958 \tau^{1.208} + 99.00 \tau + 19.105 \tau^2 -2.796 \tau^3 .. math:: \tau = 1-T/T_c Parameters ---------- T : float Temperature of fluid [K] Tc : float Critical temperature of fluid [K] omega : float Acentric factor [-] Returns ------- Hvap : float Enthalpy of vaporization, [J/mol] Notes ----- The original article has been reviewed and found to have coefficients with slightly more precision. Additionally, the form of the equation is slightly different, but numerically equivalent. The refence fluids are: :math:`\omega_0` = benzene = 0.212 :math:`\omega_1` = carbazole = 0.461 A sample problem in the article has been verified. The numerical result presented by the author requires high numerical accuracy to obtain. This function converges to zero at `Tc`. If Tc is larger than T, 0 is returned as the model would return complex numbers. Examples -------- Problem in [1]_: >>> SMK(553.15, 751.35, 0.302) 39866.18999046229 References ---------- .. [1] Sivaraman, Alwarappa, Joe W. Magee, and Riki Kobayashi. "Generalized Correlation of Latent Heats of Vaporization of Coal-Liquid Model Compounds between Their Freezing Points and Critical Points." Industrial & Engineering Chemistry Fundamentals 23, no. 1 (February 1, 1984): 97-100. doi:10.1021/i100013a017. ''' if T >= Tc: return 0.0 omegaR1, omegaR2 = 0.212, 0.461 A10 = 6.536924 A20 = -2.466698 A30 = -77.52141 B10 = 59.63435 B20 = 36.09887 B30 = -14.60567 A11 = -0.132584 A21 = -28.21525 A31 = -82.95820 B11 = 99.00008 B21 = 19.10458 B31 = -2.795660 # 1 branch, two powers, 1 division tau = 1. - T/Tc tau_16 = tau**(1.0/6.0) tau_13 = tau_16*tau_16 tau_56 = tau_13*tau_13*tau_16 tau_other = tau**1.2083333333333333 #(1-1/8. + 1/3.)) L0 = (A10*tau_13 + A20*tau_56 + A30*tau_other + tau*(B10 + tau*(B20 + B30*tau))) L1 = (A11*tau_13 + A21*tau_56 + A31*tau_other + tau*(B11 + tau*(B21 + B31*tau))) domega = 4.016064257028112*(omega - omegaR1) # 4.016... = 1.0/(omegaR2 - omegaR1) # domega = (omega - omegaR1)/(omegaR2 - omegaR1) return R*Tc*(L0 + domega*L1)
[docs]def MK(T, Tc, omega): r'''Calculates enthalpy of vaporization at arbitrary temperatures using a the work of [1]_; requires a chemical's critical temperature and acentric factor. The enthalpy of vaporization is given by: .. math:: \Delta H_{vap} = \Delta H_{vap}^{(0)} + \omega \Delta H_{vap}^{(1)} + \omega^2 \Delta H_{vap}^{(2)} .. math:: \frac{\Delta H_{vap}^{(i)}}{RT_c} = b^{(j)} \tau^{1/3} + b_2^{(j)} \tau^{5/6} + b_3^{(j)} \tau^{1.2083} + b_4^{(j)}\tau + b_5^{(j)} \tau^2 + b_6^{(j)} \tau^3 .. math:: \tau = 1-T/T_c Parameters ---------- T : float Temperature of fluid [K] Tc : float Critical temperature of fluid [K] omega : float Acentric factor [-] Returns ------- Hvap : float Enthalpy of vaporization, [J/mol] Notes ----- The original article has been reviewed. A total of 18 coefficients are used: WARNING: The correlation has been implemented as described in the article, but its results seem different and with some error. Its results match with other functions however. Has poor behavior for low-temperature use. This function converges to zero at `Tc`. If Tc is larger than T, 0 is returned as the model would return complex numbers. Examples -------- Problem in article for SMK function. >>> MK(553.15, 751.35, 0.302) 38728.00667307733 References ---------- .. [1] Morgan, David L., and Riki Kobayashi. "Extension of Pitzer CSP Models for Vapor Pressures and Heats of Vaporization to Long-Chain Hydrocarbons." Fluid Phase Equilibria 94 (March 15, 1994): 51-87. doi:10.1016/0378-3812(94)87051-9. ''' if T >= Tc: return 0.0 bs0 = [5.2804, 0.080022, 7.2543] bs1 = [12.8650, 273.23, -346.45] bs2 = [1.1710, 465.08, -610.48] bs3 = [-13.1160, -638.51, 839.89] bs4 = [0.4858, -145.12, 160.05] bs5 = [-1.0880, 74.049, -50.711] tau = 1. - T/Tc tau_third = tau**0.3333 tau_83 = tau**0.8333 tau_other = tau**1.2083 tau2 = tau*tau tau3 = tau2*tau H0 = (bs0[0]*tau_third + bs1[0]*tau_83 + bs2[0]*tau_other + bs3[0]*tau + bs4[0]*tau2 + bs5[0]*tau3) H1 = (bs0[1]*tau_third + bs1[1]*tau_83 + bs2[1]*tau_other + bs3[1]*tau + bs4[1]*tau2 + bs5[1]*tau3) H2 = (bs0[2]*tau_third + bs1[2]*tau_83 + bs2[2]*tau_other + bs3[2]*tau + bs4[2]*tau2 + bs5[2]*tau3) return (H0 + omega*(H1 + omega*H2))*R*Tc
[docs]def Velasco(T, Tc, omega): r'''Calculates enthalpy of vaporization at arbitrary temperatures using a the work of [1]_; requires a chemical's critical temperature and acentric factor. The enthalpy of vaporization is given by: .. math:: \Delta_{vap} H = RT_c(7.2729 + 10.4962\omega + 0.6061\omega^2)(1-T_r)^{0.38} Parameters ---------- T : float Temperature of fluid [K] Tc : float Critical temperature of fluid [K] omega : float Acentric factor [-] Returns ------- Hvap : float Enthalpy of vaporization, [J/mol] Notes ----- The original article has been reviewed. It is regressed from enthalpy of vaporization values at 0.7Tr, from 121 fluids in REFPROP 9.1. A value in the article was read to be similar, but slightly too low from that calculated here. This function converges to zero at `Tc`. If Tc is larger than T, 0 is returned as the model would return complex numbers. Examples -------- From graph, in [1]_ for perfluoro-n-heptane. >>> Velasco(333.2, 476.0, 0.5559) 33299.428636069264 References ---------- .. [1] Velasco, S., M. J. Santos, and J. A. White. "Extended Corresponding States Expressions for the Changes in Enthalpy, Compressibility Factor and Constant-Volume Heat Capacity at Vaporization." The Journal of Chemical Thermodynamics 85 (June 2015): 68-76. doi:10.1016/j.jct.2015.01.011. ''' if T >= Tc: return 0.0 return (7.2729 + 10.4962*omega + 0.6061*omega**2)*(1-T/Tc)**0.38*R*Tc
### Enthalpy of Vaporization at Normal Boiling Point.
[docs]def Riedel(Tb, Tc, Pc): r'''Calculates enthalpy of vaporization at the boiling point, using the Ridel [1]_ CSP method. Required information are critical temperature and pressure, and boiling point. Equation taken from [2]_ and [3]_. The enthalpy of vaporization is given by: .. math:: \Delta_{vap} H=1.093 T_b R\frac{\ln P_c-1.013}{0.930-T_{br}} Parameters ---------- Tb : float Boiling temperature of fluid [K] Tc : float Critical temperature of fluid [K] Pc : float Critical pressure of fluid [Pa] Returns ------- Hvap : float Enthalpy of vaporization at the normal boiling point, [J/mol] Notes ----- This equation has no example calculation in any source. The source has not been verified. It is equation 4-144 in Perry's. Perry's also claims that errors seldom surpass 5%. [2]_ is the source of example work here, showing a calculation at 0.0% error. Internal units of pressure are bar. Examples -------- Pyridine, 0.0% err vs. exp: 35090 J/mol; from Poling [2]_. >>> Riedel(388.4, 620.0, 56.3E5) 35089.80179000598 References ---------- .. [1] Riedel, L. "Eine Neue Universelle Dampfdruckformel Untersuchungen Uber Eine Erweiterung Des Theorems Der Ubereinstimmenden Zustande. Teil I." Chemie Ingenieur Technik 26, no. 2 (February 1, 1954): 83-89. doi:10.1002/cite.330260206. .. [2] Poling, Bruce E. The Properties of Gases and Liquids. 5th edition. New York: McGraw-Hill Professional, 2000. .. [3] Green, Don, and Robert Perry. Perry's Chemical Engineers' Handbook, Eighth Edition. McGraw-Hill Professional, 2007. ''' Pc = Pc/1E5 # Pa to bar Tbr = Tb/Tc return 1.093*Tb*R*(log(Pc) - 1.013)/(0.93 - Tbr)
[docs]def Chen(Tb, Tc, Pc): r'''Calculates enthalpy of vaporization using the Chen [1]_ correlation and a chemical's critical temperature, pressure and boiling point. The enthalpy of vaporization is given by: .. math:: \Delta H_{vb} = RT_b \frac{3.978 T_r - 3.958 + 1.555 \ln P_c}{1.07 - T_r} Parameters ---------- Tb : float Boiling temperature of the fluid [K] Tc : float Critical temperature of fluid [K] Pc : float Critical pressure of fluid [Pa] Returns ------- Hvap : float Enthalpy of vaporization, [J/mol] Notes ----- The formulation presented in the original article is similar, but uses units of atm and calorie instead. The form in [2]_ has adjusted for this. A method for estimating enthalpy of vaporization at other conditions has also been developed, but the article is unclear on its implementation. Based on the Pitzer correlation. Internal units: bar and K Examples -------- Same problem as in Perry's examples. >>> Chen(294.0, 466.0, 5.55E6) 26705.902558030946 References ---------- .. [1] Chen, N. H. "Generalized Correlation for Latent Heat of Vaporization." Journal of Chemical & Engineering Data 10, no. 2 (April 1, 1965): 207-10. doi:10.1021/je60025a047 .. [2] Poling, Bruce E. The Properties of Gases and Liquids. 5th edition. New York: McGraw-Hill Professional, 2000. ''' Tbr = Tb/Tc Pc = Pc/1E5 # Pa to bar return R*Tb*(3.978*Tbr - 3.958 + 1.555*log(Pc))/(1.07 - Tbr)
[docs]def Liu(Tb, Tc, Pc): r'''Calculates enthalpy of vaporization at the normal boiling point using the Liu [1]_ correlation, and a chemical's critical temperature, pressure and boiling point. The enthalpy of vaporization is given by: .. math:: \Delta H_{vap} = RT_b \left[ \frac{T_b}{220}\right]^{0.0627} \frac{ (1-T_{br})^{0.38} \ln(P_c/P_A)}{1-T_{br} + 0.38 T_{br} \ln T_{br}} Parameters ---------- Tb : float Boiling temperature of the fluid [K] Tc : float Critical temperature of fluid [K] Pc : float Critical pressure of fluid [Pa] Returns ------- Hvap : float Enthalpy of vaporization, [J/mol] Notes ----- This formulation can be adjusted for lower boiling points, due to the use of a rationalized pressure relationship. The formulation is taken from the original article. A correction for alcohols and organic acids based on carbon number, which only modifies the boiling point, is available but not implemented. No sample calculations are available in the article. Internal units: Pa and K Examples -------- Same problem as in Perry's examples >>> Liu(294.0, 466.0, 5.55E6) 26378.575260517395 References ---------- .. [1] LIU, ZHI-YONG. "Estimation of Heat of Vaporization of Pure Liquid at Its Normal Boiling Temperature." Chemical Engineering Communications 184, no. 1 (February 1, 2001): 221-28. doi:10.1080/00986440108912849. ''' Tbr = Tb/Tc return R*Tb*(Tb/220.)**0.0627*(1. - Tbr)**0.38*log(Pc/101325.) \ / (1 - Tbr + 0.38*Tbr*log(Tbr))
[docs]def Vetere(Tb, Tc, Pc, F=1.0): r'''Calculates enthalpy of vaporization at the boiling point, using the Vetere [1]_ CSP method. Required information are critical temperature and pressure, and boiling point. Equation taken from [2]_. The enthalpy of vaporization is given by: .. math:: \frac {\Delta H_{vap}}{RT_b} = \frac{\tau_b^{0.38} \left[ \ln P_c - 0.513 + \frac{0.5066}{P_cT_{br}^2}\right]} {\tau_b + F(1-\tau_b^{0.38})\ln T_{br}} Parameters ---------- Tb : float Boiling temperature of fluid [K] Tc : float Critical temperature of fluid [K] Pc : float Critical pressure of fluid [Pa] F : float, optional Constant for a fluid, [-] Returns ------- Hvap : float Enthalpy of vaporization at the boiling point, [J/mol] Notes ----- The equation cannot be found in the original source. It is believed that a second article is its source, or that DIPPR staff have altered the formulation. Internal units of pressure are bar. Examples -------- Example as in [2]_, p2-487; exp: 25.73 >>> Vetere(294.0, 466.0, 5.55E6) 26363.43895706672 References ---------- .. [1] Vetere, Alessandro. "Methods to Predict the Vaporization Enthalpies at the Normal Boiling Temperature of Pure Compounds Revisited." Fluid Phase Equilibria 106, no. 1-2 (May 1, 1995): 1-10. doi:10.1016/0378-3812(94)02627-D. .. [2] Green, Don, and Robert Perry. Perry's Chemical Engineers' Handbook, Eighth Edition. McGraw-Hill Professional, 2007. ''' Tbr = Tb/Tc taub = 1-Tb/Tc Pc = Pc/1E5 term = taub**0.38*(log(Pc)-0.513 + 0.5066/Pc/Tbr**2) / (taub + F*(1-taub**0.38)*log(Tbr)) return R*Tb*term
### Enthalpy of Vaporization adjusted for T
[docs]def Watson(T, Hvap_ref, T_ref, Tc, exponent=0.38): r'''Calculates enthalpy of vaporization of a chemical at a temperature using the known heat of vaporization at another temperature according to the Watson [1]_ [2]_ correlation. This is an application of the corresponding-states principle, with an emperical temperature dependence. .. math:: \frac{\Delta H_{vap}^{T1}}{\Delta H_{vap}^{T2}} = \left( \frac{1-T_{r,1}}{1-T_{r,2}} \right)^{0.38} Parameters ---------- T : float Temperature for which to calculate heat of vaporization, [K] Hvap_ref : float Enthalpy of vaporization at the known temperature point, [J/mol] T_ref : float Reference temperature; ideally as close to `T` as posible, [K] Tc : float Critical temperature of fluid [K] exponent : float, optional A fit exponent can optionally be used instead of the Watson 0.38 exponent, [-] Returns ------- Hvap : float Enthalpy of vaporization at `T`, [J/mol] Notes ----- Examples -------- Predict the enthalpy of vaporization of water at 320 K from a point at 300 K: >>> Watson(T=320, Hvap_ref=43908, T_ref=300.0, Tc=647.14) 42928.990094915454 The error is 0.38% compared to the correct value of 43048 J/mol. If the provided temperature is above the critical point, zero is returned. References ---------- .. [1] Watson, KM. "Thermodynamics of the Liquid State." Industrial & Engineering Chemistry 35, no. 4 (1943): 398-406. .. [2] Martin, Joseph J., and John B. Edwards. "Correlation of Latent Heats of Vaporization.” AIChE Journal 11, no. 2 (1965): 331-33. https://doi.org/10.1002/aic.690110226. ''' Tr = T/Tc if Tr > 1.0: return 0.0 Trefr = T_ref/Tc H2 = Hvap_ref*((1.0 - Tr)/(1.0 - Trefr))**exponent return H2
[docs]def Watson_n(T1, T2, Hvap1, Hvap2, Tc): r'''Calculates the Watson heat of vaporizaton extrapolation exponent given two known heats of vaporization. .. math:: n = \left[ \frac{\ln{\left(\frac{Hvap_{1}}{Hvap_{2}} \right)}} {\ln{\left(\frac{T_{1} - T_{c}}{T_{2} - T_{c}} \right)}}\right] Parameters ---------- T1 : float Temperature of first heat of vaporization point, [K] T2 : float Temperature of second heat of vaporization point, [K] Hvap1 : float Enthalpy of vaporization at the first known temperature point, [J/mol] Hvap2 : float Enthalpy of vaporization at the second known temperature point, [J/mol] Tc : float Critical temperature of fluid [K] Returns ------- exponent : float A fit exponent that can be used instead of the Watson 0.38 exponent, [-] Notes ----- This can be useful for extrapolating when a correlation does not reach the critical point. Examples -------- >>> Watson_n(T1=320, T2=300, Hvap1=42928.990094915454, Hvap2=43908, Tc=647.14) 0.380000000000 ''' return log(Hvap1/Hvap2)/log((T1 - Tc)/(T2 - Tc))
### Enthalpy of Vaporization model equations
[docs]def Alibakhshi(T, Tc, C): r'''Calculates enthalpy of vaporization of a chemical at a temperature using a theoretically-derived single-coefficient fit equation developed in [1]_. This model falls apart at ~0.8 Tc. .. math:: \Delta H_{vap} = \left(4.5\pi N_A\right)^{1/3.}4.2\times 10^{-7} (T_c - 6) - 0.5RT\ln(T) + CT Parameters ---------- T : float Temperature for which to calculate heat of vaporization, [K] Tc : float Critical temperature of fluid [K] C : float Alibakhshi fit coefficient, [J/mol/K] Returns ------- Hvap : float Enthalpy of vaporization at `T`, [J/mol] Notes ----- The authors of [1]_ evaluated their model on 1890 compounds for a temperature range of 50 K under `Tb` to 100 K below `Tc`, and obtained an average absolute relative error of 4.5%. Examples -------- Predict the enthalpy of vaporization of water at 320 K: >>> Alibakhshi(T=320.0, Tc=647.14, C=-16.7171) 41961.30490225752 The error is 2.5% compared to the correct value of 43048 J/mol. References ---------- .. [1] Alibakhshi, Amin. "Enthalpy of Vaporization, Its Temperature Dependence and Correlation with Surface Tension: A Theoretical Approach." Fluid Phase Equilibria 432 (January 25, 2017): 62-69. https://doi.org/10.1016/j.fluid.2016.10.013. ''' return (4.5*pi*N_A)**(1/3.)*4.2E-7*(Tc-6.) - R/2.*T*log(T) + C*T
[docs]def PPDS12(T, Tc, A, B, C, D, E): r'''Calculate the enthalpy of vaporization of a fluid using the 5-term power fit developed by the PPDS and named PPDS equation 12. .. math:: H_{vap} = RT_c \left(A\tau^{1/3} + B\tau^{2/3} + C\tau + D\tau^2 + E\tau^6\right) .. math:: \tau = 1 - \frac{T}{T_c} Parameters ---------- T : float Temperature of fluid [K] Tc : float Critical temperature of fluid [K] A : float Coefficient, [-] B : float Coefficient, [-] C : float Coefficient, [-] D : float Coefficient, [-] E : float Coefficient, [-] Returns ------- Hvap : float Enthalpy of vaporization at `T`, [J/mol] Notes ----- Coefficients can be found in [1]_, but no other source for these coefficients has been found. Examples -------- Example from [1]_: >>> PPDS12(300.0, 591.75, 4.60584, 13.97224, -10.592315, 2.120205, 4.277128) 37948.76862035925 Example from [2]_ for benzene; note the coefficients from [2]_ predict enthalpy of vaporization in kJ/mol, so the output must be adjusted. The same effect can be obtained by multiplying each of the coefficients by 1000. >>> 1000.0*PPDS12(300.0, 562.05, 0.00171484, 0.0258604, -0.0243564, 0.00740881, 0.00680068) 33662.4258030 References ---------- .. [1] Gesellschaft, V. D. I., ed. VDI Heat Atlas. 2nd edition. Berlin; New York:: Springer, 2010. .. [2] "Enthalpy of Vaporization: PPDS12." https://trc.nist.gov/TDE/TDE_Help/Eqns-Pure-Hvap/PPDS12.htm. ''' if T >= Tc: return 0.0 tau = 1. - T/Tc tau_cbrt = tau**(1/3.) tau2 = tau*tau Hvap = R*Tc*(tau_cbrt*(A + B*tau_cbrt) + C*tau + tau2*(D + E*tau2*tau2)) return Hvap
### Heat of Fusion Hfus_all_methods = (CRC, miscdata.WEBBOOK, miscdata.WIKIDATA, miscdata.JOBACK) """Tuple of method name keys. See the `Hfus` for the actual references"""
[docs]@mark_numba_incompatible def Hfus_methods(CASRN): """Return all methods available to obtain the heat of fusion for the desired chemical. Parameters ---------- CASRN : str CASRN, [-] Returns ------- methods : list[str] Methods which can be used to obtain the Hfus with the given inputs. See Also -------- Hfus """ if not _phase_change_const_loaded: _load_phase_change_constants() return list_available_methods_from_df_dict(Hfus_sources, CASRN, 'Hfus')
[docs]@mark_numba_incompatible def Hfus(CASRN, method=None): r'''This function handles the retrieval of a chemical's heat of fusion. Lookup is based on CASRNs. Will automatically select a data source to use if no method is provided; returns None if the data is not available. Function has data for approximately 22000 chemicals. Parameters ---------- CASRN : str CASRN [-] Returns ------- Hfus : float Molar enthalpy of fusion at normal melting point, [J/mol] Other Parameters ---------------- method : string, optional A string for the method name to use, as defined by the variable, `Hfus_all_methods`. Notes ----- The available sources are as follows: * 'CRC', a compillation of data on organics and inorganics as published in [1]_. * 'WEBBOOK', a NIST resource [4]_ containing mostly experimental and averaged values * 'WIKIDATA', data from the Wikidata project [2]_ * 'JOBACK', an estimation method for organic substances in [3]_ Examples -------- >>> Hfus('7732-18-5') 6010.0 See Also -------- Hfus_methods References ---------- .. [1] Haynes, W.M., Thomas J. Bruno, and David R. Lide. CRC Handbook of Chemistry and Physics, 95E. Boca Raton, FL: CRC press, 2014. .. [2] Wikidata. Wikidata. Accessed via API. https://www.wikidata.org/ .. [3] Joback, K.G., and R.C. Reid. "Estimation of Pure-Component Properties from Group-Contributions." Chemical Engineering Communications 57, no. 1-6 (July 1, 1987): 233-43. doi:10.1080/00986448708960487. .. [4] Shen, V.K., Siderius, D.W., Krekelberg, W.P., and Hatch, H.W., Eds., NIST WebBook, NIST, http://doi.org/10.18434/T4M88Q ''' if dr.USE_CONSTANTS_DATABASE and method is None: val, found = database_constant_lookup(CASRN, 'Hfus') if found: return val if not _phase_change_const_loaded: _load_phase_change_constants() if method: return retrieve_from_df_dict(Hfus_sources, CASRN, 'Hfus', method) else: return retrieve_any_from_df_dict(Hfus_sources, CASRN, 'Hfus')