SUBROUTINE SUDIM(KULOUT) 1,3
#if defined (DOC)
*
***s/r SUDIM * - Setting up of the dimensions
*     --------
*
*Author:   Based on a subroutine written by
*          Mats Hamrud and Philippe Courtier  *ECMWF*
*     P. Gauthier *ARMA/AES  June 9, 1992
*Revision:
*     . P. Gauthier *ARMA/AES May 25,1993: -Dimensions for specific humidity
*     .                                     and surface pressure
*     . 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/SMC May 2000
*                . Introduction of nconf 141
*     . M. Buehner *ARMA/MSC April 2002
*                . Read NAMSV and adjust NVADIM to include space for SVs
*     . Y. Yang    Nov. 2003
*                . Changed RSIGTR and RPORTR to vectors to accommodate
*                  multiple species.
*                . Switched order of "comdim.cdk" and "comstate.cdk"
*                  due to dependences
*     . M. Tanguay *ARMN/MSC Jan. 2005
*                . Introduction of minimizer N1CG1
*     . M. Buehner *ARMA May 2008
*                . Added namelist variables for vertical localization of
*                  correlations and using multiple latitude bands
*                  of correlations and new approach for PtoT and
*                  localized Tb correlations (NANALVAR=4)
*
*     . Y. Nezlin ARQX March 2006 (in collaboration with Y.J. Rochon)
*            - Added NPERTBG, LPERTOBS, and LmodelER 
*              (for use with code by M. Buehner)
*     . M. Buehner  *ARMA/MSC 
*            - Added RVLOC* localization lengths.
*     . Y.J. Rochon *ARQX/EC
*             - Addition of RVLOCTR
*
*---------------
*     Purpose: initialize  COMDIM and read the namelist NAMDIM
*
*Arguments:
*     i: KULOUT  (logical unit for optional printing i.e. debugging)
*     o: comdim.cdk (COMDECK containing the dimensions of the model
*
#endif
C
      use modstag, only: nj_s, njlath_s, level2_staggrid, lstagwinds
                                !
      IMPLICIT NONE
#include "comdim.cdk"
#include "comlun.cdk"
#include "comct0.cdk"
#include "comcva.cdk"
#include "comsv.cdk"
      INTEGER KULOUT, IAL1, IAL2, IERR, ILEN
      INTEGER JJ
C
C
C*       1. SET DEFAULT VALUES AND MODIFY THEM.
C           -----------------------------------
C
 100  CONTINUE
C
C*    1.1 Default values
C     --------------
 110  CONTINUE
C
      N1GC = 3
      NVAMAJ = 6
      NIMPRES =  5
      NITERMAX = 400
      RDF1FAC  = 0.25d0
      NITERJOB = -1
      NSIMMAX  = 500
      NGRTEST  = 0
      NGRANGE  = 15
      NCNTVAR  = 2
      NEVALJ   = 1
      lxbar    = .true.
      ltlmend  = .false.
      LTSTSP   = .FALSE.
      LTSTCVA  = .FALSE.
      LNONSEP  = .TRUE.
      REPSG    = 1e-3
      LRSTART  = .FALSE.
      LSTAT    = .TRUE.
      RSIGGZ   =  0.0
      DO JJ = 1, NCMTMAX
           RSIGTR(JJ)   =  1.0
      ENDDO
      RSIGPS   =  1.0
      RSIGTG   =  1.5
      RSIGQ    =  1.0
      RNU2     = 0.0
      RSIGUU   =  2.92
      RSIGTT   = 0.0
      NANALVAR = 3
      RPORVO   = 6000.E3
      RPORDI   = 6000.E3
      RPORTT   = 3000.E3
      RPORQ    = 3000.E3
      RPORPS   = 3000.E3
      RPORTG   = 500.E3
      RPORGZ   = 1200000.
      DO JJ = 1, NCMTMAX
           RPORTR(JJ) = 3000.E3
      ENDDO
      CIMP     = 'G'
      CFG      = 'F'
      CCOV     = 'H'
      CSCAL    = 'P'
      CFGERR   = 'G'
      CHUM     = 'LQ'
      EPSNEG   = 1e-6
      SELECT0  = 0
      BFGSB    = 2
      IMODE3   = 0
      NTUNESTATS = 0
      NPERTBG  = 0
      LPERTOBS = .FALSE.
      LmodelER = .FALSE.
C
      NFLEVPTOT = -999
      RSCALEPTOT = 1.0
      LHBHT1   = .FALSE.
      LUSE3DSTD = .FALSE.
      NTRUNC3DSTD = 0   
      LCOPYPTOT = .FALSE.
      CFLTUNEOBS= 'none'
      CFLTUNEBG = 'none'
C
      RVLOCBALT   = 0.0
      RVLOCPSI    = 0.0
      RVLOCCHI    = 0.0
      RVLOCUNBALT = 0.0
      RVLOCLQ     = 0.0
      RVLOCPSITT  = 0.0   
C
      DO JJ = 1, NCMTMAX
           RVLOCTR(JJ) = 0.0
      ENDDO   
C
      NLATMIN1    = 40
      NLATMAX1    = 50
      NLATMIN2    = 71
      NLATMAX2    = 81
C
      WRITE(UNIT=KULOUT,FMT='(//," Modification of the dimensions:"
     S     ," of the control variable",/,10x
     S     ,"- reading the namelist NAMCVA in SUDIM")')
C
      CALL READNML('NAMCVA',IERR)
      level2_staggrid = .false.
      write(kulout,fmt='(4x,A,L3)')' LEVEL2_staggrid = ',level2_staggrid
C
      NI=240
      NIINC=240
      NJ=120
      NJINC=120
      NFLEV=28
      NISUR=2
      NJSUR=2
      NVGAUX=0
      NTRUNCINC=108
      NTRUNC=108
      NVSAUX=0
      nprecon=0
      NLATBIN=1
C
 120  CONTINUE
      WRITE(UNIT=KULOUT,FMT='(//,'' MODIFICATION OF THE DIMENSIONS:''
     S     ,''- reading the namelist NAMDIM in SUDIM'')')
C
      CALL READNML('NAMDIM',IERR)
C
C*    .   1.3 Check the consistency between the number of spectral
C     .       and gridpoint fields
C     .       ----------------------------------------------------
C
      IF(NFLEVPTOT.lt.0) NFLEVPTOT=NFLEV
      WRITE(KULOUT,*) 'NFLEVPTOT=',NFLEVPTOT
 130  CONTINUE
      IF(NVGD.NE.NVSP)THEN
         WRITE(NULOUT,FMT=9130)'  NVGD',NVGD,'  NVSP',NVSP
         NVGD = NVSP
      END IF
      IF(NVG2D.NE.NVSP2D) THEN
         WRITE(NULOUT,FMT=9130)' NVG2D',NVG2D,'NVSP2D',NVSP2D
         NVG2D = NVSP2D
      END IF
      IF(NVGAUX.NE.NVSAUX) THEN
         WRITE(NULOUT,FMT=9130)'NVGAUX',NVGAUX,'NVSAUX',NVSAUX
         NVGAUX = NVSAUX
      END IF
 9130 FORMAT(4X,'-INCONSISTENCY IN THE NUMBER OF FIELDS: ',A6,'= ',I4
     S     ,4X,A6,'= ',I4,/,8X,'RESET TO THE SPECTRAL VALUES')
C
C*    2. Initialize the dimensions (dependent dimensions).
C
      NI=NIINC
      NJ=NJINC
      NTRUNC=NTRUNCINC
C
 200  CONTINUE
C
C*    .   2.1 Collocation grid dimensions.
C     .       ---------------------------
C
 210  CONTINUE
      NJLATH = (NJ + 1)/2
      nj_s = nj-1
      njlath_s = nj/2
      NJBEG  = - NJSUR + 1
      NJEND  = NJ + NJSUR
      IF(MOD(NJ,2).EQ.0) THEN
         NJMAX = NJ+1
      ELSE
         NJMAX = NJ
      END IF
C
      NIBEG = 0
      NIEND = NI + NISUR
C
      WRITE(KULOUT,*)' DIMENSIONS IN GRID SPACE ------:'
      WRITE(UNIT=KULOUT,FMT=9210)
     S     NJ  ,NJLATH, NJSUR,NJBEG ,NJEND ,NI ,NISUR, NIBEG
     S     , NIEND,NFLEV
 9210 FORMAT(4X,
     S     ' NJ    =',I6,' NJLATH  =',I6,
     S     ' NJSUR =',I6,' NJBEG   =',I6,' NJEND =',I6,/,4X,
     S     ' NI    =',I6,' NISUR   =',I6,' NIBEG =',I6,
     S     ' NIEND =',I6,' NFLEV = ',I6)
      write(kulout,fmt='(4x,A,i6,A,i6)')'NJ_S = ',nj_s,'  NJLATH_S = ',njlath_s
      IF(NLATBD.GT.NJLATH) THEN
         NLATBD = NJLATH
         WRITE(NULOUT,9211)NLATBD, NJLATH
      END IF
 9211 FORMAT(6X,'Width of latitudinal band is too wide. In SUDIM'
     S     ,' NLATBD is reset to NJLATH',/10X,'NLATBD = ',I3,4X
     S     ,'NJLATH = ',I3)
C
C*    .   2.2 Spectral dimensions
C     .       -------------------
C
      NLA = (NTRUNC + 1)*(NTRUNC +2)/2
      NLARH = (NTRUNC+1)*(NTRUNC+1)
      IF(MOD(NTRUNC+1,2).EQ.0) THEN
         NTRUNCMX = NTRUNC + 1
      ELSE
         NTRUNCMX = NTRUNC
      END IF
      IF(MOD(NLA,2).EQ.0) THEN
         NLADIM = NLA+1
      ELSE
         NLADIM = NLA
      END IF
C
      WRITE(KULOUT,*)' DIMENSIONS IN SPECTRAL SPACE ------:'
      WRITE(UNIT=KULOUT,FMT=9220)NTRUNC, NTRUNCMX, NLA, NLADIM, NLARH
 9220 FORMAT(/,' Triangular truncation of order '
     S     ,'NTRUNC =',I4,' NTRUNCMX: ',I4,'  NLA:',I8,'  NLADIM:',I8
     S     ,'   NLARH:',I8)
C
C*    .   2.3 Check for aliasing.
C     .       ------------------
C
 220  CONTINUE
*
      IAL1=3*NTRUNC - (2*NJ-1)
      IF (IAL1 .GT. 0) THEN
         WRITE(UNIT=KULOUT,
     S        FMT='('' ******* ALIASING FOR PRODUCTS OF FIELDS ''
     S        ,'' IN THE N-S DIRECTION  ******** '')')
*
         IAL1=2*NTRUNC - (2*NJ-1)
         IF (IAL1 .GT. 0) THEN
            WRITE(UNIT=KULOUT,
     S           FMT='('' ******* ALIASING FOR SPECTRAL TRANSFORMS ''
     S           ,'' IN THE N-S DIRECTION  ******** '')')
         ENDIF
       ENDIF
*
*
      IAL2=3*NTRUNC - (NI-1)
      IF (IAL2 .GT. 0) THEN
         WRITE(UNIT=KULOUT,
     S        FMT='('' ******* ALIASING FOR PRODUCTS OF FIELDS ''
     S        ,'' IN THE E-W DIRECTION  ******** '')')
*
         IAL2=2*NTRUNC - (NI-1)
         IF (IAL2 .GT. 0) THEN
            WRITE(UNIT=KULOUT,
     S           FMT='('' ******* ALIASING FOR SPECTRAL TRANSFORMS ''
     S           ,'' IN THE E-W DIRECTION  ******** '')')
         ENDIF
       ENDIF
C
C*    3. Initialize the number of fields.
C     -----------------------------------
 300  CONTINUE
C
C*    .   3.1  Total number of 2D fields in grid space
C     .        ---------------------------------------
C
 310  CONTINUE
C
      NKGDIM = (NVGD+ NVGAUX)* NFLEV + NVG2D
C
      WRITE(UNIT=KULOUT,FMT=9310)
     S     NVGD,NVGAUX,NVG2D,NKGDIM
 9310 FORMAT(/,5X,'Number of variables in grid',
     S     ' space',/,
     S     ' NVGD   =',I6,' NVGAUX =',I6,
     S     ' NVG2D   =',I6,' NKGDIM =',I6)
C
C
C*    .   3.2  Total number of spectral fields
C     .        -------------------------------
C
 320  CONTINUE
      NKSDIM = (NVSP + NVSAUX)*NFLEV + NVSP2D
      if(nconf.ne.300.and.nconf.ne.800.and.nconf.ne.801.and.nconf.ne.500.and.nanalvar.eq.4) then
        NKSDIM2 = NKSDIM+NFLEV
      else
        NKSDIM2 = NKSDIM
      endif
C
      WRITE(UNIT=KULOUT,FMT='(/,5X,''Number of variables in SPECTRAL'',
     S     '' space'',/,
     S     '' NVSP   ='',I6,'' NVSAUX ='',I6,
     S     '' NVSP2D   ='',I6,'' NKSDIM ='',I6)')
     S     NVSP,NVSAUX,NVSP2D,NKSDIM
C
C*    4. Dimension of the control variable
C     .  ---------------------------------
C
 400  CONTINUE
C
C     Read NAMSV and adjust adjust NVADIM, if necessary, for incorporating SVs into B
C
      CSVNORM='E'
      NSV=0
      NUMSEG=1
      NSVMODE=0
      IF(NINT(NCONF/100.0).EQ.6) CALL READNML('NAMSV',IERR)
      ILEN = NSV
      IF(NSVMODE.eq.1) THEN
        NVADIM = ILEN
      ELSEIF(NSVMODE.eq.2) THEN
        NVADIM = NKSDIM*(2*NLA - NTRUNC -1) + ILEN
      ELSE
        NVADIM = NKSDIM*(2*NLA - NTRUNC -1)
      ENDIF
cbue
cbue      NVADIM=NVADIM+NFLEV*(2*NLA - NTRUNC -1)
C
      NVADIM=NVADIM*NLATBIN
C
      IF(N1GC.EQ.2) THEN
         NMTRA = 3*NVADIM + NVAMAJ*(2*NVADIM + 1)
      ELSE IF(N1GC.EQ.3)THEN
         NMTRA = 4*NVADIM + NVAMAJ*(2*NVADIM + 1)
      ELSE IF(N1GC.EQ.4)THEN
         NMTRA = 1 + NVAMAJ*(2*NVADIM + 1)
         NWORK = 5*NVADIM + NVAMAJ
      ELSE
         NMTRA = NVADIM*2
      END IF
      WRITE(KULOUT,9401)N1GC, NVAMAJ,NVADIM,NMTRA
 9401 FORMAT(4X,'N1GC = ',I2,4X,'NVAMAJ = ',I3
     S     ,/5X,"NVADIM =",1x,I9,3X,"NMTRA =",1X,I9)
      IF(N1GC.EQ.4) THEN
      WRITE(KULOUT,9402)NWORK
 9402 FORMAT(4X,'FOR N1CG1:',4X,'NWORK = ',I9)
      ENDIF
C
      RETURN
      END