MODULE m_Arrays

USE m_Parameters

IMPLICIT NONE

PRIVATE
  
PUBLIC :: Get_Arrays, Free_Arrays

INTEGER (KIND=ki8), DIMENSION (:,:,:), ALLOCATABLE, PUBLIC :: lsave

REAL (KIND=kr8), DIMENSION (:), ALLOCATABLE, PUBLIC :: &
                 dn, cn, cn2, yp, y, w, uhy, vhy, phy

REAL (KIND=kr4), DIMENSION (:), ALLOCATABLE, PUBLIC :: buz, buzcl2, buzcl3
REAL (KIND=kr4), DIMENSION (:,:), ALLOCATABLE, PUBLIC :: buzcl1, buzcl4
REAL (KIND=kr4), DIMENSION (:,:), ALLOCATABLE, PUBLIC :: buf, bufcl2, bufcl3
REAL (KIND=kr4), DIMENSION (:,:,:), ALLOCATABLE, PUBLIC :: bufcl1, bufcl4
REAL (KIND=kr4), DIMENSION (:,:,:), ALLOCATABLE, PUBLIC :: bufc, bufw

REAL (KIND=kr8), DIMENSION (:,:), ALLOCATABLE, PUBLIC :: &
                 un, vn, pn, guns, gvns, gpns, guna, gvna, gpna, &
                 wunn, wvnn, wpnn, wuns, wvns, wpns, etq, etx, etni

REAL (KIND=kr8), DIMENSION (:,:,:), ALLOCATABLE, PUBLIC :: &
                 omega, ur, vr, pr, etn

REAL (KIND=kr8), DIMENSION (:,:,:,:), ALLOCATABLE, PUBLIC :: &
                 uh, vh, ph

CHARACTER (LEN=2), DIMENSION (:), ALLOCATABLE, PUBLIC :: cs

CHARACTER (LEN=6), DIMENSION (:), ALLOCATABLE, PUBLIC :: case


CONTAINS


SUBROUTINE Get_Arrays

  IMPLICIT NONE

  ALLOCATE (lsave(Lmax,2,NCmax))
  ALLOCATE (dn(Kmax), cn(Kmax), cn2(Kmax))
  ALLOCATE (yp(Jmax), y(Jmax), w(Jmax))
  ALLOCATE (omega(Mmax,Lmax,2))
  ALLOCATE (uhy(Jmaxh), vhy(Jmaxh), phy(Jmaxh))
  ALLOCATE (uh(Mmax,Lmax,2,Jmaxh), vh(Mmax,Lmax,2,Jmaxh), ph(Mmax,Lmax,2,Jmaxh))
  ALLOCATE (un(Imax,Jmax), vn(Imax,Jmax), pn(Imax,Jmax))
  ALLOCATE (ur(Imax,Jmax,NCmax), vr(Imax,Jmax,NCmax), pr(Imax,Jmax,NCmax))
  ALLOCATE (etn(Imax,Jmax,NCmax))
  ALLOCATE (etq(Imax,Jmax), etx(Imax,Jmax), etni(Imax,Jmax))
  ALLOCATE (guns(Imax2,Jmaxh), gvns(Imax2,Jmaxh), gpns(Imax2,Jmaxh))
  ALLOCATE (guna(Imax2,Jmaxh), gvna(Imax2,Jmaxh), gpna(Imax2,Jmaxh))
  ALLOCATE (wunn(Imax2,Jmaxh), wvnn(Imax2,Jmaxh), wpnn(Imax2,Jmaxh))
  ALLOCATE (wuns(Imax2,Jmaxh), wvns(Imax2,Jmaxh), wpns(Imax2,Jmaxh))
  ALLOCATE (buz(Jmax))
  ALLOCATE (buzcl1(Jmax,NCmax), buzcl2(Jmax), buzcl3(Jmax), buzcl4(Jmax,NWmax))
  ALLOCATE (buf(Imax,Jmax))
  ALLOCATE (bufcl1(Imax,Jmax,NCmax), bufcl2(Imax,Jmax), bufcl3(Imax,Jmax))
  ALLOCATE (bufcl4(Imax,Jmax,NWmax))
  ALLOCATE (bufc(Mmax,Lmax,2), bufw(Mmax,Lmax,2))
  ALLOCATE (cs(NCmax), case(NCmax))

  CALL Init_Arrays

END SUBROUTINE Get_Arrays


SUBROUTINE Free_Arrays

  IMPLICIT NONE

  DEALLOCATE (lsave)
  DEALLOCATE (dn, cn, cn2)
  DEALLOCATE (yp, y, w)
  DEALLOCATE (omega)
  DEALLOCATE (uh, vh, ph)
  DEALLOCATE (uhy, vhy, phy)
  DEALLOCATE (un, vn, pn)
  DEALLOCATE (ur, vr, pr)
  DEALLOCATE (etn)
  DEALLOCATE (etq, etx, etni)
  DEALLOCATE (guns, gvns, gpns)
  DEALLOCATE (guna, gvna, gpna)
  DEALLOCATE (wunn, wvnn, wpnn)
  DEALLOCATE (wuns, wvns, wpns)
  DEALLOCATE (buz, buzcl1, buzcl2, buzcl3, buzcl4)
  DEALLOCATE (buf, bufcl1, bufcl2, bufcl3, bufcl4)
  DEALLOCATE (bufc, bufw)
  DEALLOCATE (cs, case)

END SUBROUTINE Free_Arrays


SUBROUTINE Init_Arrays

  IMPLICIT NONE

  dn=0.0; cn=0.0; cn2=0.0
  yp=0.0; y=0.0; w=0.0
  omega=0.0
  uh=0.0; vh=0.0; ph=0.0
  uhy=0.0; vhy=0.0; phy=0.0
  un=0.0; vn=0.0; pn=0.0
  ur=0.0; vr=0.0; pr=0.0
  etn=0.0
  etq=0.0; etx=0.0; etni=0.0
  guns=0.0; gvns=0.0; gpns=0.0
  guna=0.0; gvna=0.0; gpna=0.0
  wunn=0.0; wvnn=0.0; wpnn=0.0
  wuns=0.0; wvns=0.0; wpns=0.0
  buz=0.0; buzcl1=0.0; buzcl2=0.0; buzcl3=0.0; buzcl4=0.0
  buf=0.0; bufcl1=0.0; bufcl2=0.0; bufcl3=0.0; bufcl4=0.0
  bufc=0.0; bufw=0.0

  cs=(/'rb', 'kv', 'mx', 'gw', 'ge', 'wv'/)

  case=(/'Rossby', 'Kelvin', 'Mista.', 'Grav.W', 'Grav.E', 'AllWav'/)

  lsave=1

  ! Rossby
  lsave(1:Lmax2,:,1)=0
  lsave(Lmax1+1,1,1)=0
  lsave(Lmax2+1,2,1)=0

  ! Kelvin
  lsave(:,:,2)=0
  lsave(Lmax1+1,1,2)=1

  ! Mista.
  lsave(:,:,3)=0
  lsave(Lmax2+1,2,3)=1

  ! Grav.W
  lsave(Lmax1+1:Lmax,:,4)=0

  ! Grav.E
  lsave(1:Lmax1,:,5)=0
  lsave(Lmax2+1:Lmax,:,5)=0
  lsave(Lmax1+1,1,5)=0

  ! AllWav
  lsave(:,:,6)=1


END SUBROUTINE Init_Arrays


END MODULE m_Arrays
