! Horizontal basic numerical operations for 2-dimensional arrays.
! These are the basic building blocks for horizontal compact and
! conventional differencing, quadrature, midpoint interpolation
! and filtering.

!############# 2-dimensions, index-i active:

subroutine ud1c2i(c,d,bnd1, & 1
     ids,ide, jds,jde,      &
     ims,ime, jms,jme,      &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

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

      integer :: i,j

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

end subroutine ud1c2i


subroutine ud2c2i(c,d,bnd1,bnd2, & 1
     ids,ide, jds,jde,           &
     ims,ime, jms,jme,           &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

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

      integer :: i,j

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

end subroutine ud2c2i


subroutine sa1a2i(a,bnm1, & 4
     ids,ide, jds,jde,    &
     ims,ime, jms,jme,    &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

      real,         INTENT(IN   )    :: bnm1

      integer :: i,j

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

end subroutine sa1a2i


subroutine sq1a2i(a,bnq, & 4
     ids,ide, jds,jde,   &
     ims,ime, jms,jme,   &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

      real,         INTENT(IN   )    :: bnq

      integer :: i,j

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

end subroutine sq1a2i


subroutine sd1b2i(a,bnqi, & 4
     ids,ide, jds,jde,    &
     ims,ime, jms,jme,    &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

      real,         INTENT(IN   )    :: bnqi

      integer :: i,j

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

end subroutine sd1b2i


subroutine ef1a2i(a,knq1, & 6
     ids,ide, jds,jde,    &
     ims,ime, jms,jme,    &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

      real,         INTENT(IN   )    :: knq1

      integer :: i,j

      do j=jts,jte
      do i=its,ite
         a(i,j)=a(i,j)+knq1*a(i+1,j)
      enddo
      enddo
end subroutine ef1a2i


subroutine ef2a2i(a,knq1,knq2, & 4
     ids,ide, jds,jde,         &
     ims,ime, jms,jme,         &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

      real,         INTENT(IN   )    :: knq1,knq2

      integer :: i,j

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


subroutine ef1b2i(a,knq1, & 6
     ids,ide, jds,jde,    &
     ims,ime, jms,jme,    &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

      real,         INTENT(IN   )    :: knq1

      integer :: i,j

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


subroutine ef2b2i(a,knq1,knq2, & 4
     ids,ide, jds,jde,         &
     ims,ime, jms,jme,         &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

      real,         INTENT(IN   )    :: knq1,knq2

      integer :: i,j

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


subroutine rf1a2i(a,lnq1, & 8
     ids,ide, jds,jde,    &
     ims,ime, jms,jme,    &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

      real,         INTENT(IN   )    :: lnq1

      integer :: i,j

      do j=jts,jte
      do i=its,ite
         a(i,j)=a(i,j)-lnq1*a(i-1,j)
      enddo
      enddo
end subroutine rf1a2i


subroutine rf2a2i(a,lnq1,lnq2,  & 6
     ids,ide, jds,jde,          &
     ims,ime, jms,jme,          &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

      real,         INTENT(IN   )    :: lnq1,lnq2

      integer :: i,j

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


subroutine rf1b2i(a,lnq1, & 8
     ids,ide, jds,jde,    &
     ims,ime, jms,jme,    &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

      real,         INTENT(IN   )    :: lnq1

      integer :: i,j

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


subroutine rf2b2i(a,lnq1,lnq2, & 6
     ids,ide, jds,jde,         &
     ims,ime, jms,jme,         &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

      real,         INTENT(IN   )    :: lnq1,lnq2

      integer :: i,j

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


subroutine ra1a2i(a,p,lnq1,fnq, & 8
     ids,ide, jds,jde,          &
     ims,ime, jms,jme,          &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

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

      real,         INTENT(IN   )    :: lnq1

      integer,      INTENT(IN   )    :: fnq

      integer :: i,j

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

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


subroutine ra2a2i(a,p,lnq1,lnq2,fnq, & 6
     ids,ide, jds,jde,               &
     ims,ime, jms,jme,               &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

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

      real,         INTENT(IN   )    :: lnq1,lnq2

      integer,      INTENT(IN   )    :: fnq

      integer :: i,j

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

      do j=jts,jte
      do i=1,2
            p(i,j)=0.
      enddo
      enddo

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


subroutine ra1b2i(a,p,lnq1,fnq, & 8
     ids,ide, jds,jde,          &
     ims,ime, jms,jme,          &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

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

      real,         INTENT(IN   )    :: lnq1

      integer,      INTENT(IN   )    :: fnq

      integer :: i,j

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

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

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


subroutine ra2b2i(a,p,lnq1,lnq2,fnq, & 6
     ids,ide, jds,jde,               &
     ims,ime, jms,jme,               &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

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

      real,         INTENT(IN   )    :: lnq1,lnq2

      integer,      INTENT(IN   )    :: fnq

      integer :: i,j

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

      do j=jts,jte
      do i=1,2
         p(i,j)=0.
      enddo
      enddo

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


subroutine mf11a2i(a,lnq1,knq1, &
     ids,ide, jds,jde,          &
     ims,ime, jms,jme,          &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

      real,         INTENT(IN   )    :: lnq1,knq1

      integer :: i,j

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


subroutine mf12a2i(a,lnq1,knq1,knq2, &
     ids,ide, jds,jde,               &
     ims,ime, jms,jme,               &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

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

      integer :: i,j

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


subroutine mf21a2i(a,lnq1,lnq2,knq1, &
     ids,ide, jds,jde,               &
     ims,ime, jms,jme,               &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

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

      integer :: i,j

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


subroutine mf22a2i(a,lnq1,lnq2,knq1,knq2, &
     ids,ide, jds,jde,                    &
     ims,ime, jms,jme,                    &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

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

      integer :: i,j

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


subroutine ma11a2i(a,p,lnq1,knq1,fnq, &
     ids,ide, jds,jde,                &
     ims,ime, jms,jme,                &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

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

      real,         INTENT(IN   )    :: lnq1,knq1

      integer,      INTENT(IN   )    :: fnq 

      integer :: i,j

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

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


subroutine ma12a2i(a,p,lnq1,knq1,knq2,fnq, &
     ids,ide, jds,jde,                     &
     ims,ime, jms,jme,                     &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

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

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

      integer,      INTENT(IN   )    :: fnq

      integer :: i,j

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

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


subroutine ma21a2i(a,p,lnq1,lnq2,knq1,fnq, &
     ids,ide, jds,jde,                     &
     ims,ime, jms,jme,                     &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

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

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

      integer,      INTENT(IN   )    :: fnq

      integer :: i,j

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

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

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


subroutine ma22a2i(a,p,lnq1,lnq2,knq1,knq2,fnq, &
     ids,ide, jds,jde,                          &
     ims,ime, jms,jme,                          &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

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

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

      integer,      INTENT(IN   )    :: fnq

      integer :: i,j

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

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

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


subroutine mf11b2i(a,lnq1,knq1, &
     ids,ide, jds,jde,          &
     ims,ime, jms,jme,          &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

      real,         INTENT(IN   )    :: lnq1,knq1

      integer :: i,j

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


subroutine mf12b2i(a,lnq1,knq1,knq2, &
     ids,ide, jds,jde,               &
     ims,ime, jms,jme,               &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

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

      integer :: i,j

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


subroutine mf21b2i(a,lnq1,lnq2,knq1, &
     ids,ide, jds,jde,               &
     ims,ime, jms,jme,               &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

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

      integer :: i,j

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


subroutine mf22b2i(a,lnq1,lnq2,knq1,knq2, &
     ids,ide, jds,jde,                    &
     ims,ime, jms,jme,                    &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

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

      integer :: i,j

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


subroutine ma11b2i(a,p,lnq1,knq1,fnq, &
     ids,ide, jds,jde,                &
     ims,ime, jms,jme,                &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

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

      real,         INTENT(IN   )    :: lnq1,knq1

      integer,      INTENT(IN   )    :: fnq 

      integer :: i,j

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

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


subroutine ma12b2i(a,p,lnq1,knq1,knq2,fnq, &
     ids,ide, jds,jde,                     &
     ims,ime, jms,jme,                     &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde 
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

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

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

      integer,      INTENT(IN   )    :: fnq

      integer :: i,j

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

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


subroutine ma21b2i(a,p,lnq1,lnq2,knq1,fnq, &
     ids,ide, jds,jde,                     &
     ims,ime, jms,jme,                     &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

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

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

      integer,      INTENT(IN   )    :: fnq

      integer :: i,j

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

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

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


subroutine ma22b2i(a,p,lnq1,lnq2,knq1,knq2,fnq, &
     ids,ide, jds,jde,                          &
     ims,ime, jms,jme,                          &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

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

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

      integer,      INTENT(IN   )    :: fnq

      integer :: i,j

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

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

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

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

subroutine ud1c2j(c,d,bnd1, & 1
     ids,ide, jds,jde,      &
     ims,ime, jms,jme,      &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

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

      integer :: i,j

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

end subroutine ud1c2j


subroutine ud2c2j(c,d,bnd1,bnd2, & 1
     ids,ide, jds,jde,           &
     ims,ime, jms,jme,           &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

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

      integer :: i,j

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

end subroutine ud2c2j


subroutine sa1a2j(a,bnm1, & 4
     ids,ide, jds,jde,    &
     ims,ime, jms,jme,    &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

      real,         INTENT(IN   )    :: bnm1

      integer :: i,j

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

end subroutine sa1a2j


subroutine sq1a2j(a,bnq, & 4
     ids,ide, jds,jde,   &
     ims,ime, jms,jme,   &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

      real,         INTENT(IN   )    :: bnq

      integer :: i,j

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

end subroutine sq1a2j


subroutine sd1b2j(a,bnqi, & 4
     ids,ide, jds,jde,    &
     ims,ime, jms,jme,    &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

      real,         INTENT(IN   )    :: bnqi

      integer :: i,j

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

end subroutine sd1b2j


subroutine ef1a2j(a,knq1, & 6
     ids,ide, jds,jde,    &
     ims,ime, jms,jme,    &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

      real,         INTENT(IN   )    :: knq1

      integer :: i,j

      do j=jts,jte
      do i=its,ite
         a(i,j)=a(i,j)+knq1*a(i,j+1)
      enddo
      enddo
end subroutine ef1a2j


subroutine ef2a2j(a,knq1,knq2, & 4
     ids,ide, jds,jde,         &
     ims,ime, jms,jme,         &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

      real,         INTENT(IN   )    :: knq1,knq2

      integer :: i,j

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


subroutine ef1b2j(a,knq1, & 6
     ids,ide, jds,jde,    &
     ims,ime, jms,jme,    &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

      real,         INTENT(IN   )    :: knq1

      integer :: i,j

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


subroutine ef2b2j(a,knq1,knq2, & 4
     ids,ide, jds,jde,         &
     ims,ime, jms,jme,         &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

      real,         INTENT(IN   )    :: knq1,knq2

      integer :: i,j

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


subroutine rf1a2j(a,lnq1, & 8
     ids,ide, jds,jde,    &
     ims,ime, jms,jme,    &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

      real,         INTENT(IN   )    :: lnq1

      integer :: i,j

      do j=jts,jte
      do i=its,ite
         a(i,j)=a(i,j)-lnq1*a(i,j-1)
      enddo
      enddo
end subroutine rf1a2j


subroutine rf2a2j(a,lnq1,lnq2, & 6
     ids,ide, jds,jde,         &
     ims,ime, jms,jme,         &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

      real,         INTENT(IN   )    :: lnq1,lnq2

      integer :: i,j

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


subroutine rf1b2j(a,lnq1, & 8
     ids,ide, jds,jde,    &
     ims,ime, jms,jme,    &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

      real,         INTENT(IN   )    :: lnq1

      integer :: i,j

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


subroutine rf2b2j(a,lnq1,lnq2, & 6
     ids,ide, jds,jde,         &
     ims,ime, jms,jme,         &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

      real,         INTENT(IN   )    :: lnq1,lnq2

      integer :: i,j

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


subroutine ra1a2j(a,p,lnq1,fnq, & 8
     ids,ide, jds,jde,          &
     ims,ime, jms,jme,          &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

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

      real,         INTENT(IN   )    :: lnq1

      integer,      INTENT(IN   )    :: fnq

      integer :: i,j

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

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

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


subroutine ra2a2j(a,p,lnq1,lnq2,fnq, & 6
     ids,ide, jds,jde,               &
     ims,ime, jms,jme,               &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

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

      real,         INTENT(IN   )    :: lnq1,lnq2

      integer,      INTENT(IN   )    :: fnq

      integer :: i,j

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

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

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


subroutine ra1b2j(a,p,lnq1,fnq, & 8
     ids,ide, jds,jde,          &
     ims,ime, jms,jme,          &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

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

      real,         INTENT(IN   )    :: lnq1

      integer,      INTENT(IN   )    :: fnq

      integer :: i,j

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

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

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


subroutine ra2b2j(a,p,lnq1,lnq2,fnq, & 6
     ids,ide, jds,jde,               &
     ims,ime, jms,jme,               &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

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

      real,         INTENT(IN   )    :: lnq1,lnq2

      integer,      INTENT(IN   )    :: fnq

      integer :: i,j

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

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

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


subroutine mf11a2j(a,lnq1,knq1, &
     ids,ide, jds,jde,          &
     ims,ime, jms,jme,          &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

      real,         INTENT(IN   )    :: lnq1,knq1

      integer :: i,j

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


subroutine mf12a2j(a,lnq1,knq1,knq2, &
     ids,ide, jds,jde,               &
     ims,ime, jms,jme,               &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

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

      integer :: i,j

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


subroutine mf21a2j(a,lnq1,lnq2,knq1, &
     ids,ide, jds,jde,               &
     ims,ime, jms,jme,               &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

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

      integer :: i,j

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


subroutine mf22a2j(a,lnq1,lnq2,knq1,knq2, &
     ids,ide, jds,jde,                    &
     ims,ime, jms,jme,                    &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

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

      integer :: i,j

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


subroutine ma11a2j(a,p,lnq1,knq1,fnq, &
     ids,ide, jds,jde,                &
     ims,ime, jms,jme,                &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

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

      real,         INTENT(IN   )    :: lnq1,knq1

      integer,      INTENT(IN   )    :: fnq 

      integer :: i,j

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

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

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


subroutine ma12a2j(a,p,lnq1,knq1,knq2,fnq, &
     ids,ide, jds,jde,                     &
     ims,ime, jms,jme,                     &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

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

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

      integer,      INTENT(IN   )    :: fnq

      integer :: i,j

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

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


subroutine ma21a2j(a,p,lnq1,lnq2,knq1,fnq, &
     ids,ide, jds,jde,                     &
     ims,ime, jms,jme,                     &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

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

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

      integer,      INTENT(IN   )    :: fnq

      integer :: i,j

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

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

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


subroutine ma22a2j(a,p,lnq1,lnq2,knq1,knq2,fnq, &
     ids,ide, jds,jde,                          &
     ims,ime, jms,jme,                          &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

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

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

      integer,      INTENT(IN   )    :: fnq

      integer :: i,j

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

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

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


subroutine mf11b2j(a,lnq1,knq1, &
     ids,ide, jds,jde,          &
     ims,ime, jms,jme,          &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

      real,         INTENT(IN   )    :: lnq1,knq1

      integer :: i,j

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


subroutine mf12b2j(a,lnq1,knq1,knq2, &
     ids,ide, jds,jde,               &
     ims,ime, jms,jme,               &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

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

      integer :: i,j

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


subroutine mf21b2j(a,lnq1,lnq2,knq1, &
     ids,ide, jds,jde,               &
     ims,ime, jms,jme,               &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

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

      integer :: i,j

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


subroutine mf22b2j(a,lnq1,lnq2,knq1,knq2, &
     ids,ide, jds,jde,                    &
     ims,ime, jms,jme,                    &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

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

      integer :: i,j

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


subroutine ma11b2j(a,p,lnq1,knq1,fnq, &
     ids,ide, jds,jde,                &
     ims,ime, jms,jme,                &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

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

      real,         INTENT(IN   )    :: lnq1,knq1

      integer,      INTENT(IN   )    :: fnq 

      integer :: i,j

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

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


subroutine ma12b2j(a,p,lnq1,knq1,knq2,fnq, &
     ids,ide, jds,jde,                     &
     ims,ime, jms,jme,                     &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

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

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

      integer,      INTENT(IN   )    :: fnq

      integer :: i,j

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

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


subroutine ma21b2j(a,p,lnq1,lnq2,knq1,fnq, &
     ids,ide, jds,jde,                     &
     ims,ime, jms,jme,                     &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

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

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

      integer,      INTENT(IN   )    :: fnq

      integer :: i,j

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

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

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


subroutine ma22b2j(a,p,lnq1,lnq2,knq1,knq2,fnq, &
     ids,ide, jds,jde,                          &
     ims,ime, jms,jme,                          &
     its,ite, jts,jte)

implicit none

      INTEGER,      INTENT(IN   )    :: ids,ide, jds,jde
      INTEGER,      INTENT(IN   )    :: ims,ime, jms,jme
      INTEGER,      INTENT(IN   )    :: its,ite, jts,jte

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

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

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

      integer,      INTENT(IN   )    :: fnq

      integer :: i,j

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

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

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