Source code for biosteam.units.design_tools.batch

# -*- coding: utf-8 -*-
# BioSTEAM: The Biorefinery Simulation and Techno-Economic Analysis Modules
# Copyright (C) 2020-2023, 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.
"""
General functional algorithms for batch design.

"""

__all__ = ('size_batch',)

[docs] def size_batch(F_vol, tau_reaction, tau_cleaning, N_reactors, V_wf) -> dict: r""" 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. N_reactors : int Number of reactors. V_wf : float Fraction of working volume. Returns ------- dict * 'Reactor volume': float * 'Batch time': float * 'Loading time': float Notes ----- By assuming no downtime, the total volume of all reactors is: .. math:: V_T = F_{vol}(\tau_{reaction} + \tau_{cleaning} + \tau_{loading}) where :math:`V_T` is the total volume of all reactors, :math:`F_{vol}` is the volumetric flow rate of the feed, :math:`\tau_{reaction}` is the reaction time, :math:`\tau_{cleaning}` is the cleaning and unloading time, and :math:`\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 working volume of an individual reactor is: .. math:: V_{i,working} = \frac{V_T}{N_{reactors}} where :math:`N_{reactors}` is the number of reactor vessels. The time required to load a reactor (assuming no downtime) is: .. math:: \tau_{loading} = \frac{V_{i,working}}{F_{vol}} Note that the the actual volume of a reactor is: .. math:: V_i = \frac{V_{i,working}}{f} where f is the fraction of working volume in a reactor. Plugging in and solving for the total volume, :math:`V_{T}`, we have: .. math:: V_T = F_{vol}\frac{\tau_{reaction} + \tau_{cleaning}}{1 - \frac{1}{N_{reactors}}} Using this equation, :math:`V_T` is first calculated, then :math:`V_{i, working}`, :math:`\tau_{loading}`, and :math:`V_i`. Units of measure may vary so long as they are consistent. The loading time can be considered the cycle time in this scenario. """ # Total volume of all reactors, assuming no downtime V_T = F_vol * (tau_reaction + tau_cleaning) / (1 - 1 / N_reactors) # Volume of an individual reactor V_i = V_T/N_reactors # Time required to load a reactor tau_loading = V_i/F_vol # Total batch time tau_batch = tau_reaction + tau_cleaning + tau_loading # Account for excess volume V_i /= V_wf return {'Reactor volume': V_i, 'Batch time': tau_batch, 'Loading time': tau_loading}