hru_hyds.f90 Source File


This file depends on

sourcefile~~hru_hyds.f90~~EfferentGraph sourcefile~hru_hyds.f90 hru_hyds.f90 sourcefile~basin_module.f90 basin_module.f90 sourcefile~hru_hyds.f90->sourcefile~basin_module.f90 sourcefile~climate_module.f90 climate_module.f90 sourcefile~hru_hyds.f90->sourcefile~climate_module.f90 sourcefile~constituent_mass_module.f90 constituent_mass_module.f90 sourcefile~hru_hyds.f90->sourcefile~constituent_mass_module.f90 sourcefile~hru_module.f90 hru_module.f90 sourcefile~hru_hyds.f90->sourcefile~hru_module.f90 sourcefile~hydrograph_module.f90 hydrograph_module.f90 sourcefile~hru_hyds.f90->sourcefile~hydrograph_module.f90 sourcefile~output_landscape_module.f90 output_landscape_module.f90 sourcefile~hru_hyds.f90->sourcefile~output_landscape_module.f90 sourcefile~output_ls_pesticide_module.f90 output_ls_pesticide_module.f90 sourcefile~hru_hyds.f90->sourcefile~output_ls_pesticide_module.f90 sourcefile~time_module.f90 time_module.f90 sourcefile~hru_hyds.f90->sourcefile~time_module.f90 sourcefile~hydrograph_module.f90->sourcefile~basin_module.f90 sourcefile~hydrograph_module.f90->sourcefile~time_module.f90

Source Code

      subroutine hru_hyds
      
!!    ~ ~ ~ PURPOSE ~ ~ ~
!!    this subroutine summarizes data for subbasins with multiple HRUs and
!!    prints the daily output.hru file

      use hru_module, only : cbodu, chl_a, clayld, doxq, hhsurfq, hru, ihru, lagyld, latq, qp_cms, percn, qday,  &
         sagyld, sanyld, silyld, sedminpa, sedminps, sedorgn, sedorgp, sepbtm, surqno3, surqsolp, tileno3,     &
         sedyld, latno3, qtile, tconc, satexq_chan, surqsalt, latqsalt, tilesalt, percsalt, urbqsalt,          & !rtb salt
         snomlt, wetqsalt,                                                                                     &
         surqcs, latqcs, tilecs, perccs, sedmcs, urbqcs, wetqcs !rtb cs
      use hydrograph_module
      use basin_module
      use time_module
      use constituent_mass_module
      use output_landscape_module
      use output_ls_pesticide_module
      use climate_module
      
      implicit none

      integer :: j = 0               !none          |same as ihru (hru number)
      real :: cnv_m3 = 0.            !              |
      real :: cnv_kg = 0.            !              |
      real :: cnv_ppm = 0.            !              |
      integer :: iob = 0             !              |
      integer :: ihyd = 0            !none          |counter
      integer :: ipest = 0           !none          |counter
      integer :: ipath = 0           !none          |counter 
      integer :: isalt = 0           !none          |counter for salt ions (rtb salt)
      integer :: ics = 0             !none          |counter for constituents (rtb cs)
      integer :: istep = 0           !none          |counter
      integer :: istep_bak = 0       !none          |counter
      integer :: day_cur = 0         !none          |counter
      integer :: day_next = 0        !none          |counter
      integer :: tinc = 0            !none          |
      integer :: inext_step = 0
      
      j = ihru
      cnv_m3 = hru(j)%area_ha * 10.
      cnv_kg = hru(j)%area_ha
      
      !! assign reach loadings for subbasin
      !! zero out hydrograph storage locations
      iob = icmd 
      ob(icmd)%hd(1) = hz
      ob(icmd)%hd(2) = hz
      ob(icmd)%hd(3) = hz
      ob(icmd)%hd(4) = hz
      ob(icmd)%hd(5) = hz
      if (cs_db%num_tot > 0) then
        obcs(icmd)%hd(1) = hin_csz
        obcs(icmd)%hd(2) = hin_csz
        obcs(icmd)%hd(3) = hin_csz
        obcs(icmd)%hd(4) = hin_csz
        obcs(icmd)%hd(5) = hin_csz
      end if

      !! surface runoff hydrograph (3)
      ob(icmd)%hdsep%flo_surq = qday * cnv_m3            !!rtb gwflow - hydrograph separation (surface runoff)
      ob(icmd)%hdsep%flo_satexsw = satexq_chan * cnv_m3  !!rtb gwflow - hydrograph separation (saturation excess runoff)
      ob(icmd)%peakrate = qp_cms
      ob(icmd)%hd(3)%temp = 5. + .75 * w%tave         !!wtmp
      ob(icmd)%hd(3)%flo = qday * cnv_m3              !!qdr m3/d
      ob(icmd)%hd(3)%sed = sedyld(j)                  !!sedyld
      ob(icmd)%hd(3)%orgn = sedorgn(j) * cnv_kg       !!sedorgn
      ob(icmd)%hd(3)%sedp = (sedorgp(j) + sedminpa(j) +                 &
                        sedminps(j)) * cnv_kg         !!sedorgp & sedminps
      ob(icmd)%hd(3)%no3 = surqno3(j) * cnv_kg        !!surqno3 & latno3 & no3gw
      ob(icmd)%hd(3)%solp = (surqsolp(j) + hls_d(j)%tilelabp) * cnv_kg      !!surqsolp & sedminpa
      ob(icmd)%hd(3)%chla = chl_a(j) *cnv_kg          !!chl_a
      ob(icmd)%hd(3)%nh3 = 0.                         !! NH3
      ob(icmd)%hd(3)%no2 = 0.                         !! NO2
      if (ob(icmd)%hd(3)%flo > 0.01) then
        cnv_ppm = 1. / (1000. * ob(icmd)%hd(3)%flo)
      else
        cnv_ppm = 0.
      end if
      ob(icmd)%hd(3)%cbod = cbodu(j) * cnv_ppm        !!cbodu
      ob(icmd)%hd(3)%dox = doxq(j) * cnv_ppm          !!doxq & soxy

      ob(icmd)%hd(3)%san = sanyld(j)                  !! detached sand
      ob(icmd)%hd(3)%sil = silyld(j)                  !! detached silt
      ob(icmd)%hd(3)%cla = clayld(j)                  !! detached clay
      ob(icmd)%hd(3)%sag = sagyld(j)                  !! detached small aggregates
      ob(icmd)%hd(3)%lag = lagyld(j)                  !! detached large aggregates
      
      !set constituents
      do ipest = 1, cs_db%num_pests
        obcs(icmd)%hd(3)%pest(ipest) = (hpestb_d(j)%pest(ipest)%surq + hpestb_d(j)%pest(ipest)%sed) * cnv_kg
      end do
      do ipath = 1, cs_db%num_paths
        obcs(icmd)%hd(3)%path(ipath) = 0
      end do
      do isalt = 1, cs_db%num_salts !rtb salt
              obcs(icmd)%hd(3)%salt(isalt) = (surqsalt(j,isalt)+urbqsalt(j,isalt)+wetqsalt(j,isalt)) * cnv_kg !kg of each salt ion
      enddo
      do ics = 1, cs_db%num_cs !rtb cs
              obcs(icmd)%hd(3)%cs(ics) = (surqcs(j,ics)+sedmcs(j,ics)+urbqcs(j,ics)+wetqcs(j,ics)) * cnv_kg !kg of each constituent (surface runoff + attached)
      enddo
      
      !recharge hydrograph (2)
      ob(icmd)%hd(2)%flo = sepbtm(j) * cnv_m3           !! recharge flow
      ob(icmd)%hd(2)%no3 = percn(j) * cnv_kg            !! recharge nitrate
      !set constituents
      do ipest = 1, cs_db%num_pests
        obcs(icmd)%hd(2)%pest(ipest) = hpestb_d(j)%pest(ipest)%perc * cnv_kg
      end do
      do ipath = 1, cs_db%num_paths
        obcs(icmd)%hd(2)%path(ipath) = 0
      end do
      do isalt = 1, cs_db%num_salts !rtb salt
        obcs(icmd)%hd(2)%salt(isalt) = percsalt(j,isalt) * cnv_kg !kg of each salt ion
      enddo
      do ics = 1, cs_db%num_cs !rtb cs
        obcs(icmd)%hd(2)%cs(ics) = perccs(j,ics) * cnv_kg !kg of each constituent
      enddo
      
      !lateral soil flow hydrograph (4)
      ob(icmd)%hd(4)%flo = latq(j) * cnv_m3                 !! lateral flow
      ob(icmd)%hdsep%flo_latq = latq(j) * cnv_m3            !!rtb gwflow - hydrograph separation
      ob(icmd)%hd(4)%no3 = latno3(j) * cnv_kg
      !set constituents
      do ipest = 1, cs_db%num_pests
        obcs(icmd)%hd(4)%pest(ipest) = hpestb_d(j)%pest(ipest)%latq * cnv_kg
      end do
      do ipath = 1, cs_db%num_paths
        obcs(icmd)%hd(4)%path(ipath) = 0
      end do
      do isalt = 1, cs_db%num_salts !rtb salt
        obcs(icmd)%hd(4)%salt(isalt) = latqsalt(j,isalt) * cnv_kg !kg of each salt ion
      enddo
      do ics = 1, cs_db%num_cs !rtb cs
        obcs(icmd)%hd(4)%cs(ics) = latqcs(j,ics) * cnv_kg !kg of each constituent
      enddo
      
      !tile flow hydrograph (5)
      ob(icmd)%hd(5)%flo = qtile * cnv_m3               !! tile flow
      ob(icmd)%hd(5)%no3 = tileno3(j) * cnv_kg          !! tile flow nitrate 
      !set constituents
      do ipest = 1, cs_db%num_pests
        obcs(icmd)%hd(5)%pest(ipest) = hpestb_d(j)%pest(ipest)%tileq * cnv_kg
      end do
      do ipath = 1, cs_db%num_paths
        obcs(icmd)%hd(5)%path(ipath) = 0.
      end do
      
      !water temperature calculations
      !percolate temperature
      ob(icmd)%hd(2)%temp = w_temp%sur_lat
      !surface runoff temperature
      if (snomlt > 0.1) then
        ob(icmd)%hd(3)%temp = w_temp%sno_mlt
      else
        ob(icmd)%hd(3)%temp = w_temp%sur_lat
      end if
      !lateral soil flow temperature
      ob(icmd)%hd(4)%temp = w_temp%sur_lat
      !tile flow temperature
      ob(icmd)%hd(5)%temp = w_temp%sur_lat
      do isalt = 1, cs_db%num_salts !rtb salt
        obcs(icmd)%hd(5)%salt(isalt) = tilesalt(j,isalt) * cnv_kg !kg of each salt ion
      enddo
      do ics = 1, cs_db%num_cs !rtb cs
        obcs(icmd)%hd(5)%cs(ics) = tilecs(j,ics) * cnv_kg !kg of each constituent
      enddo
      
      !sum to obtain the total outflow hydrograph (1)
      do ihyd = 3, 5
        ob(icmd)%hd(1) = ob(icmd)%hd(1) + ob(icmd)%hd(ihyd)
      end do
      
      !set constituents
      do ipest = 1, cs_db%num_pests
        obcs(icmd)%hd(1)%pest(ipest) = obcs(icmd)%hd(3)%pest(ipest) + obcs(icmd)%hd(4)%pest(ipest) +    &
                                                                      obcs(icmd)%hd(5)%pest(ipest)
      end do
      do ipath = 1, cs_db%num_paths
        obcs(icmd)%hd(1)%path(ipath) = 0
      end do
      do isalt = 1, cs_db%num_salts !rtb salt
        obcs(icmd)%hd(1)%salt(isalt) = obcs(icmd)%hd(3)%salt(isalt) + obcs(icmd)%hd(4)%salt(isalt) +    &  !total = surface runoff + lateral flow + tile flow
                                                                      obcs(icmd)%hd(5)%salt(isalt)
      enddo
      do ics = 1, cs_db%num_cs !rtb cs
        obcs(icmd)%hd(1)%cs(ics) = obcs(icmd)%hd(3)%cs(ics) + obcs(icmd)%hd(4)%cs(ics) +    &  !total = surface runoff + lateral flow + tile flow
                                                              obcs(icmd)%hd(5)%cs(ics)
      enddo
      
      !! set subdaily hydrographs
      !! set previous and next days for adding previous and translating to next
      day_cur = ob(icmd)%day_cur
      day_next = day_cur + 1
      if (day_next > ob(icmd)%day_max) day_next = 1
          
      if (time%step > 1) then
        if (bsn_cc%gampt == 1) then
          !! hhsurfq from sq_greenampt - mm
          ob(icmd)%hyd_flo(day_cur,:) = ob(icmd)%hyd_flo(day_cur,:) + hhsurfq(j,:) * cnv_m3
          
          !! translate the hydrogrpah by time of concentration - no attenuation
          ob(icmd)%hyd_flo(day_next,:) = 0.
          if (tconc(j) * 60. > time%dtm) then
            tinc = int (tconc(j) * 60. / time%dtm)
            tinc = min1 (float(time%step), float(tinc))
            !! move to next days hydrograph
            do istep = 1, tinc
              inext_step = time%step - tinc + istep
              ob(icmd)%hyd_flo(day_next,istep) = ob(icmd)%hyd_flo(day_cur,inext_step)
            end do
            !! shift current day hydrograph
            do istep = 1, time%step
              istep_bak = time%step - istep + 1
              if (istep_bak <= tinc) then
                ob(icmd)%hyd_flo(day_cur,istep_bak) = 0.
              else
                ob(icmd)%hyd_flo(day_cur,istep_bak) = ob(icmd)%hyd_flo(day_cur,istep_bak-tinc)
              end if
            end do
          end if
        else
          !! use unit hydrograph and daily runoff
          call flow_hyd_ru_hru (ob(icmd)%day_cur, ob(icmd)%hd(3)%flo, ob(icmd)%hd(4)%flo,     &
                                        ob(icmd)%hd(5)%flo, ob(icmd)%uh, ob(icmd)%hyd_flo)
        end if
      else
        !! set to total runoff needed when summing incoming in command
        ob(icmd)%hyd_flo(day_cur,1) = ob(icmd)%hd(1)%flo
      end if

      return   
      end subroutine hru_hyds