batch#

General functional algorithms for batch design.

size_batch(F_vol, tau_reaction, tau_cleaning, V_wf, V_max=None, N_reactors=None, loading_time=None)[source]#

Solve for batch reactor volume, cycle time, and loading time.

Parameters:
  • F_vol (float) – Volumetric flow rate.

  • tau_reaction (float) – Reaction time.

  • tau_cleaning (float) – Cleaning in place time.

  • V_wf (float) – Fraction of working volume.

  • V_max (int) – Maximum volume of a reactor.

  • N_reactors (int) – Number of reactors.

  • loading_time – Loading time of batch reactor. If not given, it will assume each vessel is constantly being filled.

Returns:

  • ‘Reactor volume’: float

  • ’Batch time’: float

  • ’Loading time’: float

Return type:

dict

Notes

By assuming no downtime, the total volume of all reactors is:

\[V_T = F_{vol}(\tau_{reaction} + \tau_{cleaning} + \tau_{loading})\]

where \(V_T\) is the total volume required, \(F_{vol}\) is the volumetric flow rate of the feed, \(\tau_{reaction}\) is the reaction time, \(\tau_{cleaning}\) is the cleaning and unloading time, and \(\tau_{loading}\) is the time required to load a vessel. This equation makes the conservative assumption that no reaction takes place when the tank is being filled.

The number of reactors is:

\[N_{reactors} = ceil(\frac{V_T}{V_{max} \cdot V_{wf}})\]

where \(N_{reactors}\) is the number of reactor vessels, \(V_{max}\) is the maximum reactor volume, and \(V_{wf}\) is the fraction of working volume in a reactor.

The working volume of an individual reactor is:

\[V_{i,working} = \frac{V_T}{N_{reactors}}\]

If there is no upstream storage and a vessel is constantly being filled, the time required to load a reactor is:

\[\tau_{loading} = \frac{V_{i,working}}{F_{vol}}\]

Note that the actual volume of a reactor is:

\[V_i = \frac{V_{i,working}}{f}\]

Plugging in and solving for the total volume, \(V_{T}\), we have:

\[V_T = F_{vol}\frac{\tau_{reaction} + \tau_{cleaning}}{1 - \frac{1}{N_{reactors}}}\]

If the number of reactors is specified but not the loading time, \(V_T\) is first calculated, then \(V_{i, working}\), \(\tau_{loading}\), and \(V_i\).

If neither the number of reactors nor the loading time are specified, we solve the equations iteratively until \(\tau_{loading}\) converges.

If the loading time is given but not the number of reactors, then the equation for \(tau_{loading}\) does not apply and we first compute \(N_reactors\) given :math:`V_{max}.

Units of measure may vary so long as they are consistent. The loading time can be considered the cycle time in this scenario.

Examples

Size batch given a maximum reactor volume of 1,000 m3 and zero loading time:

>>> from biosteam.units.design_tools import size_batch
>>> F_vol = 1e3; tau_reaction = 30; tau_cleaning = 3; V_wf = 0.95
>>> size_batch(
...     F_vol, tau_reaction, tau_cleaning, V_wf,
...     V_max=1e3, loading_time=0
... )
{'Reactor volume': 992.48,
 'Batch time': 33,
 'Loading time': 0,
 'Number of reactors': 35}

Size batch given 35 reactors and zero loading time:

>>> size_batch(
...     F_vol, tau_reaction, tau_cleaning, V_wf,
...     N_reactors=35, loading_time=0
... )
{'Reactor volume': 992.48,
 'Batch time': 33,
 'Loading time': 0,
 'Number of reactors': 35}

Size batch given a maximum reactor volume of 1,000 m3 and assume the constant loading:

>>> size_batch(
...     F_vol, tau_reaction, tau_cleaning, V_wf,
...     V_max=1000,
... )
{'Reactor volume': 992.6900584795799, 'Batch time': 33.95000000000163, 'Loading time': 0.950000000001627, 'Number of reactors': 36}

Size batch given 36 reactors and assume the constant loading:

>>> size_batch(
...     F_vol, tau_reaction, tau_cleaning, V_wf,
...     N_reactors=36
... )
{'Reactor volume': 992.4812030075188,
 'Batch time': 33.94285714285714,
 'Loading time': 0.9428571428571428,
 'Number of reactors': 36}