Fermentation#
- class Fermentation(ID='', ins=None, outs=(), thermo=None, **kwargs)[source]#
Create a Fermentation object which models large-scale batch fermentation for the production of 1st generation ethanol using yeast [1] [2] [3] [4]. A compound with CAS ‘Yeast’ must be present. Only sucrose and glucose are taken into account for conversion. Conversion is based on reaction time, tau. Cleaning and unloading time, tau_0, fraction of working volume, V_wf, and number of reactors, N_reactors, are attributes that can be changed. Cost of a reactor is based on the NREL batch fermentation tank cost assuming volumetric scaling with a 6/10th exponent [5].
- Parameters:
ins (
Stream
], optional) – Inlet fluids to be mixed into the fermentor.outs (
Stream
], optional) –[0] Vent
[1] Effluent
tau (float) – Reaction time.
N (int, optional) – Number of batch reactors
V (float, optional) – Target volume of reactors [m^3].
T=305.15 (float) – Temperature of reactor [K].
P=101325 (float) – Operating pressure of reactor [Pa].
Nmin=2 (int) – Minimum number of fermentors.
Nmax=36 (int) – Maximum number of fermentors.
efficiency=0.9 (float, optional) – User enforced efficiency.
iskinetic=False (bool, optional) – If True, Fermenation.kinetic_model will be used.
Notes
Either N or V must be given.
Examples
Simulate a Fermentation object which models batch fermentation for the production of 1st generation ethanol using yeast.
>>> from biorefineries.cane import create_sugarcane_chemicals >>> from biosteam.units import Fermentation >>> from biosteam import Stream, settings >>> settings.set_thermo(create_sugarcane_chemicals()) >>> feed = Stream('feed', ... Water=1.20e+05, ... Glucose=1.89e+03, ... Sucrose=2.14e+04, ... DryYeast=1.03e+04, ... units='kg/hr', ... T=32+273.15) >>> F1 = Fermentation('F1', ... ins=feed, outs=('CO2', 'product'), ... tau=8, efficiency=0.90, N=8) >>> F1.simulate() >>> F1.show() Fermentation: F1 ins... [0] feed phase: 'l', T: 305.15 K, P: 101325 Pa flow (kmol/hr): Water 6.66e+03 Glucose 10.5 Sucrose 62.5 Yeast 456 outs... [0] CO2 phase: 'g', T: 305.15 K, P: 101325 Pa flow (kmol/hr): Water 9.95 Ethanol 3.71 CO2 244 [1] product phase: 'l', T: 305.15 K, P: 101325 Pa flow (kmol/hr): Water 6.59e+03 Ethanol 240 Glucose 4.07 Yeast 532 >>> F1.results() Fermentation Units F1 Electricity Power kW 66.6 Cost USD/hr 5.2 Chilled water Duty kJ/hr -1.41e+07 Flow kmol/hr 9.42e+03 Cost USD/hr 70.3 Design Reactor volume m3 247 Batch time hr 12.6 Loading time hr 1.57 Number of reactors 8 Recirculation flow rate m3/hr 17.7 Reactor duty kJ/hr -1.41e+07 Cleaning and unloading time hr 3 Working volume fraction 0.9 Purchase cost Heat exchangers (x8) USD 1.57e+05 Reactors (x8) USD 1.87e+06 Agitators (x8) USD 1.17e+05 Cleaning in place USD 8.89e+04 Recirculation pumps (x8) USD 1.26e+05 Total purchase cost USD 2.36e+06 Utility cost USD/hr 75.5 >>> F1.results() Fermentation Units F1 Electricity Power kW 66.6 Cost USD/hr 5.2 Chilled water Duty kJ/hr -1.41e+07 Flow kmol/hr 9.42e+03 Cost USD/hr 70.3 Design Reactor volume m3 247 Batch time hr 12.6 Loading time hr 1.57 Number of reactors 8 Recirculation flow rate m3/hr 17.7 Reactor duty kJ/hr -1.41e+07 Cleaning and unloading time hr 3 Working volume fraction 0.9 Purchase cost Heat exchangers (x8) USD 1.57e+05 Reactors (x8) USD 1.87e+06 Agitators (x8) USD 1.17e+05 Cleaning in place USD 8.89e+04 Recirculation pumps (x8) USD 1.26e+05 Total purchase cost USD 2.36e+06 Utility cost USD/hr 75.5
References
-
line:
str
= 'Fermentation'# class-attribute Name denoting the type of Unit class. Defaults to the class name of the first child class
- kinetic_constants = (0.31, 1.01, 1.88, 2.81, 82.8, 108.2, 113.4, 0.45, 0.18)#
tuple[float] Kinetic parameters for the kinetic model. Default constants are fitted for Oliveria’s model (mu_m1, mu_m2, Ks1, Ks2, Pm1, Pm2, Xm, Y_PS, a)
- static kinetic_model(z, t, *kinetic_constants)[source]#
Return change of yeast, ethanol, and substrate concentration in kg/m3.
- Parameters:
z (Iterable with (X, E, S) [-]:) –
X: Yeast concentration (kg/m3)
P: Ethanol concentration (kg/m3)
S: Substrate concentration (kg/m3)
t (float) – Time point
*kinetic_constants –
mu_m1: Maximum specific growth rate (1/hr)
mu_m2: Maximum specific ethanol production rate (g-product/g-cell-hr)
Ks1: Sugar saturation constant for growth (g/L)
Ks2: Sugar saturation constant for product (g/L)
Pm1: Maximum product concentration at zero growth [mu_m1=0] (g/L)
Pm2: Maximum product concentration [mu_m2=0] (g/L)
Xm: Maximum cell concentration [mu_m1=0] (g/L)
Y_PS: Ethanol yield based on sugar consumed
a: Toxic power
-
heat_utilities:
list
[HeatUtility
, ...]# All heat utilities associated to unit. Cooling and heating requirements are stored here (including auxiliary requirements).
-
power_utility:
PowerUtility
# Electric utility associated to unit (including auxiliary requirements).
-
F_BM:
dict
[str
,float
]# All bare-module factors for each purchase cost. Defaults to values in the class attribute
_F_BM_default
.
-
design_results:
dict
[str
, object]# All design requirements excluding utility requirements and detailed auxiliary unit requirements.
-
baseline_purchase_costs:
dict
[str
,float
]# All baseline purchase costs without accounting for design, pressure, and material factors.
-
purchase_costs:
dict
[str
,float
]# Itemized purchase costs (including auxiliary units) accounting for design, pressure, and material factors (i.e.,
F_D
,F_P
,F_M
). Items here are automatically updated at the end of unit simulation.
-
installed_costs:
dict
[str
,float
]# All installed costs accounting for bare module, design, pressure, and material factors. Items here are automatically updated at the end of unit simulation.
-
equipment_lifetime:
int
|dict
[str
,int
]# Lifetime of equipment. Defaults to values in the class attribute
_default_equipment_lifetime
. Use an integer to specify the lifetime for all items in the unit purchase costs. Use a dictionary to specify the lifetime of each purchase cost item.
-
run_after_specifications:
bool
# Whether to run mass and energy balance after calling specification functions