Source code for biorefineries.biodiesel.units.transesterification

# -*- 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.
"""
"""
from biosteam import Unit
from biosteam.units.decorators import cost
from thermosteam.reaction import Reaction, ParallelReaction

__all__ = ('Transesterification',)

[docs] @cost('Volume', 'Reactor', CE=525.4, cost=15000, n=0.55, kW=1.5, BM=4.3,) class Transesterification(Unit): """ Create a transesterification reactor that converts 'TAG', 'DAG', 'MAG' and 'Methanol' to 'Biodiesel' and 'Glycerol'. Finds the amount of catalyst 'NaOCH3' required and consumes it to produce 'NaOH' and 'Methanol'. Parameters ---------- ins : stream sequence * [0] Lipid feed * [1] Methanol feed (includes catalyst) outs : stream Reactor effluent. efficiency : float Efficiency of conversion (on a 'Lipid' basis). excess_methanol : float Excess methanol fed in addition to the required stoichiometric amount. x_catalyst : float Catalyst molar fraction in methanol feed. T : float Operating temperature [K]. """ _bounds = {'Volume': (0.1, 20)} _units = {'Volume': 'm^3'} _tau = 1 _N_ins = 2 _N_outs = 1 def _get_design_info(self): return (('Residence time', self.tau, 'hr'), ('Conversion efficiency', self.efficiency, ''), ('Working volume fraction', 0.8, '')) def __init__(self, ID='', ins=None, outs=(), *, efficiency=None, excess_methanol, T, x_catalyst, transesterification=None, ): Unit.__init__(self, ID, ins, outs) if transesterification is None: if efficiency is None: efficiency = 0.9 #: [:class:`~thermosteam.ParallelReaction`] Transesterification and catalyst consumption reactions. self.transesterification = ParallelReaction([ Reaction('MAG + Methanol -> Biodiesel + Glycerol', reactant='MAG', X=efficiency), Reaction('DAG + 2Methanol -> 2Biodiesel + Glycerol', reactant='DAG', X=efficiency), Reaction('TAG + 3Methanol -> 3Biodiesel + Glycerol', reactant='TAG', X=efficiency), ]) else: self.transesterification = transesterification self.catalyst_dissolution = Reaction('NaOCH3 -> NaOH + Methanol', reactant='NaOCH3', X=1) self.x_catalyst = x_catalyst #: [float] Catalyst molar fraction in methanol feed. self.excess_methanol = excess_methanol #: [float] Excess methanol fed in addition to the required stoichiometric amount. self.T = T #: [float] Operating temperature (K). @property def tau(self): """Residence time (hr).""" return self._tau @tau.setter def tau(self, tau): self._tau = tau @property def efficiency(self): """Transesterification efficiency.""" return self.transesterification.X.mean() @efficiency.setter def efficiency(self, efficiency): self.transesterification.X[:] = efficiency def _run(self): feed, methanol = self.ins product, = self.outs x_catalyst = self.x_catalyst x_methanol = 1. - x_catalyst required_methanol = 1. + self.excess_methanol methanol.imol['Methanol'] = x_methanol * required_methanol * ( feed.imol['MAG'] + 2 * feed.imol['DAG'] + 3 * feed.imol['TAG'] ) methanol.imol['NaOCH3'] = x_catalyst / x_methanol * methanol.imol['Methanol'] product.mix_from([feed, methanol], energy_balance=False) self.transesterification(product) self.catalyst_dissolution(product) product.T = self.T def _design(self): effluent = self._outs[0] self.design_results['Volume'] = self._tau * effluent.F_vol / 0.8 self.add_heat_utility(self.Hnet, effluent.T)