@@ -53,6 +53,8 @@ module HillslopeHydrologyMod
5353 integer , private , parameter :: soil_profile_set_lowland_upland = 2
5454 integer , private , parameter :: soil_profile_linear = 3
5555
56+ real (r8 ), private , parameter :: floodplain_slope = 1e-3_r8
57+
5658 !- ----------------------------------------------------------------------
5759
5860contains
@@ -962,17 +964,32 @@ subroutine HillslopeStreamOutflow(bounds, &
962964
963965 integer :: c, l, g, i, j
964966 integer :: nstep
965- real (r8 ) :: dtime ! land model time step (sec)
967+ real (r8 ) :: dtime ! land model time step (sec)
968+ real (r8 ) :: cross_sectional_area_channel ! cross sectional area of stream channel (m2)
966969 real (r8 ) :: cross_sectional_area ! cross sectional area of stream water (m2)
967970 real (r8 ) :: stream_depth ! depth of stream water (m)
968971 real (r8 ) :: hydraulic_radius ! cross sectional area divided by wetted perimeter (m)
969972 real (r8 ) :: flow_velocity ! flow velocity (m/s)
970973 real (r8 ) :: overbank_area ! area of water above bankfull (m2)
974+ real (r8 ) :: overbank_depth ! depth of water above bankfull (m)
975+ real (r8 ) :: dynamic_viscosity
976+ real (r8 ) :: bankfull_flow_velocity
977+ real (r8 ) :: kinematic_viscosity
978+ real (r8 ) :: length_scale
979+ real (r8 ) :: reynolds
971980 real (r8 ), parameter :: manning_roughness = 0.03_r8 ! manning roughness
972981 real (r8 ), parameter :: manning_exponent = 0.667_r8 ! manning exponent
973982
974983 integer , parameter :: overbank_method = 1 ! method to treat overbank stream storage; 1 = increase dynamic slope, 2 = increase flow area cross section, 3 = remove instantaneously
975984 logical :: active_stream
985+ real (r8 ), parameter :: Acoef = 0.02939 ! mPa·s
986+ real (r8 ), parameter :: Bcoef = 507.88 ! K
987+ real (r8 ), parameter :: Ccoef = 149.30 ! K
988+ real (r8 ), parameter :: Tavg = 293.15 ! 20C + 273.15
989+ real (r8 ), parameter :: rhow = 1e3
990+ real (r8 ), parameter :: reynolds_thresh = 1000
991+ real (r8 ), parameter :: stream_conductivity = 1e-3_r8
992+ real (r8 ), parameter :: water_surface_slope = 5e-5_r8
976993 character (len=* ), parameter :: subname = ' HillslopeStreamOutflow'
977994
978995 !- ----------------------------------------------------------------------
@@ -998,25 +1015,71 @@ subroutine HillslopeStreamOutflow(bounds, &
9981015 if (lun% active(l) .and. active_stream) then
9991016 ! Streamflow calculated from Manning equation
10001017 if (streamflow_method == streamflow_manning) then
1018+ cross_sectional_area_channel = lun% stream_channel_width(l)* lun% stream_channel_depth(l)
1019+
10011020 cross_sectional_area = stream_water_volume(l) &
10021021 / lun% stream_channel_length(l)
1003- stream_depth = cross_sectional_area &
1004- / lun% stream_channel_width(l)
1005- hydraulic_radius = cross_sectional_area &
1006- / (lun% stream_channel_width(l) + 2 * stream_depth)
1022+
1023+ ! calculate hydraulic radius
1024+ if (cross_sectional_area <= cross_sectional_area_channel) then
1025+ stream_depth = cross_sectional_area &
1026+ / lun% stream_channel_width(l)
1027+ overbank_depth = 0._r8
1028+ hydraulic_radius = cross_sectional_area &
1029+ / (lun% stream_channel_width(l) + 2 * stream_depth)
1030+ else ! overbank conditions exist
1031+ stream_depth = lun% stream_channel_depth(l)
1032+ overbank_area = cross_sectional_area &
1033+ - cross_sectional_area_channel
1034+ ! use small positive slope for floodplain
1035+ overbank_depth = sqrt (floodplain_slope* overbank_area)
1036+
1037+ hydraulic_radius = cross_sectional_area &
1038+ / (lun% stream_channel_width(l) &
1039+ + 2 * stream_depth &
1040+ + 2 * overbank_depth/ floodplain_slope) ! sin ~ tan for small values
1041+ endif
10071042
10081043 if (hydraulic_radius <= 0._r8 ) then
10091044 volumetric_streamflow(l) = 0._r8
10101045 else
1011- flow_velocity = (hydraulic_radius)** manning_exponent &
1046+ ! check reynolds number using bankfull channel properties (static)
1047+ bankfull_flow_velocity = (lun% stream_channel_depth(l))** manning_exponent &
10121048 * sqrt (lun% stream_channel_slope(l)) &
10131049 / manning_roughness
1050+
1051+ ! check reynolds number dynamically
1052+ flow_velocity = (hydraulic_radius)** manning_exponent &
1053+ * sqrt (lun% stream_channel_slope(l)) &
1054+ / manning_roughness
1055+
1056+ ! Vogel-Fulcher-Tammann equation
1057+ dynamic_viscosity = Acoef * exp ((Bcoef/ (Tavg- Ccoef)))
1058+ kinematic_viscosity = dynamic_viscosity/ rhow
1059+
1060+ ! let length scale equal bankfull depth
1061+ ! length_scale = lun%stream_channel_depth(l)
1062+ ! reynolds = bankfull_flow_velocity*length_scale/kinematic_viscosity
1063+ ! let length scale equal dynamic depth
1064+ length_scale = stream_depth + overbank_depth
1065+ reynolds = flow_velocity* length_scale/ kinematic_viscosity
1066+
1067+ if ( reynolds < reynolds_thresh) then
1068+ ! use exponent = 2 instead of 0.66, and specified water surface slope
1069+ flow_velocity = (hydraulic_radius)** 2 &
1070+ * water_surface_slope &
1071+ / (manning_roughness)
1072+ else
1073+ flow_velocity = (hydraulic_radius)** manning_exponent &
1074+ * sqrt (lun% stream_channel_slope(l)) &
1075+ / manning_roughness
1076+ endif
10141077 ! overbank flow
1015- if (stream_depth > lun % stream_channel_depth(l) ) then
1078+ if (overbank_depth > 0._r8 ) then
10161079 if (overbank_method == 1 ) then
1017- ! try increasing dynamic slope
1018- volumetric_streamflow(l) = cross_sectional_area * flow_velocity &
1019- * (stream_depth / lun % stream_channel_depth(l))
1080+ ! flow velocity already accounts for overbank conditions
1081+
1082+ volumetric_streamflow(l) = cross_sectional_area * flow_velocity
10201083 else if (overbank_method == 2 ) then
10211084 ! try increasing flow area cross section
10221085 overbank_area = (stream_depth - lun% stream_channel_depth(l)) * 30._r8 * lun% stream_channel_width(l)
@@ -1080,6 +1143,7 @@ subroutine HillslopeUpdateStreamWater(bounds, waterstatebulk_inst, &
10801143 real (r8 ) :: qflx_drain_vol ! volumetric saturated drainage (m3/s)
10811144 real (r8 ) :: dtime ! land model time step (sec)
10821145 logical :: active_stream
1146+ real (r8 ) :: overbank_area, overbank_depth
10831147
10841148 character (len=* ), parameter :: subname = ' HillslopeUpdateStreamWater'
10851149
@@ -1138,6 +1202,14 @@ subroutine HillslopeUpdateStreamWater(bounds, waterstatebulk_inst, &
11381202 / lun% stream_channel_length(l) &
11391203 / lun% stream_channel_width(l)
11401204
1205+ ! recalculate for floodplain approximation
1206+ if (stream_water_depth(l)>lun% stream_channel_depth(l)) then
1207+ overbank_area = (stream_water_volume(l) &
1208+ / lun% stream_channel_length(l)) &
1209+ - lun% stream_channel_width(l)* lun% stream_channel_depth(l)
1210+ overbank_depth = sqrt (floodplain_slope* overbank_area)
1211+ stream_water_depth(l) = lun% stream_channel_depth(l) + overbank_depth
1212+ endif
11411213 end if
11421214 enddo
11431215
0 commit comments