Source code for thermosteam.mixture.mixture_builders

# -*- coding: utf-8 -*-
# BioSTEAM: The Biorefinery Simulation and Techno-Economic Analysis Modules
# Copyright (C) 2020, Yoel Cortes-Pena <yoelcortes@gmail.com>
# 
# This module is under the UIUC open-source license. See 
# github.com/BioSTEAMDevelopmentGroup/biosteam/blob/master/LICENSE.txt
# for license details.
"""
All Mixture object builders.

"""
from ..base import PhaseMixtureHandle
from .ideal_mixture_model import IdealMixtureModel
from .mixture import Mixture

__all__ = ('ideal_mixture',)

# %% Functions

def group_handles_by_phase(phase_handles):
    hasfield = hasattr
    getfield = getattr
    iscallable = callable
    handles_by_phase = {'s': [],
                        'l': [],
                        'g': []}
    for phase, handles in handles_by_phase.items():
        for phase_handle in phase_handles:
            if iscallable(phase_handle) and hasfield(phase_handle, phase):
                prop = getfield(phase_handle, phase)
            else:
                prop = phase_handle
            handles.append(prop)
    return handles_by_phase
    
def build_ideal_PhaseMixtureHandle(chemicals, var):
    setfield = object.__setattr__
    getfield = getattr
    phase_handles = [getfield(i, var) for i in chemicals]
    new = PhaseMixtureHandle.__new__(PhaseMixtureHandle)
    for phase, handles in group_handles_by_phase(phase_handles).items():
        setfield(new, phase, IdealMixtureModel(handles, var))
    setfield(new, 'var', var)
    return new

# %% Ideal mixture model builder 

[docs]def ideal_mixture(chemicals, include_excess_energies=False): """ Create a Mixture object that computes mixture properties using ideal mixing rules. Parameters ---------- chemicals : Chemicals For retrieving pure component chemical data. include_excess_energies=False : bool Whether to include excess energies in enthalpy and entropy calculations. See also -------- :class:`~.mixture.Mixture` :class:`~.IdealMixtureModel` Examples -------- >>> from thermosteam import Chemicals >>> from thermosteam.mixture import ideal_mixture >>> chemicals = Chemicals(['Water', 'Ethanol']) >>> ideal_mixture_model = ideal_mixture(chemicals) >>> ideal_mixture_model.Hvap([0.2, 0.8], 350) 39601.089191849824 """ chemicals = tuple(chemicals) getfield = getattr Cn = build_ideal_PhaseMixtureHandle(chemicals, 'Cn') H = build_ideal_PhaseMixtureHandle(chemicals, 'H') S = build_ideal_PhaseMixtureHandle(chemicals, 'S') H_excess = build_ideal_PhaseMixtureHandle(chemicals, 'H_excess') S_excess = build_ideal_PhaseMixtureHandle(chemicals, 'S_excess') mu = build_ideal_PhaseMixtureHandle(chemicals, 'mu') V = build_ideal_PhaseMixtureHandle(chemicals, 'V') kappa = build_ideal_PhaseMixtureHandle(chemicals, 'kappa') Hvap = IdealMixtureModel([getfield(i, 'Hvap') for i in chemicals], 'Hvap') sigma = IdealMixtureModel([getfield(i, 'sigma') for i in chemicals], 'sigma') epsilon = IdealMixtureModel([getfield(i, 'epsilon') for i in chemicals], 'epsilon') return Mixture('ideal mixing', Cn, H, S, H_excess, S_excess, mu, V, kappa, Hvap, sigma, epsilon, include_excess_energies)