Hydroprocessing¶

QSDsan: Quantitative Sustainable Design for sanitation and resource recovery systems

This module is developed by:

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

saf systems

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