From d0eb269d60c22b3095cf455e3118020a37f78876 Mon Sep 17 00:00:00 2001 From: Yoel Date: Wed, 25 Sep 2024 12:35:44 -0500 Subject: [PATCH] add feed vapor fraction as an input --- biosteam/units/fluidized_catalytic_cracking.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/biosteam/units/fluidized_catalytic_cracking.py b/biosteam/units/fluidized_catalytic_cracking.py index a6c883c6..e3a32015 100644 --- a/biosteam/units/fluidized_catalytic_cracking.py +++ b/biosteam/units/fluidized_catalytic_cracking.py @@ -46,8 +46,10 @@ class FluidizedCatalyticCracking(bst.Unit): def _init( self, reaction, + bulk_reactant=None, vessel_material=None, feed_pressure=None, + feed_vapor_fraction=None, catalyst_to_feed_ratio=None, spent_catalyst_to_feed_ratio=None, product_loss=None, @@ -69,10 +71,13 @@ def _init( vessel_material = 'Stainless steel 316' if feed_pressure is None: feed_pressure = 2 * 101325 # Can operate at a low pressure, but must accomodate pressure drop + if feed_vapor_fraction is None: + feed_vapor_fraction = 0 if catalyst_to_feed_ratio is None: catalyst_to_feed_ratio = 5 # by weight if spent_catalyst_to_feed_ratio is None: # TODO: Find value + # Mitias recommends (rule of thumb) spent_catalyst_to_feed_ratio = 1e-6 # by weight; Value is abitrary for now if product_loss is None: product_loss = 0.5e-2 @@ -103,6 +108,7 @@ def _init( if regenerator_pressure is None: regenerator_pressure = 282685 # 40 psig self.reaction = reaction + self.bulk_reactant = bulk_reactant self.vessel_material = vessel_material self.feed_pressure = feed_pressure self.catalyst_to_feed_ratio = catalyst_to_feed_ratio @@ -121,6 +127,7 @@ def _init( self.regenerator_catalyst_residence_time = regenerator_catalyst_residence_time self.regenerator_length_to_diameter = regenerator_length_to_diameter self.regenerator_pressure = regenerator_pressure + self.feed_vapor_fraction = feed_vapor_fraction @property def feed(self): return self.ins[0] @@ -148,7 +155,7 @@ def _setup(self): 'pump', bst.Pump, ins=self.feed, P=self.feed_pressure, ) self.auxiliary( - 'feed_preheater', bst.HXutility, ins=pump-0, V=0, rigorous=True, + 'feed_preheater', bst.HXutility, ins=pump-0, V=self.feed_vapor_fraction, rigorous=True, ) self.auxiliary( 'air_compressor', bst.IsentropicCompressor, ins=self.air, P=self.regenerator_pressure, @@ -173,10 +180,16 @@ def _run(self): product.P = self.feed_pressure - self._estimate_reactor_pressure_drop() flue_gas.P = discarded_catalyst.P = self.regenerator_pressure - self._estimate_regenerator_pressure_drop() product.mol = feed.mol + steam.mol + if self.bulk_reactant: + if self.reaction.X != 1: + raise RuntimeError('reaction extent must be 100% with bulk reactants') + model_reactant, reactants = self.bulk_reactant + F_reactant_mass = product.imass[reactants].sum() + product.imol[reactants] = 0 + product.imass[model_reactant] = F_reactant_mass product.phase = 'g' flue_gas.phase = 'g' self.reaction(product) - # Product loss will dictate temperature of recirculated catalyst product.split_to(flue_gas, product, self.product_loss, energy_balance=False) product_loss = flue_gas.mol.copy()