Hydroprocessing¶
QSDsan: Quantitative Sustainable Design for sanitation and resource recovery systems
This module is developed by:
Yalin Li <mailto.yalin.li@gmail.com>
Jianan Feng <jiananf2@illinois.edu>
This module is under the University of Illinois/NCSA Open Source License. Please refer to https://github.com/QSD-Group/QSDsan/blob/main/LICENSE.txt for license details.
- class qsdsan.unit_operations.static._hydroprocessing.Hydroprocessing(ID='', ins: Sequence[AbstractStream] | None = None, outs: Sequence[AbstractStream] | None = (), thermo=None, init_with='Stream', include_construction=False, T=724.15, P=7134008.172, inf_T=None, WHSV=0.625, catalyst_lifetime=39600, catalyst_ID='HC_catalyst', hydrogen_rxned_to_inf_oil=0.01125, hydrogen_ratio=5.556, include_PSA=False, PSA_efficiency=0.9, gas_yield=0.0451, oil_yield=0.9549000000000001, gas_composition={'CH4': 0.0063, 'CO2': 0.0388}, oil_composition={'C10H22': 0.11756, 'C11H24': 0.16846, 'C12H26': 0.13198, 'C13H28': 0.09302, 'C14H30': 0.04643, 'C15H32': 0.0325, 'C16H34': 0.01923, 'C17H36': 0.00431, 'C18H38': 0.00099, 'C19H40': 0.00497, 'C20H42': 0.00033, 'C9H20': 0.09086, 'CYCHEX': 0.03714, 'HEPTANE': 0.11474, 'HEXANE': 0.01111, 'OCTANE': 0.08125}, aqueous_composition={'H2O': 1}, internal_heat_exchanging=True, use_decorated_cost='Hydrocracker', dynamic_V_wf=False, tau=5, V_wf=0.4, length_to_diameter=2, diameter=None, N=None, V=None, auxiliary=False, mixing_intensity=None, kW_per_m3=0, wall_thickness_factor=1.5, vessel_material='Stainless steel 316', vessel_type='Vertical')¶
General fuel-upgrading reactor (hydrocracking, hydrotreating, or similar): influent oil mixed with H2 reacts at elevated temperature and pressure to produce a single upgraded effluent stream (mixed gas/oil/aqueous phases, blended per gas_yield/oil_yield/aq_yield and their respective composition dicts). Co-product includes spent catalyst.
On reaction exotherm: this class does NOT credit the hydroprocessing reaction’s own exotherm against inf_hx’s heating duty by default – inf_hx costs the full sensible heat needed to bring both the influent oil and hydrogen up to T (see inf_T below for the opt-in mechanism to change this). This is a deliberate choice because this class’s yields/compositions (gas_yield/oil_yield/aqueous_composition/etc.) are empirically-fit mass fractions across many named product species, not derived from a mass/atom-balanced stoichiometric reaction. Therefore, computing the reaction’s real heat of reaction from each component’s tabulated heat of formation (self.Hnet) is not reliable. If a more accurate influent temperature is known, supply it via inf_T instead.
- Parameters:
ins (Iterable(stream)) – Influent oil, hydrogen, catalyst_in.
outs (Iterable(stream)) – Effluent (oil + gas + aqueous, blended), catalyst_out.
T (float) – Reaction temperature, [K].
P (float) – Reaction pressure, [Pa]; also the hydrogen compressor’s target pressure.
inf_T (float or None) – Influent preheat temperature, [K]; if provided, both the oil and hydrogen streams (fresh + recycled) are heated only to inf_T (not T) before entering the reactor, and the remaining temperature rise from inf_T to T is treated as coming from the reaction’s own heat of reaction (uncosted). Defaults to None (no credit; both streams effectively heated straight to T, matching this class’s historical behavior).
WHSV (float) – Weight hourly space velocity, [kg feed/hr/kg catalyst].
catalyst_lifetime (float) – Catalyst lifetime, [hr].
catalyst_ID (str) – ID of the catalyst.
hydrogen_rxned_to_inf_oil (float) – Reacted H2 to influent oil mass ratio.
hydrogen_ratio (float) – Total hydrogen amount = hydrogen_rxned_to_inf_oil * hydrogen_ratio; excess hydrogen not recovered by the (optional) PSA leaves with the effluent.
include_PSA (bool) – Whether to include a pressure swing adsorption (PSA) unit to recover excess H2.
PSA_efficiency (float) – H2 recovery efficiency of the PSA unit; forced to 0 if include_PSA is False.
gas_yield (float) – Mass ratio of fuel gas to the sum of influent oil and reacted H2.
oil_yield (float) – Mass ratio of treated oil to the sum of influent oil and reacted H2.
gas_composition (dict) – Composition of the gas fraction (excluding excess H2), normalized to 100% sum.
oil_composition (dict) – Composition of the treated-oil fraction, normalized to 100% sum.
aqueous_composition (dict) – Composition of the aqueous fraction, normalized to 100% sum.
internal_heat_exchanging (bool) – If True, use the effluent to preheat the influent before the reactor.
use_decorated_cost (str) – ‘Hydrocracker’ or ‘Hydrotreater’ to use the corresponding literature decorated cost; any other value uses generic Reactor/PressureVessel costing.
Examples
>>> from qsdsan import Component, Components, set_thermo, Stream >>> from qsdsan.unit_operations import Hydroprocessing >>> catalyst = Component('Catalyst', phase='s', particle_size='Particulate', ... degradability='Undegradable', organic=False, formula='Al2O3') >>> _ = catalyst.default() >>> cmps = Components([ ... Component('Octane', search_ID='Octane', particle_size='Soluble', ... degradability='Slowly', organic=True), ... Component('CH4', phase='g', particle_size='Dissolved gas', ... degradability='Slowly', organic=True), ... Component('CO2', phase='g', particle_size='Dissolved gas', ... degradability='Undegradable', organic=False), ... Component('H2', phase='g', particle_size='Dissolved gas', ... degradability='Undegradable', organic=False), ... Component('H2O', particle_size='Soluble', degradability='Undegradable', ... organic=False), ... catalyst, ... ]) >>> cmps.compile() >>> set_thermo(cmps) >>> oil = Stream('oil', Octane=100, units='kg/hr') >>> H2 = Stream('H2') >>> catalyst_in = Stream('catalyst_in', Catalyst=1, units='kg/hr', phase='s') >>> U1 = Hydroprocessing('U1', ins=(oil, H2, catalyst_in), outs=('eff', 'catalyst_out'), ... catalyst_ID='Catalyst', ... gas_composition={'CO2': 0.5, 'CH4': 0.5}, ... oil_composition={'Octane': 1}, ... aqueous_composition={'H2O': 1}) >>> U1.simulate() >>> round(U1.oil_yield + U1.gas_yield + U1.aq_yield, 6) 1.0 >>> sorted(set(type(u).__name__ for u in U1.auxiliary_units)) ['HXprocess', 'HXutility', 'IsothermalCompressor']
See also
References
- [1] Jones, S. B.; Zhu, Y.; Anderson, D. B.; Hallen, R. T.; Elliott, D. C.;
Schmidt, A. J.; Albrecht, K. O.; Hart, T. R.; Butcher, M. G.; Drennan, C.; Snowden-Swan, L. J.; Davis, R.; Kinchin, C. Process Design and Economics for the Conversion of Algal Biomass to Hydrocarbons: Whole Algae Hydrothermal Liquefaction and Upgrading; PNNL–23227, 1126336; 2014; https://doi.org/10.2172/1126336.
- property PSA_efficiency¶
[float] H2 recovery efficiency of the PSA unit, forced to 0 if include_PSA is False.
- property aq_yield¶
[float] Mass ratio of aqueous phase to the sum of influent oil and reacted H2. Read-only; derived as 1 - gas_yield - oil_yield (or 0 if their sum > 1).
- auxiliary_unit_names: tuple[str, ...] = ('compressor', 'hx', 'inf_hx', 'inf_hx_H2')¶
Auxiliary unit operation names.
- property eff_composition¶
[dict] Composition of the blended effluent, normalized to 100% sum.
- property gas_yield¶
[float] Mass ratio of fuel gas to the sum of influent oil and reacted H2. Setting this triggers renormalization: if gas_yield + oil_yield > 1, both are rescaled proportionally; otherwise aq_yield absorbs the remainder.
- line: str = 'Hydroprocessing'¶
class-attribute Name denoting the type of Unit class. Defaults to the class name of the first child class
- property oil_yield¶
[float] Mass ratio of treated oil to the sum of influent oil and reacted H2. Setting this triggers renormalization: if gas_yield + oil_yield > 1, both are rescaled proportionally; otherwise aq_yield absorbs the remainder.
- run()¶
Run mass and energy balance. This method also runs specifications user defined specifications unless it is being run within a specification (to avoid infinite loops).
See also
_run,specifications,add_specification,add_bounded_numerical_specification