Source code for openpnm.models.phase.mixtures._funcs

import numpy as np
from openpnm.models.phase import _phasedocs


__all__ = [
    'salinity',
    'mixing_rule',
    'mole_summation',
    'from_component',
    'mole_to_mass_fraction',
]


[docs] @_phasedocs def salinity( phase, T='pore.temperature', conc='pore.concentration', ): r""" Calculates the salinity in g salt per kg of solution from concentration Parameters ---------- %(phase)s %(T)s %(conc)s Returns ------- salinity : ndarray The salinity in g of solute per kg of solution. Notes ----- This model is useful for converting known concentration values (e.g. calculated by a transport algorithm) into salinity values, which can then be used for finding other physical properties of water which are available as a function of salinity. The salinity correlations are valid for salinity up to 160 g/kg, which corresponds to a concentration of 0.05 mol/L (assuming NaCl is the only solute) """ C = phase[conc] T = phase[T] a = 8.73220929e+00 b = 6.00389629e+01 c = -1.19083743e-01 d = -1.77796042e+00 e = 3.26987130e-04 f = -1.09636011e-01 g = -1.83933426e-07 S = a + b*C + c*T + d*C**2 + e*T**2 + f*C**3 + g*T**3 return S
[docs] @_phasedocs def mixing_rule( phase, prop, mode='logarithmic', power=1, ): r""" Computes the property of a mixture using the specified mixing rule Parameters ---------- %(phase)s prop : str The dictionary key containing the property of interest on each component mode : str The mixing rule to to use. Options are: ============== ======================================================== mode ============== ======================================================== 'logarithmic' (default) Uses the natural logarithm of the property as: :math:`ln(z) = \Sigma (x_i \cdot ln(\z_i))` 'linear' Basic mole fraction weighting of the form :math:`z = \Sigma (x_i \cdot \z_i)` 'power Applies an exponent to the property as: :math:`\z^{power} = \Sigma (x_i \cdot \z_i^{power})` ============== ======================================================== power : scalar If ``mode='power'`` this indicates the value of the exponent, otherwise this is ignored. """ xs = phase['pore.mole_fraction'] ys = phase.get_comp_vals(prop) z = 0.0 if mode == 'logarithmic': for i in xs.keys(): z += xs[i]*np.log(ys[i]) z = np.exp(z) elif mode in ['linear', 'simple']: for i in xs.keys(): z += xs[i]*ys[i] elif mode == 'power': for i in xs.keys(): z += xs[i]*ys[i]**power z = z**(1/power) return z
[docs] @_phasedocs def mole_to_mass_fraction( phase, MWs='param.molecular_weight' ): r""" Computes the mass fraction in each pore Parameters ---------- %(phase)s %(MWs)s Returns ------- ws : ndarray An ndarray containing the mass fraction in each pore computed from the mole fractions of each component and their molecular weights. """ xs = phase['pore.mole_fraction'] MW = phase.get_comp_vals(MWs) num = [xs[k]*MW[k] for k in xs.keys()] denom = np.sum(num, axis=0) ws = num/denom comps = list(phase.components.keys()) d = {comps[i]: ws[i, :] for i in range(len(comps))} return d
[docs] @_phasedocs def mole_summation(phase): r""" Computes total mole fraction in each pore given component values Parameters ---------- %(phase)s Returns ------- vals : ND-array An ND-array containing the total mole fraction. Note that this is not guaranteed to sum to 1.0. """ xs = [phase['pore.mole_fraction.' + c.name] for c in phase.components.values()] if len(xs) > 0: xs = np.sum(xs, axis=0) else: xs = np.nan return xs
[docs] @_phasedocs def from_component(phase, prop, compname): r""" Fetches the given values from the specified object Parameters ---------- %(phase)s prop : str The name of the array to retreive compname : str The name of the object possessing the desired data Returns ------- vals : ND-array An ND-array containing the request data """ comp = phase.project[compname] vals = comp[prop] return vals