Granular Activated Carbon (GAC)
- This is an empirical, performance-based granular activated carbon (GAC) model that works under the following criteria and assumptions:
simulation of this unit model is only supported with the Multi-Component Aqueous Solution (MCAS) property package
supports a single liquid phase only
supports adsorption of a single solute species only while other species are considered inert
supports steady-state only
assumes isothermal conditions
model performance is independent of a gravity-fed or pressurized GAC unit, therefore assumes isobaric conditions
Introduction
The implemented model for estimating GAC performance is adapted from a simplified model originally presented in Hand, 1984 and further elaborated in Crittenden, 2012. This formulation is denoted as the constant-pattern homogeneous surface diffusion model (CPHSDM). As a GAC system is operated as a batch process, a mass transfer zone (MTZ) is formed in the bed where a concentration profile, or breakthrough curve, develops as a function of the adsorption properties. This MTZ is bounded by saturated GAC upstream and fresh GAC downstream. The CPHSDM is valid under the assumption that the shape of the MTZ is constant as it travels through the bed and a constant pattern solution (CPS) may be determined. The CPS is calculated through a multistep procedure utilizing common dimensionless groups applied in polynomial fits to determine performance. Therefore, coefficients used in the polynomial must be derived from experimental data of the intended system to produce valid results. Coefficients for common compounds treated by GAC may be found in both Hand, 1984 and Crittenden, 2012. The model is estimated to have within 10% error and therefore may be applied to bed lengths shorter than the minimum length determined by the CPHSDM within the error threshold (in addition to being applicable to bed lengths greater than the minimum length determined by the CPHSDM).
The batch operation results of the CPS are converted to approximate steady-state results for intuitive use of the model
for flowsheet purposes. A visualization of the transformation is provided in Figure 1. For a traditional breakthrough
curve the CPHSDM method calculates the single point, single conc_ratio_replace
and operational_time
, highlighted on the
breakthrough curve. This operational time is the amount of elapsed time after startup that the bed is refreshed with new
GAC adsorbent. Steady state concentration can be analogous to all of the effluent in this operational time being stored
as holdup, therefore the average concentration ratio is significantly less than concentration ratio at the time of
bed replacement, as many days pass before the start of the breakthrough. To approximate the average effluent
concentration in this time frame, the breakthrough curve is numerically integrated with the trapezoid rule. The curve is
discretized with respect to the concentration ratio instead of the (traditionally done ‘x’ variable) operational time
due to simplicity of solving the model equations.

Figure 1. Discretization of the breakthrough curve for the steady state approximation. The ratio of the shaded area
to the area left of the vertical dotted line corresponding to operational_time
is the calculated
conc_ratio_avg
. Expected values of conc_ratio_avg
are often less than 0.25 depending on the
conc_ratio_replace
setpoint.
Degrees of Freedom
In the default configuration of the GAC unit model there are 17 degrees of freedom in addition to the inlet state variables (i.e., temperature, pressure, component flowrates) that should be fixed for the model to be fully specified. In association with using the Freundlich adsorption isotherm and empirical model, the following 9 variables are almost always fixed and may be derived from experimental data:
Freundlich isotherm \(k\) parameter
Freundlich isotherm \(\frac{1}{n}\) parameter
Stanton number equation parameters \(a_0\) and \(a_1\) (Hand, 1984), (Crittenden, 1987)
throughput ratio equation parameters \(b_0\), \(b_1\), \(b_2\), \(b_3\) and \(b_4\) (Hand, 1984)
Additionally, the following 9 variables are traditionally fixed:
particle apparent density
particle diameter
empty bed contact time
bed voidage or particle bulk density
superficial velocity or bed length
effluent to inlet concentration ratio at operational time or steady state approximation of average effluent to inlet concentration ratio in operational time by trapezoid rule or bed volumes treated
surface diffusion coefficient
liquid phase film transfer coefficient
When setting the configuration options to calculate the surface diffusion coefficient and liquid phase film transfer coefficient, these respective variables are no longer specified and 4 newly introduced variables must be fixed. This excludes new variables or parameters that may be required to be specified within the property package when called by the GAC model. This is a net result of 19 degrees of freedom. Newly utilized variables that must be fixed include:
shape correction factor
particle porosity
tortuosity of the path that the adsorbate must take as compared to the radius
surface-to-pore diffusion flux ratio
Model Structure
The GAC model consists of 1 ControlVolume0DBlock (process_flow) for the process flow of the water treatment train. The process flow includes 2 StateBlocks (inlet and outlet) which are used for mass and momentum balances. It also includes 1 StateBlock (adsorbed) for the solute that is adsorbed into the GAC particles. The material removed in the adsorbed state block is simulated as liquid phase solute but should be interpreted as solute that has adsorbed into the solid phase GAC particles. The steady state mass removal and replacement rate of the GAC itself is provided as a unit model variable and excluded from flowsheet material balances. Therefore, GAC is never included as a component in property package specifications.
Sets
Description |
Symbol |
Indices |
---|---|---|
time |
\(t\) |
[0] |
phases |
\(p\) |
[‘Liq’] |
components |
\(j\) |
[‘H2O’, target_species, background solutes]* |
species adsorbed |
\(\text{target_species}\) |
[target_species] |
inert species |
\(\text{inert_species}\) |
[‘H2O’, target_species, background solutes] - [target_species] |
number of discretized operational time elements used for steady state approximation |
\(\text{ele_disc}\) |
[0:elements_ss_approx] |
number of discretized trapezoidal area terms for steady state approximation |
\(\text{ele_index}\) |
[1:elements_ss_approx] |
target_species
argument of the unit model and corresponds to the single solute which is adsorbed.inert_species
are the difference in component_list - target_species
.Variables
Supporting only a single solute, variables concerning the adsorption of a species are respective to the target species although not explicitly indexed. All other species are inert from a mass balance perspective, but effects of background species to the adsorption of the target species may be modeled by adjusting the Freundlich isotherm parameters and other variables in the model.
Description |
Symbol |
Variable Name |
Index |
Units |
---|---|---|---|---|
Freundlich isotherm k parameter |
\(k\) |
freund_k |
None |
\(\left(\text{m}^3\text{/kg}\right)^\left( \frac{1}{n} \right)\) |
Freundlich isotherm 1/n parameter |
\(\frac{1}{n}\) |
freund_ninv |
None |
\(\text{dimensionless}\) |
surface diffusion coefficient |
\(D_s\) |
ds |
None |
\(\text{m}^2\text{/s}\) |
liquid phase film transfer coefficient |
\(k_f\) |
kf |
None |
\(\text{m/s}\) |
equilibrium concentration of adsorbed phase with liquid phase |
\(q_e\) |
equil_conc |
None |
\(\left( \text{kg}_\text{adsorbate}\text{/kg}_\text{adsorbent} \right)\) |
solute distribution parameter |
\(D_g\) |
dg |
None |
\(\text{dimensionless}\) |
Biot number |
\(Bi\) |
N_Bi |
None |
\(\text{dimensionless}\) |
superficial velocity |
\(u_s\) |
velocity_sup |
None |
\(\text{m/s}\) |
interstitial velocity |
\(u_i\) |
velocity_int |
None |
\(\text{m/s}\) |
bed void fraction |
\(\epsilon\) |
bed_voidage |
None |
\(\text{dimensionless}\) |
bed length |
\(L\) |
bed_length |
None |
\(\text{m}\) |
bed diameter |
\(D\) |
bed_diameter |
None |
\(\text{m}\) |
bed area |
\(A\) |
bed_area |
None |
\(\text{m}^2\) |
bed volume |
\(V\) |
bed_volume |
None |
\(\text{m}^3\) |
empty bed contact time |
\(EBCT\) |
ebct |
None |
\(\text{s}\) |
fluid residence time in the bed |
\(\tau\) |
residence_time |
None |
\(\text{s}\) |
mass of fresh gac in the bed |
\(M_{GAC}\) |
bed_mass_gac |
None |
\(\text{kg}\) |
gac apparent density |
\(\rho_a\) |
particle_dens_app |
None |
\(\text{kg/}\text{m}^3\) |
gac bulk density |
\(\rho_b\) |
particle_dens_bulk |
None |
\(\text{kg/}\text{m}^3\) |
gac particle diameter |
\(d_p\) |
particle_dia |
None |
\(\text{m}\) |
Stanton equation parameter 0 |
\(a_0\) |
a0 |
None |
\(\text{dimensionless}\) |
Stanton equation parameter 1 |
\(a_1\) |
a1 |
None |
\(\text{dimensionless}\) |
throughput equation parameter 0 |
\(b_0\) |
b0 |
None |
\(\text{dimensionless}\) |
throughput equation parameter 1 |
\(b_1\) |
b1 |
None |
\(\text{dimensionless}\) |
throughput equation parameter 2 |
\(b_2\) |
b2 |
None |
\(\text{dimensionless}\) |
throughput equation parameter 3 |
\(b_3\) |
b3 |
None |
\(\text{dimensionless}\) |
throughput equation parameter 4 |
\(b_4\) |
b4 |
None |
\(\text{dimensionless}\) |
minimum Stanton number to achieve a constant pattern solution |
\(St_{min}\) |
min_N_St |
None |
\(\text{dimensionless}\) |
minimum empty bed contact time to achieve a constant pattern solution |
\(EBCT_{min}\) |
min_ebct |
None |
\(\text{s}\) |
specific throughput from empirical equation |
\(T\) |
throughput |
None |
\(\text{dimensionless}\) |
minimum fluid residence time in the bed to achieve a constant pattern solution |
\(\tau_{min}\) |
min_residence_time |
None |
\(\text{s}\) |
minimum operational time of the bed from fresh to achieve a constant pattern solution |
\(t_{min}\) |
min_operational_time |
None |
\(\text{s}\) |
effluent to inlet concentration ratio at operational time |
\(\frac{C}{C_{0}}\bigg{|}_{z=L,/,t=t_{op}}\) |
conc_ratio_replace |
None |
\(\text{dimensionless}\) |
operational time of the bed from fresh |
\(t_{op}\) |
operational_time |
None |
\(\text{s}\) |
bed volumes treated at operational time |
\(BVT\) |
bed_volumes_treated |
None |
\(\text{dimensionless}\) |
specific throughput from empirical equation by discrete element |
\(T_{ele}\) |
ele_throughput |
None |
\(x\) |
minimum operational time of the bed from fresh to achieve a constant pattern solution by discrete element |
\(t_{min, ele}\) |
ele_min_operational_time |
ele_index |
\(\text{s}\) |
effluent to inlet concentration ratio at operational time by discrete element |
\(\left(\frac{C}{C_{0}}\right)_{ele}\bigg{|}_{z=L,/,t=t_{op_ e}}\) |
ele_conc_ratio_replace |
ele_index |
\(\text{dimensionless}\) |
operational time of the bed from fresh by discrete element |
\(t_{op, ele}\) |
ele_operational_time |
ele_disc |
\(\text{s}\) |
trapezoid rule of elements for numerical integration of average concentration ratio |
\(term_{ele}\) |
ele_conc_ratio_avg |
ele_disc |
\(\text{dimensionless}\) |
steady state approximation of average effluent to inlet concentration ratio in operational time by trapezoid rule |
\(\left(\frac{C}{C_{0}}\right)_{avg}\) |
conc_ratio_avg |
None |
\(\text{dimensionless}\) |
total mass of adsorbed species at operational time |
\(M\) |
mass_adsorbed |
None |
\(\text{kg}\) |
gac usage/replacement/regeneration rate |
\(\dot{m}_{GAC}\) |
gac_usage_rate |
None |
\(\text{m/s}\) |
The following variables are only built when specific configuration options are selected.
if film_transfer_coefficient_type
is set to calculated
:
Description |
Symbol |
Variable Name |
Index |
Units |
---|---|---|---|---|
Reynolds number |
\(Re\) |
N_Re |
None |
\(\text{dimensionless}\) |
Schmidt number |
\(Sc\) |
N_Sc |
None |
\(\text{dimensionless}\) |
shape correction factor |
\(SCF\) |
shape_correction_factor |
None |
\(\text{dimensionless}\) |
if surface_diffusion_coefficient_type
is set to calculated
:
Description |
Symbol |
Variable Name |
Index |
Units |
---|---|---|---|---|
gac particle porosity |
\(\epsilon_p\) |
particle_porosity |
None |
\(\text{dimensionless}\) |
tortuosity of the path that the adsorbate must take as compared to the radius |
\(\tau_p\) |
tort |
None |
\(\text{dimensionless}\) |
surface-to-pore diffusion flux ratio |
\(S\!P\!D\!F\!R\) |
spdfr |
None |
\(\text{dimensionless}\) |
Equations
Description |
Equation |
---|---|
equilibrium concentration |
\(q_e = kC_0^{1/n}\) |
solute distribution parameter |
\(D_g=\frac{\rho_aq_e\left( 1-\epsilon \right)}{\epsilon C_0}\) |
Biot number |
\(Bi=\frac{k_fd_p\left( 1-\epsilon \right)}{2D_sD_g\epsilon}\) |
bed void fraction based on gac particle densities |
\(\epsilon=1-\frac{\rho_b}{\rho_a}\) |
relating velocities based on bed voidage |
\(u_i=\frac{u_s}{\epsilon}\) |
bed length based on velocity and ebct |
\(L=(EBCT)u_s\) |
bed diameter and area relation |
\(A=\pi\left(\frac{D}{2}\right)^2\) |
bed area based on velocity and volumetric flow |
\(A=\frac{Q}{u_s}\) |
bed volume based on cylindrical dimensions |
\(V=AL\) |
fluid residence time in the bed |
\(\tau=(EBCT)\epsilon\) |
total mass of gac in the bed |
\(M_{GAC}=V\rho_b\) |
minimum Stanton number to achieve constant pattern solution |
\(St_{min}=a_0Bi+a_1\) |
minimum empty bed contact time to achieve constant pattern solution |
\(EBCT_{min}=\frac{St_{min}d_p}{2k_f\left( 1-\epsilon \right)}\) |
throughput based on empirical 5-parameter regression |
\(T=b_0+b_1\left( \frac{C}{C_0} \right)^{b_2}+\frac{b_3}{1.01-\left( \frac{C}{C_0} \right)^{b_4}}\) |
minimum fluid residence time in the bed to achieve a constant pattern solution |
\(\tau_{min}=EBCT_{min}\epsilon\) |
minimum operational time of the bed from fresh to achieve a constant pattern solution |
\(t_{min}=\tau_{min}\left( D_g+1 \right)T\) |
elapsed operational time between a fresh bed and the theoretical bed replacement |
\(t_{op}=t_{min}+\left( \tau-\tau_{min} \right)\left( D_g+1 \right)\) |
bed volumes treated |
\(BVT=\frac{t_{op}\epsilon}{\tau}\) |
throughput based on empirical 5-parameter regression by discretized element |
\(T_{ele}=b_0+b_1\left(\frac{C}{C_{0}}\right)_{ele}^{b_2}+\frac{b_3}{1.01-\left(\frac{C}{C_{0}}\right)_{ele}^{b_4}}\) |
minimum operational time of the bed from fresh to achieve a constant pattern solution by discretized element |
\(t_{min, ele}=\tau_{min}\left( D_g+1 \right)T\) |
creating evenly spaced discretized elements |
\(\frac{C}{C_{0}}\bigg{|}_{t=t_{op, ele}}=0.01+(ele-1)*\frac{\left(\frac{C}{C_{0}}\bigg{|}_{t=t_{op}}-0.01\right)}{num\text{_}ele}\) |
finite element discretization of concentration ratios over time |
\(term_{ele}=\left(\frac{t_{op, ele}-t_{op, (ele-1)}}{t_{op}}\right)\frac{\left(\frac{C}{C_{0}}\bigg{|}_{t=t_{op, ele}}+{C_{0}}\bigg{|}_{t=t_{op, (ele-1)}}\right)}{2}\) |
summation of finite elements for average concentration during operating time |
\(\left(\frac{C}{C_{0}}\right)_{avg}=\sum_{ele\text{_}index}term_{ele}\) |
mass adsorbed in the operational time |
\(M=\frac{\dot{m}_{j}}{t_{op}}\) |
steady state rate of new gac mass required |
\(\dot{m}_{GAC}=\frac{M_{GAC}}{t_{op}}\) |
if film_transfer_coefficient_type
is set to calculated
:
Description |
Equation |
---|---|
Reynolds number calculation* |
\(Re=\frac{\rho_ld_pu_i}{\mu_l}\) |
Schmidt number calculation* |
\(Sc=\frac{\mu_l}{\rho_sD_l}\) |
liquid phase film transfer rate from the Gnielinshi correlation* |
\(k_f=(SCF)\frac{\left[ 1+1.5\left( 1-\epsilon \right) \right]D_l}{d_p}\left( 2+0.644Re^{\frac{1}{2}}Sc^{\frac{1}{3}} \right)\) |
*Subscript \(l\) denotes bulk liquid phase properties, here those are supplied by the property package.
if surface_diffusion_coefficient_type
is set to calculated
:
Description |
Equation |
---|---|
surface diffusion parameter (Crittenden, 1987) |
\(D_s=\left( S\!P\!D\!F\!R \right)\left( \frac{\epsilon_pC_0D_l}{\rho_aq_e\tau_p} \right)\) |
Costing Method
Costing Method Variables
The following parameters are constructed when applying the GAC costing method in the watertap_costing_package
:
Description |
Symbol |
Variable Name |
Default Value |
Units |
---|---|---|---|---|
Number of GAC contactors in operation in parallel |
\(N_{op}\) |
num_contactors_op |
1 |
\(\text{dimensionless}\) |
Number of off-line redundant GAC contactors in parallel |
\(N_{red}\) |
num_contactors_redundant |
1 |
\(\text{dimensionless}\) |
Fraction of spent GAC adsorbent that can be regenerated for reuse |
\(f_{regen}\) |
regen_frac |
0.70 |
\(\text{dimensionless}\) |
Reference maximum value of GAC mass needed for initial charge where economy of scale no longer discounts the unit price (U.S. EPA, 2021) |
\(M_{GAC}^{ref}\) |
bed_mass_gac_max_ref |
18143.7 |
\(kg\) |
Contactor polynomial cost coefficients |
\(x\) |
contactor_cost_coeff |
tabulated |
\(\text{dimensionless}\) |
Adsorbent exponential cost coefficients |
\(y\) |
adsorbent_unit_cost_coeff |
tabulated |
\(\text{dimensionless}\) |
Other process costs power law coefficients |
\(z\) |
other_cost_param |
tabulated |
\(\text{dimensionless}\) |
Unit cost to regenerate spent GAC adsorbent by an offsite regeneration facility |
\(C_{regen}\) |
regen_unit_cost |
4.28352 |
\($/kg\) |
Unit cost to makeup spent GAC adsorbent with fresh adsorbent |
\(C_{makeup}\) |
makeup_unit_cost |
4.58223 |
\($/kg\) |
Energy consumption polynomial coefficients |
\(alpha\) |
energy_consumption_coeff |
tabulated |
\(\text{dimensionless}\) |
Costing methods are available for steel pressure vessel contactors (default) and concrete gravity basin contactors. Given that the form of the costing component equations are different (polynomial, exponential, and power law), the units associated with the parameters are embedded in the constraints and not directly applied to the variable. Additionally, the index is generalized to its position ([0:len(parameter_data)])
in the list, although some parameters are coefficients while others are exponents (see equations below for details). Variables with the (U.S. EPA, 2021) citation are directly taken from previously determined expressions. Other variables are regressed from higher detailed costing methods in (U.S. EPA, 2021). The variations in costing parameters are tabulated below:
Variable Name |
Contactor Type |
Index 0 |
Index 1 |
Index 2 |
Index 3 |
---|---|---|---|---|---|
adsorbent_unit_cost_coeff (U.S. EPA, 2021) |
n/a |
4.58342 |
-1.25311e-5 |
||
contactor_cost_coeff (U.S. EPA, 2021) |
pressure |
10010.9 |
2204.95 |
-15.9378 |
0.110592 |
contactor_cost_coeff |
gravity |
75131.3 |
735.550 |
-1.01827 |
0 |
other_cost_param |
pressure |
16660.7 |
0.552207 |
||
other_cost_param |
gravity |
38846.9 |
0.490571 |
||
energy_consumption_coeff_data |
pressure |
8.09926e-4 |
8.70577e-4 |
0 |
|
energy_consumption_coeff_data |
gravity |
0.123782 |
0.132403 |
-1.41512e-5 |
Costing GAC contactors is defaulted to purchasing 1 operational and 1 redundant contactor for alternating operation. For large systems this may be a poor
assumption considering vessel sizing and achieving pseudo-steady state. The number of contactors input by the user should justify reasonable
(commercially available) dimensions of identical modular contactors in parallel. When costing several operational vessels, the area reported
in the unit model should be interpreted as the sum of the areas across all operating GAC contactors. The costing
parameters may be selected from either steel pressure-fed vessels or concrete gravity-fed basins by the
contactor_type
argument. Note this only affects costing calculations. Volume dimensions calculations
within the model remain assuming a cylindrical bed.
The following variables are constructed when applying the GAC costing method in the watertap_costing_package
:
Description |
Symbol |
Variable Name |
Units |
---|---|---|---|
Unit contactor(s) capital cost |
\(C_{cap,bed}\) |
contactor_cost |
\($\) |
GAC adsorbent cost per unit mass |
\(C_{carbon}\) |
adsorbent_unit_cost |
\($/kg\) |
Unit adsorbent capital cost |
\(C_{cap,carbon}\) |
adsorbent_cost |
\($\) |
Unit other process capital cost |
\(C_{cap,other}\) |
other_process_cost |
\($\) |
Cost to regenerate spent GAC adsorbent by an offsite regeneration facility |
\(C_{op,regen}\) |
gac_regen_cost |
\($/year\) |
Cost to makeup spent GAC adsorbent with fresh adsorbent |
\(C_{op,makeup}\) |
gac_makeup_cost |
\($/year\) |
Approximate GAC system energy consumption* |
\(P\) |
energy_consumption |
\(kW\) |
*Energy consumption is the sum of energy required to operate booster, backwash, and residual pumps.
Capital Cost Calculations
Capital costs are determined by the summation of three costing terms. Each term is is calculated by a one parameter (different for each term) function considering economy of scale.
\[C_{cap,tot} = C_{cap,bed}+C_{cap,carbon}+C_{cap,other}\]
Contactor and GAC adsorbent capital costs are estimated using functions and parameters reported in US EPA, 2021. Contactors are assumed to be carbon steel pressure vessels with plastic internals and are determined as a polynomial function of individual contactor volume. The unit cost per kilogram of GAC adsorbent needed is calculated using an exponential function. A maximum reference mass is imposed in the costing method to define a best available price where above this required charge, the price would no longer be discounted. Other process costs (vessels, pipes, instrumentation, and controls) included in the US EPA, 2021 model are aggregated into a separate term. The parameters for the power law function with respect to the total system contactor volume were regressed using results from the US EPA, 2021 model.
\[\begin{split}& C_{cap,bed} = \left( N_{op}+N_{red} \right)\left( x_0+x_1\left( \frac{V}{N_{op}} \right)+x_2\left( \frac{V}{N_{op}} \right)^2+x_3\left( \frac{V}{N_{op}} \right)^3 \right) \\\\ & C_{carbon} = y_0e^{y_1M_{GAC}^{ref}} \\\\ & C_{cap,carbon} = C_{carbon}M_{GAC} \\\\ & C_{cap,other} = z_0\left( \left( N_{op}+N_{red} \right)\frac{V}{N_{op}} \right)^{z_1}\end{split}\]
Note that given the the ability to alter the parameters in these correlations, GAC adsorbent unit costs (\(C_{carbon}\)) may be fixed to a value (\(y_0\)) by setting \(y_1=0\).
Operating Cost Calculations
Operating costs are calculated as the cost to replace spent GAC adsorbent in the contactor beds. Energy is costed as a flow term by the WaterTAP costing method. Since the replacement adsorbent purchases are expected to be purchased in bulk at smaller quantities than the initial charge, the cost of fresh GAC adsorbent for makeup has an independent cost per unit mass variable, expected to be higher than the initial charge unit cost.
\[\begin{split}& C_{op,tot} = C_{op,regen}+C_{op,makeup} \\\\ & C_{op,regen} = f_{regen}C_{regen}\dot{m}_{GAC} \\\\ & C_{op,makeup} = \left( 1-f_{regen} \right)C_{makeup}\dot{m}_{GAC} \\\\ & P = \alpha_0+\alpha_1V+\alpha_2V^2\end{split}\]
Code Documentation
References
Hand, D. W., Crittenden, J. C., & Thacker, W. E. (1984). Simplified models for design of fixed-bed adsorption systems. Journal of Environmental Engineering, 110(2), 440-456.
Crittenden, J., Rhodes, R., Hand, D., Howe, K., & Tchobanoglous, G. (2012). MWHs Water Treatment. Principles and Design. John Wiley & Sons.
Crittenden, J. C., Berrigan, J. K., Hand, D. W., & Lykins, B. (1987). Design of Rapid Fixed‐Bed Adsorption Tests for Nonconstant Diffusivities. Journal of Environmental Engineering, 113(2), 243–259.
United States Environmental Protection Agency. (2021). Work Breakdown Structure-Based Cost Model for Granular Activated Carbon Drinking Water Treatment. https://www.epa.gov/system/files/documents/2022-03/gac-documentation-.pdf_0.pdf