Source code for despasito.equations_of_state.saft.Aideal

# -- coding: utf8 --

r"""
EOS object for SAFT ideal gas contributions to the Helmholtz energy with
:func:`~despasito.equations_of_state.saft.Aideal.Aideal_contribution`
"""

import numpy as np
import logging

from despasito.equations_of_state import constants
import despasito.equations_of_state.eos_toolbox as tb

logger = logging.getLogger(__name__)


[docs] def Aideal_contribution(rho, T, xi, massi, method="Abroglie"): r""" Return a vector of ideal contribution of the Helmholtz energy. :math:`\frac{A^{ideal}}{N k_{B} T}` Supported methods include: :func:`~despasito.equations_of_state.saft.Aideal.Abroglie`, Parameters ---------- rho : numpy.ndarray Number density of system [:math:`mol/m^3`] T : float Temperature of the system [K] xi : numpy.ndarray Mole fraction of each component, sum(xi) should equal 1.0 massi : numpy.ndarray Vector of component masses that correspond to the mole fractions in xi [kg/mol] method : str, Optional, default=Abroglie The function name of the method to calculate the ideal contribution of the Helmholtz energy. To add a new one, add a function to: despasito.equations_of_state.saft.Aideal.py Returns ------- Aideal : numpy.ndarray Helmholtz energy of ideal gas for each density given. """ functions = {"Abroglie": Abroglie} if method in functions: function = functions[method] else: raise ValueError("Method, {}, was not found to calculate Aideal.".format(method)) return function(rho, T, xi, massi)
[docs] def Abroglie(rho, T, xi, massi): r""" Return a vector of ideal contribution of Helmholtz energy derived from Broglie wavelength Parameters ---------- rho : numpy.ndarray Number density of system [:math:`mol/m^3`] T : float Temperature of the system [K] xi : numpy.ndarray Mole fraction of each component, sum(xi) should equal 1.0 massi : numpy.ndarray Vector of component masses that correspond to the mole fractions in xi [kg/mol] Returns ------- Aideal : numpy.ndarray Helmholtz energy of ideal gas for each density given. """ rho2 = rho * constants.molecule_per_nm3 xi_tmp, massi_tmp = tb.remove_insignificant_components(xi, massi) # rhoi: (number of components,number of densities) number density of each component # for each density rhoi = np.outer(rho2, xi_tmp) Lambda = np.sqrt( (constants.h * constants.Nav * constants.m2nm) * (constants.h / constants.kb * constants.m2nm) / (2.0 * np.pi * massi_tmp * T) ) log_broglie3_rho = np.log(Lambda**3 * rhoi) if np.isnan(np.sum(np.sum(xi_tmp * log_broglie3_rho, axis=1))): raise ValueError( "Aideal has values of zero when taking the log. All mole fraction values " "should be nonzero. Mole fraction: {}".format(xi_tmp) ) else: Aideal = np.sum(xi_tmp * log_broglie3_rho, axis=1) - 1.0 return Aideal