Source code for rtdpy.ad_oo

import numpy as np
from rtdpy.rtd import RTD, RTDInputError


[docs]class AD_oo(RTD): """ Create Axial Dispersion with open-open boundary conditions Residence Time Distribution (RTD) model. [1]_ .. math:: E(t) = \\frac{\\sqrt{Pe}}{\\tau\\sqrt{4\\pi\\theta}} \\text{exp}\\left[\\frac{-Pe \\left(1-\\theta\\right)^2} {4\\theta}\\right]\\\\ \\theta = t/\\tau Parameters ---------- tau : scalar L/U, not the mean residence time, see tau_oo. ``tau>0`` peclet : scalar Reactor Peclet number (L*U/D). ``peclet>0`` dt : scalar Time step for RTD. ``dt>0`` time_end : scalar End time for RTD. ``time_end>0`` Notes ----- The mean residence time for an open-open system is not tau. Mean residence time is :math:`\\tau_{oo} = (1+2/Pe)*\\tau`. References ---------- .. [1] Levenspiel O., Smith W.K. (1957) Notes on the diffusion-type model for the longitudinal mixing of fluids in flow. "Chemical Engineering Science", 6, 227-233 Examples -------- >>> import matplotlib.pyplot as plt >>> import rtdpy >>> for pe in [10, 100]: ... a = rtdpy.AD_oo(tau=1, peclet=pe, dt=.01, time_end=3) ... plt.plot(a.time, a.exitage, label=f"peclet={pe}") >>> plt.xlabel('Time') >>> plt.ylabel('Exit Age Function') >>> plt.legend() >>> plt.show() """ def __init__(self, tau, peclet, dt, time_end): super().__init__(dt, time_end) if tau <= 0: raise RTDInputError('tau less than zero') self._tau = tau if peclet <= 0: raise RTDInputError('peclet less than zero') self._peclet = peclet self._exitage = self._calc_exitage() def _calc_exitage(self): theta_safe = np.clip(self.theta, np.finfo(float).eps, None) output = (1 / self.tau / np.sqrt(4. * np.pi * theta_safe / self.peclet) * np.exp( -(1. - theta_safe) ** 2 / (4. * theta_safe / self.peclet))) return output @property def theta(self): """Dimensionless time.""" return self.time / self.tau @property def peclet(self): """Peclet number.""" return self._peclet @property def tau(self): """Tau.""" return self._tau @property def tau_oo(self): """ Mean Residence Time for open-open system. Not tau for open-open. .. math: tau_oo = (1 + 2/Pe) tau """ return (1. + 2. / self.peclet) * self.tau def __repr__(self): """Returns representation of object""" return ("AD_oo(tau={}, peclet={}, dt={}, time_end={})".format( self.tau, self.peclet, self.dt, self.time_end))