Skip to content
Snippets Groups Projects
fluvial_erosion.f 7.29 KiB
Newer Older
  • Learn to ignore specific revisions
  • c fluvial_erosion
    
          subroutine fluvial_erosion (xkf,xlf_BR,xlf_AL,width_c,
         &                            x,y,h,h0,hi,ndon,nnode,
         &                            surface,slope,length,
         &                            water,sediment,
         &                            ibucket,dt,fix,
         &                            dhh,
         &                            nb,nn,nbmax,
         &                            iorder,itype_node,
         &                            dhminfluv,dhmaxfluv,
         &                            nlake,
         &                            sea_level,outflux,ideposition)
    
    c subroutine to calculate fluvial erosion
    
    c INPUT: xkf         = diffusivity
    c        xlf_BR      = bedrock erosion length scale
    c        xlf_AL      = alluvials erosion length scale
    c        width_c     = coef controling channel width as fnct of discharge
    c        x,y         = x- and y-nodal positions
    c        h           = present topography
    c        h0          = bedrock-alluvion interface
    c        hi          = initial topography (at time 0)
    c        ndon        = donor array
    c        nnode       = number of nodes
    c        surface     = surface associated with each node
    c        slope       = slope associated with each nodal link (stream)
    c        length      = length associated with each nodal link (stream)
    c        ibucket     = working array
    c        dt          = time step length
    c        fix         = boundary conditoin array
    c        dhh         = amount of material eroded/deposited over the time step
    c        nb          = number of natural neighbours per node
    c        nn          = list of natural neighbours
    c        nbmax       = maximum of natural neighbours
    c        iorder      = working array containing the proper sequence in node
    c                      number in which to perform the river erosion operations
    c        itype_node  = type associated to each node (see later in code)
    c        dhminfluv   = minimum amount removed by river erosion
    c        dhmaxfluv   = maximum amount removed by river erosion
    c        nlake       = determines whether a node is part of a lake or not
    c        sea_level   = sea level
    c        ideposition = to prevent deposition by rivers (=0)
    
    
    c OUTPUT:  several arrays are updated:
    c        h           = new current topography
    
    c          the contribution from river incision to outflux is calculated
    
    c          the following arrays are filled:
    c        water       = water discharge at each point
    c        sediment    = sediment load at each point
    
    c subroutines called:
    c - debug
    c - find_order
    
          common /vocal/ ivocal
    
    
          real       x(nnode),y(nnode),h(nnode),h0(nnode),hi(nnode)
          real       xkf(nnode),xlf_BR(nnode)
    
          real*4     surface(nnode),dhh(nnode)
          real*4     water(nnode),sediment(nnode)
          real*4     slope(nnode),length(nnode)
    
          integer*4  ibucket(nnode)
          real       fix(nnode)
    
          integer*4  nb(*),nn(nbmax,*)
          integer*4  iorder(nnode),itype_node(nnode)
    
          integer*4  nlake(nnode)
    
    c sets all ibucket to 0
    c sets all water to 1 and all sediment to 0
    c note that water(i) can be different for every node; this is where a more
    c  "complex" orographic model should be included...
    
            do i=1,nnode
            ibucket(i)=0
            sediment(i)=0.
            dhh(i)=0.
            enddo
    
          dhminfluv=0.
          dhmaxfluv=0.
    
    c finds proper ordering (cascade algorithm)
    
          if (ivocal.eq.1) call debug ('find_order$',0)
          call find_order (ibucket,ndon,fix,iorder,
         &                 nnode,norder)
          if (ivocal.eq.1) call debug ('fluvial_erosion$',1)
    
    c itype_node determines the type of node:
    c   -1:   local minima next to (or on) a fixed boundary
    c    0:   diffusion only
    c    1:   channel because one of its parents was a channel
    
            do i=1,nnode
            itype_node(i)=0
            enddo
    
            do jorder=1,norder
              i=iorder(jorder)
              slop=-slope(i)
    c special treatment for self donors and b.c.nodes
              if (ndon(i).eq.i) then
              dh=0.
              itype_node(i)=-2
              outflux=outflux+sediment(i)*(1.-fix(i))
              sediment(i)=0.
              water(i)=0.
    
    c special treatment for nodes below sea level
              elseif (h(i).lt.sea_level) then
              dh=sediment(i)/surface(i)
              h(i)=h(i)+dh
              itype_node(i)=-1
              sediment(i)=0.
    
              else
              if (itype_node(i).ne.0) itype_node(i)=1
    
    c sedeqb is how much sediment the river can carry
              sedeqb=xkf(i)*slop*water(i)*dt
    
    c set channel width according to sqrt function of discharge
              width_ch=width_c*sqrt(water(i))
    
    c special treatment for lake nodes
              if (nlake(i).eq.1) then
              dh=sediment(i)/surface(i)
              h(i)=h(i)+dh
              sediment(i)=0.
    c deposition
                elseif (sediment(i).ge.sedeqb.and.ideposition.eq.1) then
                dh=(sediment(i)-sedeqb)/surface(i)
    c there is a maximum amount of sediment that can be dumped at one location.
    c the maximum is given by the maximum height that the dumping may produce
    c such that the slope it creates between this node and its donor is not
    c greater than the erosional treshold. In other words, it is assumed that
    c by deposition one cannot create a levee so big that at the next time step
    c it is going to be eroded down
                if (water(i).ne.0.) then
                dhmax=sediment(i)*length(i)/xkf(i)/water(i)/dt+
         &             h(ndon(i))-h(i)
                else
                dhmax=dh
                endif
                  if (dh.le.dhmax) then
                  sediment(i)=sedeqb
                  h(i)=h(i)+dh
                  else
                  dh=dhmax
                  sediment(i)=sediment(i)-dhmax*surface(i)
                  h(i)=h(i)+dh
                  endif
    c erosion
                  else
    c first case: eroding bedrock only
                    if (h(i).le.h0(i)) then
                    dsed_ch=(sedeqb)*(length(i)/xlf_BR(i))
                    dh=-(dsed_ch)/(width_ch*length(i))
                    dsediment=-dh*surface(i)
                    h(i)=h(i)+dh
                    sediment(i)=sediment(i)+dsediment
    c second case: eroding alluvions only
                      else
                      dsed_ch=(sedeqb)*(length(i)/xlf_AL)
                      dh=-(dsed_ch)/(width_ch*length(i))
                        if (dh.ge.h0(i)-h(i)) then
                        dsediment=-dh*surface(i)
                        h(i)=h(i)+dh
                        sediment(i)=sediment(i)+dsediment
                          else
    c third case: eroding alluvions and bedrock
                          dh1=h(i)-h0(i)
                          dsed_al_ch=dh1*length(i)*width_ch
                          dsed_ch=sedeqb*(length(i)/xlf_BR(i))
    c calculate the height change of the bedrock interface.
                          dh=-(dsed_ch)/(width_ch*length(i))
                          dsediment=-dh*surface(i)
                          dsed_al_cell=dh1*surface(i)
                          h(i)=h0(i)+dh
                          sediment(i)=sediment(i)+dsediment+dsed_al_cell
                          endif
                      endif
                  endif
              dhminfluv=amin1(dhminfluv,dh)
              dhmaxfluv=amax1(dhmaxfluv,dh)
    c from water+sediment+slope update height and sediment
                if (ndon(i).ne.i) then
                water(ndon(i))=water(ndon(i))+water(i)
                sediment(ndon(i))=sediment(ndon(i))+sediment(i)
                if (slop.ne.0.) itype_node(ndon(i))=1
                endif
              endif
    c compute dhh
              dhh(i)=fix(i)*dh
            enddo
    
          return
          end