cs_irrig.f90 Source File


This file depends on

sourcefile~~cs_irrig.f90~~EfferentGraph sourcefile~cs_irrig.f90 cs_irrig.f90 sourcefile~aquifer_module.f90 aquifer_module.f90 sourcefile~cs_irrig.f90->sourcefile~aquifer_module.f90 sourcefile~basin_module.f90 basin_module.f90 sourcefile~cs_irrig.f90->sourcefile~basin_module.f90 sourcefile~ch_cs_module.f90 ch_cs_module.f90 sourcefile~cs_irrig.f90->sourcefile~ch_cs_module.f90 sourcefile~constituent_mass_module.f90 constituent_mass_module.f90 sourcefile~cs_irrig.f90->sourcefile~constituent_mass_module.f90 sourcefile~cs_aquifer.f90 cs_aquifer.f90 sourcefile~cs_irrig.f90->sourcefile~cs_aquifer.f90 sourcefile~cs_module.f90 cs_module.f90 sourcefile~cs_irrig.f90->sourcefile~cs_module.f90 sourcefile~hru_module.f90 hru_module.f90 sourcefile~cs_irrig.f90->sourcefile~hru_module.f90 sourcefile~hydrograph_module.f90 hydrograph_module.f90 sourcefile~cs_irrig.f90->sourcefile~hydrograph_module.f90 sourcefile~res_cs_module.f90 res_cs_module.f90 sourcefile~cs_irrig.f90->sourcefile~res_cs_module.f90 sourcefile~reservoir_data_module.f90 reservoir_data_module.f90 sourcefile~cs_irrig.f90->sourcefile~reservoir_data_module.f90 sourcefile~water_allocation_module.f90 water_allocation_module.f90 sourcefile~cs_irrig.f90->sourcefile~water_allocation_module.f90 sourcefile~water_body_module.f90 water_body_module.f90 sourcefile~cs_irrig.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_irrig(iwallo,idmd,ihru) !rtb cs
      
!!    ~ ~ ~ PURPOSE ~ ~ ~
!!    this subroutine adds constituent mass from irrigation water into the soil profile, and removes constituent 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 cs_module !rtb cs
      use cs_aquifer !rtb cs
      use ch_cs_module !rtb cs
      use res_cs_module !rtb cs
      use basin_module, only : bsn_cc
      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) :: ihru       !HRU that receives irrigation water
      character*10 :: irrig_type  
      integer :: isrc = 0                   !irrigation source counter
      integer :: irrig_nsource = 0          !number of irrigation sources for the object
      integer :: irrig_ob = 0               !object number of irrigation source
      integer :: ires = 0                   !reservoir ID
      integer :: iaq = 0                    !aquifer ID
      integer :: ichan = 0                  !channel ID
      integer :: obnum = 0                  !object number
      integer :: obnum_chan = 0             !channel object number
      integer :: ics = 0                    !constituent counter
      integer :: wetland = 0                !wetland flag
      real :: irrig_total = 0.              !irrigation removed from source (m3)
      real :: irrig_fraction = 0.           !fraction of irrigation water
      real :: irrig_volume = 0.             !volume (m3) of irrigation water
      real :: mass_diff = 0.
      real :: ion_mass = 0.
      real :: res_mass = 0.
      real :: mass_initial = 0.
      real :: irrig_mass = 0.
      real :: gw_volume = 0.
      real :: cs_conc = 0.
      

      !determine number of irrigation sources
      irrig_nsource = wallo(iwallo)%dmd(idmd)%dmd_src_obs
      
      !loop through the irrigation sources
      do isrc=1,irrig_nsource
      
        !determine the object type and object number (of water source)
        irrig_type = wallo(iwallo)%dmd(idmd)%src_ob(isrc)%ob_typ
        irrig_ob = wallo(iwallo)%dmd(idmd)%src_ob(isrc)%ob_num
        
        !total water volume (m3) removed from source object
        irrig_volume = wallod_out(iwallo)%dmd(idmd)%src(isrc)%withdr
        
        !calculate salt mass added to soil profile via irrigation (and salt mass removed from source object)
        if(irrig_volume > 0) then
        
        !reservoir
        if(irrig_type.eq.'res') then 
          ires = irrig_ob
          !remove constituent mass from reservoir; add to soil profile; include in daily constituent mass balance
          do ics=1,cs_db%num_cs
            ion_mass = (res_water(ires)%csc(ics)*irrig_volume) / 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 constituent mass from the reservoir
            res_water(ires)%cs(ics) = res_water(ires)%cs(ics) - ion_mass !kg
            rescs_d(ires)%cs(ics)%irrig = rescs_d(ires)%cs(ics)%irrig + ion_mass !kg - include in reservoir constituent balance
            !add constituent mass to demand object
            wetland = hru(ihru)%dbs%surf_stor !check if HRU is a wetland
            if(wetland > 0) then !add to wetland
              wet_water(ihru)%cs(ics) = wet_water(ihru)%cs(ics) + ion_mass !kg  
              wetcs_d(ihru)%cs(ics)%irrig = wetcs_d(ihru)%cs(ics)%irrig + ion_mass !kg
            else !add to soil profile
              cs_soil(ihru)%ly(1)%cs(ics) = cs_soil(ihru)%ly(1)%cs(ics) + (ion_mass/hru(ihru)%area_ha) !kg/ha - add to soil layer
              hcsb_d(ihru)%cs(ics)%irsw = hcsb_d(ihru)%cs(ics)%irsw + (ion_mass/hru(ihru)%area_ha) !kg/ha - include in soil constituent balance  
            endif
          enddo
        
        !aquifer  
        elseif(irrig_type.eq.'aqu' .and. bsn_cc%gwflow.eq.0) then !aquifer (if gwflow active: handled in gwflow_ppag)
          obnum = sp_ob1%aqu + irrig_ob - 1 
          iaq = irrig_ob
          !remove constituent mass from aquifer; add to soil profile; include in daily constituent mass balance
          do ics=1,cs_db%num_cs
            mass_initial = cs_aqu(iaq)%cs(ics)
            ion_mass = (cs_aqu(iaq)%csc(ics)*irrig_volume) / 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.
            cs_aqu(iaq)%cs(ics) = cs_aqu(iaq)%cs(ics) - ion_mass !kg - remove from storage
            acsb_d(iaq)%cs(ics)%irr = acsb_d(iaq)%cs(ics)%irr + ion_mass !kg - include in aquifer constituent balance
            !add constituent mass to demand object
            wetland = hru(ihru)%dbs%surf_stor !check if HRU is a wetland
            if(wetland > 0) then !add to wetland
              wet_water(ihru)%cs(ics) = wet_water(ihru)%cs(ics) + ion_mass !kg  
              wetcs_d(ihru)%cs(ics)%irrig = wetcs_d(ihru)%cs(ics)%irrig + ion_mass !kg
            else !add to soil profile
              cs_soil(ihru)%ly(1)%cs(ics) = cs_soil(ihru)%ly(1)%cs(ics) + (ion_mass/hru(ihru)%area_ha) !kg/ha - add to soil layer
              hcsb_d(ihru)%cs(ics)%irgw = hcsb_d(ihru)%cs(ics)%irgw + (ion_mass/hru(ihru)%area_ha) !kg/ha - include in soil constituent 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(irrig_type.eq.'cha') then 
          obnum = sp_ob1%chandeg + irrig_ob - 1 !channel object
          ichan = ob(obnum)%num
          !remove constituent mass from channel; add to soil profile; include in daily constituent mass balance
          do ics=1,cs_db%num_cs
            if(ob(obnum)%hd(1)%flo > 10.) then
              mass_initial = ch_water(ichan)%cs(ics)
              ion_mass = (((ch_water(ichan)%cs(ics)*1000.)/ob(obnum)%hd(1)%flo)*irrig_volume) / 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.
              ch_water(ichan)%cs(ics) = ch_water(ichan)%cs(ics) - ion_mass !kg - remove from storage
              chcs_d(ichan)%cs(ics)%irr = chcs_d(ichan)%cs(ics)%irr + ion_mass !kg - include in channel constituent balance
              !add constituent mass to demand object
              wetland = hru(ihru)%dbs%surf_stor !check if HRU is a wetland
              if(wetland > 0) then !add to wetland
                wet_water(ihru)%cs(ics) = wet_water(ihru)%cs(ics) + ion_mass !kg  
                wetcs_d(ihru)%cs(ics)%irrig = wetcs_d(ihru)%cs(ics)%irrig + ion_mass !kg
              else !add to soil profile
                cs_soil(ihru)%ly(1)%cs(ics) = cs_soil(ihru)%ly(1)%cs(ics) + (ion_mass/hru(ihru)%area_ha) !kg/ha - add to soil layer
                hcsb_d(ihru)%cs(ics)%irsw = hcsb_d(ihru)%cs(ics)%irsw + (ion_mass/hru(ihru)%area_ha) !kg/ha - include in soil constituent balance
              endif
            endif
          enddo
        
        !canal diversion sources  
        elseif(irrig_type.eq.'div') then  
          !determine source channel of canal water
          obnum = sp_ob1%recall + irrig_ob - 1 !recall object  
          if(ob(obnum)%obtyp_out(1) == 'sdc') then
            ichan = ob(obnum)%obtypno_out(1)
            obnum_chan = sp_ob1%chandeg + ichan - 1 !channel object
            !add to soil profile; include in daily constituent mass balance
            if(ob(obnum_chan)%hd(1)%flo > 10.) then !only proceed if channel has water
            do ics=1,cs_db%num_cs
              !concentration of source channel water
              cs_conc = (ch_water(ichan)%cs(ics)*1000.)/ob(obnum_chan)%hd(1)%flo !g/m3
              ion_mass = (cs_conc*irrig_volume) / 1000. !kg/day  
              !add constituent mass to demand object
              wetland = hru(ihru)%dbs%surf_stor !check if HRU is a wetland
              if(wetland > 0) then !add to wetland
                wet_water(ihru)%cs(ics) = wet_water(ihru)%cs(ics) + ion_mass !kg  
                wetcs_d(ihru)%cs(ics)%irrig = wetcs_d(ihru)%cs(ics)%irrig + ion_mass !kg
              else !add to soil profile
                cs_soil(ihru)%ly(1)%cs(ics) = cs_soil(ihru)%ly(1)%cs(ics) + (ion_mass/hru(ihru)%area_ha) !kg/ha - add to soil layer
                hcsb_d(ihru)%cs(ics)%irsw = hcsb_d(ihru)%cs(ics)%irsw + (ion_mass/hru(ihru)%area_ha) !kg/ha - include in soil constituent balance
              endif
            enddo !go to next constituent
            endif
          endif
          
        !unlimited (outside watershed)
        elseif(irrig_type.eq.'unl') then 
          !add to soil profile; include in daily constituent mass balance
          do ics=1,cs_db%num_cs
            irrig_mass = 0.
            irrig_mass = (cs_irr(ihru)%csc(ics)/1000.) * irrig_volume !kg
            irrig_mass = irrig_mass / hru(ihru)%area_ha !kg/ha
            !add constituent mass to demand object
            wetland = hru(ihru)%dbs%surf_stor !check if HRU is a wetland
            if(wetland > 0) then !add to wetland
              wet_water(ihru)%cs(ics) = wet_water(ihru)%cs(ics) + irrig_mass !kg  
              wetcs_d(ihru)%cs(ics)%irrig = wetcs_d(ihru)%cs(ics)%irrig + irrig_mass !kg
            else !add to soil profile
              cs_soil(ihru)%ly(1)%cs(ics) = cs_soil(ihru)%ly(1)%cs(ics) + irrig_mass !kg/ha
              hcsb_d(ihru)%cs(ics)%irwo = hcsb_d(ihru)%cs(ics)%irwo + irrig_mass !kg/ha
            endif
          enddo  
        endif
        
        endif

      enddo !go to next irrigation source

      return
      end !cs_irrig