📄 irr_rch.f
字号:
subroutine irr_rch
!! ~ ~ ~ PURPOSE ~ ~ ~
!! this subroutine performs the irrigation operation when the water
!! source is a reach
!! ~ ~ ~ INCOMING VARIABLES ~ ~ ~
!! name |units |definition
!! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
!! aird(:) |mm H2O |amount of water applied to HRU on current
!! |day
!! auto_wstr(:,:,:)|none or mm |water stress factor which triggers auto
!! |irrigation
!! divmax(:) |mm H2O or |maximum daily irrigation diversion from
!! | 10^4 m^3 H2O|the reach (when IRR=1): when value is
!! |positive the units are mm H2O; when the
!! |value is negative, the units are (10**4
!! |m^3 H2O
!! flowfr(:) |none |fraction of available flow in reach that
!! |is allowed to be applied to the HRU
!! flowmin(:) |m**3/s |minimum instream flow for irrigation
!! |diversions when IRR=1, irrigation water
!! |will be diverted only when streamflow is
!! |at or above FLOWMIN.
!! iida |julian date |day being simulated (current julian date)
!! wstrs_id(:,:,:) |none |water stress identifier:
!! |1 plant water demand
!! |2 soil water deficit
!! iir(:,:,:) |julian date |date of irrigation operation
!! inum1 |none |reach number
!! ipot(:) |none |number of HRU (in subbasin) that is ponding
!! |water--the HRU that the surface runoff from
!! |current HRU drains into. This variable is
!! |used only for rice paddys or closed
!! |depressional areas
!! irr_amt(:,:,:) |mm H2O |depth of irrigation water applied to
!! |HRU
!! irrno(:) |none |irrigation source location
!! |if IRR=1, IRRNO is the number of the
!! | reach
!! |if IRR=2, IRRNO is the number of the
!! | reservoir
!! |if IRR=3, IRRNO is the number of the
!! | subbasin
!! |if IRR=4, IRRNO is the number of the
!! | subbasin
!! |if IRR=5, not used
!! irrsc(:) |none |irrigation source code:
!! |1 divert water from reach
!! |2 divert water from reservoir
!! |3 divert water from shallow aquifer
!! |4 divert water from deep aquifer
!! |5 divert water from source outside
!! | watershed
!! nair(:) |none |sequence number of auto-irrigation
!! |application within the year
!! nhru |none |number of HRUs in watershed
!! nirr(:) |none |sequence number of irrigation application
!! |within the year
!! nro(:) |none |sequence number of year in rotation
!! phuacc(:) |none |fraction of plant heat units accumulated
!! phuirr(:,:,:) |none |fraction of plant heat units at which
!! |irrigation occurs
!! pot_vol(:) |m**3 H2O |current volume of water stored in the
!! |depression/impounded area
!! rtwtr |m^3 H2O |water leaving reach on day
!! sedrch |metric tons |sediment transported out of reach on day
!! sol_sumfc(:) |mm H2O |amount of water held in the soil profile
!! |at field capacity
!! sol_sw(:) |mm H2O |amount of water stored in soil profile on any
!! |given day
!! strsw(:) |none |fraction of potential plant growth achieved
!! |on the day where the reduction is caused by
!! |water stress
!! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
!! ~ ~ ~ OUTGOING VARIABLES ~ ~ ~
!! name |units |definition
!! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
!! nirr(:) |none |sequence number of irrigation application
!! |within the year
!! pot_vol(:) |m**3 H2O |current volume of water stored in the
!! |depression/impounded area
!! rtwtr |m^3 H2O |water leaving reach on day
!! sedrch |metric tons |sediment transported out of reach on day
!! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
!! ~ ~ ~ LOCAL DEFINITIONS ~ ~ ~
!! name |units |definition
!! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
!! cnv |none |conversion factor (mm => m^3)
!! flag |none |irrigation flag:
!! |0 no irrigation operation on current day
!! |1 scheduled irrigation
!! |2 auto irrigation
!! jrch |none |reach number
!! k |none |HRU number
!! vminmm |mm H2O |maximum amount of water available for
!! |irrigation from reach
!! vmm |mm H2O |depth of irrigation water over HRU
!! vmxi |mm H2O |amount of water specified in irrigation
!! |operation
!! vol |m^3 H2O |volume of water applied in irrigation
!! |operation
!! wtrin |m^3 H2O |water outflow from reach prior to subtracting
!! |irrigation diversions
!! ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
!! ~ ~ ~ SUBROUTINES/FUNCTIONS CALLED ~ ~ ~
!! Intrinsic: Abs, Min
!! SWAT: irrigate
!! ~ ~ ~ ~ ~ ~ END SPECIFICATIONS ~ ~ ~ ~ ~ ~
use parm
integer :: jrch, k, flag, ii
real :: cnv, vmm, vminmm, vol, wtrin
jrch = 0
jrch = inum1
wtrin = 0.
wtrin = rtwtr + rchstor(jrch)
do k = 1, nhru
if (irrsc(k) == 1 .and. irrno(k) == jrch) then
!! check for timing of irrigation operation
flag = 0
if (iida == iir(nro(k),nirr(k),k)) flag = 1
if (phuacc(k) > phuirr(nro(k),nirr(k),k)) flag = 1
if (auto_wstr(nro(k),nair(k),k) > 0.) then
if (wstrs_id(nro(k),nair(k),k) == 1 .and. &
& strsw(k) < auto_wstr(nro(k),nair(k),k)) flag = 2
if (wstrs_id(nro(k),nair(k),k) == 2 .and. &
& sol_sumfc(k) - sol_sw(k) > auto_wstr(nro(k),nair(k),k))&
& flag = 2
end if
if (flag > 0) then
!!irrigate only if flow is greater than minimum flow
if (rtwtr > flowmin(k) * 86400.) then
cnv = 0.
cnv = hru_ha(k) * 10.
vmm = 0.
vminmm = 0.
!! compute maximum amount of water allowed in HRU
if (divmax(k) < 0.) then
!!divmax units are 10^4 m^3
vmm = Abs(divmax(k)) * 10000. / cnv
else
!! divmax units are mm H2O
vmm = divmax(k)
endif
!! compute maximum amount of water available for irrigation
!! from reach
wtr_avail = rtwtr + rchstor(jrch)
vminmm = (wtr_avail - flowmin(k) * 86400.) * flowfr(k) / cnv
vmm = Min(vminmm, vmm)
!! check available against set amount in scheduled operation
if (flag == 1) then
vmxi = 0.
vmxi = irr_amt(nro(k),nirr(k),k)
if (vmxi < 1.e-6) vmxi = sol_sumfc(k)
if (vmm > vmxi) vmm = vmxi
end if
if (flag == 2) then
vmxi = 0.
vmxi = sol_sumfc(k)
if (vmm > vmxi) vmm = vmxi
end if
if (vmm > 0.) then
vol = 0.
vol = vmm * cnv
if (ipot(k) == k) then
pot_vol(k) = pot_vol(k) + vol
else
call irrigate(k,vmm)
end if
!! subtract irrigation from reach outflow
if (ipot(k) /= k) then
vol = 0.
vol = aird(k) * cnv
end if
if (ievent > 2) then
do ii = 1, 24
hrtwtr(ii) = hrtwtr(ii) - vol * hrtwtr(ii) / rtwtr
if (hrtwtr(ii) < 0.) hrtwtr(ii) = 0.
end do
end if
xx = wtrin
if (xx > rchstor(jrch)) then
xx = wtrin - rchstor(jrch)
rchstor(jrch) = 0.
else
rchstor(jrch) = rchstor(jrch) - xx
xx = 0.
end if
if (xx > 0.) then
rtwtr = rtwtr - xx
rtwtr = amax1(0., rtwtr)
end if
!! advance irrigation operation number
if (flag == 1) then
nirr(k) = nirr(k) + 1
end if
end if
end if
end if
end if
end do
if (wtrin /= rtwtr .and. wtrin > 0.01) then
sedrch = sedrch * rtwtr / wtrin
if (sedrch < 0.) sedrch = 0.
if (ievent > 2) then
do ii = 1, 24
hsedyld(ii) = hsedyld(ii) * rtwtr / wtrin
end do
end if
end if
return
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -