! Horizontal basic numerical operations for 3-dimensional arrays.
! These are the basic building blocks for horizontal compact and
! conventional differencing, quadrature, midpoint interpolation
! and filtering.
!############# 3-dimensions, index-i active:

subroutine ud1c3i(c,d,bnd1,      & 1
     ids,ide, jds,jde, kds,kde, &
     ims,ime, jms,jme, kms,kme, &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(IN   )    :: c                   

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(OUT  )    :: d    
               
      real,         INTENT(IN   )    ::  bnd1

      integer :: i,j,k

      do j=jts,jte
      do k=kts,kte
      do i=its,ite
         d(i,k,j)=bnd1*(c(i+1,k,j)-c(i-1,k,j))
      enddo
      enddo
      enddo

end subroutine ud1c3i


subroutine ud2c3i(c,d,bnd1,bnd2, & 1
     ids,ide, jds,jde, kds,kde,  &
     ims,ime, jms,jme, kms,kme,  &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(IN   )    :: c                   

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(OUT  )    :: d    
               
      real,         INTENT(IN   )    ::  bnd1,bnd2

      integer :: i,j,k

      do j=jts,jte
      do k=kts,kte
      do i=its,ite
         d(i,k,j)=bnd1*(c(i+1,k,j)-c(i-1,k,j))+bnd2*(c(i+2,k,j)-c(i-2,k,j))
      enddo
      enddo
      enddo

end subroutine ud2c3i


subroutine sa1a3i(a,bnm1,       & 4
     ids,ide, jds,jde, kds,kde, &
     ims,ime, jms,jme, kms,kme, &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(INOUT)    :: a                    

      real,         INTENT(IN   )    :: bnm1

      integer :: i,j,k

      do j=jts,jte
      do k=kts,kte
      do i=its,ite
         a(i,k,j)=bnm1*(a(i,k,j)+a(i+1,k,j))
      enddo
      enddo
      enddo

end subroutine sa1a3i


subroutine sq1a3i(a,bnq,        & 4
     ids,ide, jds,jde, kds,kde, &
     ims,ime, jms,jme, kms,kme, &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(INOUT)    :: a                    

      real,         INTENT(IN   )    :: bnq

      integer :: i,j,k

      do j=jts,jte
      do k=kts,kte
      do i=its,ite
         a(i,k,j)=a(i-1,k,j)+bnq*a(i,k,j)
      enddo
      enddo
      enddo

end subroutine sq1a3i


subroutine sd1b3i(a,bnqi,       & 4
     ids,ide, jds,jde, kds,kde, &
     ims,ime, jms,jme, kms,kme, &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(INOUT)    :: a                    

      real,         INTENT(IN   )    :: bnqi

      integer :: i,j,k

      do j=jts,jte
      do k=kts,kte
      do i=ite,its,-1
         a(i,k,j)=bnqi*(a(i,k,j)-a(i-1,k,j))
      enddo
      enddo
      enddo

end subroutine sd1b3i


subroutine ef1a3i(a,knq1,       & 6
     ids,ide, jds,jde, kds,kde, &
     ims,ime, jms,jme, kms,kme, &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(INOUT)    :: a                    

      real,         INTENT(IN   )    :: knq1

      integer :: i,j,k

      do j=jts,jte
      do k=kts,kte
      do i=its,ite
         a(i,k,j)=a(i,k,j)+knq1*a(i+1,k,j)
      enddo
      enddo
      enddo
end subroutine ef1a3i


subroutine ef2a3i(a,knq1,knq2,  & 4
     ids,ide, jds,jde, kds,kde, &
     ims,ime, jms,jme, kms,kme, &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(INOUT)    :: a                    

      real,         INTENT(IN   )    :: knq1,knq2

      integer :: i,j,k

      do j=jts,jte
      do k=kts,kte
      do i=its,ite
         a(i,k,j)=a(i,k,j)+knq1*a(i+1,k,j)+knq2*a(i+2,k,j)
      enddo
      enddo
      enddo
end subroutine ef2a3i


subroutine ef1b3i(a,knq1,       & 6
     ids,ide, jds,jde, kds,kde, &
     ims,ime, jms,jme, kms,kme, &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(INOUT)    :: a                    

      real,         INTENT(IN   )    :: knq1

      integer :: i,j,k

      do j=jts,jte
      do k=kts,kte
      do i=ite,its,-1
         a(i,k,j)=a(i,k,j)+knq1*a(i-1,k,j)
      enddo
      enddo
      enddo
end subroutine ef1b3i


subroutine ef2b3i(a,knq1,knq2,  & 4
     ids,ide, jds,jde, kds,kde, &
     ims,ime, jms,jme, kms,kme, &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(INOUT)    :: a                    

      real,         INTENT(IN   )    :: knq1,knq2

      integer :: i,j,k

      do j=jts,jte
      do k=kts,kte
      do i=ite,its,-1
         a(i,k,j)=a(i,k,j)+knq1*a(i-1,k,j)+knq2*a(i-2,k,j)
      enddo
      enddo
      enddo
end subroutine ef2b3i


subroutine rf1a3i(a,lnq1,       & 8
     ids,ide, jds,jde, kds,kde, &
     ims,ime, jms,jme, kms,kme, &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(INOUT)    :: a                    

      real,         INTENT(IN   )    :: lnq1

      integer :: i,j,k

      do j=jts,jte
      do k=kts,kte
      do i=its,ite
         a(i,k,j)=a(i,k,j)-lnq1*a(i-1,k,j)
      enddo
      enddo
      enddo
end subroutine rf1a3i


subroutine rf2a3i(a,lnq1,lnq2,  & 6
     ids,ide, jds,jde, kds,kde, &
     ims,ime, jms,jme, kms,kme, &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(INOUT)    :: a                    

      real,         INTENT(IN   )    :: lnq1,lnq2

      integer :: i,j,k

      do j=jts,jte
      do k=kts,kte
      do i=its,ite
         a(i,k,j)=a(i,k,j)-lnq1*a(i-1,k,j)-lnq2*a(i-2,k,j)
      enddo
      enddo
      enddo
end subroutine rf2a3i


subroutine rf1b3i(a,lnq1,       & 8
     ids,ide, jds,jde, kds,kde, &
     ims,ime, jms,jme, kms,kme, &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(INOUT)    :: a                    

      real,         INTENT(IN   )    :: lnq1

      integer :: i,j,k

      do j=jts,jte
      do k=kts,kte
      do i=ite,its,-1
         a(i,k,j)=a(i,k,j)-lnq1*a(i+1,k,j)
      enddo
      enddo
      enddo
end subroutine rf1b3i


subroutine rf2b3i(a,lnq1,lnq2,  & 6
     ids,ide, jds,jde, kds,kde, &
     ims,ime, jms,jme, kms,kme, &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(INOUT)    :: a                    

      real,         INTENT(IN   )    :: lnq1,lnq2

      integer :: i,j,k

      do j=jts,jte
      do k=kts,kte
      do i=ite,its,-1
         a(i,k,j)=a(i,k,j)-lnq1*a(i+1,k,j)-lnq2*a(i+2,k,j)
      enddo
      enddo
      enddo
end subroutine rf2b3i


subroutine ra1a3i(a,p,lnq1,fnq, & 8
     ids,ide, jds,jde, kds,kde, &
     ims,ime, jms,jme, kms,kme, &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(IN   )    :: a

      real, dimension(1, kms:kme, jms:jme), &
                    INTENT(INOUT)    :: p

      real,         INTENT(IN   )    :: lnq1

      integer,      INTENT(IN   )    :: fnq

      integer :: i,j,k

      if(fnq > ite+1-its)stop 'In rala3i; fnq exceeds tile width'

      do j=jts,jte
      do k=kts,kte
         p(1,k,j)=0.
      enddo
      enddo
      do j=jts,jte
      do k=kts,kte
      do i=ite+1-fnq,ite
         p(1,k,j)=a(i,k,j)-lnq1*p(1,k,j)
      enddo
      enddo
      enddo
end subroutine ra1a3i


subroutine ra2a3i(a,p,lnq1,lnq2,fnq,  & 6
     ids,ide, jds,jde, kds,kde,       &
     ims,ime, jms,jme, kms,kme,       &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(IN   )    ::  a   

      real, dimension(2, kms:kme, jms:jme), &
                    INTENT(INOUT)    :: p

      real,         INTENT(IN   )    :: lnq1,lnq2

      integer,      INTENT(IN   )    :: fnq

      integer :: i,j,k

      if(fnq > ite+1-its)stop 'In ra2a3i; fnq exceeds tile width'
      if(mod(fnq,2)/=0)  stop 'In ra2a3i; fnq is not even'

      do j=jts,jte
      do k=kts,kte
         p(1,k,j)=0.
         p(2,k,j)=0.
      enddo
      enddo

      do j=jts,jte
      do k=kts,kte
      do i=ite+1-fnq,ite,2
         p(2,k,j)=a(i,  k,j)-lnq1*p(1,k,j)-lnq2*p(2,k,j)
         p(1,k,j)=a(i+1,k,j)-lnq1*p(2,k,j)-lnq2*p(1,k,j)
      enddo
      enddo
      enddo
end subroutine ra2a3i


subroutine ra1b3i(a,p,lnq1,fnq, & 8
     ids,ide, jds,jde, kds,kde, &
     ims,ime, jms,jme, kms,kme, &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(IN   )    :: a                    

      real, dimension(1, kms:kme, jms:jme), &
                    INTENT(INOUT)    :: p

      real,         INTENT(IN   )    :: lnq1

      integer,      INTENT(IN   )    :: fnq

      integer :: i,j,k

      if(fnq > ite+1-its)stop 'In ralb3i; fnq exceeds tile width'

      do j=jts,jte
      do k=kts,kte
         p(1,k,j)=0.
      enddo
      enddo

      do j=jts,jte
      do k=kts,kte
      do i=its-1+fnq,its,-1
         p(1,k,j)=a(i,k,j)-lnq1*p(1,k,j)
      enddo
      enddo
      enddo
end subroutine ra1b3i


subroutine ra2b3i(a,p,lnq1,lnq2,fnq, & 6
     ids,ide, jds,jde, kds,kde,      &
     ims,ime, jms,jme, kms,kme,      &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(IN   )    :: a                    

      real, dimension(2, kms:kme, jms:jme), &
                    INTENT(INOUT)    :: p

      real,         INTENT(IN   )    :: lnq1,lnq2

      integer,      INTENT(IN   )    :: fnq

      integer :: i,j,k

      if(fnq > ite+1-its)stop 'In ra2b3i; fnq exceeds tile width'
      if(mod(fnq,2)/=0)  stop 'In ra2b3i; fnq is not even'

      do j=jts,jte
      do k=kts,kte
         p(1,k,j)=0.
         p(2,k,j)=0.
      enddo
      enddo

      do j=jts,jte
      do k=kts,kte
      do i=its-1+fnq,its,-2
         p(2,k,j)=a(i  ,k,j)-lnq1*p(1,k,j)-lnq2*p(2,k,j)
         p(1,k,j)=a(i-1,k,j)-lnq1*p(2,k,j)-lnq2*p(1,k,j)
      enddo
      enddo
      enddo
end subroutine ra2b3i 


subroutine mf11a3i(a,lnq1,knq1, &
     ids,ide, jds,jde, kds,kde, &
     ims,ime, jms,jme, kms,kme, &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(INOUT)    :: a                    

      real,         INTENT(IN   )    :: lnq1,knq1

      integer :: i,j,k

      do j=jts,jte
      do k=kts,kte
      do i=its,ite
         a(i,k,j)=a(i,k,j)-lnq1*a(i-1,k,j)+knq1*a(i+1,k,j)
      enddo
      enddo
      enddo
end subroutine mf11a3i


subroutine mf12a3i(a,lnq1,knq1,knq2, &
     ids,ide, jds,jde, kds,kde,      &
     ims,ime, jms,jme, kms,kme,      &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(INOUT)    :: a                    

      real,         INTENT(IN   )    :: lnq1,knq1,knq2

      integer :: i,j,k

      do j=jts,jte
      do k=kts,kte
      do i=its,ite
         a(i,k,j)=a(i,k,j)-lnq1*a(i-1,k,j) &
                          +knq1*a(i+1,k,j)+knq2*a(i+2,k,j)
      enddo
      enddo
      enddo
end subroutine mf12a3i


subroutine mf21a3i(a,lnq1,lnq2,knq1, &
     ids,ide, jds,jde, kds,kde,      &
     ims,ime, jms,jme, kms,kme,      &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(INOUT)    :: a                    

      real,         INTENT(IN   )    :: lnq1,lnq2,knq1

      integer :: i,j,k

      do j=jts,jte
      do k=kts,kte
      do i=its,ite
         a(i,k,j)=a(i,k,j)-lnq1*a(i-1,k,j)-lnq2*a(i-2,k,j)+knq1*a(i+1,k,j)
      enddo
      enddo
      enddo
end subroutine mf21a3i


subroutine mf22a3i(a,lnq1,lnq2,knq1,knq2, &
     ids,ide, jds,jde, kds,kde,           &
     ims,ime, jms,jme, kms,kme,           &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(INOUT)    :: a                    

      real,         INTENT(IN   )    :: lnq1,lnq2,knq1,knq2

      integer :: i,j,k

      do j=jts,jte
      do k=kts,kte
      do i=its,ite
         a(i,k,j)=a(i,k,j)-lnq1*a(i-1,k,j)-lnq2*a(i-2,k,j) &
                          +knq1*a(i+1,k,j)+knq2*a(i+2,k,j)
      enddo
      enddo
      enddo
end subroutine mf22a3i


subroutine ma11a3i(a,p,lnq1,knq1,fnq, &
     ids,ide, jds,jde, kds,kde,       &
     ims,ime, jms,jme, kms,kme,       &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(IN   )    :: a 

      real, dimension(1, kms:kme, jms:jme),&
                    INTENT(INOUT)    :: p

      real,         INTENT(IN   )    :: lnq1,knq1

      integer,      INTENT(IN   )    :: fnq 

      integer :: i,j,k

      if(fnq > ite+1-its)stop 'In mal1a3i; fnq exceeds tile width'

      do j=jts,jte
      do k=kts,kte
         p(1,k,j)=0.
      enddo
      enddo
      do j=jts,jte
      do k=kts,kte
      do i=ite+1-fnq,ite
         p(1,k,j)=a(i,k,j)-lnq1*p(1,k,j)+knq1*a(i+1,k,j)
      enddo
      enddo
      enddo
end subroutine ma11a3i


subroutine ma12a3i(a,p,lnq1,knq1,knq2,fnq, &
     ids,ide, jds,jde, kds,kde,            &
     ims,ime, jms,jme, kms,kme,            &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(IN   )    :: a                    

      real, dimension(1, kms:kme, jms:jme), &
                    INTENT(INOUT)    :: p

      real,         INTENT(IN   )    :: lnq1,knq1,knq2

      integer,      INTENT(IN   )    :: fnq

      integer :: i,j,k

      if(fnq > ite+1-its)stop 'In ma12a3i; fnq exceeds tile width'

      do j=jts,jte
      do k=kts,kte
         p(1,k,j)=0.
      enddo
      enddo
      do j=jts,jte
      do k=kts,kte
      do i=ite+1-fnq,ite
         p(1,k,j)=a(i,k,j)-lnq1*p(1,  k,j) &
                          +knq1*a(i+1,k,j)+knq2*a(i+2,k,j)
      enddo
      enddo
      enddo
end subroutine ma12a3i


subroutine ma21a3i(a,p,lnq1,lnq2,knq1,fnq, &
     ids,ide, jds,jde, kds,kde,            &
     ims,ime, jms,jme, kms,kme,            &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(IN   )    :: a                    

      real, dimension(2, kms:kme, jms:jme), &
                    INTENT(INOUT)    :: p

      real,         INTENT(IN   )    :: lnq1,lnq2,knq1

      integer,      INTENT(IN   )    :: fnq

      integer :: i,j,k

      if(fnq > ite+1-its)stop 'In ma21a3i; fnq exceeds tile width'
      if(mod(fnq,2)/=0)  stop 'In ma21a3i; fnq is not even'

      do j=jts,jte
      do k=kts,kte
         p(1,k,j)=0.
         p(2,k,j)=0.
      enddo
      enddo

      do j=jts,jte
      do k=kts,kte
      do i=ite+1-fnq,ite,2
         p(2,k,j)=a(i,  k,j)-lnq1*p(1,  k,j)-lnq2*p(2,k,j) &
                            +knq1*a(i+1,k,j)
         p(1,k,j)=a(i+1,k,j)-lnq1*p(2,  k,j)-lnq2*p(1,k,j) &
                            +knq1*a(i+2,k,j)
      enddo
      enddo
      enddo
end subroutine ma21a3i


subroutine ma22a3i(a,p,lnq1,lnq2,knq1,knq2,fnq, &
     ids,ide, jds,jde, kds,kde,                 &
     ims,ime, jms,jme, kms,kme,                 &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(IN   )    :: a                    

      real, dimension(2, kms:kme, jms:jme), &
                    INTENT(INOUT)    :: p

      real,         INTENT(IN   )    :: lnq1,lnq2,knq1,knq2

      integer,      INTENT(IN   )    :: fnq

      integer :: i,j,k

      if(fnq > ite+1-its)stop 'In ma22a3i; fnq exceeds tile width'
      if(mod(fnq,2)/=0)  stop 'In ma22a3i; fnq is not even'

      do j=jts,jte
      do k=kts,kte
         p(1,k,j)=0.
         p(2,k,j)=0.
      enddo
      enddo

      do j=jts,jte
      do k=kts,kte
      do i=ite+1-fnq,ite,2
         p(2,k,j)=a(i,  k,j)-lnq1*p(1,  k,j)-lnq2*p(2,  k,j) &
                            +knq1*a(i+1,k,j)+knq2*a(i+2,k,j)
         p(1,k,j)=a(i+1,k,j)-lnq1*p(2,  k,j)-lnq2*p(1,  k,j) &
                            +knq1*a(i+2,k,j)+knq2*a(i+3,k,j)
      enddo
      enddo
      enddo
end subroutine ma22a3i


subroutine mf11b3i(a,lnq1,knq1, &
     ids,ide, jds,jde, kds,kde, &
     ims,ime, jms,jme, kms,kme, &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(INOUT)    :: a                    

      real,         INTENT(IN   )    :: lnq1,knq1

      integer :: i,j,k

      do j=jts,jte
      do k=kts,kte
      do i=ite,its,-1
         a(i,k,j)=a(i,k,j)-lnq1*a(i+1,k,j)+knq1*a(i-1,k,j)
      enddo
      enddo
      enddo
end subroutine mf11b3i


subroutine mf12b3i(a,lnq1,knq1,knq2, &
     ids,ide, jds,jde, kds,kde,      &
     ims,ime, jms,jme, kms,kme,      &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(INOUT)    :: a                    

      real,         INTENT(IN   )    :: lnq1,knq1,knq2

      integer :: i,j,k

      do j=jts,jte
      do k=kts,kte
      do i=ite,its,-1
         a(i,k,j)=a(i,k,j)-lnq1*a(i+1,k,j) &
                          +knq1*a(i-1,k,j)+knq2*a(i-2,k,j)
      enddo
      enddo
      enddo
end subroutine mf12b3i


subroutine mf21b3i(a,lnq1,lnq2,knq1, &
     ids,ide, jds,jde, kds,kde,      &
     ims,ime, jms,jme, kms,kme,      &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(INOUT)    :: a                    

      real,         INTENT(IN   )    :: lnq1,lnq2,knq1

      integer :: i,j,k

      do j=jts,jte
      do k=kts,kte
      do i=ite,its,-1
         a(i,k,j)=a(i,k,j)-lnq1*a(i+1,k,j)-lnq2*a(i+2,k,j)+knq1*a(i-1,k,j)
      enddo
      enddo
      enddo
end subroutine mf21b3i


subroutine mf22b3i(a,lnq1,lnq2,knq1,knq2, &
     ids,ide, jds,jde, kds,kde,           &
     ims,ime, jms,jme, kms,kme,           &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(INOUT)    :: a                    

      real,         INTENT(IN   )    :: lnq1,lnq2,knq1,knq2

      integer :: i,j,k

      do j=jts,jte
      do k=kts,kte
      do i=ite,its,-1
         a(i,k,j)=a(i,k,j)-lnq1*a(i+1,k,j)-lnq2*a(i+2,k,j) &
                          +knq1*a(i-1,k,j)+knq2*a(i-2,k,j)
      enddo
      enddo
      enddo
end subroutine mf22b3i


subroutine ma11b3i(a,p,lnq1,knq1,fnq, &
     ids,ide, jds,jde, kds,kde,       &
     ims,ime, jms,jme, kms,kme,       &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(IN   )    :: a 

      real, dimension(1, kms:kme, jms:jme),&
                    INTENT(INOUT)    :: p

      real,         INTENT(IN   )    :: lnq1,knq1

      integer,      INTENT(IN   )    :: fnq 

      integer :: i,j,k

      if(fnq > ite+1-its)stop 'In mal1b3i; fnq exceeds tile width'

      do j=jts,jte
      do k=kts,kte
         p(1,k,j)=0.
      enddo
      enddo
      do j=jts,jte
      do k=kts,kte
      do i=its-1+fnq,its,-1
         p(1,k,j)=a(i,k,j)-lnq1*p(1,k,j)+knq1*a(i-1,k,j)
      enddo
      enddo
      enddo
end subroutine ma11b3i


subroutine ma12b3i(a,p,lnq1,knq1,knq2,fnq, &
     ids,ide, jds,jde, kds,kde,            &
     ims,ime, jms,jme, kms,kme,            &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(IN   )    :: a                    

      real, dimension(1, kms:kme, jms:jme), &
                    INTENT(INOUT)    :: p

      real,         INTENT(IN   )    :: lnq1,knq1,knq2

      integer,      INTENT(IN   )    :: fnq

      integer :: i,j,k

      if(fnq > ite+1-its)stop 'In mal2b3i; fnq exceeds tile width'

      do j=jts,jte
      do k=kts,kte
         p(1,k,j)=0.
      enddo
      enddo
      do j=jts,jte
      do k=kts,kte
      do i=its-1+fnq,its,-1
         p(1,k,j)=a(i,k,j)-lnq1*p(1,  k,j) &
                          +knq1*a(i-1,k,j)+knq2*a(i-2,k,j)
      enddo
      enddo
      enddo
end subroutine ma12b3i


subroutine ma21b3i(a,p,lnq1,lnq2,knq1,fnq, &
     ids,ide, jds,jde, kds,kde,            &
     ims,ime, jms,jme, kms,kme,            &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(IN   )    :: a                    

      real, dimension(2, kms:kme, jms:jme), &
                    INTENT(INOUT)    :: p

      real,         INTENT(IN   )    :: lnq1,lnq2,knq1

      integer,      INTENT(IN   )    :: fnq

      integer :: i,j,k

      if(fnq > ite+1-its)stop 'In ma21b3i; fnq exceeds tile width'
      if(mod(fnq,2)/=0)  stop 'In ma21b3i; fnq is not even'

      do j=jts,jte
      do k=kts,kte
         p(1,k,j)=0.
         p(2,k,j)=0.
      enddo
      enddo

      do j=jts,jte
      do k=kts,kte
      do i=its-1+fnq,its,-2
         p(2,k,j)=a(i,  k,j)-lnq1*p(1,  k,j)-lnq2*p(2,k,j) &
                            +knq1*a(i-1,k,j)
         p(1,k,j)=a(i-1,k,j)-lnq1*p(2,  k,j)-lnq2*p(1,k,j) &
                            +knq1*a(i-2,k,j)
      enddo
      enddo
      enddo
end subroutine ma21b3i


subroutine ma22b3i(a,p,lnq1,lnq2,knq1,knq2,fnq, &
     ids,ide, jds,jde, kds,kde,                 &
     ims,ime, jms,jme, kms,kme,                 &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(IN   )    ::  a                    

      real, dimension(2, kms:kme, jms:jme), &
                    INTENT(INOUT)    :: p

      real,         INTENT(IN   )    :: lnq1,lnq2,knq1,knq2

      integer,      INTENT(IN   )    :: fnq

      integer :: i,j,k

      if(fnq > ite+1-its)stop 'In ma22b3i; fnq exceeds tile width'
      if(mod(fnq,2)/=0)  stop 'In ma22b3i; fnq is not even'

      do j=jts,jte
      do k=kts,kte
         p(1,k,j)=0.
         p(2,k,j)=0.
      enddo
      enddo

      do j=jts,jte
      do k=kts,kte
      do i=its-1+fnq,its,-2
         p(2,k,j)=a(i,  k,j)-lnq1*p(1,  k,j)-lnq2*p(2,  k,j) &
                            +knq1*a(i-1,k,j)+knq2*a(i-2,k,j)
         p(1,k,j)=a(i-1,k,j)-lnq1*p(2,  k,j)-lnq2*p(1,  k,j) &
                            +knq1*a(i-2,k,j)+knq2*a(i-3,k,j)
      enddo
      enddo
      enddo
end subroutine ma22b3i

!############# 3-dimensions, index-j active:

subroutine ud1c3j(c,d,bnd1,     & 1
     ids,ide, jds,jde, kds,kde, &
     ims,ime, jms,jme, kms,kme, &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(IN   )    :: c                   

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(OUT  )    :: d    
               
      real,         INTENT(IN   )    :: bnd1

      integer :: i,j,k

      do j=jts,jte
      do k=kts,kte
      do i=its,ite
         d(i,k,j)=bnd1*(c(i,k,j+1)-c(i,k,j-1))
      enddo
      enddo
      enddo

end subroutine ud1c3j


subroutine ud2c3j(c,d,bnd1,bnd2, & 1
     ids,ide, jds,jde, kds,kde,  &
     ims,ime, jms,jme, kms,kme,  &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(IN   )    :: c                   

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(OUT  )    :: d    
               
      real,         INTENT(IN   )    :: bnd1,bnd2

      integer :: i,j,k

      do j=jts,jte
      do k=kts,kte
      do i=its,ite
         d(i,k,j)=bnd1*(c(i,k,j+1)-c(i,k,j-1))+bnd2*(c(i,k,j+2)-c(i,k,j-2))
      enddo
      enddo
      enddo

end subroutine ud2c3j


subroutine sa1a3j(a,bnm1,       & 4
     ids,ide, jds,jde, kds,kde, &
     ims,ime, jms,jme, kms,kme, &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(INOUT)    :: a                    

      real,         INTENT(IN   )    :: bnm1

      integer :: i,j,k

      do j=jts,jte
      do k=kts,kte
      do i=its,ite
         a(i,k,j)=bnm1*(a(i,k,j)+a(i,k,j+1))
      enddo
      enddo
      enddo

end subroutine sa1a3j


subroutine sq1a3j(a,bnq,        & 4
     ids,ide, jds,jde, kds,kde, &
     ims,ime, jms,jme, kms,kme, &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(INOUT)    :: a                    

      real,         INTENT(IN   )    :: bnq

      integer :: i,j,k

      do j=jts,jte
      do k=kts,kte
      do i=its,ite
         a(i,k,j)=a(i,k,j-1)+bnq*a(i,k,j)
      enddo
      enddo
      enddo

end subroutine sq1a3j


subroutine sd1b3j(a,bnqi,       & 4
     ids,ide, jds,jde, kds,kde, &
     ims,ime, jms,jme, kms,kme, &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(INOUT)    :: a                    

      real,         INTENT(IN   )    :: bnqi

      integer :: i,j,k

      do j=jte,jts-1,-1
      do k=kts,kte
      do i=its,ite
         a(i,k,j)=bnqi*(a(i,k,j)-a(i,k,j-1))
      enddo
      enddo
      enddo

end subroutine sd1b3j


subroutine ef1a3j(a,knq1,       & 6
     ids,ide, jds,jde, kds,kde, &
     ims,ime, jms,jme, kms,kme, &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(INOUT)    :: a                    

      real,         INTENT(IN   )    :: knq1

      integer :: i,j,k

      do j=jts,jte
      do k=kts,kte
      do i=its,ite
         a(i,k,j)=a(i,k,j)+knq1*a(i,k,j+1)
      enddo
      enddo
      enddo
end subroutine ef1a3j


subroutine ef2a3j(a,knq1,knq2,  & 4
     ids,ide, jds,jde, kds,kde, &
     ims,ime, jms,jme, kms,kme, &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(INOUT)    :: a                    

      real,         INTENT(IN   )    :: knq1,knq2

      integer :: i,j,k

      do j=jts,jte
      do k=kts,kte
      do i=its,ite
         a(i,k,j)=a(i,k,j)+knq1*a(i,k,j+1)+knq2*a(i,k,j+2)
      enddo
      enddo
      enddo
end subroutine ef2a3j


subroutine ef1b3j(a,knq1,       & 6
     ids,ide, jds,jde, kds,kde, &
     ims,ime, jms,jme, kms,kme, &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(INOUT)    :: a                    

      real,         INTENT(IN   )    :: knq1

      integer :: i,j,k

      do j=jte,jts-1,-1
      do k=kts,kte
      do i=its,ite
         a(i,k,j)=a(i,k,j)+knq1*a(i,k,j-1)
      enddo
      enddo
      enddo
end subroutine ef1b3j


subroutine ef2b3j(a,knq1,knq2,  & 4
     ids,ide, jds,jde, kds,kde, &
     ims,ime, jms,jme, kms,kme, &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(INOUT)    :: a                    

      real,         INTENT(IN   )    :: knq1,knq2

      integer :: i,j,k

      do j=jte,jts,-1
      do k=kts,kte
      do i=its,ite
         a(i,k,j)=a(i,k,j)+knq1*a(i,k,j-1)+knq2*a(i,k,j-2)
      enddo
      enddo
      enddo
end subroutine ef2b3j


subroutine rf1a3j(a,lnq1,       & 8
     ids,ide, jds,jde, kds,kde, &
     ims,ime, jms,jme, kms,kme, &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(INOUT)    :: a                    

      real,         INTENT(IN   )    :: lnq1

      integer :: i,j,k

      do j=jts,jte
      do k=kts,kte
      do i=its,ite
         a(i,k,j)=a(i,k,j)-lnq1*a(i,k,j-1)
      enddo
      enddo
      enddo
end subroutine rf1a3j


subroutine rf2a3j(a,lnq1,lnq2,  & 6
     ids,ide, jds,jde, kds,kde, &
     ims,ime, jms,jme, kms,kme, &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(INOUT)    :: a                    

      real,         INTENT(IN   )    :: lnq1,lnq2

      integer :: i,j,k

      do j=jts,jte
      do k=kts,kte
      do i=its,ite
         a(i,k,j)=a(i,k,j)-lnq1*a(i,k,j-1)-lnq2*a(i,k,j-2)
      enddo
      enddo
      enddo
end subroutine rf2a3j


subroutine rf1b3j(a,lnq1,       & 8
     ids,ide, jds,jde, kds,kde, &
     ims,ime, jms,jme, kms,kme, &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(INOUT)    :: a                    

      real,         INTENT(IN   )    :: lnq1

      integer :: i,j,k

      do j=jte,jts,-1
      do k=kts,kte
      do i=its,ite
         a(i,k,j)=a(i,k,j)-lnq1*a(i,k,j+1)
      enddo
      enddo
      enddo
end subroutine rf1b3j


subroutine rf2b3j(a,lnq1,lnq2,  & 6
     ids,ide, jds,jde, kds,kde, &
     ims,ime, jms,jme, kms,kme, &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(INOUT)    :: a                    

      real,         INTENT(IN   )    :: lnq1,lnq2

      integer :: i,j,k

      do j=jte,jts,-1
      do k=kts,kte
      do i=its,ite
         a(i,k,j)=a(i,k,j)-lnq1*a(i,k,j+1)-lnq2*a(i,k,j+2)
      enddo
      enddo
      enddo
end subroutine rf2b3j


subroutine ra1a3j(a,p,lnq1,fnq, & 8
     ids,ide, jds,jde, kds,kde, &
     ims,ime, jms,jme, kms,kme, &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(IN   )    :: a

      real, dimension(ims:ime, kms:kme, 1),        &
                    INTENT(INOUT)    :: p

      real,         INTENT(IN   )    :: lnq1

      integer,      INTENT(IN   )    :: fnq

      integer :: i,j,k

      if(fnq > jte+1-jts)stop 'In rala3j; fnq exceeds tile width'

      do k=kts,kte
      do i=its,ite
         p(i,k,1)=0.
      enddo
      enddo

      do j=jte+1-fnq,jte,2
      do k=kts,kte
      do i=its,ite
         p(i,k,1)=a(i,k,j)-lnq1*p(i,k,1)
      enddo
      enddo
      enddo
end subroutine ra1a3j


subroutine ra2a3j(a,p,lnq1,lnq2,fnq,  & 6
     ids,ide, jds,jde, kds,kde,       &
     ims,ime, jms,jme, kms,kme,       &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(IN   )    :: a   

      real, dimension(ims:ime, kms:kme, 2),        &
                    INTENT(INOUT)    :: p

      real,         INTENT(IN   )    :: lnq1,lnq2

      integer,      INTENT(IN   )    :: fnq

      integer :: i,j,k

      if(fnq > jte+1-jts)stop 'In ra2a3j; fnq exceeds tile width'
      if(mod(fnq,2)/=0)  stop 'In ra2a3j; fnq is not even'

      do j=1,2
      do k=kts,kte
      do i=its,ite
         p(i,k,j)=0.
      enddo
      enddo
      enddo

      do j=jte+1-fnq,jte,2
      do k=kts,kte
      do i=its,ite
         p(i,k,2)=a(i,k,j  )-lnq1*p(i,k,1)-lnq2*p(i,k,2)
         p(i,k,1)=a(i,k,j+1)-lnq1*p(i,k,2)-lnq2*p(i,k,1)
      enddo
      enddo
      enddo
end subroutine ra2a3j


subroutine ra1b3j(a,p,lnq1,fnq, & 8
     ids,ide, jds,jde, kds,kde, &
     ims,ime, jms,jme, kms,kme, &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(IN   )    :: a                    

      real, dimension(ims:ime, kms:kme, 1), &
                    INTENT(INOUT)    :: p

      real,         INTENT(IN   )    :: lnq1

      integer,      INTENT(IN   )    :: fnq

      integer :: i,j,k

      if(fnq > jte+1-jts)stop 'In ralb3j; fnq exceeds tile width'

      do k=kts,kte
      do i=its,ite
         p(k,j,1)=0.
      enddo
      enddo

      do j=jts-1+fnq,jts,-1
      do k=kts,kte
      do i=its,ite
         p(i,k,1)=a(i,k,j)-lnq1*p(i,k,1)
      enddo
      enddo
      enddo
end subroutine ra1b3j


subroutine ra2b3j(a,p,lnq1,lnq2,fnq, & 6
     ids,ide, jds,jde, kds,kde,      &
     ims,ime, jms,jme, kms,kme,      &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(IN   )    :: a                    

      real, dimension(ims:ime, kms:kme, 2), &
                    INTENT(INOUT)    :: p

      real,         INTENT(IN   )    :: lnq1,lnq2

      integer,      INTENT(IN   )    :: fnq

      integer :: i,j,k

      if(fnq > jte+1-jts)stop 'In ra2b3j; fnq exceeds tile width'
      if(mod(fnq,2)/=0)  stop 'In ra2b3j; fnq is not even'

      do j=1,2
      do k=kts,kte
      do i=its,ite
         p(i,k,j)=0.
      enddo
      enddo
      enddo

      do j=jts-1+fnq,jts,-2
      do k=kts,kte
      do i=its,ite
         p(i,k,2)=a(i,k,j  )-lnq1*p(i,k,1)-lnq2*p(i,k,2)
         p(i,k,1)=a(i,k,j-1)-lnq1*p(i,k,2)-lnq2*p(i,k,1)
      enddo
      enddo
      enddo
end subroutine ra2b3j 


subroutine mf11a3j(a,lnq1,knq1, &
     ids,ide, jds,jde, kds,kde, &
     ims,ime, jms,jme, kms,kme, &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(INOUT)    :: a                    

      real,         INTENT(IN   )    :: lnq1,knq1

      integer :: i,j,k

      do j=jts,jte
      do k=kts,kte
      do i=its,ite
         a(i,k,j)=a(i,k,j)-lnq1*a(i,k,j-1)+knq1*a(i,k,j+1)
      enddo
      enddo
      enddo
end subroutine mf11a3j


subroutine mf12a3j(a,lnq1,knq1,knq2, &
     ids,ide, jds,jde, kds,kde,      &
     ims,ime, jms,jme, kms,kme,      &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(INOUT)    :: a                    

      real,         INTENT(IN   )    :: lnq1,knq1,knq2

      integer :: i,j,k

      do j=jts,jte
      do k=kts,kte
      do i=its,ite
         a(i,k,j)=a(i,k,j)-lnq1*a(i,k,j-1) &
                          +knq1*a(i,k,j+1)+knq2*a(i,k,j+2)
      enddo
      enddo
      enddo
end subroutine mf12a3j


subroutine mf21a3j(a,lnq1,lnq2,knq1, &
     ids,ide, jds,jde, kds,kde,      &
     ims,ime, jms,jme, kms,kme,      &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(INOUT)    :: a                    

      real,         INTENT(IN   )    :: lnq1,lnq2,knq1

      integer :: i,j,k

      do j=jts,jte
      do k=kts,kte
      do i=its,ite
         a(i,k,j)=a(i,k,j)-lnq1*a(i,k,j-1)-lnq2*a(i,k,j-2)+knq1*a(i,k,j+1)
      enddo
      enddo
      enddo
end subroutine mf21a3j


subroutine mf22a3j(a,lnq1,lnq2,knq1,knq2, &
     ids,ide, jds,jde, kds,kde,           &
     ims,ime, jms,jme, kms,kme,           &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(INOUT)    :: a                    

      real,         INTENT(IN   )    :: lnq1,lnq2,knq1,knq2

      integer :: i,j,k

      do j=jts,jte
      do k=kts,kte
      do i=its,ite
         a(i,k,j)=a(i,k,j)-lnq1*a(i,k,j-1)-lnq2*a(i,k,j-2) &
                          +knq1*a(i,k,j+1)+knq2*a(i,k,j+2)
      enddo
      enddo
      enddo
end subroutine mf22a3j


subroutine ma11a3j(a,p,lnq1,knq1,fnq, &
     ids,ide, jds,jde, kds,kde,       &
     ims,ime, jms,jme, kms,kme,       &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(IN   )    :: a 

      real, dimension(ims:ime, kms:kme, 1),        &
                    INTENT(INOUT)    :: p

      real,         INTENT(IN   )    :: lnq1,knq1

      integer,      INTENT(IN   )    :: fnq 

      integer :: i,j,k

      if(fnq > jte+1-jts)stop 'In mal1a3j; fnq exceeds tile width'

      do k=kts,kte
      do i=its,ite
         p(i,k,1)=0.
      enddo
      enddo

      do j=jte+1-fnq,jte
      do k=kts,kte
      do i=its,ite
         p(i,k,1)=a(i,k,j)-lnq1*p(i,k,1)+knq1*a(i,k,j+1)
      enddo
      enddo
      enddo
end subroutine ma11a3j


subroutine ma12a3j(a,p,lnq1,knq1,knq2,fnq, &
     ids,ide, jds,jde, kds,kde,            &
     ims,ime, jms,jme, kms,kme,            &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(IN   )    :: a                    

      real, dimension(ims:ime, kms:kme, 1),        &
                    INTENT(INOUT)    :: p

      real,         INTENT(IN   )    :: lnq1,knq1,knq2

      integer,      INTENT(IN   )    :: fnq

      integer :: i,j,k

      if(fnq > jte+1-jts)stop 'In ma12a3j; fnq exceeds tile width'

      do k=kts,kte
      do i=its,ite
         p(i,k,1)=0.
      enddo
      enddo
      do j=jte+1-fnq,jte
      do k=kts,kte
      do i=its,ite
         p(i,k,1)=a(i,k,j)-lnq1*p(i,k,1) &
                          +knq1*a(i,k,j+1)+knq2*a(i,k,j+2)
      enddo
      enddo
      enddo
end subroutine ma12a3j


subroutine ma21a3j(a,p,lnq1,lnq2,knq1,fnq, &
     ids,ide, jds,jde, kds,kde,            &
     ims,ime, jms,jme, kms,kme,            &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(IN   )    :: a                    

      real, dimension(ims:ime, kms:kme, 2),        &
                    INTENT(INOUT)    :: p

      real,         INTENT(IN   )    :: lnq1,lnq2,knq1

      integer,      INTENT(IN   )    :: fnq

      integer :: i,j,k

      if(fnq > jte+1-jts)stop 'In ma21a3j; fnq exceeds tile width'
      if(mod(fnq,2)/=0)  stop 'In ma21a3j; fnq is not even'

      do j=1,2
      do k=kts,kte
      do i=its,ite
         p(i,k,j)=0.
      enddo
      enddo
      enddo

      do j=jte+1-fnq,jte,2
      do k=kts,kte
      do i=its,ite
         p(i,k,2)=a(i,k,j  )-lnq1*p(i,k,1)-lnq2*p(i,k,2) &
                            +knq1*a(i,k,j+1)
         p(i,k,1)=a(i,k,j+1)-lnq1*p(i,k,2)-lnq2*p(i,k,1) &
                            +knq1*a(i,k,j+2)
      enddo
      enddo
      enddo
end subroutine ma21a3j


subroutine ma22a3j(a,p,lnq1,lnq2,knq1,knq2,fnq, &
     ids,ide, jds,jde, kds,kde,                 &
     ims,ime, jms,jme, kms,kme,                 &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(IN   )    :: a                    

      real, dimension(ims:ime, kms:kme, 2), &
                    INTENT(INOUT)    :: p

      real,         INTENT(IN   )    :: lnq1,lnq2,knq1,knq2

      integer,      INTENT(IN   )    :: fnq

      integer :: i,j,k

      if(fnq > jte+1-jts)stop 'In ma22a3j; fnq exceeds tile width'
      if(mod(fnq,2)/=0)  stop 'In ma22a3j; fnq is not even'

      do j=1,2
      do k=kts,kte
      do i=its,ite
         p(i,k,j)=0.
      enddo
      enddo
      enddo

      do j=jte+1-fnq,jte,2
      do k=kts,kte
      do i=its,ite
         p(i,k,2)=a(i,k,j  )-lnq1*p(i,k,1  )-lnq2*p(i,k,2  ) &
                            +knq1*a(i,k,j+1)+knq2*a(i,k,j+2)
         p(i,k,1)=a(i,k,j+1)-lnq1*p(i,k,2  )-lnq2*p(i,k,1  ) &
                            +knq1*a(i,k,j+2)+knq2*a(i,k,j+3)
      enddo
      enddo
      enddo
end subroutine ma22a3j


subroutine mf11b3j(a,lnq1,knq1, &
     ids,ide, jds,jde, kds,kde, &
     ims,ime, jms,jme, kms,kme, &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(INOUT)    :: a                    

      real,         INTENT(IN   )    :: lnq1,knq1

      integer :: i,j,k

      do j=jte,jts,-1
      do k=kts,kte
      do i=its,ite
         a(i,k,j)=a(i,k,j)-lnq1*a(i,k,j+1)+knq1*a(i,k,j-1)
      enddo
      enddo
      enddo
end subroutine mf11b3j


subroutine mf12b3j(a,lnq1,knq1,knq2, &
     ids,ide, jds,jde, kds,kde,      &
     ims,ime, jms,jme, kms,kme,      &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(INOUT)    :: a                    

      real,         INTENT(IN   )    :: lnq1,knq1,knq2

      integer :: i,j,k

      do j=jte,jts,-1
      do k=kts,kte
      do i=its,ite
         a(i,k,j)=a(i,k,j)-lnq1*a(i,k,j+1) &
                          +knq1*a(i,k,j-1)+knq2*a(i,k,j-2)
      enddo
      enddo
      enddo
end subroutine mf12b3j


subroutine mf21b3j(a,lnq1,lnq2,knq1, &
     ids,ide, jds,jde, kds,kde,      &
     ims,ime, jms,jme, kms,kme,      &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(INOUT)    :: a                    

      real,         INTENT(IN   )    :: lnq1,lnq2,knq1

      integer :: i,j,k

      do j=jte,jts,-1
      do k=kts,kte
      do i=its,ite
         a(i,k,j)=a(i,k,j)-lnq1*a(i,k,j+1)-lnq2*a(i,k,j+2)+knq1*a(i,k,j-1)
      enddo
      enddo
      enddo
end subroutine mf21b3j


subroutine mf22b3j(a,lnq1,lnq2,knq1,knq2, &
     ids,ide, jds,jde, kds,kde,           &
     ims,ime, jms,jme, kms,kme,           &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(INOUT)    :: a                    

      real,         INTENT(IN   )    :: lnq1,lnq2,knq1,knq2

      integer :: i,j,k

      do j=jte,jts,-1
      do k=kts,kte
      do i=its,ite
         a(i,k,j)=a(i,k,j)-lnq1*a(i,k,j+1)-lnq2*a(i,k,j+2) &
                          +knq1*a(i,k,j-1)+knq2*a(i,k,j-2)
      enddo
      enddo
      enddo
end subroutine mf22b3j


subroutine ma11b3j(a,p,lnq1,knq1,fnq, &
     ids,ide, jds,jde, kds,kde,       &
     ims,ime, jms,jme, kms,kme,       &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(IN   )    :: a 

      real, dimension(ims:ime, kms:kme, 1),&
                    INTENT(INOUT)    :: p

      real,         INTENT(IN   )    :: lnq1,knq1

      integer,      INTENT(IN   )    :: fnq 

      integer :: i,j,k

      if(fnq > jte+1-jts)stop 'In mal1b3j; fnq exceeds tile width'

      do k=kts,kte
      do i=its,ite
         p(i,k,1)=0.
      enddo
      enddo
      do j=jts-1+fnq,jts,-1
      do k=kts,kte
      do i=its,ite
         p(i,k,1)=a(i,k,j)-lnq1*p(i,k,1)+knq1*a(i,k,j-1)
      enddo
      enddo
      enddo
end subroutine ma11b3j


subroutine ma12b3j(a,p,lnq1,knq1,knq2,fnq, &
     ids,ide, jds,jde, kds,kde,            &
     ims,ime, jms,jme, kms,kme,            &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(IN   )    :: a                    

      real, dimension(ims:ime, kms:kme, 1), &
                    INTENT(INOUT)    :: p

      real,         INTENT(IN   )    :: lnq1,knq1,knq2

      integer,      INTENT(IN   )    :: fnq

      integer :: i,j,k

      if(fnq > jte+1-jts)stop 'In mal2b3j; fnq exceeds tile width'

      do k=kts,kte
      do i=its,ite
         p(i,k,1)=0.
      enddo
      enddo
      do j=jts-1+fnq,jts,-1
      do k=kts,kte
      do i=its,ite
         p(i,k,1)=a(i,k,j)-lnq1*p(i,k,1  ) &
                          +knq1*a(i,k,j-1)+knq2*a(i,k,j-2)
      enddo
      enddo
      enddo
end subroutine ma12b3j


subroutine ma21b3j(a,p,lnq1,lnq2,knq1,fnq, &
     ids,ide, jds,jde, kds,kde,            &
     ims,ime, jms,jme, kms,kme,            &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(IN   )    :: a                    

      real, dimension(ims:ime , kms:kme, 2), &
                    INTENT(INOUT)    :: p

      real,         INTENT(IN   )    :: lnq1,lnq2,knq1

      integer,      INTENT(IN   )    :: fnq

      integer :: i,j,k

      if(fnq > jte+1-jts)stop 'In ma21b3j; fnq exceeds tile width'
      if(mod(fnq,2)/=0)  stop 'In ma21b3j; fnq is not even'

      do j=1,2
      do k=kts,kte
      do i=its,ite
         p(i,k,j)=0.
      enddo
      enddo
      enddo

      do j=jts-1+fnq,jts,-2
      do k=kts,kte
      do i=its,ite
         p(i,k,2)=a(i,k,j  )-lnq1*p(i,k,1  )-lnq2*p(i,k,2) &
                            +knq1*a(i,k,j-1)
         p(i,k,1)=a(i,k,j-1)-lnq1*p(i,k,2  )-lnq2*p(i,k,1) &
                            +knq1*a(i,k,j-2)
      enddo
      enddo
      enddo
end subroutine ma21b3j


subroutine ma22b3j(a,p,lnq1,lnq2,knq1,knq2,fnq, &
     ids,ide, jds,jde, kds,kde,                 &
     ims,ime, jms,jme, kms,kme,                 &
     its,ite, jts,jte, kts,kte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde, kds,kde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme, kms,kme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte, kts,kte

      real, dimension(ims:ime , kms:kme, jms:jme), &
                    INTENT(IN   )    :: a                    

      real, dimension(ims:ime, kms:kme, 2),        &
                    INTENT(INOUT)    :: p

      real,         INTENT(IN   )    :: lnq1,lnq2,knq1,knq2

      integer,      INTENT(IN   )    :: fnq

      integer :: i,j,k

      if(fnq > jte+1-jts)stop 'In ma22b3j; fnq exceeds tile width'
      if(mod(fnq,2)/=0)  stop 'In ma22b3j; fnq is not even'

      do j=1,2
      do k=kts,kte
      do i=its,ite
         p(i,k,j)=0.
      enddo
      enddo
      enddo

      do j=jts-1+fnq,jts,-2
      do k=kts,kte
      do i=its,ite
         p(i,k,2)=a(i,k,j  )-lnq1*p(i,k,1  )-lnq2*p(i,k,2  ) &
                            +knq1*a(i,k,j-1)+knq2*a(i,k,j-2)
         p(i,k,1)=a(i,k,j-1)-lnq1*p(i,k,2  )-lnq2*p(i,k,1  ) &
                            +knq1*a(i,k,j-2)+knq2*a(i,k,j-3)
      enddo
      enddo
      enddo
end subroutine ma22b3j