SUBROUTINE SUALOBS(KULOUT) 1
      use modmask, only : lmaskpp_in, lmaskpp_out,lmasksf_in,lmasksf_out
      use modmask, only : lmask,lmaskto,lmaskgo,lmaskro,lmaskzp,ldiagpp
      use modmask, only : ldiagsf, ldiag
      use modmask, only : lmasktr, lmasktr_all    
#if defined (DOC)
*
***s/r SUALOBS  - Memory allocation for obs. related arrays
*
*Author  : P. Gauthier *ARMA/AES  June 9, 1992
*Revision:
*     L.Fillion  *RPN/AES Feb 93  - Allocation for auxiliary fields
*     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).
*     S. Pellerin *ARMA/AES Aug. 98.
*                   - Allocation (loc) for GOMES
*     L.Fillion  *ARMA/AES 25 nov 98  - Allocation for background fiels needed in TL and ADJ
*                 observation operators.
*     J.Halle    *CMDA/AES Oct 99
*                   - Added ground temperature to(TG) to model state
*     P. KOCLAS CMC NOV 99
*                 added stnid field
*     S. Pellerin *ARMA/SMC May 2000
*                   - Fix for F90 conversion:
*                        .Illimination of pointer to character*9 CSTNID
*                        .Introduction of distinc pointer for integer
*                         and real cma arrays (ptmobhdr,ptrobhdr,ptmobdata,ptrobdata)
*     JM Belanger CMDA/SMC  Jul 2000
*                   - 32 bits conversion
*                    (Memory allocation for ROBDATA8 array declared
*                     in comoba.cdk)
*     S. Pellerin *ARMA/SMC nov. 2001
*                   - Allocation of mvar and pexy vertors for 4Dvar book keeping
*     Y. Yang  July 2003
*                  - Added loops to accommodate multiple species
*                  - Expanded size of CMA for 2 additional entries in ROBDASTA8
*     Y. Yang  Feb. 2005
*                  -  Replaced 'OZ' related parts with that of 'TR' family.
*     J. Halle    *CMDA/SMC mai 2006
*                   - Added one additionnal entry for ROBDATA8 (now 9 itemss instead of 8)
*     S. Pellerin *ARMA/SMC jan. 2009
*                   - Allocation of data assimilated mask
*     Y. Yang    ARQI/AQRD Jan 2010
*                   - Added additionnal entries on top of J. Halle's modification for 
*                     ROBDATA8 (now 11 itemss instead of 10)
*                   - Allocation of masks related to constituents
*     Y.J.Rochon  *ARQX March 2011
*                   - Increased ROBDATA8 allocation to 14xNDATAMX for 
*                     consistency with dimension in comoba.cdk
*
*Arguments
*     i   KULOUT: unit used for optional printing
*
#endif
C
      IMPLICIT NONE
*implicits
#include "comdim.cdk"
#include "comcva.cdk"
#include "comdimo.cdk"
#include "comoahdr.cdk"
#include "comoabdy.cdk"
#include "comchem.cdk"
#include "commvo.cdk"
#include "commvo1.cdk"
#include "commvog.cdk"
#include "comoba.cdk"
#include "comstate.cdk"
*
      INTEGER KULOUT, IERR
      INTEGER ILEN, ILENU, ilen8
      INTEGER iloc, jvar
      INTEGER JJ
      EXTERNAL HPALLOC
C
      WRITE(KULOUT,FMT='(//,6(" ***********"))')
      WRITE(KULOUT,*)'     SUALOBS:  Memory allocation of the',
     S     ' observation arrays'
      WRITE(KULOUT,FMT='(6(" ***********"))')
C
C*    1. Model state at observation stations
C     .  -----------------------------------
C
 100  CONTINUE
      ILEN = NFLEV*NMXOBS
      CALL HPALLOC( PTPPOBS,MAX(ILEN,1),IERR,8)
      ILEN = NKGDIMO*NMXOBS
      CALL HPALLOC( PTMTHOBS,MAX(NMXOBS,1),IERR,8)
      CALL HPALLOC( PTMTMOBS,MAX(NMXOBS,1),IERR,8)
      call hpalloc( ptmtag,max(nmxobs,1),ierr,0)
      call hpalloc( ptpexy,max(nmxobs,1),ierr,0)
      CALL HPALLOC( PTMOBS,MAX(ILEN,1),IERR,8)
      CALL HPALLOC(PTMOBS1,MAX(ILEN,1),IERR,8)
      CALL HPALLOC(PTMOBSG,MAX(ILEN,1),IERR,8)
      ilen = nflev*nmxobs*2
      call hpalloc(ptltv,max(ilen,1),IERR,8)
      ilen = nflev*nmxobs
      call hpalloc(pttapfac,max(ilen,1),IERR,8)
      if(chum.eq.'ES') then
        ilen = nflev*nmxobs
        call hpalloc(ptestdg,max(ilen,1),IERR,8)
        call hpalloc(ptdlnesg,max(ilen,1),IERR,8)
        call hpalloc(ptrqgfac,max(ilen,1),IERR,8)
      else
        ilen = nflev*nmxobs*3
        call hpalloc(ptlq2es,max(ilen,1),IERR,8)
      endif
C
      PTOMU  = -1
      PTOMU1  = -1
      PTOMUG  = -1
C
      PTOMV  = -1
      PTOMV1  = -1
      PTOMVG  = -1
C
      PTOMT  = -1
      PTOMT1  = -1
      PTOMTG  = -1
C
      PTOMQ  = -1
      PTOMQ1  = -1
      PTOMQG  = -1
C
      PTOMGZ = -1
      PTOMGZ1 = -1
      PTOMGZG = -1
c
      PTOMTR = -1
      PTOMTR1 = -1
      PTOMTRG = -1
c
      ptomes = -1
      ptomes1 = -1
      PTOMESG = -1
C
      PTOMPS = -1
      PTOMPS1 = -1
      PTOMPSG = -1
C
      PTOMTGR = -1
      PTOMTGR1 = -1
      PTOMTGRG = -1
C
      iloc = 1
      do jvar = 1,jpnvarmax
        if(jvar .eq. nouu) then
          NMVOPOSIT(nouu) = iloc
          if(NMVOEXIST(nouu).eq.1) then
            PTOMU  = LOC(GOMOBS(iloc,1))
            PTOMU1  = LOC(GOMOBS1(iloc,1))
            PTOMUG  = LOC(GOMOBSG(iloc,1))
            iloc = iloc + nflev
          end if
        elseif(jvar .eq. novv) then
          NMVOPOSIT(novv) = iloc
          if(NMVOEXIST(novv).eq.1) then
            PTOMV  = LOC(GOMOBS(iloc,1))
            PTOMV1  = LOC(GOMOBS1(iloc,1))
            PTOMVG  = LOC(GOMOBSG(iloc,1))
            iloc = iloc + nflev
          end if
        elseif(jvar .eq. nogz) then
          NMVOPOSIT(nogz) = iloc
          if(NMVOEXIST(nogz).eq.1) then
            PTOMGZ = LOC(GOMOBS(iloc,1))
            PTOMGZ1 = LOC(GOMOBS1(iloc,1))
            PTOMGZG = LOC(GOMOBSG(iloc,1))
            iloc = iloc + nflev
          end if
        elseif(jvar .eq. noq) then
          NMVOPOSIT(noq) = iloc
          if(NMVOEXIST(noq).eq.1) then
            PTOMQ  = LOC(GOMOBS(iloc,1))
            PTOMQ1  = LOC(GOMOBS1(iloc,1))
            PTOMQG  = LOC(GOMOBSG(iloc,1))
            iloc = iloc + nflev
          end if
        elseif(jvar .eq. nott) then
          NMVOPOSIT(nott) = iloc
          if(NMVOEXIST(nott).eq.1) then
            PTOMT  = LOC(GOMOBS(iloc,1))
            PTOMT1  = LOC(GOMOBS1(iloc,1))
            PTOMTG  = LOC(GOMOBSG(iloc,1))
            iloc = iloc + nflev
          end if
        elseif(jvar .eq. notr(1)) then
          NMVOPOSIT(notr(1)) = iloc
          if(NMVOEXIST(notr(1)).eq.1) then
            PTOMTR = LOC(GOMOBS(iloc,1))
            PTOMTR1 = LOC(GOMOBS1(iloc,1))
            PTOMTRG = LOC(GOMOBSG(iloc,1))
            iloc = iloc + nflev
          end if
          DO JJ = 2,NOCMT
             NMVOPOSIT(notr(JJ)) = iloc
             if(NMVOEXIST(notr(JJ)).eq.1) then
               iloc = iloc + nflev
             end if
          ENDDO
        elseif(jvar .eq. noes) then
          NMVOPOSIT(noes) = iloc
          if(NMVOEXIST(noes).eq.1) then
            PTOMES = LOC(GOMOBS(iloc,1))
            PTOMES1 = LOC(GOMOBS1(iloc,1))
            PTOMESG = LOC(GOMOBSG(iloc,1))
            iloc = iloc + nflev
          end if
        elseif(jvar .eq. nops) then
          NMVOPOSIT(nops) = iloc
          if(NMVOEXIST(nops).eq.1) then
            PTOMPS = LOC(GOMOBS(iloc,1))
            PTOMPS1 = LOC(GOMOBS1(iloc,1))
            PTOMPSG = LOC(GOMOBSG(iloc,1))
            iloc = iloc + 1
          end if
        elseif(jvar .eq. notg) then
          NMVOPOSIT(notg) = iloc
          if(NMVOEXIST(notg).eq.1) then
            PTOMTGR = LOC(GOMOBS(iloc,1))
            PTOMTGR1 = LOC(GOMOBS1(iloc,1))
            PTOMTGRG = LOC(GOMOBSG(iloc,1))
            iloc = iloc + 1
          end if
        endif
      enddo
C
C*    .   1.1 Auxiliary state
C     .       ---------------
C
 110  CONTINUE
C
      ILENU  = NMXOBS*NFLEV
      WRITE(KULOUT,FMT='(/,"Arrays in COMMVO (COMMVO1) are allocated",
     S     " the following space:")')
      WRITE(KULOUT,FMT=9100)ILEN,ILENU, NMXOBS
 9100 FORMAT("   GOMOBS :",I10,10x
     S     ," (GOMU, GOMV,GOMGZ,GOMQ):",I10
     S     ," (GOMPS,GOMTGR):",I10)
C
C
C*    2. Arrays containing the observations themselves
C     .   (COMDECK COMOBA)
C     .  ---------------------------------------------
C
      ILEN = NCMLET*NMXOBS
      ILENU = NCMLBO*NDATAMX
      WRITE(KULOUT,FMT=9101) NCMLET,NCMLBO,ILEN,ILENU
 9101 FORMAT("   NCMLET :",I10,10x," NCMLBO :",I10,10x
     $     ," NCMLET*NMXOBS :",I10,10x
     S     ," NCMLBO*NDATAMX:",I10)
C
      CALL HPALLOC(ptrobhdr,MAX(ILEN,1),IERR,1)
      ptmobhdr = ptrobhdr
      CALL HPALLOC(PTROBDATA,MAX(ILENU,1),IERR,1)
      ptmobdata = ptrobdata

*     Memory allocation for ROBDATA8.
C
C     Expand the CMA size since the definition of ROBDATA8 was modified.
C
c      ilen8=8*NDATAMX
c      ilen8=9*NDATAMX

c      ilen8=11*NDATAMX
      ilen8=14*NDATAMX
      CALL HPALLOC(ptrobdata8,MAX(ilen8,1),IERR,8)
C
      allocate(lmaskpp_in(ndatamx),lmaskpp_out(ndatamx))
      lmaskpp_in = .false.
      lmaskpp_out = .false.
      allocate(lmasksf_in(ndatamx),lmasksf_out(ndatamx))
      lmasksf_in = .false.
      lmasksf_out = .false.
      allocate(lmask(ndatamx),lmaskto(ndatamx),lmaskgo(ndatamx))
      lmaskto = .false.
      lmaskgo = .false.
      allocate(lmaskro(ndatamx),lmaskzp(ndatamx),ldiagpp(ndatamx))
      lmaskzp = .false.
      lmaskro = .false.
      ldiagpp = .false.
      allocate(ldiagsf(ndatamx),ldiag(ndatamx))
      ldiagsf = .false.
      ldiag = .false.
      
      allocate(lmasktr(NCMTMAX,ndatamx),lmasktr_all(ndatamx))
      lmasktr= .false.
      lmasktr_all= .false.
      
      WRITE(KULOUT,FMT='(/,"  Arrays in COMOBA are allocated",
     S     " the following space:")')
      WRITE(KULOUT,FMT=9200)ILEN,ILENU,ilen8
 9200 FORMAT("   ROBHDR/MOBHDR: ",I10,10x
     S     ," ROBDATA/MOBDATA : ",I10,10x
     S     ," ROBDATA8 : ",I10,10x)

      RETURN
      END