Sludge Treatment

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.dynamic._sludge_treatment.Centrifuge(ID='', ins: Sequence[AbstractStream] | None = None, outs: Sequence[AbstractStream] | None = (), thermo=None, isdynamic=False, init_with='WasteStream', F_BM_default={'Bowl stainless steel': 1, 'Conveyor': 1, 'Pump': 1.1800826, 'Pump building': 1.1800826, 'Pumps': 1, 'Scraper': 1, 'Slab concrete': 1.0, 'Wall concrete': 1.0, 'Wall stainless steel': 1.0, 'v notch weir': 1}, thickener_perc=28, TSS_removal_perc=98, solids_feed_rate=70, g_factor=2500, rotational_speed=2500, LtoD=4, F_BM={'Bowl stainless steel': 1, 'Conveyor': 1, 'Pump': 1.1800826, 'Pump building': 1.1800826, 'Pumps': 1, 'Scraper': 1, 'Slab concrete': 1.0, 'Wall concrete': 1.0, 'Wall stainless steel': 1.0, 'v notch weir': 1}, polymer_dosage=20, h_cylindrical=2, h_conical=1, **kwargs)

Centrifuge based on BSM2 Layout.

Parameters:
  • ID (str) – ID for the Dewatering Unit. The default is ‘’.

  • ins (class:WasteStream) – Influent to the Dewatering Unit. Expected number of influent is 1.

  • outs (class:WasteStream) – Treated effluent and sludge.

  • thickener_perc (float) – The percentage of Suspended Sludge in the underflow of the dewatering unit.[1]

  • TSS_removal_perc (float) – The percentage of suspended solids removed in the dewatering unit.[1]

  • solids_feed_rate (float) – Rate of solids processed by one centrifuge in dry tonne per day (dtpd). Default value is 150 dtpd. [6]

  • g_factor (float) – Factor by which g (9.81 m/s2) is multiplied to obtain centrifugal acceleration. g_factor typically lies between 1500 and 3000. centrifugal acceleration = g * g_factor = k * (RPM)^2 * diameter [3]

  • rotational_speed (float) – rotational speed of the centrifuge in rpm. Typical rpm is between 2000-3000 rpm [MOP-8, PAGE 1733]

  • LtoD (The ratio of length to diameter of the centrifuge.) – The value typically lies between 3-4. [4]

  • polymer_dosage (float) – mass of polymer utilised (lb) per tonne of dry solid waste (lbs/tonne).[5] Depends on the type of influents, please refer to [5] for appropriate values. Default value of 20 lbs/tonne is taken from [5], based on Primary + WAS aerated undigested value.

  • h_cylindrical (float) – length of cylindrical portion of dewatering unit.

  • h_conical (float) – length of conical portion of dewatering unit.

References

[1] Gernaey, Krist V., Ulf Jeppsson, Peter A. Vanrolleghem, and John B. Copp. Benchmarking of control strategies for wastewater treatment plants. IWA publishing, 2014.

[2] Metcalf, Leonard, Harrison P. Eddy, and Georg Tchobanoglous. Wastewater engineering: treatment, disposal, and reuse. Vol. 4. New York: McGraw-Hill, 1991.

[3] Design of Municipal Wastewater Treatment Plants: WEF Manual of Practice No. 8 ASCE Manuals and Reports on Engineering Practice No. 76, Fifth Edition.

[4] https://www.alibaba.com/product-detail/Multifunctional-Sludge-Dewatering-Decanter-Centrifuge_1600285055254.html?spm=a2700.galleryofferlist.normal_offer.d_title.1cd75229sPf1UW&s=p

[5] United States Environmental Protection Agency (EPA) ‘Biosolids Technology Fact Sheet Centrifuge Thickening and Dewatering’

[6] San Diego (.gov) Chapter - 3 ‘Solids Treatment Facility’ (https://www.sandiego.gov/sites/default/files/legacy/mwwd/pdf/mbc/chapterthree.pdf)

line: str = 'Centrifuge'

class-attribute Name denoting the type of Unit class. Defaults to the class name of the first child class

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

class qsdsan.unit_operations.dynamic._sludge_treatment.Incinerator(ID='', ins: Sequence[AbstractStream] | None = None, outs: Sequence[AbstractStream] | None = (), thermo=None, isdynamic=False, init_with='WasteStream', F_BM_default=None, process_efficiency=0.9, calorific_value_sludge=None, calorific_value_fuel=None, heating_value_basis='LHV', ash_component_ID='X_Ig_ISS', nitrogen_ID='S_N2', water_ID='H2O', carbon_dioxide_ID='S_CO2', oxygen_ID='S_O2', **kwargs)

Fluidized bed incinerator.

Parameters:
  • ID (str) – ID for the Incinerator Unit. The default is ‘’.

  • ins (class:WasteStream) – Influent to the Incinerator Unit. Expected number of influent streams are 3. Please remember the order of influents as {wastestream, air, fuel}

  • outs (class:WasteStream) – Flue gas and ash.

  • process_efficiency (float) – The process efficiency of the incinerator unit. Expected value between 0 and 1.

  • calorific_value_sludge (float, optional) – The calorific value of the dry sludge in KJ/kg. If None (default), calculated from the properties of the components.

  • calorific_value_fuel (float, optional) – The calorific value of the fuel in KJ/kg. If None (default), calculated from the properties of the components.

  • heating_value_basis (str) – Basis of the heats of combustion, ‘LHV’ (lower heating value, default) or ‘HHV’ (higher heating value).

  • ash_component_ID (str) – IDs of the ash, N2, H2O, CO2, and O2 components.

  • nitrogen_ID (str) – IDs of the ash, N2, H2O, CO2, and O2 components.

  • water_ID (str) – IDs of the ash, N2, H2O, CO2, and O2 components.

  • carbon_dioxide_ID (str) – IDs of the ash, N2, H2O, CO2, and O2 components.

  • oxygen_ID (str) – IDs of the ash, N2, H2O, CO2, and O2 components.

Notes

Complete combustion is assumed and calculated with BioSTEAM reactions (thermosteam.reaction.ParallelReaction, see combustion_reactions) on the mole flows of all influents, i.e., C becomes CO2, H becomes H2O, and N becomes N2. As the flows of components with measured_as are in the measured-as unit, moles are from their real mass (i_mass), which is correct with or without adjusting the components’ MW to the measured-as unit. The O2 needed is taken from the air and the excess is in the flue gas (a warning is raised if the air is not enough). Mineral solids and other elements go to the ash, and water, N2, CO2, and O2 pass through.

For each component, BioSTEAM’s combustion reaction (from its formula) is used when it is defined with the components of the system (and, for organic components, its O2 demand agrees with the component’s COD). Otherwise (e.g., ASM state variables with no formula, or components with P and metals), the reaction is from the component’s composition: the formula, or for components with no formula, the C and N contents together with the mass and COD (to solve for H and O); non-organic components with no formula go to the ash.

The energy balance (in kJ/hr, after simulation), similar to BioSTEAM’s biosteam.facilities.BoilerTurbogenerator, uses the heating values of the components (their LHV/HHV if neutral and available, otherwise estimated from the O2 consumed by their combustion with Thornton’s rule, i.e., 13.1 MJ of net heat per kg of O2 [3, 4]): heat_sludge, heat_fuel, and their sum heat_combustion; heat_air is the sensible heat of the air above 298.15 K; heat_flue_gas is process_efficiency times the heat input, and heat_loss is the rest. heat_evaporation is the energy to heat the water in the sludge to boiling and evaporate it, for reference.

Examples

>>> import qsdsan as qs
>>> cmps = qs.Components.load_default()
>>> CO2 = qs.Component.from_chemical('S_CO2', chemical='CO2',
...                                  particle_size='Soluble',
...                                  degradability='Undegradable',
...                                  organic=False)
>>> cmps_test = qs.Components([cmps.S_F, cmps.S_NH4, cmps.X_OHO, cmps.H2O,
...                            cmps.S_CH4, cmps.S_O2, cmps.S_N2, cmps.S_H2,
...                            cmps.X_Ig_ISS, CO2])
>>> cmps_test.default_compile(ignore_inaccurate_molar_weight=True)
>>> qs.set_thermo(cmps_test)
>>> ws = qs.WasteStream('ws', S_F=10, S_NH4=20, X_OHO=15, H2O=1000)
>>> natural_gas = qs.WasteStream('nat_gas', phase='g', S_CH4=1000)
>>> air = qs.WasteStream('air', phase='g', S_O2=1500, S_N2=4900)
>>> from qsdsan.unit_operations import Incinerator
>>> Inc = Incinerator(ID='Inc', ins= (ws, air, natural_gas),
...                   outs=('flu_gas', 'ash'),
...                   isdynamic=False)
>>> Inc.simulate()
>>> Inc.show()
Incinerator: Inc
ins...
[0] ws
phase: 'l', T: 298.15 K, P: 101325 Pa
flow (g/hr): S_F    1e+04
                S_NH4  2e+04
                X_OHO  1.5e+04
                H2O    1e+06
    WasteStream-specific properties:
     pH         : 7.0
     Alkalinity : 2.5 mmol/L
     COD        : 23916.5 mg/L
     BOD        : 14990.5 mg/L
     TC         : 8313.4 mg/L
     TOC        : 8313.4 mg/L
     TN         : 20400.3 mg/L
     TP         : 368.3 mg/L
     TK         : 68.4 mg/L
     TSS        : 11144.7 mg/L
[1] air
phase: 'g', T: 298.15 K, P: 101325 Pa
flow (g/hr): S_O2  1.5e+06
                S_N2  4.9e+06
    WasteStream-specific properties: None for non-liquid waste streams
[2] nat_gas
phase: 'g', T: 298.15 K, P: 101325 Pa
flow (g/hr): S_CH4  1e+06
    WasteStream-specific properties: None for non-liquid waste streams
outs...
[0] flu_gas
phase: 'g', T: 298.15 K, P: 101325 Pa
flow (g/hr): H2O    1.62e+06
                S_O2   4.29e+05
                S_N2   4.92e+06
                S_CO2  7.2e+05
    WasteStream-specific properties: None for non-liquid waste streams
[1] ash
phase: 's', T: 298.15 K, P: 101325 Pa
flow (g/hr): X_Ig_ISS  2.05e+03
    WasteStream-specific properties: None for non-liquid waste streams

The energy balance [kJ/hr] (rounded here to thousands):

>>> [round(i, -3) for i in (Inc.heat_sludge, Inc.heat_fuel, Inc.heat_flue_gas, Inc.heat_loss)]
[926000.0, 12541000.0, 12120000.0, 1347000.0]
>>> round(Inc.heat_evaporation, -3)
2570000.0

In a dynamic system, the unit’s algebraic equations give the same flows as static simulation:

>>> Inc_dyn = Incinerator(ID='Inc_dyn', outs=('flu_gas_dyn', 'ash_dyn'), isdynamic=True,
...                       ins=(ws.copy('ws_dyn'), air.copy('air_dyn'), natural_gas.copy('gas_dyn')))
>>> sys = qs.System('sys', path=(Inc_dyn,))
>>> sys.simulate(t_span=(0, 1), method='BDF')
>>> flue_gas, ash = Inc_dyn.outs
>>> [round(flue_gas.imass[i], 1) for i in ('S_CO2', 'S_N2', 'H2O', 'S_O2')]
[719.5, 4921.3, 1620.9, 429.3]
>>> round(ash.imass['X_Ig_ISS'], 1)
2.1

References

[1] Khuriati, A., P. Purwanto, H. S. Huboyo, Suryono Sumariyah, S. Suryono, and A. B. Putranto. “Numerical calculation based on mass and energy balance of waste incineration in the fixed bed reactor.” In Journal of Physics: Conference Series, vol. 1524, no. 1, p. 012002. IOP Publishing, 2020.

[2] Omari, Arthur, Karoli N. Njau, Geoffrey R. John, Joseph H. Kihedu, and Peter L. Mtui. “Mass And Energy Balance For Fixed Bed Incinerators A case of a locally designed incinerator in Tanzania.”

[3] Thornton, W. M. “The relation of oxygen to the heat of combustion of organic compounds.” Philosophical Magazine and Journal of Science, 6th series, vol. 33, pp. 196-203, 1917.

[4] Huggett, C. “Estimation of rate of heat release by means of oxygen consumption measurements.” Fire and Materials, vol. 4, no. 2, pp. 61-65, 1980 (13.1 MJ/kg O2, +/-5%).

property calorific_value_fuel

[float or NoneType] Calorific value of the fuel in KJ/kg, None to calculate from component properties.

property calorific_value_sludge

[float or NoneType] Calorific value of the dry sludge in KJ/kg, None to calculate from component properties.

property heating_value_basis

[str] Basis of the heats of combustion, ‘LHV’ (lower heating value) or ‘HHV’ (higher heating value).

line: str = 'Incinerator'

class-attribute Name denoting the type of Unit class. Defaults to the class name of the first child class

property process_efficiency

Process efficiency of incinerator.

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

class qsdsan.unit_operations.dynamic._sludge_treatment.Thickener(ID='', ins: Sequence[AbstractStream] | None = None, outs: Sequence[AbstractStream] | None = (), thermo=None, isdynamic=False, init_with='WasteStream', F_BM_default={'Bowl stainless steel': 1, 'Conveyor': 1, 'Pump': 1.1800826, 'Pump building': 1.1800826, 'Pumps': 1, 'Scraper': 1, 'Slab concrete': 1.0, 'Wall concrete': 1.0, 'Wall stainless steel': 1.0, 'v notch weir': 1}, thickener_perc=7, TSS_removal_perc=98, solids_loading_rate=4, h_thickener=4, downward_flow_velocity=36, F_BM={'Bowl stainless steel': 1, 'Conveyor': 1, 'Pump': 1.1800826, 'Pump building': 1.1800826, 'Pumps': 1, 'Scraper': 1, 'Slab concrete': 1.0, 'Wall concrete': 1.0, 'Wall stainless steel': 1.0, 'v notch weir': 1}, **kwargs)

Thickener based on BSM2 Layout.

Parameters:
  • ID (str) – ID for the Thickener. The default is ‘’.

  • ins (class:WasteStream) – Influent to the clarifier. Expected number of influent is 1.

  • outs (class:WasteStream) – Thickened sludge and effluent.

  • thickener_perc (float) – The percentage of solids in the underflow of the thickener.[1]

  • TSS_removal_perc (float) – The percentage of suspended solids removed in the thickener.[1]

  • solids_loading_rate (float) – Solid loading rate in the thickener in [(kg/hr)/m2]. Default is 4 kg/(m2*hr) [2] If the thickener is treating: Only Primary clarifier sludge, then expected range: 4-6 kg/(m2*hr) Only WAS (treated with air or oxygen): 0.5-1.5 kg/(m2*hr) Primary clarifier sludge + WAS: 1.5-3.5 kg/(m2/hr)

  • float (h_thickener =) – Side water depth of the thickener. Typically lies between 3-4 m. [2] Height of tank forming the thickener.

  • downward_flow_velocity (float, optional) – Speed on the basis of which center feed diameter is designed [m/hr]. [3] The default is 36 m/hr. (10 mm/sec)

  • F_BM (dict) – Equipment bare modules.

Examples

>>> from qsdsan import set_thermo, Components, WasteStream
>>> cmps = Components.load_default()
>>> cmps_test = cmps.subgroup(['S_F', 'S_NH4', 'X_OHO', 'H2O'])
>>> set_thermo(cmps_test)
>>> ws = WasteStream('ws', S_F = 10, S_NH4 = 20, X_OHO = 15, H2O=1000)
>>> from qsdsan.unit_operations import Thickener
>>> TC = Thickener(ID='TC', ins= (ws), outs=('sludge', 'effluent'))
>>> TC.simulate()
>>> sludge, effluent = TC.outs
>>> sludge.imass['X_OHO']/ws.imass['X_OHO']
0.98
>>> TC.show()
Thickener: TC
ins...
[0] ws
phase: 'l', T: 298.15 K, P: 101325 Pa
flow (g/hr): S_F    1e+04
                S_NH4  2e+04
                X_OHO  1.5e+04
                H2O    1e+06
    WasteStream-specific properties:
     pH         : 7.0
     Alkalinity : 2.5 mmol/L
     COD        : 23916.5 mg/L
     BOD        : 14990.5 mg/L
     TC         : 8313.4 mg/L
     TOC        : 8313.4 mg/L
     TN         : 20400.3 mg/L
     TP         : 368.3 mg/L
     TK         : 68.4 mg/L
     TSS        : 11144.7 mg/L
outs...
[0] sludge
phase: 'l', T: 298.15 K, P: 101325 Pa
flow (g/hr): S_F    1.56e+03
                S_NH4  3.12e+03
                X_OHO  1.47e+04
                H2O    1.56e+05
    WasteStream-specific properties:
     pH         : 7.0
     COD        : 95948.4 mg/L
     BOD        : 55752.4 mg/L
     TC         : 34693.6 mg/L
     TOC        : 34693.6 mg/L
     TN         : 24614.1 mg/L
     TP         : 1740.2 mg/L
     TK         : 413.6 mg/L
     TSS        : 67366.9 mg/L
[1] effluent
phase: 'l', T: 298.15 K, P: 101325 Pa
flow (g/hr): S_F    8.44e+03
                S_NH4  1.69e+04
                X_OHO  300
                H2O    8.44e+05
    WasteStream-specific properties:
     pH         : 7.0
     COD        : 9978.8 mg/L
     BOD        : 7103.3 mg/L
     TC         : 3209.0 mg/L
     TOC        : 3209.0 mg/L
     TN         : 19584.9 mg/L
     TP         : 102.9 mg/L
     TK         : 1.6 mg/L
     TSS        : 266.0 mg/L

References

[1] Gernaey, Krist V., Ulf Jeppsson, Peter A. Vanrolleghem, and John B. Copp. Benchmarking of control strategies for wastewater treatment plants. IWA publishing, 2014.

[2] Chapter-21: Solids Thicknening (Table 21.3). WEF Manual of Practice No. 8. 6th Edition. Virginia: McGraw-Hill, 2018.

[3] Introduction to Wastewater Clarifier Design by Nikolay Voutchkov, PE, BCEE.

[4] Metcalf, Leonard, Harrison P. Eddy, and Georg Tchobanoglous. Wastewater engineering: treatment, disposal, and reuse. Vol. 4. New York: McGraw-Hill, 1991.

property TSS_removal_perc

The percentage of suspended solids removed in the thickener

line: str = 'Thickener'

class-attribute Name denoting the type of Unit class. Defaults to the class name of the first child class

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

property solids_loading_rate

solids_loading_rate is the loading in the thickener

property thickener_perc

The percentage of suspended solids in the thickened sludge, in %.