channel_control.f90 Source File


This file depends on

sourcefile~~channel_control.f90~~EfferentGraph sourcefile~channel_control.f90 channel_control.f90 sourcefile~basin_module.f90 basin_module.f90 sourcefile~channel_control.f90->sourcefile~basin_module.f90 sourcefile~channel_data_module.f90 channel_data_module.f90 sourcefile~channel_control.f90->sourcefile~channel_data_module.f90 sourcefile~channel_module.f90 channel_module.f90 sourcefile~channel_control.f90->sourcefile~channel_module.f90 sourcefile~climate_module.f90 climate_module.f90 sourcefile~channel_control.f90->sourcefile~climate_module.f90 sourcefile~constituent_mass_module.f90 constituent_mass_module.f90 sourcefile~channel_control.f90->sourcefile~constituent_mass_module.f90 sourcefile~hydrograph_module.f90 hydrograph_module.f90 sourcefile~channel_control.f90->sourcefile~hydrograph_module.f90 sourcefile~time_module.f90 time_module.f90 sourcefile~channel_control.f90->sourcefile~time_module.f90 sourcefile~hydrograph_module.f90->sourcefile~basin_module.f90 sourcefile~hydrograph_module.f90->sourcefile~time_module.f90

Source Code

      subroutine channel_control
      
!!    ~ ~ ~ PURPOSE ~ ~ ~
!!    this subroutine simulates channel routing     

!!    ~ ~ ~ INCOMING VARIABLES ~ ~ ~
!!    name        |units         |definition  
!!    ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
!!    bankst(:)   |m^3 H2O       |bank storage
!!    inum1       |none          |reach number
!!    inum2       |none          |inflow hydrograph storage location number
!!    pet_ch      |mm H2O        |potential evapotranspiration on day
!!    rchdep      |m             |depth of flow on day
!!    rttlc       |m^3 H2O       |transmission losses from reach on day
!!    rtwtr       |m^3 H2O       |water leaving reach on day
!!    ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
!!    ~ ~ ~ OUTGOING VARIABLES ~ ~ ~
!!    name        |units         |definition
!!    ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
!!    revapday    |m^3 H2O       |amount of water moving from bank storage
!!                               |into the soil profile or being taken
!!                               |up by plant roots in the bank storage zone
!!    rtwtr       |m^3 H2O       |water leaving reach on day
!!    qdbank      |m^3 H2O       |streamflow contribution from bank storage
!!    sedrch      |metric tons   |sediment transported out of reach on day
!!    ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~

!!    ~ ~ ~ LOCAL DEFINITIONS ~ ~ ~
!!    name        |units         |definition
!!    ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
!!    ii          |none          |counter
!!    jrch        |none          |reach number
!!    ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~ ~

!!    ~ ~ ~ SUBROUTINES/FUNCTIONS CALLED ~ ~ ~
!!    Intrinsic: Min
!!    SWAT: rchinit, rtover, rtday, rtmusk, rthourly, rtsed, rthsed, watqual
!!    SWAT: noqual, hhwatqual, hhnoqual, rtpest, rthpest
!!    SWAT: rchuse, reachout

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

      use climate_module
      use hydrograph_module
      use basin_module
      use channel_data_module
      use time_module
      use channel_module
      use constituent_mass_module
      
      implicit none

      integer :: ii = 0   !units         |description
      real :: qdbank = 0. !m^3 H2O       |streamflow contribution from bank storage
      real :: revapday = 0. !m^3 H2O       |amount of water moving from bank storage
                          !              |into the soil profile or being taken
                          !              |up by plant roots in the bank storage zone
      real :: chlin = 0.       !mg chl-a/L    |chlorophyll-a concentration in inflow
      real :: algin = 0.       !mg alg/L      |algal biomass concentration in inflow
      real :: orgnin = 0.      !mg N/L        |organic N concentration in inflow
      real :: ammoin = 0.      !mg N/L        |ammonium N concentration in inflow
      real :: nitratin = 0.    !mg N/L        |nitrate concentration in inflow
      real :: nitritin = 0.    !mg N/L        |nitrite concentration in inflow
      real :: orgpin = 0.      !mg P/L        |organic P concentration in inflow 
      real :: dispin = 0.      !mg P/L        |soluble P concentration in inflow
      real :: cbodin = 0.      !mg/L          |carbonaceous biological oxygen demand
      real :: disoxin = 0.     !mg O2/L       |dissolved oxygen concentration in inflow
      real :: cinn = 0.        !mg N/L        |effective available nitrogen concentration
      real :: rttlc_d = 0.
      real :: rtevp_d = 0.
                         
      ch_d(jrch)%flo_out = 0.
      ch_d(jrch)%evap = 0.
      jhyd = ch_dat(jrch)%hyd
      jsed = ch_dat(jrch)%sed
      jnut = ch_dat(jrch)%nut

      iwst = ob(icmd)%wst
      pet_ch = wst(iwst)%weat%pet
      qdbank = 0.
      revapday = 0.
      
      !! initialize variables for route command loop
      call ch_rchinit

      !! zero flow out variables
      ob(icmd)%hd(1) = hz
      if (time%step > 0) then
        do ii = 1, time%step
          ob(icmd)%ts(1,ii) = hz
        end do
      end if  

      ch(jrch)%vel_chan = 0.
      ch(jrch)%dep_chan = 0.
      sedrch = 0.
      rch_san = 0.
      rch_cla = 0.
      rch_sil = 0.
      rch_sag = 0.
      rch_gra = 0.
      rch_lag = 0.
      wtrin = 0.
      algin = 0.
      chlin = 0.
      orgnin = 0.
      nitritin = 0.
      ammoin = 0.
      nitratin = 0.
      orgpin = 0.
      dispin = 0.
      cbodin = 0.
      disoxin = 0.
!! route water through reach
      rtwtr_d=0.
      cinn = 0.
      rttlc_d=0.
      rtevp_d =0.

!! route water through reach
      if (time%step == 0) then
          rt_delt = 1.
        wtrin = ob(icmd)%hin%flo
!! initialize inflow concentrations
        
        if (bsn_cc%rte == 0) call ch_rtday
        if (bsn_cc%rte == 1) call ch_rtmusk

        ben_area = ch_hyd(jhyd)%l *ch_hyd(jhyd)%w 
        
!        if (cs_db%num_pests > 0) then

!          call ch_rtpest 
!        end if
        
        rtwtr_d = rtwtr
        rttlc_d = rttlc
        rtevp_d = rtevp
      else
        rt_delt = 1. / time%step  
        wtrin = ob(icmd)%hin%flo * rt_delt
        rtwtr = 0.
        do ii = 1, time%step
        ! wtrin = ob(icmd)%ts(1,ii)%flo  
        call ch_rtday
!        call ch_rthpest
               rtwtr_d=rtwtr_d+rtwtr
               rttlc_d=rttlc_d+ rttlc
               rtevp_d =rtevp_d+ rtevp

!       hsedyld(ii) = ob(icmd)%ts(1,ii)%sed 
!       sedrch = sedrch + hsedyld(ii)
        rch_san = 0.
!       rch_sil = rch_sil + hsedyld(ii)  !!All are assumed to be silt type particles
        rch_cla = 0.
        rch_sag = 0.
        rch_lag = 0.
        rch_gra = 0.
        
        end do    
      endif

!! average daily water depth for sandi doty 09/26/07
      ch(jrch)%dep_chan = rchdep


!! add transmission losses to bank storage/deep aquifer in subbasin
      if (rttlc > 0.) then
        ch(jrch)%bankst = ch(jrch)%bankst + rttlc
      end if
 
!! compute revap from bank storage
      revapday = 0.6 * pet_ch *ch_hyd(jhyd)%l *ch_hyd(jhyd)%w
      revapday = Min(revapday, ch(jrch)%bankst)
      ch(jrch)%bankst = ch(jrch)%bankst - revapday

!! compute contribution of water in bank storage to streamflow
      qdbank = ch(jrch)%bankst * (1. - ch_hyd(jhyd)%alpha_bnk)
      ch(jrch)%bankst = ch(jrch)%bankst - qdbank
      rtwtr_d = rtwtr_d + qdbank
      if (time%step > 0) then
        do ii = 1, time%step
          hrtwtr(ii) = hrtwtr(ii) + qdbank / real(time%step)
        end do
      end if

!!    Channel Deposition (Only new deposits during the current time step)
      if (ch(jrch)%depch >= ch(jrch)%depprch) then
	    ch_d(jrch)%ch_dep = ch(jrch)%depch - ch(jrch)%depprch
	  else
	    ch_d(jrch)%ch_dep = 0.
	  end if
!!    Floodplain Deposition (Only new deposits during the current time step)
      if (ch(jrch)%depfp >= ch(jrch)%depprfp) then
	    ch_d(jrch)%fp_dep = ch(jrch)%depfp - ch(jrch)%depprfp
	  else
	    ch_d(jrch)%fp_dep = 0.
	  end if
!!    Total suspended sediments (only silt and clay)
      if (ch_sed(jsed)%eqn == 0) then
        ch_d(jrch)%tot_ssed = sedrch
      else
        ch_d(jrch)%tot_ssed = rch_sil + rch_cla
      endif
      
      return

      end subroutine channel_control