Source code for rtdpy.pfr

"""PFR model."""

import numpy as np

from rtdpy.rtd import RTD, RTDInputError


[docs]class Pfr(RTD): """ Create Plug Flow Reactor (PFR) Residence Time Distribution (RTD) model. [1]_ .. math:: E(t) = \\delta\\left(t-\\tau\\right) Parameters ---------- tau : scalar Mean residence time of PFR. ``tau>0`` dt : scalar Time step for RTD. ``dt>0`` time_end : scalar End time for RTD. ``time_end>0`` References ---------- .. [1] Levenspiel O. (1999) "Chemical Reaction Engineering: Third Edition" John Wiley & Sons, Inc. Examples -------- >>> import matplotlib.pyplot as plt >>> import rtdpy >>> a = rtdpy.Pfr(tau=1, dt=.01, time_end=3) >>> plt.plot(a.time, a.exitage) >>> plt.xlabel('Time') >>> plt.ylabel('Exit Age Function') >>> plt.show() """ def __init__(self, tau, dt, time_end): super().__init__(dt, time_end) if tau <= 0: raise RTDInputError("tau less than 0") if tau >= self.time[-1]: raise RTDInputError( "PFR lag is at or beyond end of supplied time") self._tau = tau self._exitage = self._calc_exitage() def _calc_exitage(self): """Calculate exitage.""" a = np.zeros_like(self.time) idx = np.nonzero(self.time <= self.tau) idxfirst = idx[0][-1] if idxfirst == self.time.size: raise RTDInputError('PFR lag is at end of supplied time') a[idxfirst] = (self.time[idxfirst + 1] - self.tau) / self.dt / self.dt a[idxfirst + 1] = (self.tau - self.time[idxfirst]) / self.dt / self.dt return a @property def tau(self): """Tau. L/U""" return self._tau def __repr__(self): """Representation of object""" return ("Pfr(tau={}, dt={}, time_end={})".format( self.tau, self.dt, self.time_end))