SUBROUTINE SUALLO(KULOUT) 1
#if defined (DOC)
*
***s/r SUALLO  - Memory allocation for the model variables
*
*Author  : P. Gauthier *ARMA/AES  June 9, 1992
*Revision:
*     P. Gauthier *ARMA/AES May 25, 1993
*     .           -Allocation for specific humidity and surface pressure
*     .            for spectral/gridpoint model states and forecast
*     .            error correlation
*     .           -Allocation of specific humidity is triggered by setting
*     .           -Allocation of surface pressure is triggered by setting
*     .            NVSP2D = 1.
*     .           -SUALLO has also been rearranged by grouping similar states
*     .            together (e.g., COMSP, COMSP1, COMSPG)
*     P. Gauthier *ARMA/AES September 28, 1993
*     .           -Allocation of RDEVSTD in COMSPG
*     C. Charette *ARMA/AES January 1996
*                 -Add 'compstat.cdk'.
*                 -Allocation for prediction error statistics.
*     S. Pellerin *ARMA/AES Sept 97.
*                 - Control of the different model state of the 3Dvar
*                   through COMSTATE, COMSTATEC and COMSTNUM common
*                   blocks variables (comstate.cdk).
*     P. Koclas   *CMC/AES Nov 97.
*                 -alocation of scalpm1 variable
*     S. Pellerin **ARMA/AES Jan 98.
*                 -Dynamic allocation of DAMPLIBG (COMPSTAT) previously
*                  hard coded to 240x120.
*     L. Fillion  *ARMA/AES (originally Oct 1996)
*                 -Add 'comode.cdk'.
*     C. Charette *ARMA/AES  FEV 1999
*                 -Add 'compdg.cdk'.
*     C. Charette *ARMA/AES SEP 1999
*                 - Operator PTOT as a function of latitude
*     J. Halle    *CMDA/AES Oct 99.
*                 - Added ground temperature (TG) to the model state.
*     Y. Yang  July 2003
*                 - Added do loops to accommodate multiple species
*     Y. Yang Feb. 2005
*                 - Removed 'OZ' parts since ozone now part of 'TR'
*     M. Buehner    *ARMA/MSC Oct 2004.
*                 - Changed DAMPLIBG to 3D.
*     M. Tanguay  *ARMN/MSC Jan. 2005
*                 - Introduction of minimizer N1CG1
*     M. Buehner    *ARMA/MSC Oct 2004. 
*                 - Changed DAMPLIBG to 3D.
*     M. Buehner    *ARMA May 2008
*                 - Added variables for new approach with PtoT and
*                   localized Tb correlations (NANALVAR=4)
*     Y.J. Rochon *ARQX Nov 2008     
*                 - Added allocation of *BAL_*C
*
*Arguments
*     i   KULOUT: unit used for optional printing
*
#endif
C
      IMPLICIT NONE
*implicits
#include "pardim.cdk"
#include "comct0.cdk"
#include "comdim.cdk"
#include "comleg.cdk"
#include "comchem.cdk"
#include "comgd0.cdk"
#include "comgd1.cdk"
#include "compdg.cdk"
#include "comsp.cdk"
#include "comsp1.cdk"
#include "comspg.cdk"
#include "comcorr.cdk"
#include "comgem.cdk"
#include "comcva.cdk"
#include "compstat.cdk"
#include "comstate.cdk"
#include "comode.cdk"
*
      INTEGER KULOUT, ILEN, IERR, ILMU, ILENUT0, ILENSPV
      INTEGER JJ
C
      INTEGER iloc, jvar
      EXTERNAL HPALLOC
C
      WRITE(KULOUT,FMT='(//,6('' ***********''))')
      WRITE(KULOUT,*)'     SUALLO:  Memory allocation of 3D',
     S     ' variational assimilation'
      WRITE(KULOUT,FMT='(6('' ***********''))')
C
C*    1.  Gaussian grid parameters
C     .   ------------------------
C
 100  CONTINUE
      ILEN = 10*(NJEND - NJBEG +1)
      CALL HPALLOC (PTGAUS,MAX(ILEN,1),IERR,8)
C
      PTMU   = LOC(GAUS(NJBEG, 1))
      PTWT   = LOC(GAUS(NJBEG, 2))
      PTWOCS = LOC(GAUS(NJBEG, 3))
      PT1MU2 = LOC(GAUS(NJBEG, 4))
      PTSQM2 = LOC(GAUS(NJBEG, 5))
      PTCOLA = LOC(GAUS(NJBEG, 6))
      PT1QM2 = LOC(GAUS(NJBEG, 7))
      PT1MUI = LOC(GAUS(NJBEG, 8))
      PT1MUA = LOC(GAUS(NJBEG, 9))
      PTLATI = LOC(GAUS(NJBEG,10))
C
      ILMU   = NJEND - NJBEG + 1
C
      WRITE(KULOUT,FMT='(/,''  Arrays in COMLEG'')')
      WRITE(KULOUT,FMT='(''   GAUS :'',I6
     S     ,'' All the others :'',I4)')  ILEN,ILMU
C
C     .     1.1  Locations of spectral elements in arrays
C     .          ----------------------------------------
C
      ILEN = NTRUNC+1
      CALL HPALLOC(PTIND  ,MAX(ILEN,1),IERR,1)
      CALL HPALLOC(PTINDRH,MAX(ILEN,1),IERR,1)
      CALL HPALLOC(PTCLM  ,MAX(ILEN,1),IERR,1)
C
      WRITE(KULOUT,FMT='(''   NIND, NINDRH, NCLM :'',I6)')ILEN
C
C     2. Grid point model state
C     .  ----------------------
C
 200  CONTINUE
C
C     .     2.1 Main states (COMGD0, COMG1) and forecast error standard
C     .         deviation in physical space (in COMSPG)
C     .         -------------------------------------------------------
C
 210  CONTINUE
C
      ILEN = (NIEND - NIBEG + 1)*NKGDIM*(NJEND -NJBEG +1)
      CALL HPALLOC(PTGD,MAX(ILEN,1),IERR,8)
      IF(NCONF.NE.307) THEN
         CALL HPALLOC(PTGD1,MAX(ILEN,1),IERR,8)
C
         ILEN =   NKGDIM*(NJEND -NJBEG +1)
         CALL HPALLOC(PTSIG,MAX(ILEN,1),IERR,8)
         ILEN =   NKGDIM*(NJEND -NJBEG +1)*(NIEND -NIBEG +1)
         CALL HPALLOC(PTSIG3D,MAX(ILEN,1),IERR,8)
cbue
         ILEN =   NFLEV*(NJEND -NJBEG +1)
         CALL HPALLOC(PTSIGTB,MAX(ILEN,1),IERR,8)
         ILEN =   (NJEND -NJBEG +1)
         CALL HPALLOC(PTSIGPSB,MAX(ILEN,1),IERR,8)
      END IF
cbue
      ILEN=(NJEND -NJBEG +1)*(NIEND -NIBEG +1)*NFLEV
      CALL HPALLOC(PTTB0,MAX(ILEN,1),IERR,8)
      CALL HPALLOC(PTTB1,MAX(ILEN,1),IERR,8)
      ILEN = NLA*2*NFLEV
      CALL HPALLOC(PTSPTB,MAX(ILEN,1),IERR,8)
      ILEN = NI*NJ*NFLEV
      CALL HPALLOC(PTTB_out,MAX(ILEN,1),IERR,8)
C
C     .     2.2 Splitting  of states (COMGD0, COMG1) and RSIG in COMSPG
C     .         -------------------------------------------------------
C
 220  CONTINUE
C
C     2.2.1 Pointer initialisations
C           -----------------------
C
      PTUT0 = -1
      PTUT1 = -1
      PTSIGUU = -1
      PTSIGUU3D = -1
C
      PTVT0 = -1
      PTVT1 = -1
      PTSIGVV = -1
      PTSIGVV3D = -1
C
      PTT0 = -1
      PTT1 = -1
      PTSIGTT = -1
      PTSIGTT3D = -1
C
      PTQ0 = -1
      PTQ1 = -1
      PTSIGQ = -1
      PTSIGQ3D = -1
C
      PTGZ0 = -1
      PTQ1 = -1
      PTSIGQ = -1
      PTSIGQ3D = -1
C
      PTTR0 = -1
      PTTR1 = -1
      PTSIGTR = -1
      PTSIGTR3D = -1
C
      PTGPS0 = -1
      PTGPS1 = -1
      PTSIGPS = -1
      PTSIGPS3D = -1
C
      PTGTG0 = -1
      PTGTG1 = -1
      PTSIGTG = -1
      PTSIGTG3D = -1
C
      iloc = 1
      do jvar = 1,jpnvarmax
        if(jvar .eq. nguu) then
          NGPOSIT(nguu)=iloc
          if(NGEXIST(nguu).eq.1) then
            PTUT0   = LOC(GD(NIBEG,iloc,NJBEG))
            PTUT1   = LOC(GD1(NIBEG,iloc,NJBEG))
            PTSIGUU = LOC(RGSIG(NJBEG,iloc))
            PTSIGUU3D = LOC(RGSIG3D(NIBEG,iloc,NJBEG))
            iloc = iloc + nflev
          end if
        elseif(jvar .eq. ngvv) then
          NGPOSIT(ngvv)=iloc
          if(NGEXIST(ngvv).eq.1) then
            PTVT0   = LOC(GD(NIBEG,iloc,NJBEG))
            PTVT1   = LOC(GD1(NIBEG,iloc,NJBEG))
            PTSIGVV = LOC(RGSIG(NJBEG,iloc))
            PTSIGVV3D = LOC(RGSIG3D(NIBEG,iloc,NJBEG))
            iloc = iloc + nflev
          end if
        elseif(jvar .eq. nggz) then
          NGPOSIT(nggz)=iloc
          if(NGEXIST(nggz).eq.1) then
            PTGZ0   = LOC(GD(NIBEG,iloc,NJBEG))
            PTGZ1   = LOC(GD1(NIBEG,iloc,NJBEG))
            PTSIGGZ = LOC(RGSIG(NJBEG,iloc))
            PTSIGGZ3D = LOC(RGSIG3D(NIBEG,iloc,NJBEG))
            iloc = iloc + nflev
          end if
        elseif(jvar .eq. ngq) then
          NGPOSIT(ngq)=iloc
          if(NGEXIST(ngq).eq.1) then
            PTQ0   = LOC(GD(NIBEG,iloc,NJBEG))
            PTQ1   = LOC(GD1(NIBEG,iloc,NJBEG))
            PTSIGQ = LOC(RGSIG(NJBEG,iloc))
            PTSIGQ3D = LOC(RGSIG3D(NIBEG,iloc,NJBEG))
            iloc = iloc + nflev
          end if
        elseif(jvar .eq. ngtt) then
          NGPOSIT(ngtt)=iloc
          if(NGEXIST(ngtt).eq.1) then
            PTT0   = LOC(GD(NIBEG,iloc,NJBEG))
            PTT1   = LOC(GD1(NIBEG,iloc,NJBEG))
            PTSIGTT = LOC(RGSIG(NJBEG,iloc))
            PTSIGTT3D = LOC(RGSIG3D(NIBEG,iloc,NJBEG))
            iloc = iloc + nflev
          end if
        elseif(jvar .eq. ngtr(1)) then
          NGPOSIT(ngtr(1))=iloc
          if(NGEXIST(ngtr(1)).eq.1) then
            PTTR0   = LOC(GD(NIBEG,iloc,NJBEG))
            PTTR1   = LOC(GD1(NIBEG,iloc,NJBEG))
            PTSIGTR = LOC(RGSIG(NJBEG,iloc))
            PTSIGTR3D = LOC(RGSIG3D(NIBEG,iloc,NJBEG))
            iloc = iloc + nflev
          end if
          DO JJ=2, NGCMT
             NGPOSIT(ngtr(JJ))=iloc
             if(NGEXIST(ngtr(JJ)).eq.1) then
               iloc = iloc + nflev
             end if
          ENDDO
        elseif(jvar .eq. ngps) then
          NGPOSIT(ngps)=iloc
          if(NGEXIST(ngps).eq.1) then
            PTGPS0   = LOC(GD(NIBEG,iloc,NJBEG))
            PTGPS1   = LOC(GD1(NIBEG,iloc,NJBEG))
            PTSIGPS = LOC(RGSIG(NJBEG,iloc))
            PTSIGPS3D = LOC(RGSIG3D(NIBEG,iloc,NJBEG))
            iloc = iloc + 1
          end if
        elseif(jvar .eq. ngtg) then
          NGPOSIT(ngtg)=iloc
          if(NGEXIST(ngtg).eq.1) then
            PTGTG0   = LOC(GD(NIBEG,iloc,NJBEG))
            PTGTG1   = LOC(GD1(NIBEG,iloc,NJBEG))
            PTSIGTG = LOC(RGSIG(NJBEG,iloc))
            PTSIGTG3D = LOC(RGSIG3D(NIBEG,iloc,NJBEG))
            iloc = iloc + 1
          end if
        endif
      enddo
C
      ILEN = (NIEND - NIBEG + 1)*NKGDIM*(NJEND -NJBEG +1)
      ILENUT0 = (NIEND - NIBEG + 1)*NFLEV*(NJEND - NJBEG +1)
C
      WRITE(KULOUT,FMT='(/,''  Arrays in COMGD0 are allocated'',
     S     '' the following space:'')')
      WRITE(KULOUT,FMT='(''   GD :'',I8,10x
     S     ,'' (3D-fields):'',I8)')  ILEN,ILENUT0
C
      IF(NCONF.NE.307) THEN
         WRITE(KULOUT,FMT='(/,''  Arrays in COMGD1 are allocated'',
     S        '' the following space:'')')
         WRITE(KULOUT,FMT='(''   GD1:'',I8,10x
     S        ,'' (3D-fields ):'',I8)')  ILEN,ILENUT0
         ILEN = NKGDIM*(NJEND -NJBEG +1)
         WRITE(KULOUT,FMT='(/,'' Array RGSIG has been allocated''
     S        ,'' the following space:'',1x,I8)')ILEN
      END IF
C
C     3.  Spectral model states
C     .   ---------------------
C
 300  CONTINUE
C
C     .     3.1  Main state (COMSP, COMSP1, COMSPG)
C     .          ---------------------------------
C
 310  CONTINUE
      ILEN = NLA * 2 * NKSDIM
      CALL HPALLOC(PTSP  ,MAX(ILEN,1),IERR,8)
      IF(NCONF.NE.307) THEN
         CALL HPALLOC(PTSP1 ,MAX(ILEN,1),IERR,8)
         CALL HPALLOC(PTSPG ,MAX(ILEN,1),IERR,8)
         CALL HPALLOC(PTCORG,MAX(ILEN,1),IERR,8)
      END IF
      ILEN=ILEN*NLATBIN
      write(kulout,*) 'ALLOCATING SPLAT:',ilen
      CALL HPALLOC(PTSPLAT,MAX(ILEN,1),IERR,8)
C
      CALL HPALLOC(PTDEVSTD,MAX(NKSDIM,1),IERR,8)
      CALL HPALLOC(PTCORBG, MAX(NFLEV*(NKSDIM-NVSP2D),1),IERR,8)
C
C     .     3.2 Splitting  of states (COMSP, COMSP1, COMSPG)
C     .         --------------------------------------------
C
 320  CONTINUE
C
C     2.2.1 Pointer initialisations
C           -----------------------
C
      PTSVOR = -1
      PTSVOR1 = -1
      PTSVORG = -1
      PTCVORG = -1
      PTDEVVOR= -1
C
      PTSDIV = -1
      PTSDIV1 = -1
      PTSDIVG = -1
      PTCDIVG = -1
      PTDEVDIV = -1
C
      PTSTT  = -1
      PTSTT1  = -1
      PTSTTG  = -1
      PTCTTG  = -1
      PTDEVTT = -1
C
      PTSPQ = -1
      PTSPQ1 = -1
      PTSPQG = -1
      PTCQG  = -1
      PTDEVQ = -1
C
      PTSPGZ = -1
      PTSPGZ1  = -1
      PTGZG  = -1
      PTCGZG  = -1
      PTDEVGZ  = -1
C
      PTSPTR = -1
      PTSPTR1  = -1
      PTTRG  = -1
      PTCTRG  = -1
      PTDEVTR  = -1
C
      PTSPPS = -1
      PTSPPS1 = -1
      PTSPPSG = -1
      PTCPSG  = -1
      PTDEVPS = -1
C
      PTSPTG = -1
      PTSPTG1 = -1
      PTSPTGG = -1
      PTCTGG  = -1
      PTDEVTG = -1
C
      iloc = 1
      do jvar = 1,jpnvarmax
        if(jvar .eq. nsvor) then
          NSPOSIT(nsvor)=iloc
          if(NSEXIST(nsvor).eq.1) then
            PTSVOR   = LOC(SP(1,1,ILOC))
            PTSVOR1 = LOC(SP1(1,1,ILOC))
            PTSVORG = LOC(SPG(1,1,ILOC))
            PTCVORG = LOC(CORG(1,1,ILOC))
            PTDEVVOR=  LOC(RDEVSTD(ILOC))
            ptuucorbg= loc(corbg(1,iloc))
            iloc = iloc + nflev
          end if
        elseif(jvar .eq. nsdiv) then
          NSPOSIT(nsdiv)=iloc
          if(NSEXIST(nsdiv).eq.1) then
            PTSDIV  = LOC(SP (1,1,iloc))
            PTSDIV1 = LOC(SP1(1,1,ILOC))
            PTSDIVG = LOC(SPG(1,1,ILOC))
            PTCDIVG = LOC(CORG(1,1,ILOC))
            PTDEVDIV=  LOC(RDEVSTD(ILOC))
            ptvvcorbg= loc(corbg(1,iloc))
            iloc = iloc + nflev
          end if
        elseif(jvar .eq. nsgz) then
          NSPOSIT(nsgz)=iloc
          if(NSEXIST(nsgz).eq.1) then
            PTSPGZ  = LOC(SP  (1,1,iloc))
            PTSPGZ1  = LOC(SP1  (1,1,ILOC))
            PTGZG  = LOC(SPG  (1,1,ILOC))
            PTCGZG  = LOC(CORG  (1,1,ILOC))
            PTDEVGZ  = LOC(RDEVSTD(ILOC))
            ptgzcorbg= loc(corbg(1,iloc))
            iloc = iloc + nflev
          end if
        elseif(jvar .eq. nsq) then
          NSPOSIT(nsq)=iloc
          if(NSEXIST(nsq).eq.1) then
            PTSPQ  = LOC(SP  (1,1,iloc))
            PTSPQ1 = LOC(SP1 (1,1,ILOC))
            PTSPQG = LOC(SPG (1,1,ILOC))
            PTCQG  = LOC(CORG(1,1,ILOC))
            PTDEVQ = LOC(RDEVSTD(ILOC))
            ptqcorbg= loc(corbg(1,iloc))
            iloc = iloc + nflev
          end if
        elseif(jvar .eq. nstt) then
          NSPOSIT(nstt)=iloc
          if(NSEXIST(nstt).eq.1) then
            PTSTT   = LOC(SP (1,1,iloc))
            PTSTT1  = LOC(SP1(1,1,ILOC))
            PTSTTG  = LOC(SPG(1,1,ILOC))
            PTCTTG  = LOC(CORG(1,1,ILOC))
            PTDEVTT =  LOC(RDEVSTD(ILOC))
            ptttcorbg= loc(corbg(1,iloc))
            iloc = iloc + nflev
          end if
        elseif(jvar .eq. nstr(1)) then
          NSPOSIT(nstr(1))=iloc
          if(NSEXIST(nstr(1)).eq.1) then
            PTSPTR  = LOC(SP  (1,1,iloc))
            PTSPTR1  = LOC(SP1  (1,1,ILOC))
            PTTRG  = LOC(SPG  (1,1,ILOC))
            PTCTRG  = LOC(CORG  (1,1,ILOC))
            PTDEVTR  = LOC(RDEVSTD(ILOC))
            pttrcorbg= loc(corbg(1,iloc))
            iloc = iloc + nflev
          end if
          DO JJ=2, NSCMT
             NSPOSIT(nstr(JJ))=iloc
             if(NSEXIST(nstr(JJ)).eq.1) then
               iloc = iloc + nflev
             end if
          ENDDO
        elseif(jvar .eq. nsps) then
          NSPOSIT(nsps)=iloc
          if(NSEXIST(nsps).eq.1) then
            PTSPPS  = LOC(SP  (1,1,iloc))
            PTSPPS1 = LOC( SP1(1,1,ILOC))
            PTSPPSG = LOC( SPG(1,1,ILOC))
            PTCPSG  = LOC(CORG(1,1,ILOC))
            PTDEVPS = LOC(RDEVSTD(ILOC))
            iloc = iloc + 1
          end if
        elseif(jvar .eq. nstg) then
          NSPOSIT(nstg)=iloc
          if(NSEXIST(nstg).eq.1) then
            PTSPTG  = LOC(SP  (1,1,iloc))
            PTSPTG1 = LOC( SP1(1,1,ILOC))
            PTSPTGG = LOC( SPG(1,1,ILOC))
            PTCTGG  = LOC(CORG(1,1,ILOC))
            PTDEVTG = LOC(RDEVSTD(ILOC))
            iloc = iloc + 1
          end if
        endif
      enddo
C
      ILEN = NI*NJ*NKGDIM
      CALL HPALLOC(PTDAMPLIBG,MAX(ILEN,1),IERR,8)
C
      ILENSPV = NLA * 2 * NFLEV
      WRITE(KULOUT,FMT='(/,"  Arrays in COMSP are allocated",
     S     " the following space:")')
      WRITE(KULOUT,FMT='(8X,"   SP :",I8,10x
     S     ," (3D-fields SPXXX):",I8)')  ILEN,ILENSPV
C
      IF(NCONF.NE.307) THEN
         WRITE(KULOUT,FMT='(/,"  Arrays in COMSP1 are allocated",
     S        " the following space:")')
         WRITE(KULOUT,FMT='(8X,"   SP1 :",I8,10x
     S        ," (3D-fields SPXXX1):",I8)')  ILEN,ILENSPV
C
         WRITE(KULOUT,FMT='(/,"  Arrays in COMSPG are allocated",
     S        " the following space:")')
         WRITE(KULOUT,FMT='(8X,"   SPG :",I8,10x
     S        ," (3D-fields SPXXXG):",I8)')  ILEN,ILENSPV
C
         WRITE(KULOUT,FMT='(8X,"   CORG :",I8,10x
     S        ," (3D-Fields CORXXXG):",I8)')  ILEN,ILENSPV
      END IF
C
C*    4. Arrays needed to define the geometry of the model (in COMGEM)
C     .  ------------------------------------------------------------
C
 400  CONTINUE
      ILEN = (NJEND -NJBEG +1)
      CALL HPALLOC(PTILON,MAX(ILEN,1),IERR,1)
C
      WRITE(KULOUT,FMT='(/,"  Arrays in COMGEM are allocated",
     S     " the following space:  NILON =",I4)')ILEN
C
      ILEN = NLA
      CALL HPALLOC(PTNNP1, MAX(ILEN,1),IERR,8)
      CALL HPALLOC(PT1SNP1,MAX(ILEN,1),IERR,8)
      WRITE(KULOUT,FMT='(8X," (RNNP1,R1SNP1)  =",I4)')ILEN
C
C
      ILEN = NJEND -NJBEG +1
      CALL HPALLOC(PTCONPHY,MAX(ILEN,1),IERR,8)
      CALL HPALLOC(PTCONIMA,MAX(ILEN,1),IERR,8)
C
C*    5. Arrays of COMCVA for the control variable
C     .  -----------------------------------------
C
 500  CONTINUE
      ILEN = NVADIM
      IF(NCONF.NE.307)THEN
         CALL HPALLOC(PTVAZX    , MAX(ILEN,1),IERR,8)
         CALL HPALLOC(PTVAZXBAR , MAX(ILEN,1),IERR,8)
         do jvar = 1, ilen
           vazxbar(jvar) = 0.0
         enddo
         CALL HPALLOC(PTVAZG    , MAX(ILEN,1),IERR,8)
         CALL HPALLOC(PTSCALP   , MAX(ILEN,1),IERR,8)
         CALL HPALLOC(PTSCALPM1 , MAX(ILEN,1),IERR,8)
      END IF
C
      ILEN = NMTRA
      IF(NCONF.NE.307)THEN
        allocate(vatra(nmtra),STAT=ierr)
c         CALL HPALLOC(PTVATRA, MAX(ILEN,1),IERR,8)
      END IF
C
      IF(NCONF.NE.307.AND.N1GC.EQ.4)THEN
         ILEN = NVADIM
         CALL HPALLOC(PTVAZB,  MAX(ILEN,1),IERR,8)
         ILEN = NMTRA
         CALL HPALLOC(PTVATR1, MAX(ILEN,1),IERR,8)
         ILEN = NWORK
         CALL HPALLOC(PTVWORK, MAX(ILEN,1),IERR,8)
      END IF
C
      WRITE(KULOUT,FMT=9401)
 9401 FORMAT(/,'  Arrays in COMCVA are allocated',
     S     ' the following space:')
      WRITE(KULOUT,FMT=9402) NVADIM,NMTRA
 9402 FORMAT(10X,'(VAZX, VAZG, SCALP) :',I6,10x,' VATRA:',1xI6)
      IF(N1GC.EQ.4) THEN
      WRITE(KULOUT,FMT=9403) NVADIM,NMTRA,NWORK
 9403 FORMAT(10X,'FOR N1CG1: VAZB :',I6,10x,' VATR1 :',I6,10x,' VWORK :',1xI6)
      ENDIF
C
C*    6. Spectral correlations and balance operators
C
 600  CONTINUE
      ILEN = NFLEV*(NFLEV+1)*NJ
      CALL HPALLOC(PTPtoT, MAX(ILEN,1),IERR,8)
      ILEN = NFLEV*(NJ)
      CALL HPALLOC(PTTHETA, MAX(ILEN,1),IERR,8)
      CALL HPALLOC(PBAL_TBPP_CC, MAX(ILEN,1),IERR,8)
      CALL HPALLOC(PBAL_UTPP_UC, MAX(ILEN,1),IERR,8)
      ILEN = NFLEV*(NJ)*NLATBIN
      CALL HPALLOC(PTTHETA2, MAX(ILEN,1),IERR,8)
      write(6,*) 'NKSDIM2=',nksdim2
      ILEN = NKSDIM2*NKSDIM2*(NTRUNC+1)*NLATBIN
      CALL HPALLOC(PTCORNS, MAX(ILEN,1),IERR,8)
      ILEN = NKSDIM*(NTRUNC+1)
      CALL HPALLOC(PTSTDDEV, MAX(ILEN,1),IERR,8)
      ILEN = NKSDIM2*NKSDIM2
      CALL HPALLOC(PTCORVERT, MAX(ILEN,1),IERR,8)
C
C*    7. Prediction error  statistics
C
 700  CONTINUE
c
      ILEN = NJ*NFLEV
      CALL HPALLOC(PTUUSTDBG, MAX(ILEN,1),IERR,8)
      CALL HPALLOC(PTGZSTDBG, MAX(ILEN,1),IERR,8)
      CALL HPALLOC(PTQSTDBG , MAX(ILEN,1),IERR,8)
      ILEN = NI*NJ
      CALL HPALLOC(PTTGSTDBG, MAX(ILEN,1),IERR,8)
C
C*    8. Arrays required for model coordinate analysis
C     .  ---------------------------------------------
C
 800  CONTINUE
      ILEN = NFLEV
c
c     arrays for T to P and P to T transforms
c
      CALL HPALLOC(PTVMA, MAX(ILEN,1),IERR,8)
      CALL HPALLOC(PTVMB, MAX(ILEN,1),IERR,8)
      CALL HPALLOC(PTVMC, MAX(ILEN,1),IERR,8)
      CALL HPALLOC(PTVMD, MAX(ILEN,1),IERR,8)
      CALL HPALLOC(PTVME, MAX(ILEN,1),IERR,8)
      CALL HPALLOC(PTVMF, MAX(ILEN,1),IERR,8)
c
c     arrays for mean T profile and Equivalent-depths
c
      ILEN = NFLEV
      CALL HPALLOC(PTTMEANH, MAX(ILEN,1),IERR,8)
      CALL HPALLOC(PTEQDEPTH, MAX(ILEN,1),IERR,8)
c
c     arrays for vertical mode transform
c
      ILEN = NFLEV*NFLEV
      CALL HPALLOC(PTVMAT, MAX(ILEN,1),IERR,8)
      CALL HPALLOC(PTVINV, MAX(ILEN,1),IERR,8)
c
c     arrays for model background on analysis grid (compdg)
c
      ILEN = NI*NFLEV*NJ
      CALL HPALLOC(PTTG,MAX(ILEN,1),IERR,8)
      CALL HPALLOC(PTQG,MAX(ILEN,1),IERR,8)
      ILEN = NI*NJ
      CALL HPALLOC(PTGPSG,MAX(ILEN,1),IERR,8)
      CALL HPALLOC(PTGPTG,MAX(ILEN,1),IERR,8)
C
      RETURN
      END