P Reduction — Equations and Routing¶
Overview¶
The P model is substantially more complex than the N model because: 1. P loss from fields occurs via three distinct physical pathways (erosion, macropore, matrix). 2. P is routed through a chain of lakes, not directly to the coast — with a transport matrix capturing retention in each lake. 3. Stream engineering measures (ochre, sand, re-meandering, raising, trees) reduce P at the watercourse level, not the field level. 4. P wetlands (PWET) are constrained to not exceed total catchment P loss and interact with stream measures.
P loss pathways at field level¶
For each field i and measure j, total P effectiveness is the sum of three components:
See P loss pathways for the physical meaning of each pathway.
Matrix pathway¶
Slow subsurface transport through the soil matrix. Effect proportional to matrix_ha(i) (kg P/ha/yr background loss via matrix flow).
P_Effects_matrix(i,"NPB10") = PotV(i,"NPB10") × matrix_ha(i) × 0.05
P_Effects_matrix(i,"NPB20") = PotV(i,"NPB20") × matrix_ha(i) × 0.20
P_Effects_matrix(i,"PPC_NPB10") = 0.9 × PotV(i,"NPB10") × matrix_ha(i) × 0.05
Macropore pathway¶
Fast preferential flow through soil macropores — more important on heavy clay soils. Effect based on macropore_field(i) (kg P/yr total from macropore flow).
P_Effects_macropore(i,"NPB10") = macropore_field(i) × 0.05 [if NPB10 potential > 0]
P_Effects_macropore(i,"FO") = macropore_field(i) × 0.35 × (PotV(i,"FO") / IniPotV(i))
P_Effects_macropore(i,"LRh") = (1-lav(i)) × macropore_field(i) × 0.35
Erosion pathway¶
Surface erosion of P-rich topsoil into streams. Effect based on erosion_field(i) (kg P/yr total erosion loss).
P_Effects_erosion(i,"PPC") = erosion_field(i) × 0.9
P_Effects_erosion(i,"OT") = erosion_field(i) × 0.5
P_Effects_erosion(i,"BZ10") = erosion_field(i) × 0.62 [if BZ10Pot(i) > 0.2]
P_Effects_erosion(i,"BZ20") = erosion_field(i) × 0.75 [if BZ20Pot(i) > 0.2]
P_Effects_erosion(i,"LRl") = 0 [set to zero — low-lying fields]
P_Effects_erosion(i,"Pwet") = 15 × PotV(i,"Pwet")
P_Effects_erosion(i,"FO") = erosion_field(i) × (PotV(i,"FO") / IniPotV(i))
P_Effects_erosion(i,"LRh") = (1-lav(i)) × erosion_field(i)
Note on BZ threshold: A threshold of BZ10Pot(i) > 0.2 (20% of field within BZ potential) is required for P erosion effects. Reasoning: BZ potential is a fraction, so only a portion of the field needs to qualify for the measure to protect the whole field's erosion losses. ⚠️ The appropriate threshold is noted as a design decision still open in the code.
P reduction in upstream lake catchments (P_Red_bf_ret_eq_up)¶
P_Red_bf_ret_up(up_lakecatch) =e=
Sum(ret$up_LakeRet(up_lakecatch,ret), MW_red_p(ret)) [MW constructed wetlands]
+ Sum(i$up_Lake_i(up_lakecatch,i), Sum(j$pho(j), P_Effects_Total(i,j) * x(i,j))) [P field measures]
+ Sum(i$up_Lake_i(up_lakecatch,i), Sum(j$nit(j), P_Effects_Total(i,j) * x(i,j))) [N measures with P co-benefit]
+ Sum(i$up_lake_i(up_lakecatch,i), Sum(j$comb(j), P_Effects_Total(i,j) * x(i,j))) [combined measures]
+ Sum(i$up_lake_i(up_lakecatch,i), Sum(j$comb2(j),P_Effects_Total(i,j) * x(i,j))) [combined with BZ]
+ WWT_P_Red(up_lakecatch) [WWT upgrades]
+ Ochre_P_eff(up_lakecatch) + Sand_P_eff(up_lakecatch) + IBZ_P_eff(up_lakecatch) [stream point measures]
+ Re_meandering_P_eff(up_lakecatch) + Raising_P_eff(up_lakecatch) [stream restoration]
+ Trees_P_eff(up_lakecatch) + OF_p_red(up_lakecatch) [trees + overflow]
Important: N measures (nit set) contribute P co-benefits — BZ10, BZ20, FO, LRh, etc. all reduce P in addition to N. These P effects are also captured through P_Effects_Total.
Lake-chain routing (P_Red_aft_ret_eq)¶
P_Red_aft_ret(lakecatch) =e=
Sum(up_lakecatch$lakechain(lakecatch,up_lakecatch),
P_Red_bf_ret_up(up_lakecatch) × p_transp_matrix(lakecatch, up_lakecatch))
The p_transp_matrix(lakecatch, up_lakecatch) is a transport coefficient — the fraction of P reduced upstream that arrives at the downstream lake catchment after passing through any intermediate lakes. It is loaded from p_transp_matrix_NEW.csv.
A parallel matrix p_transp_matrix_k(k, up_lakecatch) routes P all the way to coastal catchments for coastal-level P aggregation.
P target constraint (P_target_eq)¶
P_target_eq(lakecatch)$(P_targets(lakecatch)>0)..
P_Red_aft_ret(lakecatch) + exceed_p(lakecatch) =g= var_P × P_targets(lakecatch)
- Only active for lake catchments with a defined target (
P_targets > 0). exceed_p(lakecatch)carriesPenalty2 = 9.999×10¹³DKK — an order of magnitude larger than the N penalty, reflecting the relative difficulty of meeting P targets.var_P = 0deactivates all P targets.- P targets loaded from
P_targets_Dec2024.inc(443 records; 189 active; max 9,155.79 kg P/yr at lakecatch=456; total ~117,089 kg P/yr).
Stream measure P effects¶
Ochre traps¶
Ochre_P_eff(up_lakecatch) = Sum(w$up_lakew, w_okker(w) × P_Effects_Ochre(w) × v_w(w,"ochre"))
P_Effects_Ochre(w) = 140 kg P/yr [if w_class = 1 or 2]
Sand traps¶
Sand_P_eff(up_lakecatch) = Sum(w$up_lakew, w_sand(w) × P_Effects_Sand(w) × v_w(w,"sand"))
P_Effects_Sand(w): 7 kg P/yr (class 1 or 2, geo zone 1)
26 kg P/yr (class 1 or 2, geo zone 2)
12 kg P/yr (class 1 or 2, geo zone 3)
Re-meandering¶
Re_meandering_P_eff(up_lakecatch) = Sum(w$up_lakew, w_meandering(w) × w_P_red_re_meandering(w) × v_w(w,"re_meandering"))
w_P_red_re_meandering.inc.
Raising (bed raising)¶
Effect is watercourse-specific fromw_P_red_raising.inc.
Trees on erosion stretches¶
Trees_P_eff(up_lakecatch) = Sum(ero_stretch$up_lake_ero, tree_eff(ero_stretch) × v_str(ero_stretch,"trees"))
Tree_eff.inc.
IBZ (in-stream buffer zone)¶
Effect is field-specific fromIBZ_eff.inc.
P wetland constraints¶
P wetland (PWET) is linked to specific stream reaches through a three-equation system:
Pwet1_eq(w).. s(w) ≥ Sum(w_Pwet(w_m), v_w(w,w_m))
Pwet2_eq(w,i)$wi_pwet.. x(i,"Pwet") + s(w) ≤ 1
Pwet3_eq(w).. Sum(w_Pwet(w_m), v_w(w,w_m)) ≥ s(w)
s(w) is a binary indicator variable.
Additionally:
P_Wet_limit_eq(up_lakecatch)..
Sum(i$up_lake_i, P_Effects_Total(i,"Pwet") × x(i,"Pwet")) ≤ Total_P_loss(up_lakecatch)
Mini-wetland P effects¶
MW P effects are aggregated at retention area (ret) level:
MW_red_P(ret) = sum over MW sizes [area × (P_Effects_MW_Matrix(ret) + P_Effects_MW_macropore(ret)) × MW_binary]
P_Effects_MW_Matrix(ret) = 0.45 × weighted average matrix_ha for fields in ret with macropore loss
- P_Effects_MW_macropore(ret) = 0.45 × weighted average macropore_field for fields in ret with macropore loss
(Note: Only fields with macropore loss > 0 are included in the average — per Hans Estrup, Nov 2024)
Open questions¶
- WL P effect was set to 0 in Nov 2023. Is this permanent for VP3 or might it be revised?
- Why is LRl P (erosion) = 0 while LRh has erosion effects? Is this because low-lying land is already wet?
- The BZ20% threshold for P erosion effects — has this been validated or is it a pragmatic choice?
- ✅
Total_P_loss(up_lakecatch)— confirmed: fromTotal_P_loss.inc, ~448 entries, baseline P load per upstream lake catchment (kg P/yr); sourceTotal_P_loss.xlsx(confirmed 2026-04-05).
Related pages¶
Concepts: - P loss pathways — physical mechanisms for each pathway - Spatial Hierarchy — ID15 → upstream lake catchment → lake catchment → coast
Field measures with P effects: - PPC — 90% erosion reduction - OT — 50% erosion reduction - PWET — P wetland; sedimentation + catchment P cap constraint - NPB10, NPB20 — all three P pathways - BZ10, BZ20 — erosion P co-benefit - FO, LRh — erosion + macropore P co-benefits
Infrastructure measures: - IBZ — in-stream buffer zone - Stream measures — ochre, sand, re-meandering, raising, trees - MW — mini-wetlands; matrix + macropore P - WWT — wastewater P reduction