cs_divert.f90 Source File


This file depends on

sourcefile~~cs_divert.f90~~EfferentGraph sourcefile~cs_divert.f90 cs_divert.f90 sourcefile~aquifer_module.f90 aquifer_module.f90 sourcefile~cs_divert.f90->sourcefile~aquifer_module.f90 sourcefile~basin_module.f90 basin_module.f90 sourcefile~cs_divert.f90->sourcefile~basin_module.f90 sourcefile~ch_cs_module.f90 ch_cs_module.f90 sourcefile~cs_divert.f90->sourcefile~ch_cs_module.f90 sourcefile~constituent_mass_module.f90 constituent_mass_module.f90 sourcefile~cs_divert.f90->sourcefile~constituent_mass_module.f90 sourcefile~cs_aquifer.f90 cs_aquifer.f90 sourcefile~cs_divert.f90->sourcefile~cs_aquifer.f90 sourcefile~cs_module.f90 cs_module.f90 sourcefile~cs_divert.f90->sourcefile~cs_module.f90 sourcefile~hru_module.f90 hru_module.f90 sourcefile~cs_divert.f90->sourcefile~hru_module.f90 sourcefile~hydrograph_module.f90 hydrograph_module.f90 sourcefile~cs_divert.f90->sourcefile~hydrograph_module.f90 sourcefile~res_cs_module.f90 res_cs_module.f90 sourcefile~cs_divert.f90->sourcefile~res_cs_module.f90 sourcefile~reservoir_data_module.f90 reservoir_data_module.f90 sourcefile~cs_divert.f90->sourcefile~reservoir_data_module.f90 sourcefile~water_allocation_module.f90 water_allocation_module.f90 sourcefile~cs_divert.f90->sourcefile~water_allocation_module.f90 sourcefile~water_body_module.f90 water_body_module.f90 sourcefile~cs_divert.f90->sourcefile~water_body_module.f90 sourcefile~ch_cs_module.f90->sourcefile~constituent_mass_module.f90 sourcefile~hydrograph_module.f90->sourcefile~basin_module.f90 sourcefile~time_module.f90 time_module.f90 sourcefile~hydrograph_module.f90->sourcefile~time_module.f90 sourcefile~water_allocation_module.f90->sourcefile~hydrograph_module.f90

Source Code

      subroutine cs_divert(iwallo,idmd,dem_id) !rtb cs
      
!!    ~ ~ ~ PURPOSE ~ ~ ~
!!    this subroutine adds cs mass to the channel, and and removes cs mass
!!    from the source object
      
      use water_allocation_module
      use water_body_module
      use aquifer_module
      use reservoir_data_module
      use hydrograph_module, only : irrig,res,sp_ob1,ob
      use hru_module, only : hru
      use basin_module, only : bsn_cc
      use cs_module !rtb cs
      use cs_aquifer !rtb cs
      use ch_cs_module !rtb cs
      use res_cs_module !rtb cs
      use constituent_mass_module

      implicit none 

      integer, intent (inout) :: iwallo     !water allocation object number
      integer, intent (inout) :: idmd       !water demand object number
      integer, intent (inout) :: dem_id     !ID of demand object that receives diverted water
      character*10 :: obj_type              !object type of source object
      character*10 :: obj_type_dem          !object type of demand object          
      integer :: obj_num = 0                !object number of source object
      integer :: isrc = 0                   !irrigation source counter
      integer :: nsource = 0                !number of irrigation sources for the object
      integer :: ires = 0                   !reservoir ID
      integer :: iaq = 0                    !aquifer ID
      integer :: ichan = 0                  !channel ID
      integer :: obnum = 0                  !object number
      integer :: ics = 0                    !cs ion counter
      real :: vol_total = 0.                !total volume (m3) withdrawn from source objects
      real :: vol_fraction = 0.             !fraction of total volume from each source object
      real :: obj_vol = 0.                  !volume (m3) withdrawn from each source object
      real :: mass_diff = 0.
      real :: ion_mass = 0.
      real :: res_mass = 0.
      real :: mass_initial = 0.
      real :: irrig_mass = 0.
      real :: gw_volume = 0.
      
      
      !determine number of water sources
      nsource = wallo(iwallo)%dmd(idmd)%dmd_src_obs
	    
      !demand object type
      obj_type_dem = wallo(iwallo)%dmd(idmd)%rcv_ob
      
      !loop through the water sources
      do isrc=1,nsource
        
        !determine the object type and object number
        obj_type = wallo(iwallo)%dmd(idmd)%src_ob(isrc)%ob_typ
        obj_num = wallo(iwallo)%dmd(idmd)%src_ob(isrc)%ob_num
        
        !total water volume removed from source object
        obj_vol = wallod_out(iwallo)%dmd(idmd)%src(isrc)%withdr
        
        !calculate cs mass added to channel (and cs mass removed from source object)
        if(obj_vol > 0) then
        
        !reservoir
        if(obj_type.eq.'res') then 
          ires = obj_num
          !remove cs mass from reservoir; add to channel
          do ics=1,cs_db%num_cs
            ion_mass = (res_water(ires)%csc(ics)*obj_vol) / 1000. !kg/day  
            res_mass = res_water(ires)%cs(ics) !kg
            mass_diff = 0.
            if(ion_mass.gt.res_mass) then
              mass_diff = ion_mass - res_mass
            endif  
            ion_mass = ion_mass - mass_diff
            if(ion_mass.lt.0) ion_mass = 0.
            !remove cs mass from the reservoir
            res_water(ires)%cs(ics) = res_water(ires)%cs(ics) - ion_mass
            !rescs_d(ires)%cs(ics)%div = rescs_d(ires)%cs(ics)%div + (ion_mass*-1) !kg - include in reservoir cs balance
            rescs_d(ires)%cs(ics)%div = rescs_d(ires)%cs(ics)%div + (-ion_mass) !kg - include in reservoir cs balance

            !add cs mass to receiving demand object
            if(obj_type_dem == "cha") then
              ch_water(dem_id)%cs(ics) = ch_water(dem_id)%cs(ics) + ion_mass !kg
              chcs_d(dem_id)%cs(ics)%div = chcs_d(dem_id)%cs(ics)%div + ion_mass !kg - include in channel cs balance
            elseif(obj_type_dem == "res") then
              res_water(dem_id)%cs(ics) = res_water(dem_id)%cs(ics) + ion_mass !kg
              rescs_d(dem_id)%cs(ics)%div = rescs_d(dem_id)%cs(ics)%div + ion_mass !kg - include in reservoir cs balance
            endif
          enddo
        
        !aquifer  
        elseif(obj_type.eq.'aqu' .and. bsn_cc%gwflow.eq.0) then !aquifer (if gwflow active: handled in gwflow_pumping)
          obnum = sp_ob1%aqu + obj_num - 1 
          iaq = obj_num
          !remove cs mass from aquifer; add to soil profile; include in daily cs mass balance
          do ics=1,cs_db%num_cs
            mass_initial = cs_aqu(iaq)%cs(ics)
            ion_mass = (cs_aqu(iaq)%csc(ics)*obj_vol) / 1000. !kg/day  
            mass_diff = 0.
            if(ion_mass.gt.cs_aqu(iaq)%cs(ics)) then
              mass_diff = ion_mass - cs_aqu(iaq)%cs(ics)
            endif  
            ion_mass = ion_mass - mass_diff
            if(ion_mass.lt.0) ion_mass = 0.
            !remove cs mass from the aquifer
            cs_aqu(iaq)%cs(ics) = cs_aqu(iaq)%cs(ics) - ion_mass !kg
            !acsb_d(iaq)%cs(ics)%div = acsb_d(iaq)%cs(ics)%div + (ion_mass*-1) !kg
            acsb_d(iaq)%cs(ics)%div = acsb_d(iaq)%cs(ics)%div + (-ion_mass) !kg      
            !add cs mass to receiving demand object
            if(obj_type_dem == "cha") then
              ch_water(dem_id)%cs(ics) = ch_water(dem_id)%cs(ics) + ion_mass !kg
              chcs_d(dem_id)%cs(ics)%div = chcs_d(dem_id)%cs(ics)%div + ion_mass !kg - include in channel cs balance
            elseif(obj_type_dem == "res") then
              res_water(dem_id)%cs(ics) = res_water(dem_id)%cs(ics) + ion_mass !kg
              rescs_d(dem_id)%cs(ics)%div = rescs_d(dem_id)%cs(ics)%div + ion_mass !kg - include in reservoir cs balance
            endif
            !convert aquifer mass to concentration
            gw_volume = (aqu_d(iaq)%stor/1000.) * (ob(obnum)%area_ha*10000.) !m3 of groundwater
            if(gw_volume.gt.0) then
              cs_aqu(iaq)%csc(ics) = (cs_aqu(iaq)%cs(ics) * 1000.) / gw_volume !g/m3 = mg/L
            else
              cs_aqu(iaq)%cs(ics) = 0.
              cs_aqu(iaq)%csc(ics) = 0.
            endif
          enddo
          
        !stream channel  
        elseif(obj_type.eq.'cha') then 
          obnum = sp_ob1%chandeg + obj_num - 1 !channel object
          ichan = ob(obnum)%num
          !remove cs mass from channel; add to soil profile; include in daily cs mass balance (rtb cs)
          do ics=1,cs_db%num_cs
            if(ob(obnum)%hd(1)%flo.gt.0) then
              mass_initial = ch_water(ichan)%cs(ics)
              ion_mass = (((ch_water(ichan)%cs(ics)*1000.)/ob(obnum)%hd(1)%flo)*obj_vol) / 1000. !kg/day  
              mass_diff = 0.
              if(ion_mass.gt.ch_water(ichan)%cs(ics)) then
                mass_diff = ion_mass - ch_water(ichan)%cs(ics) 
              endif  
              ion_mass = ion_mass - mass_diff
              if(ion_mass.lt.0) ion_mass = 0.
              !remove cs mass from channel
              ch_water(ichan)%cs(ics) = ch_water(ichan)%cs(ics) - ion_mass !kg
              !chcs_d(ichan)%cs(ics)%div = chcs_d(ichan)%cs(ics)%div + (ion_mass*-1) !kg - include in channel cs balance
              chcs_d(ichan)%cs(ics)%div = chcs_d(ichan)%cs(ics)%div + (-ion_mass) !kg - include in channel cs balance
              !add cs mass to receiving demand object
              if(obj_type_dem == "cha") then
                ch_water(dem_id)%cs(ics) = ch_water(dem_id)%cs(ics) + ion_mass !kg
                chcs_d(dem_id)%cs(ics)%div = chcs_d(dem_id)%cs(ics)%div + ion_mass !kg - include in channel cs balance
              elseif(obj_type_dem == "res") then
                res_water(dem_id)%cs(ics) = res_water(dem_id)%cs(ics) + ion_mass !kg
                rescs_d(dem_id)%cs(ics)%div = rescs_d(dem_id)%cs(ics)%div + ion_mass !kg - include in reservoir cs balance
              endif
            endif
          enddo
          
        endif
        
        endif
        
      enddo !go to next source object
      

      return
      end !cs_divert