Composting¶
[1]:
import PFAS_SAT as ps
import numpy as np
import matplotlib.pyplot as plt
from IPython.display import Image
import pandas as pd
pd.set_option('display.max_colwidth', 0)
import warnings
warnings.filterwarnings('ignore')
Model document¶
Composting can accept specific fractions of MSW including food, yard, and some paper wastes. It is also capable of treating dried and stabilized WWT solids. The primary purpose of composting is to produce a stabilized organic product that can be used as a soil amendment to enhance water retention, carbon and nutrient content, and erosion control among other potential benefits. In addition to finished compost, composting systems also produce residual solid materials from pre- and post-screening. Those materials can be combusted or landfilled. Compost also may produce leachate that needs to be managed through wastewater treatment. It is also possible that PFAS are volatilized during aerobic composting due to the elevated temperatures and stripping from active aeration, but there is currently no data on this potential pathway.
In the composting process model, feedstocks (e.g., WWT solids or food waste) are mixed with amendments (wood chips by default) to increase porosity to allow air flow through the system. Active composting may be under cover or open to the atmosphere. In the latter case, there will be contact water that may contain PFAS that will need to be managed.
Model predictions are based on achievement of equilibrium. The partition coefficient is used to estimate the concentration of PFAS in the liquid and solids. The concentration in the liquid changes throughout the year as PFAS leaches through the compost piles (i.e., it is assumed that annual precipitation is uniform throughout the year and continuously removes PFAS from the mixture). The model then calculates a fraction of precipitation that becomes contact water. The contact water can either be collected and managed or be released to surface or ground- water depending on the composting process and applicable regulations. If active composting is under a cover, then no contact water is included. The PFAS that is not removed in the contact water remains in the compost. By default, the compost is cured after active composting. The curing model is the same as the active composting model, except it is not covered and contact water is not managed. Any PFAS that does not leave the curing piles through leaching or run-off remains in the finished compost that will be either land applied or landfilled.
The behavior of the finished compost in a landfill and land application process are described in their respective sections. There are several different compost processes (e.g., windrows, static piles, in-vessel). The compost process model in the SAT framework is designed so that by changing default parameters, any compost process can be represented.
Assumptions and Limitations¶
Organic carbon partitioning coefficients determined from soils/sediments are used for compost partitioning.
Wood chips are currently the only amendment that is built into the material flow properties.
We assume that the mass of solid loss per carbon loss is similar both for active and curing composting stages.
Volatilization is assumed to be zero by default. However, the user may assign a fraction of the PFAS to be volatilized.
Future work is required to implement a dynamic (i.e., non-equilibrium) model to account for changes in the organic C content over time as composted materials decompose, and to account for episodic precipitation events.
We do not consider the possible conversion of “precursor” compounds to commonly measured PFAAs.
Input Parameters for Composting model¶
[2]:
Composting = ps.Comp()
Composting.InputData.Data[['Category','Dictonary_Name','Parameter Name', 'Parameter Description', 'amount', 'unit','Reference']]
[2]:
Category | Dictonary_Name | Parameter Name | Parameter Description | amount | unit | Reference | |
---|---|---|---|---|---|---|---|
0 | Log partition coefficient | LogPartCoef | PFOA | PFOA Log Koc (Composting) | 2.19 | log L/kg OC | [2,3,4,5] |
1 | Log partition coefficient | LogPartCoef | PFOS | PFOS Log Koc (Composting) | 3.04 | log L/kg OC | [2,3,4,5] |
2 | Log partition coefficient | LogPartCoef | PFBA | PFBA Log Koc (Composting) | 1.88 | log L/kg OC | [2,3,4,5] |
3 | Log partition coefficient | LogPartCoef | PFPeA | PFPeA Log Koc (Composting) | 1.37 | log L/kg OC | [2,3,4,5] |
4 | Log partition coefficient | LogPartCoef | PFHxA | PFHxA Log Koc (Composting) | 1.77 | log L/kg OC | [2,3,4,5] |
5 | Log partition coefficient | LogPartCoef | PFHpA | PFHpA Log Koc (Composting) | 1.97 | log L/kg OC | [2,3,4,5] |
6 | Log partition coefficient | LogPartCoef | PFNA | PFNA Log Koc (Composting) | 2.63 | log L/kg OC | [2,3,4,5] |
7 | Log partition coefficient | LogPartCoef | PFDA | PFDA Log Koc (Composting) | 3.24 | log L/kg OC | [2,3,4,5] |
8 | Log partition coefficient | LogPartCoef | PFBS | PFBS Log Koc (Composting) | 1.51 | log L/kg OC | [2,3,4,5] |
9 | Log partition coefficient | LogPartCoef | PFHxS | PFHxS Log Koc (Composting) | 2.79 | log L/kg OC | [2,3,4,5] |
10 | Amendment Material Properties | AmndProp | mass_ratio | Mass of amendment to mass of feedstock | 0.70 | kg TS/kg TS | [62] |
11 | Amendment Material Properties | AmndProp | ts_cont | TS content of amendmente _wet | 0.55 | fraction wet weight | [63] |
12 | Amendment Material Properties | AmndProp | C_cont | Organic C content - dry | 0.58 | fraction TS | [48] |
13 | Amendment PFAS Concentration | AmndPFAS | PFOA | PFOA concentration - dry mass | 0.00 | 10e-6g/kg | NaN |
14 | Amendment PFAS Concentration | AmndPFAS | PFOS | PFOS concentration - dry mass | 0.00 | 10e-6g/kg | NaN |
15 | Amendment PFAS Concentration | AmndPFAS | PFBA | PFBA concentration - dry mass | 0.00 | 10e-6g/kg | NaN |
16 | Amendment PFAS Concentration | AmndPFAS | PFPeA | PFPeA concentration - dry mass | 0.00 | 10e-6g/kg | NaN |
17 | Amendment PFAS Concentration | AmndPFAS | PFHxA | PFHxA concentration - dry mass | 0.00 | 10e-6g/kg | NaN |
18 | Amendment PFAS Concentration | AmndPFAS | PFHpA | PFHpA concentration - dry mass | 0.00 | 10e-6g/kg | NaN |
19 | Amendment PFAS Concentration | AmndPFAS | PFNA | PFNA concentration - dry mass | 0.00 | 10e-6g/kg | NaN |
20 | Amendment PFAS Concentration | AmndPFAS | PFDA | PFDA concentration - dry mass | 0.00 | 10e-6g/kg | NaN |
21 | Amendment PFAS Concentration | AmndPFAS | PFBS | PFBS concentration - dry mass | 0.00 | 10e-6g/kg | NaN |
22 | Amendment PFAS Concentration | AmndPFAS | PFHxS | PFHxS concentration - dry mass | 0.00 | 10e-6g/kg | NaN |
23 | Active composting Input | AComp | is_covered | Is active composting (AC) covered? | 0.00 | 1:TRUE,0:FALSE | NaN |
24 | Active composting Input | AComp | bulk_dens | Wet bulk density (AC pile) | 530.00 | kg/m3 | [48] |
25 | Active composting Input | AComp | wind_ht | Windrow height (AC pile) | 2.50 | m | [48] |
26 | Active composting Input | AComp | wind_wid | Windrow width (AC pile) | 4.50 | m | [48] |
27 | Active composting Input | AComp | frac_C_lost | Fraction of organic C lost during AC | 0.50 | kg C loss/kg C | [22] |
28 | Active composting Input | AComp | ts_end | Total solids content at the end of AC | 0.55 | kg TS/kg | [48] |
29 | Active composting Input | AComp | frac_sol_to_cw | Fraction of solids in contact water (AC) | 0.00 | fraction | NaN |
30 | Active composting Input | AComp | sol_loss_per_C_loss | Total solids loss per loss per C loss (AC) | 2.00 | kg TS/kg C | [64,24] |
31 | Active composting Input | AComp | is_cw_col | Is AC contact water collected? | 1.00 | 1:TRUE,0:FALSE | NaN |
32 | Active composting Input | AComp | frac_cw_col | Fraction contact water collection during AC | 0.98 | fraction | NaN |
33 | Active composting Input | AComp | ac_time | Activate composting time | 70.00 | days | [48] |
34 | Curing Input | Curing | frac_C_lost | Fraction of organic C lost during curing | 0.10 | kg C/kg C | [42] |
35 | Curing Input | Curing | ts_end | Total solids content at the end of curing | 0.65 | kg TS/kg | [42] |
36 | Curing Input | Curing | bulk_dens | Wet bulk density of curing pile | 530.00 | kg/m3 | [48] |
37 | Curing Input | Curing | wind_ht | Windrow height of curing pile | 2.00 | m | [48] |
38 | Curing Input | Curing | wind_wid | Windrow width of curing pile | 4.00 | m | [48] |
39 | Curing Input | Curing | sol_loss_per_C_loss | Total solids loss per loss per C loss (Curing) | 2.00 | kg TS/kg C | NaN |
40 | Curing Input | Curing | curing_time | Curing composting time | 30.00 | days | [48] |
41 | Precipitation Data | Precip | ann_precip | Annual precipitation rate | 1.13 | m/yr | NaN |
42 | Volatilization | Volatilization | frac_vol_loss | Fraction of PFAS lost to volatilization | 0.00 | NaN | NaN |
43 | Screen | Screen | frac_rmvd | Fraction of incoming feedstock removed by screen | 0.00 | fraction | NaN |
Incoming Dewatered WWT Solids to Composting¶
[3]:
IncominWaste = ps.IncomFlow()
IncominWaste.set_flow('Dewatered WWT Solids', 1000)
IncominWaste.calc()
DewateredWWTSolids = IncominWaste.Inc_flow
DewateredWWTSolids.report()
[3]:
Parameter | Unit | Amount | |
---|---|---|---|
0 | Mass flow | kg | 1000 |
1 | Solids flow | kg | 200 |
2 | Moisture flow | kg | 800 |
3 | VS flow | kg | 120 |
4 | Carbon flow | kg | 76 |
5 | PFOA | μg | 934.565 |
6 | PFOS | μg | 3678.93 |
7 | PFBA | μg | 146.226 |
8 | PFPeA | μg | 365.103 |
9 | PFHxA | μg | 511.518 |
10 | PFHpA | μg | 88.188 |
11 | PFNA | μg | 373.149 |
12 | PFDA | μg | 1552.18 |
13 | PFBS | μg | 125.018 |
14 | PFHxS | μg | 107.265 |
PFAS balance in Composting¶
[4]:
Composting.calc(Inc_flow=DewateredWWTSolids)
Composting.report(normalized=True)
[4]:
Volatilized | Compost | Contact water | Collected Contact water | Compost Residuals | |
---|---|---|---|---|---|
PFOA | 0.0 | 97.92 | 0.50 | 1.58 | 0.0 |
PFOS | 0.0 | 99.70 | 0.07 | 0.23 | 0.0 |
PFBA | 0.0 | 95.94 | 0.98 | 3.08 | 0.0 |
PFPeA | 0.0 | 88.83 | 2.81 | 8.36 | 0.0 |
PFHxA | 0.0 | 94.88 | 1.24 | 3.88 | 0.0 |
PFHpA | 0.0 | 96.65 | 0.81 | 2.55 | 0.0 |
PFNA | 0.0 | 99.23 | 0.18 | 0.59 | 0.0 |
PFDA | 0.0 | 99.81 | 0.05 | 0.15 | 0.0 |
PFBS | 0.0 | 91.39 | 2.13 | 6.48 | 0.0 |
PFHxS | 0.0 | 99.46 | 0.13 | 0.41 | 0.0 |
[5]:
Composting.plot_sankey(margin=1.7, offset=.4, gap=0.8)

Sensitivity to precipitation¶
[7]:
precip = np.linspace(0,10,30)
frac_remain = []
for i in precip:
Composting.InputData.Precip['ann_precip']['amount'] = i
Composting.calc(Inc_flow=DewateredWWTSolids)
frac_remain.append(sum(Composting.report()['Compost'])/sum(DewateredWWTSolids.PFAS))
plt.plot(precip,frac_remain)
plt.xlabel('Annual precipitation rate (m)')
plt.ylabel('Percent of Incoming PFAS that \n remains in the Compost (%)')
[7]:
Text(0, 0.5, 'Percent of Incoming PFAS that \n remains in the Compost (%)')
