-
Notifications
You must be signed in to change notification settings - Fork 22
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Reinfiltration of surface water and flow threshold for overland flow #470
base: master
Are you sure you want to change the base?
Changes from 1 commit
df51bea
6a984ce
ebe92bd
30e30fb
6bd036c
de4c229
6b70f1b
68aed28
127b68b
7f2d86c
6e1fd92
79ed50b
de29798
2cd9577
f6bfe8a
ae37c4a
8560072
e5067f7
715485e
db41548
b5d4889
56e7d32
4a39e4a
01bd103
26f5004
dd921b7
d05f673
2dfa845
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -156,6 +156,8 @@ | |
infiltexcess::Vector{T} | ||
# Infiltration from surface water [mm Δt⁻¹] | ||
infilt_surfacewater::Vector{T} | ||
# Contribution from surface water [mm Δt⁻¹] | ||
contribution_surfacewater::Vector{T} | ||
# Water that cannot infiltrate due to saturated soil (saturation excess) [mm Δt⁻¹] | ||
excesswater::Vector{T} | ||
# Water exfiltrating during saturation excess conditions [mm Δt⁻¹] | ||
|
@@ -718,6 +720,7 @@ function initialize_sbm(nc, config, riverfrac, inds) | |
ae_openw_r = fill(mv, n), | ||
avail_forinfilt = fill(mv, n), | ||
infilt_surfacewater = fill(mv, n), | ||
contribution_surfacewater = fill(mv, n), | ||
actinfilt = fill(mv, n), | ||
actinfiltsoil = fill(mv, n), | ||
actinfiltpath = fill(mv, n), | ||
|
@@ -916,26 +919,31 @@ function update_until_recharge(sbm::SBM, config) | |
sbm.waterlevel_river[i] * sbm.riverfrac[i], | ||
sbm.riverfrac[i] * sbm.potential_evaporation[i], | ||
) | ||
ae_openw_l = min( | ||
sbm.waterlevel_land[i] * sbm.waterfrac[i], | ||
sbm.waterfrac[i] * sbm.potential_evaporation[i], | ||
# Determine remaining fraction of available potential_evaporation | ||
soilevap_fraction = max( | ||
sbm.canopygapfraction[i] - sbm.riverfrac[i] - sbm.glacierfrac[i], | ||
0.0, | ||
) | ||
# Determine amount of surface water | ||
surface_water = sbm.waterlevel_land[i] * (1.0 - sbm.riverfrac[i]) | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Would recommend to use the same approach for There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This implementation (not using So, while we model the kinematic wave routing for the complete land fraction, and allow for open water evaporation and surface runoff for that fraction (by not using Based on this, my recommendation would be to:
Another approach (for the longterm) and similar to 2) could be to use subgrid variability, for example by using a pdf of soil storage capacity or of topographic information to derive a dynamic saturated fraction (e.g. see also this paper). |
||
|
||
# Update land waterlevel | ||
waterlevel_land = sbm.waterlevel_land[i] - ae_openw_l | ||
# Calculate open water evaporation | ||
ae_openw_l = min( | ||
surface_water, | ||
sbm.potential_evaporation[i] * soilevap_fraction, | ||
) | ||
|
||
# Update land waterlevel and scale to part of cell not covered by rivers | ||
if do_surface_water_infiltration | ||
contribution_surfacewater = surface_water - ae_openw_l | ||
# Add land waterlevel to infiltration | ||
avail_forinfilt += waterlevel_land | ||
avail_forinfilt += contribution_surfacewater | ||
else | ||
contribution_surfacewater = 0.0 | ||
end | ||
|
||
# evap available for soil evaporation | ||
soilevap_fraction = max( | ||
sbm.canopygapfraction[i] - sbm.riverfrac[i] - sbm.waterfrac[i] - | ||
sbm.glacierfrac[i], | ||
0.0, | ||
) | ||
potsoilevap = soilevap_fraction * sbm.potential_evaporation[i] | ||
potsoilevap = (sbm.potential_evaporation[i] * soilevap_fraction) - ae_openw_l | ||
|
||
if !isnothing(sbm.paddy) && sbm.paddy.irrigation_areas[i] | ||
evap_paddy_water = min(sbm.paddy.h[i], potsoilevap) | ||
|
@@ -1139,7 +1147,7 @@ function update_until_recharge(sbm::SBM, config) | |
# infiltsoilpath (and prevent division by zero) | ||
if do_surface_water_infiltration | ||
infilt_ratio = iszero(avail_forinfilt) ? 0.0 : actinfilt / avail_forinfilt | ||
infilt_surfacewater = max(0.0, waterlevel_land * infilt_ratio) | ||
infilt_surfacewater = max(0.0, contribution_surfacewater * infilt_ratio) | ||
else | ||
infilt_surfacewater = 0.0 | ||
end | ||
|
@@ -1214,6 +1222,7 @@ function update_until_recharge(sbm::SBM, config) | |
sbm.actinfilt[i] = actinfilt | ||
sbm.infiltexcess[i] = infiltexcess | ||
sbm.infilt_surfacewater[i] = infilt_surfacewater | ||
sbm.contribution_surfacewater[i] = contribution_surfacewater | ||
sbm.recharge[i] = recharge | ||
sbm.transpiration[i] = transpiration | ||
sbm.soilevap[i] = soilevap | ||
|
@@ -1274,10 +1283,9 @@ function update_after_subsurfaceflow(sbm::SBM, zi, exfiltsatwater, config) | |
do_surface_water_infiltration = | ||
get(config.model, "surface_water_infiltration", false)::Bool | ||
if do_surface_water_infiltration | ||
contribution_surfacewater = sbm.waterlevel_land[i] - sbm.ae_openw_l[i] | ||
correction_surfacewater = | ||
iszero(sbm.avail_forinfilt[i]) ? 1.0 : | ||
1.0 - (contribution_surfacewater / sbm.avail_forinfilt[i]) | ||
1.0 - (sbm.contribution_surfacewater[i] / sbm.avail_forinfilt[i]) | ||
else | ||
correction_surfacewater = 1.0 | ||
end | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Is this correct? For example, if
pond_volume_current[v]
is below thethreshold_volume
, and the input of water causespond_volume_pot > threshold_volume
, then part of the input of water to the kinematic wave should go first to the pond, and the rest is available for overland flow?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Just a quick thought: an alternative is to pull the pond out of the kinematic wave solution, and only consider vertical fluxes, similar to the
Paddy
approach.