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

📄 readres.f

📁 水文模型的原始代码
💻 F
字号:
      subroutine readres
      
!!    ~ ~ ~ PURPOSE ~ ~ ~
!!    the purpose of this subroutine is to read in data from the reservoir
!!    input file (.res)

!!    ~ ~ ~ INCOMING VARIABLES ~ ~ ~
!!    name        |units         |definition
!!    ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
!!    i           |none          |reservoir number
!!    nbyr        |none          |number of calendar years simulated
!!    ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~

!!    ~ ~ ~ OUTGOING VARIABLES ~ ~ ~
!!    name         |units         |definition
!!    ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
!!    br1(:)       |none          |1st shape parameter for reservoir surface area
!!                                |equation
!!    br2(:)       |none          |2nd shape parameter for reservoir surface area
!!                                |equation
!!    evrsv(:)     |none          |lake evaporation coefficient
!!    iflod1r(:)   |none          |beginning month of non-flood season
!!                                |(needed if IRESCO=2)
!!    iflod2r(:)   |none          |ending month of non-flood season
!!                                |(needed if IRESCO=2)
!!    iresco(:)    |none          |outflow simulation code:
!!                                |0 compute outflow for uncontrolled reservoir
!!                                |  with average annual release rate
!!                                |1 measured monthly outflow
!!                                |2 simulated controlled outflow-target release
!!                                |3 measured daily outflow
!!    iyres(:)     |none          |year of the simulation that the reservoir 
!!                                |becomes operational
!!    mores(:)     |none          |month the reservoir becomes operational
!!    ndtargr(:)   |days          |number of days to reach target storage from
!!                                |current reservoir storage
!!                                |(needed if IRESCO=2)
!!    oflowmn(:,:) |m^3/day       |minimum daily ouflow for the month (read in as
!!                                |m^3/s and converted to m^3/day)
!!    oflowmx(:,:) |m^3/day       |maximum daily ouflow for the month (read in as
!!                                |m^3/s and converted to m^3/day)
!!    res_esa(:)   |ha            |reservoir surface area when reservoir is
!!                                |filled to emergency spillway 
!!    res_evol(:)  |m**3          |volume of water needed to fill the reservoir
!!                                |to the emergency spillway (read in as 10^4 m^3
!!                                |and converted to m^3)
!!    res_k(:)     |mm/hr         |hydraulic conductivity of the reservoir bottom
!!    res_nsed(:)  |kg/L          |normal amount of sediment in reservoir (read
!!                                |in as mg/L and convert to kg/L)
!!    res_psa(:)   |ha            |reservoir surface area when reservoir is
!!                                |filled to principal spillway
!!    res_pvol(:)  |m**3          |volume of water needed to fill the reservoir
!!                                |to the principal spillway (read in as 10^4 m^3
!!                                |and converted to m^3)
!!    res_rr(:)    |m**3/day      |average daily principal spillway release
!!                                |volume (read in as a release rate in m^3/s and
!!                                |converted to m^3/day)
!!    res_sed(:)   |kg/L          |amount of sediment in reservoir (read in as
!!                                |mg/L and converted to kg/L)
!!    res_sub(:)   |none          |number of subbasin reservoir is in (weather
!!                                |for the subbasin is used for the reservoir)
!!    res_vol(:)   |m**3          |reservoir volume (read in as 10^4 m^3 and
!!                                |converted to m^3)
!!    res_out(:,:,:)|m**3/day      |measured average daily outflow from the 
!!                                |reservoir for the month (needed if IRESCO=1)
!!                                |(read in as m**3/s and converted to m**3/day)
!!    sedstlr(:)   |none          |sediment settling rate 
!!    starg(:,:)   |m**3          |monthly target reservoir storage (needed if
!!                                |IRESCO=2) (read in as 10^4 m^3 and converted
!!                                |to m^3)
!!    wshd_resfr
!!    wshd_ressed  |metric tons   |total amount of suspended sediment in 
!!                                |reservoirs in the watershed
!!    wshd_resv    |m**3          |total volume of water in all reservoirs in 
!!                                |the watershed
!!    wuresn(:,:)  |m**3          |average amount of water withdrawn from 
!!                                |reservoir each month for consumptive water use
!!                                |(read in as 10^4 m^3 and converted to m^3)
!!    wurtnf(:)    |none          |fraction of water removed from the reservoir
!!                                |via WURESN which is returned and becomes flow
!!                                |from the reservoir outlet
!!    ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~

!!    ~ ~ ~ LOCAL DEFINITIONS ~ ~ ~
!!    name        |units         |definition
!!    ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
!!    eof         |none          |end of file flag
!!    j           |none          |counter
!!    lnvol       |none          |variable to hold denominator value
!!    mon         |none          |counter
!!    titldum     |NA            |title line in .res file (not used in program)
!!    res_d50     |micrometers   |median particle diameter of sediment
!!    resdayo     |NA            |name of daily reservoir outflow file
!!                               |(needed if IRESCO = 3)
!!    resdif      |m^3 H2O       |difference in volume held in reservoir at
!!                               |emergency spillway and at principal
!!                               |spillway
!!    resmono     |NA            |name of monthly reservoir outflow file
!!                               |(needed if IRESCO = 1)
!!    targ        |10^4 m^3 H2O  |target reservoir volume
!!    ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~

!!    ~ ~ ~ SUBROUTINES/FUNCTIONS CALLED ~ ~ ~
!!    SWAT: readlwq, caps
!!    Intrinsic: Log10

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

      use parm

      character (len=80) :: titldum
      character (len=13) :: resdayo, resmono
      integer :: eof, mon, j
      real :: resdif, targ, lnvol, res_d50

!!    initialize local variables
      resdayo = ""
      resmono = ""
      eof = 0
      res_d50 = 0.

!!    read in data from .res file
      do
        read (105,1000,iostat=eof) titldum
        if (eof < 0) exit
        read (105,*,iostat=eof) res_sub(i)
        if (eof < 0) exit
        read (105,*,iostat=eof) mores(i)
        if (eof < 0) exit
        read (105,*,iostat=eof) iyres(i)
        if (eof < 0) exit
        read (105,*,iostat=eof) res_esa(i)
        if (eof < 0) exit
        read (105,*,iostat=eof) res_evol(i)
        if (eof < 0) exit
        read (105,*,iostat=eof) res_psa(i)
        if (eof < 0) exit
        read (105,*,iostat=eof) res_pvol(i)
        if (eof < 0) exit
        read (105,*,iostat=eof) res_vol(i) 
        if (eof < 0) exit
        read (105,*,iostat=eof) res_sed(i) 
        if (eof < 0) exit
        read (105,*,iostat=eof) res_nsed(i)
        if (eof < 0) exit
        read (105,*,iostat=eof) res_d50
        if (eof < 0) exit
        read (105,*,iostat=eof) res_k(i)
        if (eof < 0) exit
        read (105,*,iostat=eof) iresco(i)
        if (eof < 0) exit
        read (105,1000,iostat=eof) titldum
        if (eof < 0) exit
        read (105,*,iostat=eof) (oflowmx(mon,i), mon = 1, 6)
        if (eof < 0) exit
        read (105,1000,iostat=eof) titldum
        if (eof < 0) exit
        read (105,*,iostat=eof) (oflowmx(mon,i), mon = 7, 12)
        if (eof < 0) exit
        read (105,1000,iostat=eof) titldum
        if (eof < 0) exit
        read (105,*,iostat=eof) (oflowmn(mon,i), mon = 1, 6)
        if (eof < 0) exit
        read (105,1000,iostat=eof) titldum
        if (eof < 0) exit
        read (105,*,iostat=eof) (oflowmn(mon,i), mon = 7, 12)
        if (eof < 0) exit
        read (105,*,iostat=eof) res_rr(i)
        if (eof < 0) exit
        read (105,1100,iostat=eof) resmono
        if (eof < 0) exit
        read (105,*,iostat=eof) iflod1r(i)
        if (eof < 0) exit
        read (105,*,iostat=eof) iflod2r(i)
        if (eof < 0) exit
        read (105,*,iostat=eof) ndtargr(i)
        if (eof < 0) exit
        read (105,1000,iostat=eof) titldum
        if (eof < 0) exit
        read (105,*,iostat=eof) (starg(mon,i), mon = 1, 6)
        if (eof < 0) exit
        read (105,1000,iostat=eof) titldum
        if (eof < 0) exit
        read (105,*,iostat=eof) (starg(mon,i), mon = 7, 12)
        if (eof < 0) exit
        read (105,1100,iostat=eof) resdayo
        if (eof < 0) exit
        read (105,1000,iostat=eof) titldum
        if (eof < 0) exit
        read (105,*,iostat=eof) (wuresn(mon,i), mon = 1, 6)
        if (eof < 0) exit
        read (105,1000,iostat=eof) titldum
        if (eof < 0) exit
        read (105,*,iostat=eof) (wuresn(mon,i), mon = 7, 12)
        if (eof < 0) exit
        read (105,*,iostat=eof) wurtnf(i)
        if (eof < 0) exit
        read (105,*,iostat=eof) evrsv(i)
        if (eof < 0) exit
        exit
      end do

!!    set default values
      if (res_sub(i) <= 0) res_sub(i) = 1
      if (ndtargr(i) <= 0) ndtargr(i) = 15
      if (res_d50 <= 0) res_d50 = 10.
      if (res_pvol(i) + res_evol(i) > 0.) then
        if (res_pvol(i) <= 0) res_pvol(i) = 0.9 * res_evol(i)
      else
        if (res_pvol(i) <= 0) res_pvol(i) = 60000.0
      end if
      if (res_evol(i) <= 0.0) res_evol(i) = 1.11 * res_pvol(i)     	
      if (res_psa(i) <= 0.0) res_psa(i) = 0.08 * res_pvol(i)
      if (res_esa(i) <= 0.0) res_esa(i) = 1.5 * res_psa(i) 
      targ = 0.
      targ = res_pvol(i) + 0.1 * (res_evol(i) - res_pvol(i))
      if (res_vol(i) > targ ) res_vol(i) = targ
      if (evrsv(i) <= 0.) evrsv(i) = 0.6
     
     
!!    convert units
      res_evol(i) = res_evol(i) * 10000.          !! 10**4 m**3 => m**3
      res_pvol(i) = res_pvol(i) * 10000.          !! 10**4 m**3 => m**3
      res_vol(i) = res_vol(i) * 10000.            !! 10**4 m**3 => m**3
      res_rr(i) = res_rr(i) * 86400.              !! m**3/s => m**3/day
      res_sed(i) = res_sed(i) * 1.e-6             !! mg/L => ton/m^3
      res_nsed(i) = res_nsed(i) * 1.e-6           !! mg/L => ton/m^3
      do mon = 1, 12
        wuresn(mon,i) = wuresn(mon,i) * 10000.    !! 10**4 m**3 => m**3
        starg(mon,i) = starg(mon,i) * 10000.      !! 10**4 m**3 => m**3
        oflowmx(mon,i) = oflowmx(mon,i) * 86400.  !! m**3/s => m**3/day
        oflowmn(mon,i) = oflowmn(mon,i) * 86400.  !! m**3/s => m**3/day
      end do


      
!!    open daily reservoir outflow file 
      if (iresco(i) == 3) then
        call caps(resdayo)
        open (350+i,file=resdayo)
        read (350+i,1000) titldum
      end if

!!    initialize watershed reservoir parameters
      wshd_resfr = wshd_resfr + 1.   !!need to check this and modify (??)
      wshd_resv = wshd_resv + res_vol(i)
      wshd_ressed = wshd_ressed + res_vol(i) * res_sed(i)

!!    calculate shape parameters for surface area equation
      resdif = 0.
      resdif = res_evol(i) - res_pvol(i)
      if ((res_esa(i) - res_psa(i)) > 0. .and. resdif > 0.) then	
      lnvol = 0.
      lnvol = Log10(res_evol(i)) - Log10(res_pvol(i))
      if (lnvol > 1.e-4) then
        br2(i) = (Log10(res_esa(i)) - Log10(res_psa(i))) / lnvol
      else 
        br2(i) = (Log10(res_esa(i)) - Log10(res_psa(i))) / 0.001
      end if
        if (br2(i) > 0.9) then
          br2(i) = 0.9
          br1(i) = res_psa(i)/res_pvol(i) ** 0.9
        else
          br1(i) = res_esa(i)/res_evol(i) ** br2(i)
        end if  
      else
        br2(i) = 0.9
        br1(i) = res_psa(i)/res_pvol(i) ** 0.9
      end if

!! calculate sediment settling rate
      sed_stlr(i) = Exp(-.184 * res_d50)

!! read in monthly release data
      if (iresco(i) == 1) then
        call caps(resmono)
        open (101,file=resmono)
        read (101,1000) titldum
          do j = 1, nbyr+2
            read (101,*,iostat=eof) (res_out(i,mon,j), mon = 1, 12)
            if (eof < 0) exit
            do mon = 1, 12
              !! convert m**3/s => m**3/day
              res_out(i,mon,j) = res_out(i,mon,j) * 86400.
            end do
          end do
        close (101)
      end if

      close (105)

      return
 1000 format (a80)
 1100 format (a13)
      end

⌨️ 快捷键说明

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