• VTF
  • FSI
  • AMROC
  • SFC
  • Motion
  • STLIB
  • Main Page
  • src/generic/Generic_CellWallDerivatives.f90

    ! ----- THE X-CELL WALLS
    
    
    ! --- VALUES AT CELL WALLS
    MODULE Generic_XCellWallAv
    
      ! Returns xcwfave - the value of f evaluated at 
      !                    cell walls.  
      !               xcwfave(i) is f evaluated at the interface
      !                    between the i, and i-1 cells.
      !                               
    
    
    
      INTERFACE XCellWallAv
         MODULE PROCEDURE OneDXCellWallAv
         MODULE PROCEDURE OneDXCellWallAvIdx
         MODULE PROCEDURE TwoDXCellWallAv
         MODULE PROCEDURE TwoDXCellWallAvIdx
         MODULE PROCEDURE ThreeDXCellWallAv
         MODULE PROCEDURE ThreeDXCellWallAvIdx
      END INTERFACE
    
    CONTAINS
    
    
      SUBROUTINE OneDXCellWallAv(f,xcwfave)
    
        ! ----  Shared Variables
        USE mesh
        USE array_bounds
        USE method_parms
      
        IMPLICIT NONE
        
        DOUBLE PRECISION, INTENT(IN) :: f(ixlo:ixhi)
        DOUBLE PRECISION, INTENT(OUT):: xcwfave(ixlo:ixhi)
        
        integer i
        ! initialize the cell wall values to be zero
      
        xcwfave(ixlo) = f(ixlo)
        
        ! use second-order interpolation
        do i = ixlo, ixhi-1
           xcwfave(i+1) = (f(i+1) + f(i))*0.5d0
        end do
    
        RETURN
    
      END SUBROUTINE OneDXCellWallAv
    
      SUBROUTINE OneDXCellWallAvIdx(f,xcwfave,n,id)
    
        ! ----  Shared Variables
        USE mesh
        USE array_bounds
        USE method_parms
      
        IMPLICIT NONE
        
        integer n, id
    
        DOUBLE PRECISION, INTENT(IN) :: f(n,ixlo:ixhi)
        DOUBLE PRECISION, INTENT(OUT):: xcwfave(ixlo:ixhi)
        
        integer i
        ! initialize the cell wall values to be zero
      
        xcwfave(ixlo) = f(id,ixlo)
        
        ! use second-order interpolation
        do i = ixlo, ixhi-1
           xcwfave(i+1) = (f(id,i+1) + f(id,i))*0.5d0
        end do
    
        RETURN
    
      END SUBROUTINE OneDXCellWallAvIdx
    
      SUBROUTINE TwoDXCellWallAv(f,xcwfave)
    
        ! ----  Shared Variables
        USE mesh
        USE array_bounds
        USE method_parms
      
        IMPLICIT NONE
        
        DOUBLE PRECISION, INTENT(IN) :: f(ixlo:ixhi,iylo:iyhi)
        DOUBLE PRECISION, INTENT(OUT):: xcwfave(ixlo:ixhi,iylo:iyhi)
      
        INTEGER :: i,j
      
        ! initialize the cell wall values to be zero
        do j=iylo,iyhi
           xcwfave(ixlo,j) = f(ixlo,j)
        end do
        
        ! use second-order interpolation
        
        DO j=iylo,iyhi
           do i = ixlo,ixhi-1
              xcwfave(i+1,j) = (f(i+1,j)+f(i,j))*0.5d0
           end do
        END DO
        
        RETURN
    
      END SUBROUTINE TwoDXCellWallAv
    
        SUBROUTINE TwoDXCellWallAvIdx(f,xcwfave,n,id)
    
        ! ----  Shared Variables
        USE mesh
        USE array_bounds
        USE method_parms
      
        IMPLICIT NONE
      
        INTEGER :: n,id
        DOUBLE PRECISION, INTENT(IN) :: f(n,ixlo:ixhi,iylo:iyhi)
        DOUBLE PRECISION, INTENT(OUT):: xcwfave(ixlo:ixhi,iylo:iyhi)
      
        INTEGER :: i,j
      
        ! initialize the cell wall values to be zero
        do j=iylo,iyhi
           xcwfave(ixlo,j) = f(id,ixlo,j)
        end do
        
        ! use second-order interpolation
        
        DO j=iylo,iyhi
           do i = ixlo,ixhi-1
              xcwfave(i+1,j) = (f(id,i+1,j)+f(id,i,j))*0.5d0
           end do
        END DO
        
        RETURN
    
      END SUBROUTINE TwoDXCellWallAvIdx
    
      SUBROUTINE ThreeDXCellWallAv(f,xcwfave)
    
        ! ----  Shared Variables
        USE mesh
        USE array_bounds
        USE method_parms
      
        IMPLICIT NONE
        
        DOUBLE PRECISION, INTENT(IN) :: f(ixlo:ixhi,iylo:iyhi,izlo:izhi)
        DOUBLE PRECISION, INTENT(OUT):: xcwfave(ixlo:ixhi,iylo:iyhi,izlo:izhi)
      
        INTEGER :: i,j,k
    
        call cleslog_log_enter('ThreeDXCellWallAv')
      
        ! initialize the cell wall values to be zero
        
        do k = izlo,izhi
           do j = iylo,iyhi
          
              xcwfave(ixlo,j,k) = f(ixlo,j,k)
           end do
        end do
        ! use second-order interpolation
        DO k=izlo,izhi
           DO j=iylo,iyhi
              do i= ixlo,ixhi-1
                 xcwfave(i+1,j,k) = (f(i+1,j,k) + f(i,j,k))*0.5d0
              end do
           END DO
        END DO
        
        call cleslog_log_exit('ThreeDXCellWallAv')
    
        RETURN
    
      END SUBROUTINE ThreeDXCellWallAv
    
      SUBROUTINE ThreeDXCellWallAvIdx(f,xcwfave, n, id)
    
        ! ----  Shared Variables
        USE mesh
        USE array_bounds
        USE method_parms
      
        IMPLICIT NONE
    
        INTEGER :: n,id
        DOUBLE PRECISION, INTENT(IN) :: f(n,ixlo:ixhi,iylo:iyhi,izlo:izhi)
        DOUBLE PRECISION, INTENT(OUT):: xcwfave(ixlo:ixhi,iylo:iyhi,izlo:izhi)
      
        INTEGER :: i,j,k
    
        call cleslog_log_enter('ThreeDXCellWallAvIdx')
      
        ! initialize the cell wall values to be zero
        
        do k = izlo,izhi
           do j = iylo,iyhi
              xcwfave(ixlo,j,k) = f(id, ixlo,j,k)
           end do
        end do
        ! use second-order interpolation
        DO k=izlo,izhi
           DO j=iylo,iyhi
              do i= ixlo,ixhi-1
                 xcwfave(i+1,j,k) = (f(id,i+1,j,k) + f(id,i,j,k))*0.5d0
              end do
           END DO
        END DO
        
        call cleslog_log_exit('ThreeDXCellWallAvIdx')
    
        RETURN
    
      END SUBROUTINE ThreeDXCellWallAvIdx
    
    END MODULE Generic_XCellWallAv
    
    ! DERIVATIVES ON CELL WALLS
    
    MODULE Generic_XCellWallDx
      ! Returns xcwdf - the derivative of f evaluated at 
      !                 cell walls.  
      !               xcwdf(i) is df/dx evaluated at the interface
      !                 between the i, and i-1 cells.
      !                               
    
    
    
      INTERFACE XCellWallDx
         MODULE PROCEDURE OneDXCellWallDx
         MODULE PROCEDURE OneDXCellWallDxIdx
         MODULE PROCEDURE TwoDXCellWallDx
         MODULE PROCEDURE TwoDXCellWallDxIdx
         MODULE PROCEDURE ThreeDXCellWallDx
         MODULE PROCEDURE ThreeDXCellWallDxIdx
      END INTERFACE
    
    CONTAINS
    
      SUBROUTINE OneDXCellWallDx(f,xcwdf)
    
    
        ! ----  Shared Variables
        USE mesh
        USE array_bounds
        USE method_parms
        
        IMPLICIT NONE
    
        DOUBLE PRECISION, INTENT(IN) :: f(ixlo:ixhi)
        DOUBLE PRECISION, INTENT(OUT):: xcwdf(ixlo:ixhi)
        DOUBLE PRECISION :: cdx
      
        integer i
    
        cdx = 1.0d0/dx
    
        ! initialize the cell wall derivative to be zero
      
        xcwdf(ixlo) = 0.0d0
      
        ! use second-order center difference
        do i = ixlo,ixhi -1
           xcwdf(i+1) = (f(i+1) - f(i))*cdx
        end do
        
        RETURN
        
        
      END SUBROUTINE OneDXCellWallDx
    
      SUBROUTINE OneDXCellWallDxIdx(f,xcwdf,n,id)
    
    
        ! ----  Shared Variables
        USE mesh
        USE array_bounds
        USE method_parms
        
        IMPLICIT NONE
    
        INTEGER :: n,id
        DOUBLE PRECISION, INTENT(IN) :: f(n,ixlo:ixhi)
        DOUBLE PRECISION, INTENT(OUT):: xcwdf(ixlo:ixhi)
        DOUBLE PRECISION :: cdx
      
        integer i
    
        cdx = 1.0d0/dx
    
        ! initialize the cell wall derivative to be zero
      
        xcwdf(ixlo) = 0.0d0
      
        ! use second-order center difference
        do i = ixlo,ixhi -1
           xcwdf(i+1) = (f(id,i+1) - f(id,i))*cdx
        end do
        
        RETURN
        
        
      END SUBROUTINE OneDXCellWallDxIdx
    
    
      SUBROUTINE TwoDXCellWallDx(f,xcwdf)
    
    
        ! ----  Shared Variables
        USE mesh
        USE array_bounds
        USE method_parms
        
        IMPLICIT NONE
    
        DOUBLE PRECISION, INTENT(IN) :: f(ixlo:ixhi,iylo:iyhi)
        DOUBLE PRECISION, INTENT(OUT):: xcwdf(ixlo:ixhi,iylo:iyhi)
        DOUBLE PRECISION :: cdx
      
        INTEGER :: i,j
    
        cdx = 1.0d0/dx
    
        ! initialize the cell wall derivative to be zero
        
        do j = iylo,iyhi
           xcwdf(ixlo,j) = 0.0d0
        end do
    
        ! use second-order center difference
        DO j=iylo,iyhi
           do i = ixlo, ixhi-1
              xcwdf(i+1,j) = (f(i+1,j) - f(i,j))*cdx
           end do
        END DO
        
        RETURN
        
      END SUBROUTINE TwoDXCellWallDx
    
      SUBROUTINE TwoDXCellWallDxIdx(f,xcwdf,n,id)
    
    
        ! ----  Shared Variables
        USE mesh
        USE array_bounds
        USE method_parms
        
        IMPLICIT NONE
    
        INTEGER :: n,id
        DOUBLE PRECISION, INTENT(IN) :: f(n,ixlo:ixhi,iylo:iyhi)
        DOUBLE PRECISION, INTENT(OUT):: xcwdf(ixlo:ixhi,iylo:iyhi)
        DOUBLE PRECISION :: cdx
      
        INTEGER :: i,j
    
        cdx = 1.0d0/dx
    
        ! initialize the cell wall derivative to be zero
        
        do j = iylo,iyhi
           xcwdf(ixlo,j) = 0.0d0
        end do
    
        ! use second-order center difference
        DO j=iylo,iyhi
           do i = ixlo, ixhi-1
              xcwdf(i+1,j) = (f(id,i+1,j) - f(id,i,j))*cdx
           end do
        END DO
        
        RETURN
        
      END SUBROUTINE TwoDXCellWallDxIdx
    
      SUBROUTINE ThreeDXCellWallDx(f,xcwdf)
    
    
        ! ----  Shared Variables
        USE mesh
        USE array_bounds
        USE method_parms
        
        IMPLICIT NONE
    
        DOUBLE PRECISION, INTENT(IN) :: f(ixlo:ixhi,iylo:iyhi,izlo:izhi)
        DOUBLE PRECISION, INTENT(OUT):: xcwdf(ixlo:ixhi,iylo:iyhi,izlo:izhi)
        DOUBLE PRECISION :: cdx
      
        INTEGER :: i,j,k
    
        call cleslog_log_enter('ThreeDXCellWallDx')
    
        cdx = 1.0d0/dx
    
        ! initialize the cell wall derivative to be zero
      
        do k = izlo,izhi
           do j = iylo,iyhi
              xcwdf(ixlo,j,k) = 0.0d0
           end do
        end do
        ! use second-order center difference
        
        DO k = izlo, izhi
           DO j = iylo,iyhi
              do i = ixlo,ixhi-1
                 xcwdf(i+1,j,k) = (f(i+1,j,k) - f(i,j,k))*cdx
              end do
           END DO
        END DO
    
        call cleslog_log_exit('ThreeDXCellWallDx')
    
        RETURN
        
      END SUBROUTINE ThreeDXCellWallDx
    
      SUBROUTINE ThreeDXCellWallDxIdx(f,xcwdf, n, id)
    
    
        ! ----  Shared Variables
        USE mesh
        USE array_bounds
        USE method_parms
        
        IMPLICIT NONE
    
        INTEGER :: n,id
        DOUBLE PRECISION, INTENT(IN) :: f(n,ixlo:ixhi,iylo:iyhi,izlo:izhi)
        DOUBLE PRECISION, INTENT(OUT):: xcwdf(ixlo:ixhi,iylo:iyhi,izlo:izhi)
        DOUBLE PRECISION :: cdx
      
        INTEGER :: i,j,k
    
        call cleslog_log_enter('ThreeDXCellWallDxIdx')
    
        cdx = 1.0d0/dx
    
        ! initialize the cell wall derivative to be zero
      
        do k = izlo,izhi
           do j = iylo,iyhi
              xcwdf(ixlo,j,k) = 0.0d0
           end do
        end do
        ! use second-order center difference
        
        DO k = izlo, izhi
           DO j = iylo,iyhi
              do i = ixlo,ixhi-1
                 xcwdf(i+1,j,k) = (f(id,i+1,j,k) - f(id,i,j,k))*cdx
              end do
           END DO
        END DO
    
        call cleslog_log_exit('ThreeDXCellWallDxIdx')
    
        RETURN
        
      END SUBROUTINE ThreeDXCellWallDxIdx
    
    END MODULE Generic_XCellWallDx
    
    
    MODULE Generic_XCellWallDy
    
      ! ---     | j+1 |
      ! ---   __|_____|__
      ! ---     |  i  |
      ! ---  i-1|  j  |i+1
      ! ---   __|_____|__
      ! ---     |     |
      ! ---     | j-1 |
    
      ! Returns xcwdf - the derivative of f evaluated at 
      !                 cell walls.  
      !               xcwdf(i,j) is df/dy evaluated at the interface
      !                 between the (i,j), and (i-1,j) cells.
      !                               
    
    
    
      INTERFACE XCellWallDy
         MODULE PROCEDURE TwoDXCellWallDy
         MODULE PROCEDURE TwoDXCellWallDyIdx
         MODULE PROCEDURE ThreeDXCellWallDy
         MODULE PROCEDURE ThreeDXCellWallDyIdx
      END INTERFACE
    
    CONTAINS
    
    
    
      SUBROUTINE TwoDXCellWallDy(f,xcwdf)
    
        ! ----  Shared Variables
        USE mesh
        USE array_bounds
        USE method_parms
        
        ! ---- Shared Procedures
      
        IMPLICIT NONE
        
        DOUBLE PRECISION, INTENT(IN) :: f(ixlo:ixhi,iylo:iyhi)
        DOUBLE PRECISION, INTENT(OUT):: xcwdf(ixlo:ixhi,iylo:iyhi)
        DOUBLE PRECISION :: cdy
        
        INTEGER :: i,j
      
        cdy = 0.25d0/dy
        
        ! initialize the cell wall derivative to be zero
        do j = iylo,iyhi
           xcwdf(ixlo,j) = 0.0d0
        end do
        do i = ixlo,ixhi
           xcwdf(i,iylo) = 0.0d0
           xcwdf(i,iyhi) = 0.0d0
        end do
    
        ! use second-order center difference
        DO j = iylo+1,iyhi-1
           do i = ixlo, ixhi-1 
              xcwdf(i+1,j) = (f(i+1,j+1)+f(i,j+1)-f(i+1,j-1)-f(i,j-1))*cdy
           end do
        END DO
        
        RETURN
    
      END SUBROUTINE TwoDXCellWallDy
    
      SUBROUTINE TwoDXCellWallDyIdx(f,xcwdf,n,id)
    
        ! ----  Shared Variables
        USE mesh
        USE array_bounds
        USE method_parms
        
        ! ---- Shared Procedures
      
        IMPLICIT NONE
        
        INTEGER :: n,id
        DOUBLE PRECISION, INTENT(IN) :: f(n,ixlo:ixhi,iylo:iyhi)
        DOUBLE PRECISION, INTENT(OUT):: xcwdf(ixlo:ixhi,iylo:iyhi)
        DOUBLE PRECISION :: cdy
        
        INTEGER :: i,j
      
        cdy = 0.25d0/dy
        
        ! initialize the cell wall derivative to be zero
        do j = iylo,iyhi
           xcwdf(ixlo,j) = 0.0d0
        end do
        do i = ixlo,ixhi
           xcwdf(i,iylo) = 0.0d0
           xcwdf(i,iyhi) = 0.0d0
        end do
    
        ! use second-order center difference
        DO j = iylo+1,iyhi-1
           do i = ixlo, ixhi-1 
              xcwdf(i+1,j) = (f(id,i+1,j+1)+f(id,i,j+1)-f(id,i+1,j-1)-f(id,i,j-1))*cdy
           end do
        END DO
        
        RETURN
    
      END SUBROUTINE TwoDXCellWallDyIdx
    
      SUBROUTINE ThreeDXCellWallDy(f,xcwdf)
    
        ! ----  Shared Variables
        USE mesh
        USE array_bounds
        USE method_parms
        
        ! ---- Shared Procedures
      
        IMPLICIT NONE
        
        DOUBLE PRECISION, INTENT(IN) :: f(ixlo:ixhi,iylo:iyhi,izlo:izhi)
        DOUBLE PRECISION, INTENT(OUT):: xcwdf(ixlo:ixhi,iylo:iyhi,izlo:izhi)
        DOUBLE PRECISION :: cdy
        
        INTEGER ::i, j,k
    
        call cleslog_log_enter('ThreeDXCellWallDy')
      
        cdy = 0.25d0/dy
        
        ! initialize the cell wall derivative to be zero
        do k = izlo,izhi
           do j = iylo,iyhi
              xcwdf(ixlo,j,k) = 0.0d0
           end do
           do i= ixlo,ixhi
              xcwdf(i,iylo,k) = 0.0d0
              xcwdf(i,iyhi,k) = 0.0d0
           end do
        end do
        ! use second-order center difference
        
        do k= izlo, izhi
           DO j = iylo+1,iyhi-1
              do i = ixlo,ixhi-1
                 xcwdf(i+1,j,k) = (f(i+1,j+1,k)+f(i,j+1,k)&
                      &-f(i+1,j-1,k)-f(i,j-1,k))*cdy
              end do
           end do
        end do
    
        call cleslog_log_exit('ThreeDXCellWallDy')
    
        RETURN
    
      END SUBROUTINE ThreeDXCellWallDy
    
      SUBROUTINE ThreeDXCellWallDyIdx(f,xcwdf,n,id)
    
        ! ----  Shared Variables
        USE mesh
        USE array_bounds
        USE method_parms
        
        ! ---- Shared Procedures
      
        IMPLICIT NONE
        
        INTEGER :: n,id
        DOUBLE PRECISION, INTENT(IN) :: f(n,ixlo:ixhi,iylo:iyhi,izlo:izhi)
        DOUBLE PRECISION, INTENT(OUT):: xcwdf(ixlo:ixhi,iylo:iyhi,izlo:izhi)
        DOUBLE PRECISION :: cdy
        
        INTEGER ::i,j,k
    
        call cleslog_log_enter('ThreeDXCellWallDyIdx')
      
        cdy = 0.25d0/dy
        
        ! initialize the cell wall derivative to be zero
        do k = izlo,izhi
           do j = iylo,iyhi
              xcwdf(ixlo,j,k) = 0.0d0
           end do
           do i= ixlo,ixhi
              xcwdf(i,iylo,k) = 0.0d0
              xcwdf(i,iyhi,k) = 0.0d0
           end do
        end do
        ! use second-order center difference
        
        do k= izlo, izhi
           DO j = iylo+1,iyhi-1
              do i = ixlo,ixhi-1
                 xcwdf(i+1,j,k) = (f(id,i+1,j+1,k)+f(id,i,j+1,k)&
                      &-f(id,i+1,j-1,k)-f(id,i,j-1,k))*cdy
              end do
           end do
        end do
    
        call cleslog_log_exit('ThreeDXCellWallDyIdx')
    
        RETURN
    
      END SUBROUTINE ThreeDXCellWallDyIdx
    
    END MODULE Generic_XCellWallDy
    
    
    
    MODULE Generic_XCellWallDz
    
      ! ---     | j+1 |
      ! ---   __|_____|__
      ! ---     |  i  |
      ! ---  i-1|  j  |i+1
      ! ---   __|_____|__
      ! ---     |     |
      ! ---     | j-1 |
    
      ! Returns xcwdf - the derivative of f evaluated at 
      !                 cell walls.  
      !               xcwdf(i,j,k) is df/dz evaluated at the interface
      !                 between the (i,j,k), and (i-1,j,k) cells.
      !                               
    
    
    
      INTERFACE XCellWallDz
         MODULE PROCEDURE ThreeDXCellWallDz
         MODULE PROCEDURE ThreeDXCellWallDzIdx
      END INTERFACE
    
    CONTAINS
    
    
      SUBROUTINE ThreeDXCellWallDz(f,xcwdf)
    
        ! ----  Shared Variables
        USE mesh
        USE array_bounds
        USE method_parms
        
        ! ---- Shared Procedures
      
        IMPLICIT NONE
        
        DOUBLE PRECISION, INTENT(IN) :: f(ixlo:ixhi,iylo:iyhi,izlo:izhi)
        DOUBLE PRECISION, INTENT(OUT):: xcwdf(ixlo:ixhi,iylo:iyhi,izlo:izhi)
        DOUBLE PRECISION :: cdz
        
        INTEGER :: i,j,k
    
        call cleslog_log_enter('ThreeDXCellWallDz')
      
        cdz = 0.25d0/dz
        
        ! initialize the cell wall derivative to be zero
      
        do k = izlo,izhi
           do j = iylo,iyhi
              xcwdf(ixlo,j,k) = 0.0d0
           end do
        end do
        do j = iylo,iyhi
           do i = ixlo,ixhi
              xcwdf(i,j,izlo) = 0.0d0
              xcwdf(i,j,izhi) = 0.0d0
           end do
        end do
    
        ! use second-order center difference
        do k= izlo+1, izhi-1
           DO j = iylo,iyhi
              do i = ixlo,ixhi-1
                 xcwdf(i+1,j,k) = (f(i+1,j,k+1)+f(i,j,k+1) &
                      &-f(i+1,j,k-1)-f(i,j,k-1))*cdz
              end do
           END DO
        end do
        
        call cleslog_log_exit('ThreeDXCellWallDz')
    
        RETURN
    
      END SUBROUTINE ThreeDXCellWallDz
    
      SUBROUTINE ThreeDXCellWallDzIdx(f,xcwdf,n,id)
    
        ! ----  Shared Variables
        USE mesh
        USE array_bounds
        USE method_parms
        
        ! ---- Shared Procedures
      
        IMPLICIT NONE
        
        INTEGER :: n,id
        DOUBLE PRECISION, INTENT(IN) :: f(n,ixlo:ixhi,iylo:iyhi,izlo:izhi)
        DOUBLE PRECISION, INTENT(OUT):: xcwdf(ixlo:ixhi,iylo:iyhi,izlo:izhi)
        DOUBLE PRECISION :: cdz
        
        INTEGER :: i,j,k
    
        call cleslog_log_enter('ThreeDXCellWallDzIdx')
      
        cdz = 0.25d0/dz
        
        ! initialize the cell wall derivative to be zero
      
        do k = izlo,izhi
           do j = iylo,iyhi
              xcwdf(ixlo,j,k) = 0.0d0
           end do
        end do
        do j = iylo,iyhi
           do i = ixlo,ixhi
              xcwdf(i,j,izlo) = 0.0d0
              xcwdf(i,j,izhi) = 0.0d0
           end do
        end do
    
        ! use second-order center difference
        do k= izlo+1, izhi-1
           DO j = iylo,iyhi
              do i = ixlo,ixhi-1
                 xcwdf(i+1,j,k) = (f(id,i+1,j,k+1)+f(id,i,j,k+1) &
                      &-f(id,i+1,j,k-1)-f(id,i,j,k-1))*cdz
              end do
           END DO
        end do
        
        call cleslog_log_exit('ThreeDXCellWallDzIdx')
    
        RETURN
    
      END SUBROUTINE ThreeDXCellWallDzIdx
    
    END MODULE Generic_XCellWallDz
    
    ! ----- THE Y-CELL WALLS
    
    
    MODULE Generic_YCellWallAv
    
      ! Returns ycwfave - the value of f evaluated at 
      !                    cell walls.  
      !               ycwfave(i,j,k) is f evaluated at the interface
      !                    between the (i,j,k), and (i,j-1,k) cells.
      !                               
    
    
      
      INTERFACE YCellWallAv
         MODULE PROCEDURE TwoDYCellWallAv
         MODULE PROCEDURE TwoDYCellWallAvIdx
         MODULE PROCEDURE ThreeDYCellWallAv
         MODULE PROCEDURE ThreeDYCellWallAvIdx
      END INTERFACE
    
    CONTAINS
      
    
      SUBROUTINE TwoDYCellWallAv(f,ycwfave)
    
        ! ----  Shared Variables
        USE mesh
        USE array_bounds
        USE method_parms
      
        IMPLICIT NONE
        
        DOUBLE PRECISION, INTENT(IN) :: f(ixlo:ixhi,iylo:iyhi)
        DOUBLE PRECISION, INTENT(OUT):: ycwfave(ixlo:ixhi,iylo:iyhi)
      
        INTEGER :: i,j
      
        ! initialize the cell wall values to be zero
        
        do i = ixlo, ixhi
           ycwfave(i,iylo) = f(i,iylo)
        end do
    
        ! use second-order interpolation
        DO j = iylo,iyhi-1
           do i = ixlo, ixhi
              ycwfave(i,j+1) = (f(i,j+1) + f(i,j))*0.5d0
           end do
        END DO
        
        RETURN
    
      END SUBROUTINE TwoDYCellWallAv
    
      SUBROUTINE TwoDYCellWallAvIdx(f,ycwfave,n,id)
    
        ! ----  Shared Variables
        USE mesh
        USE array_bounds
        USE method_parms
      
        IMPLICIT NONE
        
        INTEGER :: n,id
        DOUBLE PRECISION, INTENT(IN) :: f(n,ixlo:ixhi,iylo:iyhi)
        DOUBLE PRECISION, INTENT(OUT):: ycwfave(ixlo:ixhi,iylo:iyhi)
      
        INTEGER :: i,j
      
        ! initialize the cell wall values to be zero
        
        do i = ixlo, ixhi
           ycwfave(i,iylo) = f(id,i,iylo)
        end do
    
        ! use second-order interpolation
        DO j = iylo,iyhi-1
           do i = ixlo, ixhi
              ycwfave(i,j+1) = (f(id,i,j+1) + f(id,i,j))*0.5d0
           end do
        END DO
        
        RETURN
    
      END SUBROUTINE TwoDYCellWallAvIdx
    
      SUBROUTINE ThreeDYCellWallAv(f,ycwfave)
    
        ! ----  Shared Variables
        USE mesh
        USE array_bounds
        USE method_parms
      
        IMPLICIT NONE
        
        DOUBLE PRECISION, INTENT(IN) :: f(ixlo:ixhi,iylo:iyhi,izlo:izhi)
        DOUBLE PRECISION, INTENT(OUT):: ycwfave(ixlo:ixhi,iylo:iyhi,izlo:izhi)
      
        INTEGER :: i,j,k
    
        call cleslog_log_enter('ThreeDYCellWallAv')
      
        ! initialize the cell wall values to be zero
      
        do k = izlo,izhi
           do i = ixlo,ixhi
              ycwfave(i,iylo,k) = f(i,iylo,k)
           end do
        end do
        
        ! use second-order interpolation
        DO k=izlo,izhi
           DO j=iylo,iyhi-1
              do i = ixlo,ixhi
                 ycwfave(i,j+1,k) = (f(i,j+1,k) + f(i,j,k))*0.5d0
              end do
           END DO
           
        END DO
    
        call cleslog_log_exit('ThreeDYCellWallAv')
    
        RETURN
    
      END SUBROUTINE ThreeDYCellWallAv
    
      SUBROUTINE ThreeDYCellWallAvIdx(f,ycwfave,n,id)
    
        ! ----  Shared Variables
        USE mesh
        USE array_bounds
        USE method_parms
      
        IMPLICIT NONE
        
        INTEGER :: n,id
        DOUBLE PRECISION, INTENT(IN) :: f(n,ixlo:ixhi,iylo:iyhi,izlo:izhi)
        DOUBLE PRECISION, INTENT(OUT):: ycwfave(ixlo:ixhi,iylo:iyhi,izlo:izhi)
      
        INTEGER :: i,j,k
    
        call cleslog_log_enter('ThreeDYCellWallAvIdx')
      
        ! initialize the cell wall values to be zero
      
        do k = izlo,izhi
           do i = ixlo,ixhi
              ycwfave(i,iylo,k) = f(id,i,iylo,k)
           end do
        end do
        
        ! use second-order interpolation
        DO k=izlo,izhi
           DO j=iylo,iyhi-1
              do i = ixlo,ixhi
                 ycwfave(i,j+1,k) = (f(id,i,j+1,k) + f(id,i,j,k))*0.5d0
              end do
           END DO
           
        END DO
    
        call cleslog_log_exit('ThreeDYCellWallAvIdx')
    
        RETURN
    
      END SUBROUTINE ThreeDYCellWallAvIdx
    
    END MODULE Generic_YCellWallAv
    
    ! DERIVATIVES ON CELL WALLS
    
    MODULE Generic_YCellWallDx
      ! Returns ycwdf - the derivative of f evaluated at 
      !                 cell walls.  
      !               ycwdf(i) is df/dx evaluated at the interface
      !                 between the j, and j-1 cells.
      !                               
    
    
    
      INTERFACE YCellWallDx
         MODULE PROCEDURE TwoDYCellWallDx
         MODULE PROCEDURE TwoDYCellWallDxIdx
         MODULE PROCEDURE ThreeDYCellWallDx
         MODULE PROCEDURE ThreeDYCellWallDxIdx
      END INTERFACE
    
    CONTAINS
    
      SUBROUTINE TwoDYCellWallDx(f,ycwdf)
    
    
        ! ----  Shared Variables
        USE mesh
        USE array_bounds
        USE method_parms
        
        ! ---- Shared Procedures
        
        IMPLICIT NONE
    
        DOUBLE PRECISION, INTENT(IN) :: f(ixlo:ixhi,iylo:iyhi)
        DOUBLE PRECISION, INTENT(OUT):: ycwdf(ixlo:ixhi,iylo:iyhi)
        DOUBLE PRECISION :: cdx
      
        INTEGER :: i,j
    
        cdx = 0.25d0/dx
        
        ! initialize the cell wall derivative to be zero
        
        do i = ixlo,ixhi
           ycwdf(i,iylo) = 0.0d0
        end do
        do j = iylo,iyhi
           ycwdf(ixlo,j) = 0.0d0
           ycwdf(ixhi,j) = 0.0d0
        end do
        ! use second-order center difference
        
        DO j = iylo,iyhi-1
           do i = ixlo+1, ixhi-1
              ycwdf(i,j+1) = (f(i+1,j+1)+f(i+1,j) &
                   &-f(i-1,j+1)-f(i-1,j))*cdx
           enddo
        end do
        RETURN
        
      END SUBROUTINE TwoDYCellWallDx
    
        SUBROUTINE TwoDYCellWallDxIdx(f,ycwdf,n,id)
    
    
        ! ----  Shared Variables
        USE mesh
        USE array_bounds
        USE method_parms
        
        ! ---- Shared Procedures
        
        IMPLICIT NONE
    
        INTEGER :: n,id
        DOUBLE PRECISION, INTENT(IN) :: f(n,ixlo:ixhi,iylo:iyhi)
        DOUBLE PRECISION, INTENT(OUT):: ycwdf(ixlo:ixhi,iylo:iyhi)
        DOUBLE PRECISION :: cdx
      
        INTEGER :: i,j
    
        cdx = 0.25d0/dx
        
        ! initialize the cell wall derivative to be zero
        
        do i = ixlo,ixhi
           ycwdf(i,iylo) = 0.0d0
        end do
        do j = iylo,iyhi
           ycwdf(ixlo,j) = 0.0d0
           ycwdf(ixhi,j) = 0.0d0
        end do
        ! use second-order center difference
        
        DO j = iylo,iyhi-1
           do i = ixlo+1, ixhi-1
              ycwdf(i,j+1) = (f(id,i+1,j+1)+f(id,i+1,j) &
                   &-f(id,i-1,j+1)-f(id,i-1,j))*cdx
           enddo
        end do
        RETURN
        
      END SUBROUTINE TwoDYCellWallDxIdx
    
      SUBROUTINE ThreeDYCellWallDx(f,ycwdf)
    
    
        ! ----  Shared Variables
        USE mesh
        USE array_bounds
        USE method_parms
    
        ! ---- Shared Procedures
        
        IMPLICIT NONE
    
        DOUBLE PRECISION, INTENT(IN) :: f(ixlo:ixhi,iylo:iyhi,izlo:izhi)
        DOUBLE PRECISION, INTENT(OUT):: ycwdf(ixlo:ixhi,iylo:iyhi,izlo:izhi)
        DOUBLE PRECISION :: cdx
      
        INTEGER :: i,j,k
    
        call cleslog_log_enter('ThreeDYCellWallDx')
    
        cdx = 0.25d0/dx
    
        ! initialize the cell wall derivative to be zero
        do k = izlo,izhi
           do i = ixlo,ixhi
              ycwdf(i,iylo,k) = 0.0d0
           end do
    
           do j = iylo,iyhi
              ycwdf(ixlo,j,k) = 0.0d0
              ycwdf(ixhi,j,k) = 0.0d0
           end do
        end do
        ! use second-order center difference
        
        do k=izlo, izhi
           DO j = iylo,iyhi-1
              do i = ixlo+1,ixhi-1
                 ycwdf(i,j+1,k) = (f(i+1,j+1,k)+f(i+1,j,k) &
                      &-f(i-1,j+1,k)-f(i-1,j,k))*cdx
              end do
           enddo
        enddo
        
        call cleslog_log_exit('ThreeDYCellWallDx')
    
        RETURN
        
      END SUBROUTINE ThreeDYCellWallDx
    
        SUBROUTINE ThreeDYCellWallDxIdx(f,ycwdf,n,id)
    
    
        ! ----  Shared Variables
        USE mesh
        USE array_bounds
        USE method_parms
    
        ! ---- Shared Procedures
        
        IMPLICIT NONE
    
        INTEGER :: n,id
        DOUBLE PRECISION, INTENT(IN) :: f(n,ixlo:ixhi,iylo:iyhi,izlo:izhi)
        DOUBLE PRECISION, INTENT(OUT):: ycwdf(ixlo:ixhi,iylo:iyhi,izlo:izhi)
        DOUBLE PRECISION :: cdx
      
        INTEGER :: i,j,k
    
        call cleslog_log_enter('ThreeDYCellWallDxIdx')
    
        cdx = 0.25d0/dx
    
        ! initialize the cell wall derivative to be zero
        do k = izlo,izhi
           do i = ixlo,ixhi
              ycwdf(i,iylo,k) = 0.0d0
           end do
    
           do j = iylo,iyhi
              ycwdf(ixlo,j,k) = 0.0d0
              ycwdf(ixhi,j,k) = 0.0d0
           end do
        end do
        ! use second-order center difference
        
        do k=izlo, izhi
           DO j = iylo,iyhi-1
              do i = ixlo+1,ixhi-1
                 ycwdf(i,j+1,k) = (f(id,i+1,j+1,k)+f(id,i+1,j,k) &
                      &-f(id,i-1,j+1,k)-f(id,i-1,j,k))*cdx
              end do
           enddo
        enddo
        
        call cleslog_log_exit('ThreeDYCellWallDxIdx')
    
        RETURN
        
      END SUBROUTINE ThreeDYCellWallDxIdx
    
    END MODULE Generic_YCellWallDx
    
    
    MODULE Generic_YCellWallDy
    
      ! ---     | j+1 |
      ! ---   __|_____|__
      ! ---     |  i  |
      ! ---  i-1|  j  |i+1
      ! ---   __|_____|__
      ! ---     |     |
      ! ---     | j-1 |
    
      ! Returns ycwdf - the derivative of f evaluated at 
      !                 cell walls.  
      !               ycwdf(i,j) is df/dy evaluated at the interface
      !                 between the (i,j,k), and (i,j-1,k) cells.
      !                               
    
    
    
      INTERFACE YCellWallDy
         MODULE PROCEDURE TwoDYCellWallDy
         MODULE PROCEDURE TwoDYCellWallDyIdx
         MODULE PROCEDURE ThreeDYCellWallDy
         MODULE PROCEDURE ThreeDYCellWallDyIdx
      END INTERFACE
    
    CONTAINS
    
      SUBROUTINE TwoDYCellWallDy(f,ycwdf)
    
        ! ----  Shared Variables
        USE mesh
        USE array_bounds
        USE method_parms
        
      
        IMPLICIT NONE
        
        DOUBLE PRECISION, INTENT(IN) :: f(ixlo:ixhi,iylo:iyhi)
        DOUBLE PRECISION, INTENT(OUT):: ycwdf(ixlo:ixhi,iylo:iyhi)
       
        DOUBLE PRECISION :: cdy
        
        INTEGER :: i,j
      
        cdy = 1.0d0/dy
        
        ! initialize the cell wall derivative to be zero
        
        do i = ixlo,ixhi
           ycwdf(i,iylo) = 0.0d0
        end do
        ! use second-order center difference
        ! to compute the derivative at the wall between j,j-1
        DO j = iylo,iyhi-1
           do i = ixlo,ixhi
              ycwdf(i,j+1) =(f(i,j+1)-f(i,j))*cdy
           end do
        END DO
    
        RETURN
    
      END SUBROUTINE TwoDYCellWallDy
    
      SUBROUTINE TwoDYCellWallDyIdx(f,ycwdf,n,id)
    
        ! ----  Shared Variables
        USE mesh
        USE array_bounds
        USE method_parms
        
      
        IMPLICIT NONE
        
        INTEGER :: n,id
        DOUBLE PRECISION, INTENT(IN) :: f(n,ixlo:ixhi,iylo:iyhi)
        DOUBLE PRECISION, INTENT(OUT):: ycwdf(ixlo:ixhi,iylo:iyhi)
       
        DOUBLE PRECISION :: cdy
        
        INTEGER :: i,j
      
        cdy = 1.0d0/dy
        
        ! initialize the cell wall derivative to be zero
        
        do i = ixlo,ixhi
           ycwdf(i,iylo) = 0.0d0
        end do
        ! use second-order center difference
        ! to compute the derivative at the wall between j,j-1
        DO j = iylo,iyhi-1
           do i = ixlo,ixhi
              ycwdf(i,j+1) =(f(id,i,j+1)-f(id,i,j))*cdy
           end do
        END DO
    
        RETURN
    
      END SUBROUTINE TwoDYCellWallDyIdx
    
      SUBROUTINE ThreeDYCellWallDy(f,ycwdf)
    
        ! ----  Shared Variables
        USE mesh
        USE array_bounds
        USE method_parms
        
      
        IMPLICIT NONE
        
        DOUBLE PRECISION, INTENT(IN) :: f(ixlo:ixhi,iylo:iyhi,izlo:izhi)
        DOUBLE PRECISION, INTENT(OUT):: ycwdf(ixlo:ixhi,iylo:iyhi,izlo:izhi)
        DOUBLE PRECISION :: cdy
        
        INTEGER :: i,j,k
    
        call cleslog_log_enter('ThreeDYCellWallDy')
      
        cdy = 1.0d0/dy
        
        ! initialize the cell wall derivative to be zero
      
        do k = izlo,izhi
           do i = ixlo,ixhi
              ycwdf(i,iylo,k) = 0.0d0
           end do
        end do
        
        ! use second-order center difference
        ! to compute the derivative at the cell wall between j,j-1
        DO k = izlo,izhi
           DO j = iylo,iyhi-1
              do i = ixlo,ixhi
                 ycwdf(i,j+1,k) =(f(i,j+1,k)-f(i,j,k))*cdy
              end do
           END DO
        END DO
    
        call cleslog_log_exit('ThreeDYCellWallDy')
        
        RETURN
        
      END SUBROUTINE ThreeDYCellWallDy
    
      SUBROUTINE ThreeDYCellWallDyIdx(f,ycwdf,n,id)
    
        ! ----  Shared Variables
        USE mesh
        USE array_bounds
        USE method_parms
        
      
        IMPLICIT NONE
        
        INTEGER :: n,id
        DOUBLE PRECISION, INTENT(IN) :: f(n,ixlo:ixhi,iylo:iyhi,izlo:izhi)
        DOUBLE PRECISION, INTENT(OUT):: ycwdf(ixlo:ixhi,iylo:iyhi,izlo:izhi)
        DOUBLE PRECISION :: cdy
        
        INTEGER :: i,j,k
    
        call cleslog_log_enter('ThreeDYCellWallDyIdx')
      
        cdy = 1.0d0/dy
        
        ! initialize the cell wall derivative to be zero
      
        do k = izlo,izhi
           do i = ixlo,ixhi
              ycwdf(i,iylo,k) = 0.0d0
           end do
        end do
        
        ! use second-order center difference
        ! to compute the derivative at the cell wall between j,j-1
        DO k = izlo,izhi
           DO j = iylo,iyhi-1
              do i = ixlo,ixhi
                 ycwdf(i,j+1,k) =(f(id,i,j+1,k)-f(id,i,j,k))*cdy
              end do
           END DO
        END DO
    
        call cleslog_log_exit('ThreeDYCellWallDyIdx')
        
        RETURN
        
      END SUBROUTINE ThreeDYCellWallDyIdx
    
    END MODULE Generic_YCellWallDy
    
    MODULE Generic_YCellWallDz
    
      ! ---     | j+1 |
      ! ---   __|_____|__
      ! ---     |  i  |
      ! ---  i-1|  j  |i+1
      ! ---   __|_____|__
      ! ---     |     |
      ! ---     | j-1 |
    
      ! Returns xcwdf - the derivative of f evaluated at 
      !                 cell walls.  
      !               ycwdf(i,j,k) is df/dz evaluated at the interface
      !                 between the (i,j,k), and (i,j-1,k) cells.
      !                               
    
    
    
      INTERFACE YCellWallDz
         MODULE PROCEDURE ThreeDYCellWallDz
         MODULE PROCEDURE ThreeDYCellWallDzIdx
      END INTERFACE
    
    CONTAINS
    
    
      SUBROUTINE ThreeDYCellWallDz(f,ycwdf)
    
        ! ----  Shared Variables
        USE mesh
        USE array_bounds
        USE method_parms
        
        ! ---- Shared Procedures
        
        IMPLICIT NONE
        
        DOUBLE PRECISION, INTENT(IN) :: f(ixlo:ixhi,iylo:iyhi,izlo:izhi)
        DOUBLE PRECISION, INTENT(OUT):: ycwdf(ixlo:ixhi,iylo:iyhi,izlo:izhi)
        DOUBLE PRECISION :: cdz
        
        INTEGER :: i,j,k
    
        call cleslog_log_enter('ThreeDYCellWallDz')
      
        cdz = 0.25d0/dz
    
        ! initialize the cell wall derivative to be zero
    
        do k = izlo,izhi
           do i = ixlo,ixhi
              ycwdf(i,iylo,k) = 0.0d0
           end do
        end do
    
        do j = iylo,iyhi
           do i = ixlo,ixhi
              ycwdf(i,j,izlo) = 0.0d0
              ycwdf(i,j,izhi) = 0.0d0
           end do
        end do
        ! use second-order center difference
        
        do k=izlo+1, izhi-1
           DO j = iylo,iyhi-1
              do i = ixlo, ixhi
                 ycwdf(i,j+1,k) = (f(i,j+1,k+1)+f(i,j,k+1) &
                      &-f(i,j+1,k-1)-f(i,j,k-1))*cdz
              end do
           enddo
        enddo
    
        call cleslog_log_exit('ThreeDYCellWallDz')
        
        RETURN
    
      END SUBROUTINE ThreeDYCellWallDz
    
        SUBROUTINE ThreeDYCellWallDzIdx(f,ycwdf,n,id)
    
        ! ----  Shared Variables
        USE mesh
        USE array_bounds
        USE method_parms
        
        ! ---- Shared Procedures
        
        IMPLICIT NONE
        
        INTEGER :: n,id
        DOUBLE PRECISION, INTENT(IN) :: f(n,ixlo:ixhi,iylo:iyhi,izlo:izhi)
        DOUBLE PRECISION, INTENT(OUT):: ycwdf(ixlo:ixhi,iylo:iyhi,izlo:izhi)
        DOUBLE PRECISION :: cdz
        
        INTEGER :: i,j,k
    
        call cleslog_log_enter('ThreeDYCellWallDzIdx')
      
        cdz = 0.25d0/dz
    
        ! initialize the cell wall derivative to be zero
    
        do k = izlo,izhi
           do i = ixlo,ixhi
              ycwdf(i,iylo,k) = 0.0d0
           end do
        end do
    
        do j = iylo,iyhi
           do i = ixlo,ixhi
              ycwdf(i,j,izlo) = 0.0d0
              ycwdf(i,j,izhi) = 0.0d0
           end do
        end do
        ! use second-order center difference
        
        do k=izlo+1, izhi-1
           DO j = iylo,iyhi-1
              do i = ixlo, ixhi
                 ycwdf(i,j+1,k) = (f(id,i,j+1,k+1)+f(id,i,j,k+1) &
                      &-f(id,i,j+1,k-1)-f(id,i,j,k-1))*cdz
              end do
           enddo
        enddo
    
        call cleslog_log_exit('ThreeDYCellWallDzIdx')
        
        RETURN
    
      END SUBROUTINE ThreeDYCellWallDzIdx
    
    END MODULE Generic_YCellWallDz
    
    ! ----- THE Z-CELL WALLS
    
    
    MODULE Generic_ZCellWallAv
    
      ! Returns zcwfave - the value of f evaluated at 
      !                    cell walls.  
      !               zcwfave(i,j,k) is f evaluated at the interface
      !                    between the (i,j,k), and (i,j,k-1) cells.
      !                               
    
    
      
      INTERFACE ZCellWallAv
         MODULE PROCEDURE ThreeDZCellWallAv
         MODULE PROCEDURE ThreeDZCellWallAvIdx
      END INTERFACE
    
    CONTAINS
      
      SUBROUTINE ThreeDZCellWallAv(f,zcwfave)
    
        ! ----  Shared Variables
        USE mesh
        USE array_bounds
        USE method_parms
        
        IMPLICIT NONE
        
        DOUBLE PRECISION, INTENT(IN) :: f(ixlo:ixhi,iylo:iyhi,izlo:izhi)
        DOUBLE PRECISION, INTENT(OUT):: zcwfave(ixlo:ixhi,iylo:iyhi,izlo:izhi)
      
        INTEGER :: i,j,k
    
        call cleslog_log_enter('ThreeDZCellWallAv')
      
        ! initialize the cell wall values to be zero
        do j = iylo,iyhi
           do i = ixlo,ixhi
              zcwfave(i,j,izlo) = f(i,j,izlo)
           end do
        end do
        
        ! use second-order interpolation
        DO k=izlo,izhi-1
           DO j=iylo,iyhi
              do i=ixlo,ixhi
                 zcwfave(i,j,k+1) = (f(i,j,k+1) + f(i,j,k))*0.5d0
              end do
           END DO
        END DO
    
        call cleslog_log_exit('ThreeDZCellWallAv')
    
        RETURN
    
      END SUBROUTINE ThreeDZCellWallAv
    
      SUBROUTINE ThreeDZCellWallAvIdx(f,zcwfave,n,id)
    
        ! ----  Shared Variables
        USE mesh
        USE array_bounds
        USE method_parms
        
        IMPLICIT NONE
        
        INTEGER :: n,id
        DOUBLE PRECISION, INTENT(IN) :: f(n,ixlo:ixhi,iylo:iyhi,izlo:izhi)
        DOUBLE PRECISION, INTENT(OUT):: zcwfave(ixlo:ixhi,iylo:iyhi,izlo:izhi)
      
        INTEGER :: i,j,k
    
        call cleslog_log_enter('ThreeDZCellWallAvIdx')
      
        ! initialize the cell wall values to be zero
        do j = iylo,iyhi
           do i = ixlo,ixhi
              zcwfave(i,j,izlo) = f(id,i,j,izlo)
           end do
        end do
        
        ! use second-order interpolation
        DO k=izlo,izhi-1
           DO j=iylo,iyhi
              do i=ixlo,ixhi
                 zcwfave(i,j,k+1) = (f(id,i,j,k+1) + f(id,i,j,k))*0.5d0
              end do
           END DO
        END DO
    
        call cleslog_log_exit('ThreeDZCellWallAvIdx')
    
        RETURN
    
      END SUBROUTINE ThreeDZCellWallAvIdx
    
    END MODULE Generic_ZCellWallAv
    
    
    ! DERIVATIVES ON CELL WALLS
    
    MODULE Generic_ZCellWallDx
      ! Returns zcwdf - the derivative of f evaluated at 
      !                 cell walls.  
      !               zcwdf(i) is df/dx evaluated at the interface
      !                 between the k, and k-1 cells.
      !                               
    
    
    
      INTERFACE ZCellWallDx
         MODULE PROCEDURE ThreeDZCellWallDx
         MODULE PROCEDURE ThreeDZCellWallDxIdx
      END INTERFACE
    
    CONTAINS
    
      SUBROUTINE ThreeDZCellWallDx(f,zcwdf)
    
    
        ! ----  Shared Variables
        USE mesh
        USE array_bounds
        USE method_parms
        
        ! ---- Shared Procedures
    
        IMPLICIT NONE
    
        DOUBLE PRECISION, INTENT(IN) :: f(ixlo:ixhi,iylo:iyhi,izlo:izhi)
        DOUBLE PRECISION, INTENT(OUT):: zcwdf(ixlo:ixhi,iylo:iyhi,izlo:izhi)
        DOUBLE PRECISION :: cdx
      
        INTEGER :: i,j,k
    
        call cleslog_log_enter('ThreeDZCellWallDx')
    
        cdx = 0.25d0/dx
    
        ! initialize the cell wall derivative to be zero
      
        do j = iylo, iyhi
           do i = ixlo,ixhi
              zcwdf(i,j,izlo) = 0.0d0
           end do
        end do
       
        do k = izlo,izhi
           do j = iylo,iyhi
              zcwdf(ixlo,j,k) = 0.0d0
              zcwdf(ixhi,j,k) = 0.0d0
           end do
        end do
        
        ! use second-order center difference
        
        do k=izlo, izhi-1
           DO j = iylo,iyhi
              do i = ixlo+1,ixhi-1
                 zcwdf(i,j,k+1) = (f(i+1,j,k+1)+f(i+1,j,k)&
                      &-f(i-1,j,k+1)-f(i-1,j,k))*cdx
              end do
           enddo
        enddo
    
        call cleslog_log_exit('ThreeDZCellWallDx')
        
        RETURN
        
      END SUBROUTINE ThreeDZCellWallDx
    
      SUBROUTINE ThreeDZCellWallDxIdx(f,zcwdf,n,id)
    
    
        ! ----  Shared Variables
        USE mesh
        USE array_bounds
        USE method_parms
        
        ! ---- Shared Procedures
    
        IMPLICIT NONE
    
        INTEGER :: n,id
        DOUBLE PRECISION, INTENT(IN) :: f(n,ixlo:ixhi,iylo:iyhi,izlo:izhi)
        DOUBLE PRECISION, INTENT(OUT):: zcwdf(ixlo:ixhi,iylo:iyhi,izlo:izhi)
        DOUBLE PRECISION :: cdx
      
        INTEGER :: i,j,k
    
        call cleslog_log_enter('ThreeDZCellWallDxIdx')
    
        cdx = 0.25d0/dx
    
        ! initialize the cell wall derivative to be zero
      
        do j = iylo, iyhi
           do i = ixlo,ixhi
              zcwdf(i,j,izlo) = 0.0d0
           end do
        end do
       
        do k = izlo,izhi
           do j = iylo,iyhi
              zcwdf(ixlo,j,k) = 0.0d0
              zcwdf(ixhi,j,k) = 0.0d0
           end do
        end do
        
        ! use second-order center difference
        
        do k=izlo, izhi-1
           DO j = iylo,iyhi
              do i = ixlo+1,ixhi-1
                 zcwdf(i,j,k+1) = (f(id,i+1,j,k+1)+f(id,i+1,j,k)&
                      &-f(id,i-1,j,k+1)-f(id,i-1,j,k))*cdx
              end do
           enddo
        enddo
    
        call cleslog_log_exit('ThreeDZCellWallDxIdx')
        
        RETURN
        
      END SUBROUTINE ThreeDZCellWallDxIdx
    
    END MODULE Generic_ZCellWallDx
    
    
    MODULE Generic_ZCellWallDy
    
      ! ---     | j+1 |
      ! ---   __|_____|__
      ! ---     |  i  |
      ! ---  i-1|  j  |i+1
      ! ---   __|_____|__
      ! ---     |     |
      ! ---     | j-1 |
    
      ! Returns ycwdf - the derivative of f evaluated at 
      !                 cell walls.  
      !               zcwdf(i,j,k) is df/dy evaluated at the interface
      !                 between the (i,j,k), and (i,j,k-1) cells.
      !                               
    
    
    
      INTERFACE ZCellWallDy
         MODULE PROCEDURE ThreeDZCellWallDy
         MODULE PROCEDURE ThreeDZCellWallDyIdx
      END INTERFACE
    
    CONTAINS
    
    
    
      SUBROUTINE ThreeDZCellWallDy(f,zcwdf)
    
        ! ----  Shared Variables
        USE mesh
        USE array_bounds
        USE method_parms
    
        ! ---- Shared Procedures
      
        IMPLICIT NONE
        
        DOUBLE PRECISION, INTENT(IN) :: f(ixlo:ixhi,iylo:iyhi,izlo:izhi)
        DOUBLE PRECISION, INTENT(OUT):: zcwdf(ixlo:ixhi,iylo:iyhi,izlo:izhi)
        DOUBLE PRECISION :: cdy
        
        INTEGER :: i,j,k
    
        call cleslog_log_enter('ThreeDZCellWallDy')
      
        cdy = 0.25d0/dy
        
        do k = izlo,izhi
           do i = ixlo,ixhi
              zcwdf(i,iylo,k) = 0.0d0
              zcwdf(i,iyhi,k) = 0.0d0
           end do
        end do
        do j = iylo,iyhi
           do i = ixlo, ixhi
              zcwdf(i,j,izlo) = 0.0d0
           end do
        end do
     
        ! use second-order center difference
        
        do k=izlo, izhi-1
           DO j = iylo+1,iyhi-1
              do i = ixlo,ixhi
                 zcwdf(i,j,k+1) = (f(i,j+1,k+1)+f(i,j+1,k) &
                      &-f(i,j-1,k+1)-f(i,j-1,k))*cdy
              end do
           enddo
        enddo
    
        call cleslog_log_exit('ThreeDZCellWallDy')
    
        RETURN
        
      END SUBROUTINE ThreeDZCellWallDy
    
      SUBROUTINE ThreeDZCellWallDyIdx(f,zcwdf,n,id)
    
        ! ----  Shared Variables
        USE mesh
        USE array_bounds
        USE method_parms
    
        ! ---- Shared Procedures
      
        IMPLICIT NONE
        
        INTEGER :: n,id
        DOUBLE PRECISION, INTENT(IN) :: f(n,ixlo:ixhi,iylo:iyhi,izlo:izhi)
        DOUBLE PRECISION, INTENT(OUT):: zcwdf(ixlo:ixhi,iylo:iyhi,izlo:izhi)
        DOUBLE PRECISION :: cdy
        
        INTEGER :: i,j,k
    
        call cleslog_log_enter('ThreeDZCellWallDyIdx')
      
        cdy = 0.25d0/dy
        
        do k = izlo,izhi
           do i = ixlo,ixhi
              zcwdf(i,iylo,k) = 0.0d0
              zcwdf(i,iyhi,k) = 0.0d0
           end do
        end do
        do j = iylo,iyhi
           do i = ixlo, ixhi
              zcwdf(i,j,izlo) = 0.0d0
           end do
        end do
     
        ! use second-order center difference
        
        do k=izlo, izhi-1
           DO j = iylo+1,iyhi-1
              do i = ixlo,ixhi
                 zcwdf(i,j,k+1) = (f(id,i,j+1,k+1)+f(id,i,j+1,k) &
                      &-f(id,i,j-1,k+1)-f(id,i,j-1,k))*cdy
              end do
           enddo
        enddo
    
        call cleslog_log_exit('ThreeDZCellWallDyIdx')
    
        RETURN
        
      END SUBROUTINE ThreeDZCellWallDyIdx
    
    END MODULE Generic_ZCellWallDy
    
    MODULE Generic_ZCellWallDz
    
      ! ---     | j+1 |
      ! ---   __|_____|__
      ! ---     |  i  |
      ! ---  i-1|  j  |i+1
      ! ---   __|_____|__
      ! ---     |     |
      ! ---     | j-1 |
    
      ! Returns zcwdf - the derivative of f evaluated at 
      !                 cell walls.  
      !               zcwdf(i,j,k) is df/dz evaluated at the interface
      !                 between the (i,j,k), and (i,j,k-1) cells.
      !                               
    
    
    
      INTERFACE ZCellWallDz
         MODULE PROCEDURE ThreeDZCellWallDz
         MODULE PROCEDURE ThreeDZCellWallDzIdx
      END INTERFACE
    
    CONTAINS
    
    
      SUBROUTINE ThreeDZCellWallDz(f,zcwdf)
    
        ! ----  Shared Variables
        USE mesh
        USE array_bounds
        USE method_parms
        
      
        IMPLICIT NONE
        
        DOUBLE PRECISION, INTENT(IN) :: f(ixlo:ixhi,iylo:iyhi,izlo:izhi)
        DOUBLE PRECISION, INTENT(OUT):: zcwdf(ixlo:ixhi,iylo:iyhi,izlo:izhi)
        
        DOUBLE PRECISION :: cdz
        
        INTEGER :: i,j,k
    
        call cleslog_log_enter('ThreeDZCellWallDz')
      
        cdz = 1.0d0/dz
        
        ! initialize the cell wall derivative to be zero
        do j = iylo,iyhi
           do i = ixlo, ixhi
              zcwdf(i,j,izlo) = 0.0d0
           end do
        end do
        ! use second-order center difference
        DO k = izlo,izhi-1
           DO j = iylo,iyhi
              do i = ixlo,ixhi
                 zcwdf(i,j,k+1) =(f(i,j,k+1)-f(i,j,k))*cdz
              end do
           END DO
        END DO
    
        call cleslog_log_exit('ThreeDZCellWallDz')
    
        RETURN
        
      END SUBROUTINE ThreeDZCellWallDz
    
      SUBROUTINE ThreeDZCellWallDzIdx(f,zcwdf,n,id)
    
        ! ----  Shared Variables
        USE mesh
        USE array_bounds
        USE method_parms
        
      
        IMPLICIT NONE
        
        INTEGER :: n,id
        DOUBLE PRECISION, INTENT(IN) :: f(n,ixlo:ixhi,iylo:iyhi,izlo:izhi)
        DOUBLE PRECISION, INTENT(OUT):: zcwdf(ixlo:ixhi,iylo:iyhi,izlo:izhi)
        
        DOUBLE PRECISION :: cdz
        
        INTEGER :: i,j,k
    
        call cleslog_log_enter('ThreeDZCellWallDzIdx')
      
        cdz = 1.0d0/dz
        
        ! initialize the cell wall derivative to be zero
        do j = iylo,iyhi
           do i = ixlo, ixhi
              zcwdf(i,j,izlo) = 0.0d0
           end do
        end do
        ! use second-order center difference
        DO k = izlo,izhi-1
           DO j = iylo,iyhi
              do i = ixlo,ixhi
                 zcwdf(i,j,k+1) =(f(id,i,j,k+1)-f(id,i,j,k))*cdz
              end do
           END DO
        END DO
    
        call cleslog_log_exit('ThreeDZCellWallDzIdx')
    
        RETURN
        
      END SUBROUTINE ThreeDZCellWallDzIdx
    
    END MODULE Generic_ZCellWallDz
    

<