⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 virtual.f

📁 水文模型的原始代码
💻 F
📖 第 1 页 / 共 3 页
字号:
!!    sub_sw(:)   |mm H2O        |amount of water in soil in subbasin
!!    sub_tran(:) |mm H2O        |transmission losses for day in subbasin
!!    sub_wyld(:) |mm H2O        |water yield on day in subbasin
!!    sub_yorgn(:)|kg N/ha       |organic N in surface runoff on day in subbasin
!!    sub_yorgp(:)|kg P/ha       |organic P in surface runoff on day in subbasin
!!    varoute(1,:) |deg C        |temperature
!!    varoute(2,:) |m^3 H2O      |water
!!    varoute(3,:) |metric tons  |sediment or suspended solid load
!!    varoute(4,:) |kg N         |organic nitrogen
!!    varoute(5,:) |kg P         |organic phosphorus
!!    varoute(6,:) |kg N         |nitrate
!!    varoute(7,:) |kg P         |mineral phosphorus
!!    varoute(11,:)|mg pst       |pesticide in solution
!!    varoute(12,:)|mg pst       |pesticide sorbed to sediment
!!    varoute(13,:)|kg           |chlorophyll-a
!!    varoute(16,:)|kg           |carbonaceous biological oxygen demand
!!    varoute(17,:)|kg           |dissolved oxygen
!!    varoute(18,:)|# cfu/100ml  |persistent bacteria
!!    varoute(19,:)|# cfu/100ml  |less persistent bacteria
!!    wcklsp(:)   |
!!    ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~

!!    ~ ~ ~ LOCAL DEFINITIONS ~ ~ ~
!!    name        |units         |definition
!!    ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
!!    cnv         |none          |conversion factor (mm/ha => m^3)
!!    difflw      |mm H2O        |difference in total loading and surface runoff
!!                               |loading
!!    ii          |none          |counter
!!    j           |none          |HRU number
!!    kk          |none          |counter
!!    sb          |none          |subbasin number
!!    sub_ha      |ha            |area of subbasin in hectares
!!    sub_hwyld(:)|mm H2O        |water yield from subbasin during hour
!!    tothhqd     |mm H2O        |sum of hourly surface runoff for day
!!    wtmp        |deg C         |temperature of water
!!    ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~

!!    ~ ~ ~ SUBROUTINES/FUNCTIONS CALLED ~ ~ ~
!!    SWAT: hruday, impndday, subday
!!    SWAT: alph, pkq, ysed, enrsb, pesty, orgn, psed
!!    SWAT: Tair

!!    ~ ~ ~ ~ ~ ~ END SPECIFICATIONS ~ ~ ~ ~ ~ ~

      use parm

      integer :: j, sb, kk, ii
      real :: cnv, sub_ha, wtmp, tothhqd, difflw
      real :: sub_hwyld(24)

      j = 0
      sb = 0
      j = ihru
      sb = inum1

      cnv = 0.
      cnv = hru_ha(j) * 10.

!! write daily HRU output
      if (iprint == 1 .and. curyr > nyskip) call hruday
      if (iprint == 1 .and. curyr > nyskip) call impndday

!! sum HRU results for subbasin 
      if (sb > 0) then
      !! subbasin averages: water
        sub_subp(sb) = sub_subp(sb) + subp(j) * hru_dafr(j)
        sub_snom(sb) = sub_snom(sb) + snomlt * hru_dafr(j)
        sub_pet(sb) = sub_pet(sb) + pet_day * hru_dafr(j)
        sub_etday(sb) = sub_etday(sb) + etday * hru_dafr(j)
        sub_sumfc(sb) = sub_sumfc(sb) + sol_sumfc(j) * hru_dafr(j)
        sub_sw(sb) = sub_sw(sb) + sol_sw(j) * hru_dafr(j)
        sub_sep(sb) = sub_sep(sb) + sepbtm(j) * hru_dafr(j)
        sub_qd(sb) = sub_qd(sb) + qday * hru_dafr(j)
        sub_gwq(sb) = sub_gwq(sb) + gw_q(j) * hru_dafr(j)
        sub_wyld(sb) = sub_wyld(sb) + qdr(j) * hru_dafr(j)
        sub_latq(sb) = sub_latq(sb) + latq(j) * hru_dafr(j)

      !! subbasin averages: hourly water
        if (ievent > 2) then
          do ii = 1, 24
            sub_hhqd(sb,ii) = sub_hhqd(sb,ii) + hhqday(ii) * hru_dafr(j)
            !! equation 2.3.13 in SWAT manual
            sub_hhwtmp(sb,ii) = sub_hhwtmp(sb,ii) + hhqday(ii) *        &
     &                hru_fr(j) * (5.0 + 0.75 * Tair(ii,j))
          end do
        end if

      !! subbasin averages: sediment
        sub_sedy(sb) = sub_sedy(sb) + sedyld(j)

        surqno3(j) = amax1(1.e-6,surqno3(j))
        latno3(j) = amax1(1.e-6,latno3(j))
        no3gw(j) = amax1(1.e-6,no3gw(j))
        surqsolp(j) = amax1(1.e-6,surqsolp(j))
        minpgw(j) = amax1(1.e-6,minpgw(j))
        sedorgn(j) = amax1(1.e-6,sedorgn(j))
        sedorgp(j) = amax1(1.e-6,sedorgp(j))
        sedminpa(j) = amax1(1.e-6,sedminpa(j))
        sedminps(j) = amax1(1.e-6,sedminps(j))
        

      !! subbasin averages: nutrients
        if (latno3(j) < 1.e-6) latno3(j) = 0.0
        sub_no3(sb) = sub_no3(sb) + surqno3(j) * hru_dafr(j)
        sub_latno3(sb) = sub_latno3(sb) + latno3(j) * hru_dafr(j)
        sub_gwno3(sb) = sub_gwno3(sb) + no3gw(j) * hru_dafr(j)
        sub_solp(sb) = sub_solp(sb) + surqsolp(j) * hru_dafr(j)
        sub_gwsolp(sb) = sub_gwsolp(sb) + minpgw(j) * hru_dafr(j)
        sub_yorgn(sb) = sub_yorgn(sb) + sedorgn(j) * hru_dafr(j)
        sub_yorgp(sb) = sub_yorgp(sb) + sedorgp(j) * hru_dafr(j)
        sub_sedpa(sb) = sub_sedpa(sb) + sedminpa(j) * hru_dafr(j)
        sub_sedps(sb) = sub_sedps(sb) + sedminps(j) * hru_dafr(j)

      !! subbasin averages: pesticides
        if (irtpest > 0) then
          sub_solpst(sb) = sub_solpst(sb) + hrupstd(irtpest,1,j) +      &
     &                                              hrupstd(irtpest,4,j)
          sub_sorpst(sb) = sub_sorpst(sb) + hrupstd(irtpest,2,j)
        end if

      !! subbasin averages: bacteria
        sub_bactp(sb) = sub_bactp(sb) + (bactrop + bactsedp)            &
     &                                                     * hru_dafr(j)
        sub_bactlp(sb) = sub_bactlp(sb) + (bactrolp + bactsedlp)        &
     &                                                     * hru_dafr(j)

      !! subbasin averages: water quality indicators
        sub_chl(sb) = sub_chl(sb) + chl_a(j) * (qday * qdfr * cnv)      &
     &                                                           * 1.e-6
        sub_cbod(sb) = sub_cbod(sb) + cbodu(j) * (qdr(j) * qdfr * cnv)  &
     &                                                           * 1.e-3
        sub_dox(sb) = sub_dox(sb) + (doxq(j) * (qdr(j) * qdfr * cnv) +  &
     &               soxy * (qdr(j) * (1. - qdfr) * cnv)) * 1.e-3

      !! subbasin averages: water temperature
      !! Stefan and Preudhomme. 1993.  Stream temperature estimation
      !! from air temperature.  Water Res. Bull. p. 27-45
        wtmp = 0.
        wtmp = 5.0 + 0.75 * tmpav(j)
        sub_wtmp(sb) = sub_wtmp(sb) + wtmp * qdr(j) * hru_dafr(j)

      !! subbasin averages used in subbasin sediment calculations
        wcklsp(sb) = wcklsp(sb) + cklsp(j) * hru_dafr(j)
        sub_precip(sb) = sub_precip(sb) + precipday * hru_dafr(j)
        sub_surfq(sb) = sub_surfq(sb) + surfq(j) * hru_dafr(j)
        sub_tran(sb) = sub_tran(sb) + tloss * hru_dafr(j)
        sub_bd(sb) = sub_bd(sb) + sol_bd(1,j) * hru_dafr(j)
        sub_orgn(sb) = sub_orgn(sb) + (sol_orgn(1,j) +                  &
     &                      sol_aorgn(1,j) + sol_fon(1,j)) * hru_dafr(j)
       ! do kk = 1, mp
       ! sub_pst(kk,sb) = sub_pst(kk,sb) + sol_pst(k,j,1) * hru_dafr(j)
       ! end do
      end if
!! end subbasin summarization calculations

!! perform subbasin level operations after processing last HRU in subbasin
      if (iihru == hrutot(sb)) then
        sub_ha = 0.
        sub_ha = da_ha * sub_fr(sb)

        !! calculate subbasin average values for weighted parameters
        if (subfr_nowtr(sb) > 1.e-6) then
            sub_snom(sb) = sub_snom(sb) / subfr_nowtr(sb)
            sub_sumfc(sb) = sub_sumfc(sb) / subfr_nowtr(sb)
            sub_sw(sb) = sub_sw(sb) / subfr_nowtr(sb)
            sub_sep(sb) = sub_sep(sb) / subfr_nowtr(sb)
            sub_qd(sb) = sub_qd(sb) / subfr_nowtr(sb)
            sub_gwq(sb) = sub_gwq(sb) / subfr_nowtr(sb)
            sub_wyld(sb) = sub_wyld(sb) / subfr_nowtr(sb)
            sub_latq(sb) = sub_latq(sb) / subfr_nowtr(sb)
        else
            sub_snom(sb) = 0.0
            sub_sumfc(sb) = 0.0
            sub_sw(sb) = 0.0 
            sub_sep(sb) = 0.0
            sub_qd(sb) = 0.0
            sub_gwq(sb) = 0.0
            sub_wyld(sb) = 0.0
            sub_latq(sb) = 0.0
        end if

        sub_subp(sb) = sub_subp(sb) / sub_fr(sb)
        sub_pet(sb) = sub_pet(sb) / sub_fr(sb)
        sub_etday(sb) = sub_etday(sb) / sub_fr(sb)

        if (ievent > 2) then
          do ii = 1, 24
            sub_hhqd(sb,ii) = sub_hhqd(sb,ii) / sub_fr(sb)
            if (sub_hhqd(sb,ii) > 0.1) then
            sub_hhwtmp(sb,ii) = sub_hhwtmp(sb,ii) / sub_hhqd(sb,ii)
            else
            sub_hhwtmp(sb,ii) = 0.
            end if
          end do
   
        hqd = 0.
        do ii = 1, 24
          do ib = 1, itb(sb)
            hqd(ib+ii-1) = hqd(ib+ii-1) + sub_hhqd(sb,ii) * uh(sb,ib)
          end do
        end do
    
        do ii = 1, 24
          sub_hhqd(sb,ii) = hqd(ii) + hqdsave(ii)
        end do

        do ii = 1, itb(sb)
          hqdsave(ii) = hqdsave(ii+24) + hqd(ii+24)
        end do 
        end if

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -