SUBROUTINE SUSTATE 1,1
#if defined (DOC)
*
***s/r SUSTATE - Definition of which variables are to be part
* . of the different model states
* Author : P. Gauthier *ARMA/AES March 3, 1995
* Revision:
* 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.
* Add of nmvoexist et nmvoposit for ES
* M. Buehner July 98
* Switched order of tt,q in spectral and grid point vectors
* J. Halle *CMDA/AES Oct 1999.
* Add ground temperature (TG) to model state.
* Y. Yang July 2003
* Expanded notr, nstr, ngtr to vectors to accommodate
* multiple species. Added do loops accordingly.
* Y. Yang Feb. 2005
* Removed 'OZ' part and cleaned nooz, ngoz, ...
* Y.J. Rochon Feb. 2006, April 2007
* Added test on consistency of JPNVARMAX and NCMTMAX sizes
* Added CSCMT
*
** Purpose: to define which fields are allocated within
* - Spectral states: COMSP, COMSP1, COMSPG
* - Gridpoint states: COMGD0, COMGD1
* - Model states at observation locations: COMMVO, COMMVO1
* - Spectral correlations: COMSPG
* ----------------------------------
*
*ARGUMENTS
* -NONE-
#endif
IMPLICIT NONE
*implicits
#include "comlun.cdk"
#include "comdim.cdk"
#include "comdimo.cdk"
#include "comstate.cdk"
#include "comchem.cdk"
*
INTEGER JVAR, IFLAG, IPOS
character*53 clmsg
integer jj
C
C* 1. Initialize to default values
C
100 CONTINUE
C
C Initialisation of the state variable numbers
C
C Spectral model variable numbers
C
nsvor = 1
nsdiv = 2
nsgz = 3
nstt = 4
nsq = 5
DO JJ = 1,NCMTMAX
nstr(JJ) = 5+JJ
ENDDO
nsps = 6+NCMTMAX
nstg = 7+NCMTMAX
C
C Gridpoint model variable numbers
C
nguu = 1
ngvv = 2
nggz = 3
ngtt = 4
ngq = 5
DO JJ = 1,NCMTMAX
ngtr(JJ) = 5+JJ
ENDDO
ngps = 6+NCMTMAX
ngtg = 7+NCMTMAX
C
C Model state at the observation locations
C
nouu = 1
novv = 2
nogz = 3
nott = 4
noq = 5
noes = 6
DO JJ = 1,NCMTMAX
notr(JJ) = 6+JJ
ENDDO
nops = 7+NCMTMAX
notg = 8+NCMTMAX
C
C Check dimension
C
if (JPNVARMAX.lt.8+NCMTMAX) then
CLMSG = 'SUSTATE: INCONSISTENT JPNVARMAX and NCMTMAX'
CALL ABORT3D(NULOUT,CLMSG)
end if
C
C Initialisation of model state control vertors
C
DO JVAR = 1, JPNVARMAX
C
C* Existence vertors
C
NSEXIST(JVAR) = 0
NGEXIST(JVAR) = 0
NMVOEXIST(JVAR) = 0
C
END DO
C
C* . 1.1 Basic state.
C
110 CONTINUE
C
NSEXIST(NSVOR) = 1
NSEXIST(NSDIV) = 1
C
NGEXIST(NGUU) = 1
NGEXIST(NGVV) = 1
C
NMVOEXIST(NOUU) = 1
NMVOEXIST(NOVV) = 1
C
C* 2. Read NAMELIST NAMSTATE to find which fields are needed
C
200 CONTINUE
C
DO JVAR = 1, JPNVARMAX
csneed(jvar) = ' '
cgneed(jvar) = ' '
cmvoneed(jvar) = ' '
enddo
CSNEED(1) ='QQ'
CSNEED(2) ='DD'
CSNEED(3) ='TT'
CSNEED(4) ='HU'
CSNEED(5) ='P0'
cjmb CSNEED(6) ='TG'
CGNEED(1) ='UU'
CGNEED(2) ='VV'
CGNEED(3) ='TT'
CGNEED(4) ='HU'
CGNEED(5) ='P0'
cjmb CGNEED(6) ='TG'
CMVONEED(1) ='UU'
CMVONEED(2) ='VV'
CMVONEED(3) ='TT'
CMVONEED(4) ='HU'
CMVONEED(5) ='ES'
CMVONEED(6) ='GZ'
CMVONEED(7) ='P0'
cjmb CMVONEED(8) ='TG'
c
CALL READNML
('NAMSTATE',IFLAG)
C
C* 3. Modify default values
C
300 CONTINUE
C
C* . 3.1 Spectral model state
C
310 CONTINUE
C
NVSP = 0
NVGD = 0
NVO3D = 0
NVSP2D = 0
NVG2D = 0
NVO2D = 0
C
C* For Chemical species
C
NSCMT = 0
NGCMT = 0
NOCMT = 0
DO JVAR = 1, JPNVARMAX
IF(CSNEED(JVAR).EQ.'QQ') THEN
NSEXIST(NSVOR) = 1
NVSP = NVSP + 1
ELSE IF(CSNEED(JVAR).EQ.'DD') THEN
NSEXIST(NSDIV) = 1
NVSP = NVSP + 1
ELSE IF(CSNEED(JVAR).EQ.'TT') THEN
NSEXIST(NSTT) = 1
NVSP = NVSP + 1
ELSE IF(CSNEED(JVAR).EQ.'HU') THEN
NSEXIST(NSQ) = 1
NVSP = NVSP + 1
ELSE IF(CSNEED(JVAR).EQ.'GZ') THEN
NSEXIST(NSGZ) = 1
NVSP = NVSP + 1
ELSE IF(CSNEED(JVAR).EQ.'P0') THEN
NSEXIST(NSPS) = 1
NVSP2D = NVSP2D + 1
ELSE IF(CSNEED(JVAR).EQ.'TG') THEN
NSEXIST(nstg) = 1
NVSP2D = NVSP2D + 1
C
C* Chemical species
C
ELSE
IF(CSNEED(JVAR).NE. ' ') THEN
NVSP = NVSP + 1
NSCMT = NSCMT+1
NSEXIST(NSTR(NSCMT)) = 1
CSCMT(NSCMT) = CSNEED(JVAR)
WRITE(NULOUT,*)'spectral ', CSNEED(JVAR), ' added'
ENDIF
END IF
C
C* . 3.2 Grid point model state
C
320 CONTINUE
C
IF(CGNEED(JVAR).EQ.'UU') THEN
NGEXIST(NGUU) = 1
NVGD = NVGD + 1
ELSE IF(CGNEED(JVAR).EQ.'VV') THEN
NGEXIST(NGVV) = 1
NVGD = NVGD + 1
ELSE IF(CGNEED(JVAR).EQ.'TT') THEN
NGEXIST(NGTT) = 1
NVGD = NVGD + 1
ELSE IF(CGNEED(JVAR).EQ.'HU') THEN
NGEXIST(NGQ) = 1
NVGD = NVGD + 1
ELSE IF(CGNEED(JVAR).EQ.'GZ') THEN
NGEXIST(NGGZ) = 1
NVGD = NVGD + 1
ELSE IF(CGNEED(JVAR).EQ.'P0') THEN
NGEXIST(NGPS) = 1
NVG2D = NVG2D + 1
ELSE IF(CGNEED(JVAR).EQ.'TG') THEN
NGEXIST(ngtg) = 1
NVG2D = NVG2D + 1
C
C* Chemical species
C
ELSE
IF(CGNEED(JVAR).NE. ' ') THEN
NVGD = NVGD + 1
NGCMT = NGCMT+1
NGEXIST(NGTR(NGCMT)) = 1
CGCMT(NGCMT) = CGNEED(JVAR)
WRITE(NULOUT,*)'grid ', CGNEED(JVAR), ' added'
ENDIF
END IF
C
C* . 3.3 Model state at the observation locations
C
330 CONTINUE
C
IF(CMVONEED(JVAR).EQ.'UU') THEN
NMVOEXIST(NOUU) = 1
NVO3D = NVO3D + 1
ELSE IF(CMVONEED(JVAR).EQ.'VV') THEN
NMVOEXIST(NOVV) = 1
NVO3D = NVO3D + 1
ELSE IF(CMVONEED(JVAR).EQ.'TT') THEN
NMVOEXIST(NOTT) = 1
NVO3D = NVO3D + 1
ELSE IF(CMVONEED(JVAR).EQ.'HU') THEN
NMVOEXIST(NOQ) = 1
NVO3D = NVO3D + 1
ELSE IF(CMVONEED(JVAR).EQ.'GZ') THEN
NMVOEXIST(NOGZ) = 1
NVO3D = NVO3D + 1
ELSE IF(CMVONEED(JVAR).EQ.'ES') THEN
NMVOEXIST(noes) = 1
NVO3D = NVO3D + 1
ELSE IF(CMVONEED(JVAR).EQ.'P0') THEN
NMVOEXIST(NOPS) = 1
NVO2D = NVO2D + 1
ELSE IF(CMVONEED(JVAR).EQ.'TG') THEN
NMVOEXIST(notg) = 1
NVO2D = NVO2D + 1
C
C* Chemical species
C
ELSE
IF(CMVONEED(JVAR).NE. ' ') THEN
NVO3D = NVO3D + 1
NOCMT = NOCMT+1
CMVOCMT(NOCMT) = CMVONEED(JVAR)
NMVOEXIST(NOTR(NOCMT)) = 1
WRITE(NULOUT,*)'obs. grid ', CMVONEED(JVAR), ' added'
ENDIF
END IF
C
END DO
C
C Final evaluation of the pseudo-indices for ...
C
C ... spectral model variable
C
IPOS = 1
DO JVAR = 1, JPNVARMAX
IF (NSVOR .EQ. JVAR) THEN
IF (NSEXIST(JVAR) .EQ. 1) THEN
NSVOR = IPOS
NSEXIST(IPOS) = 1
IPOS = IPOS + 1
ELSE
NSVOR = -9
ENDIF
ELSEIF(NSDIV .EQ. JVAR) THEN
IF (NSEXIST(JVAR) .EQ. 1) THEN
NSDIV = IPOS
NSEXIST(IPOS) = 1
IPOS = IPOS + 1
ELSE
NSDIV = -9
ENDIF
ELSEIF(NSQ .EQ. JVAR) THEN
IF (NSEXIST(JVAR) .EQ. 1) THEN
NSQ = IPOS
NSEXIST(IPOS) = 1
IPOS = IPOS + 1
ELSE
NSQ = -9
ENDIF
ELSEIF(NSGZ .EQ. JVAR) THEN
IF (NSEXIST(JVAR) .EQ. 1) THEN
NSGZ = IPOS
NSEXIST(IPOS) = 1
IPOS = IPOS + 1
ELSE
NSGZ = -9
ENDIF
ELSEIF(NSTT .EQ. JVAR) THEN
IF (NSEXIST(JVAR) .EQ. 1) THEN
NSTT = IPOS
NSEXIST(IPOS) = 1
IPOS = IPOS + 1
ELSE
NSTT = -9
ENDIF
ELSEIF(NSPS .EQ. JVAR) THEN
IF (NSEXIST(JVAR) .EQ. 1) THEN
NSPS = IPOS
NSEXIST(IPOS) = 1
IPOS = IPOS + 1
ELSE
NSPS = -9
ENDIF
elseif(nstg .eq. jvar) then
if (NSEXIST(jvar) .eq. 1) then
nstg = ipos
nsexist(ipos) = 1
ipos = ipos + 1
else
nstg = -9
endif
ELSE
DO JJ= 1,NCMTMAX
IF(NSTR(JJ) .EQ. JVAR) THEN
IF (NSEXIST(JVAR) .EQ. 1) THEN
NSTR(JJ) = IPOS
NSEXIST(IPOS) = 1
IPOS = IPOS + 1
ELSE
NSTR(JJ) = -9
ENDIF
ENDIF
ENDDO
ENDIF
ENDDO
C
IF(NSVOR .EQ. -9) THEN
NSVOR = IPOS
NSEXIST(IPOS) = 0
IPOS = IPOS + 1
ENDIF
IF(NSDIV .EQ. -9) THEN
NSDIV = IPOS
NSEXIST(IPOS) = 0
IPOS = IPOS + 1
ENDIF
IF(NSQ .EQ. -9) THEN
NSQ = IPOS
NSEXIST(IPOS) = 0
IPOS = IPOS + 1
ENDIF
IF(NSGZ .EQ. -9) THEN
NSGZ = IPOS
NSEXIST(IPOS) = 0
IPOS = IPOS + 1
ENDIF
IF(NSTT .EQ. -9) THEN
NSTT = IPOS
NSEXIST(IPOS) = 0
IPOS = IPOS + 1
ENDIF
DO JJ = 1, NCMTMAX
IF(NSTR(JJ) .EQ. -9) THEN
NSTR(JJ) = IPOS
NSEXIST(IPOS) = 0
IPOS = IPOS + 1
ENDIF
ENDDO
IF(NSPS .EQ. -9) THEN
NSPS = IPOS
NSEXIST(IPOS) = 0
IPOS = IPOS + 1
ENDIF
if(nstg .eq. -9) then
nstg = ipos
nsexist(ipos) = 0
ipos = ipos + 1
endif
C
C ... GRIDPOINT MODEL VARIABLE
C
CLMSG = 'SUSTATE: INCONSISTENT CGNEED AND CMVONEED IN NAMSTATE'
C
IPOS = 1
DO JVAR = 1, JPNVARMAX
IF (NGUU .EQ. JVAR) THEN
IF (NGEXIST(JVAR) .EQ. 1) THEN
NGUU = IPOS
NGEXIST(IPOS) = 1
IPOS = IPOS + 1
IF(NMVOEXIST(NOUU) .EQ. 0) THEN
CALL ABORT3D(NULOUT,CLMSG)
ENDIF
ELSE
NGUU = -9
ENDIF
ELSEIF(NGVV .EQ. JVAR) THEN
IF (NGEXIST(JVAR) .EQ. 1) THEN
NGVV = IPOS
NGEXIST(IPOS) = 1
IPOS = IPOS + 1
IF(NMVOEXIST(NOVV) .EQ. 0) THEN
CALL ABORT3D(NULOUT,CLMSG)
ENDIF
ELSE
NGVV = -9
ENDIF
ELSEIF(NGQ .EQ. JVAR) THEN
IF (NGEXIST(JVAR) .EQ. 1) THEN
NGQ = IPOS
NGEXIST(IPOS) = 1
IPOS = IPOS + 1
IF(NMVOEXIST(NOQ) .EQ. 0) THEN
CALL ABORT3D(NULOUT,CLMSG)
ENDIF
ELSE
NGQ = -9
ENDIF
ELSEIF(NGGZ .EQ. JVAR) THEN
IF (NGEXIST(JVAR) .EQ. 1) THEN
NGGZ = IPOS
NGEXIST(IPOS) = 1
IPOS = IPOS + 1
IF(NMVOEXIST(NOGZ) .EQ. 0) THEN
CALL ABORT3D(NULOUT,CLMSG)
ENDIF
ELSE
NGGZ = -9
ENDIF
ELSEIF(NGTT .EQ. JVAR) THEN
IF (NGEXIST(JVAR) .EQ. 1) THEN
NGTT = IPOS
NGEXIST(IPOS) = 1
IPOS = IPOS + 1
IF(NMVOEXIST(NOTT) .EQ. 0) THEN
CALL ABORT3D(NULOUT,CLMSG)
ENDIF
ELSE
NGTT = -9
ENDIF
ELSEIF(NGPS .EQ. JVAR) THEN
IF (NGEXIST(JVAR) .EQ. 1) THEN
NGPS = IPOS
NGEXIST(IPOS) = 1
IPOS = IPOS + 1
IF(NMVOEXIST(NOPS) .EQ. 0) THEN
CALL ABORT3D(NULOUT,CLMSG)
ENDIF
ELSE
NGPS = -9
ENDIF
elseif(ngtg .eq. jvar) then
if (NGEXIST(jvar) .eq. 1) then
ngtg = ipos
ngexist(ipos) = 1
ipos = ipos + 1
IF(NMVOEXIST(NOTG) .EQ. 0) THEN
CALL ABORT3D(NULOUT,CLMSG)
ENDIF
else
ngtg = -9
endif
ELSE
DO JJ= 1,NCMTMAX
IF(NGTR(JJ) .EQ. JVAR) THEN
IF (NGEXIST(JVAR) .EQ. 1) THEN
NGTR(JJ) = IPOS
NGEXIST(IPOS) = 1
IPOS = IPOS + 1
IF(NMVOEXIST(NOTR(JJ)) .EQ. 0) THEN
CALL ABORT3D(NULOUT,CLMSG)
ENDIF
ELSE
NGTR(JJ) = -9
ENDIF
ENDIF
ENDDO
ENDIF
ENDDO
C
IF(NGUU .EQ. -9) THEN
NGUU = IPOS
NGEXIST(IPOS) = 0
IPOS = IPOS + 1
ENDIF
IF(NGVV .EQ. -9) THEN
NGVV = IPOS
NGEXIST(IPOS) = 0
IPOS = IPOS + 1
ENDIF
IF(NGQ .EQ. -9) THEN
NGQ = IPOS
NGEXIST(IPOS) = 0
IPOS = IPOS + 1
ENDIF
IF(NGGZ .EQ. -9) THEN
NGGZ = IPOS
NGEXIST(IPOS) = 0
IPOS = IPOS + 1
ENDIF
IF(NGTT .EQ. -9) THEN
NGTT = IPOS
NGEXIST(IPOS) = 0
IPOS = IPOS + 1
ENDIF
DO JJ = 1, NCMTMAX
IF(NGTR(JJ) .EQ. -9) THEN
NGTR(JJ) = IPOS
NGEXIST(IPOS) = 0
IPOS = IPOS + 1
ENDIF
ENDDO
IF(NGPS .EQ. -9) THEN
NGPS = IPOS
NGEXIST(IPOS) = 0
IPOS = IPOS + 1
ENDIF
if(ngtg .eq. -9) then
ngtg = ipos
ngexist(ipos) = 0
ipos = ipos + 1
endif
C
C ... MODEL STATE AT THE OBSERVATION LOCATIONS
C
IPOS = 1
DO JVAR = 1, JPNVARMAX
IF (NOUU .EQ. JVAR) THEN
IF (NMVOEXIST(JVAR) .EQ. 1) THEN
NOUU = IPOS
NMVOEXIST(IPOS) = 1
IPOS = IPOS + 1
ELSE
NOUU = -9
ENDIF
ELSEIF(NOVV .EQ. JVAR) THEN
IF (NMVOEXIST(JVAR) .EQ. 1) THEN
NOVV = IPOS
NMVOEXIST(IPOS) = 1
IPOS = IPOS + 1
ELSE
NOVV = -9
ENDIF
ELSEIF(NOQ .EQ. JVAR) THEN
IF (NMVOEXIST(JVAR) .EQ. 1) THEN
NOQ = IPOS
NMVOEXIST(IPOS) = 1
IPOS = IPOS + 1
ELSE
NOQ = -9
ENDIF
ELSEIF(NOGZ .EQ. JVAR) THEN
IF (NMVOEXIST(JVAR) .EQ. 1) THEN
NOGZ = IPOS
NMVOEXIST(IPOS) = 1
IPOS = IPOS + 1
ELSE
NOGZ = -9
ENDIF
ELSEIF(NOTT .EQ. JVAR) THEN
IF (NMVOEXIST(JVAR) .EQ. 1) THEN
NOTT = IPOS
NMVOEXIST(IPOS) = 1
IPOS = IPOS + 1
ELSE
NOTT = -9
ENDIF
ELSEIF(NOES .EQ. JVAR) THEN
IF (NMVOEXIST(JVAR) .EQ. 1) THEN
NOES = IPOS
NMVOEXIST(IPOS) = 1
IPOS = IPOS + 1
ELSE
NOES = -9
ENDIF
ELSEIF(NOPS .EQ. JVAR) THEN
IF (NMVOEXIST(JVAR) .EQ. 1) THEN
NOPS = IPOS
NMVOEXIST(IPOS) = 1
IPOS = IPOS + 1
ELSE
NOPS = -9
ENDIF
elseif(notg .eq. jvar) then
if (NMVOEXIST(jvar) .eq. 1) then
notg = ipos
nmvoexist(ipos) = 1
ipos = ipos + 1
else
notg = -9
endif
ELSE
DO JJ= 1,NCMTMAX
IF(NOTR(JJ) .EQ. JVAR) THEN
IF (NMVOEXIST(JVAR) .EQ. 1) THEN
NOTR(JJ) = IPOS
NMVOEXIST(IPOS) = 1
IPOS = IPOS + 1
ELSE
NOTR(JJ) = -9
ENDIF
ENDIF
ENDDO
ENDIF
ENDDO
C
IF(NOUU .EQ. -9) THEN
NOUU = IPOS
NMVOEXIST(IPOS) = 0
IPOS = IPOS + 1
ENDIF
IF(NOVV .EQ. -9) THEN
NOVV = IPOS
NMVOEXIST(IPOS) = 0
IPOS = IPOS + 1
ENDIF
IF(NOQ .EQ. -9) THEN
NOQ = IPOS
NMVOEXIST(IPOS) = 0
IPOS = IPOS + 1
ENDIF
IF(NOGZ .EQ. -9) THEN
NOGZ = IPOS
NMVOEXIST(IPOS) = 0
IPOS = IPOS + 1
ENDIF
IF(NOTT .EQ. -9) THEN
NOTT = IPOS
NMVOEXIST(IPOS) = 0
IPOS = IPOS + 1
ENDIF
DO JJ = 1, NCMTMAX
IF(NOTR(JJ) .EQ. -9) THEN
NOTR(JJ) = IPOS
NMVOEXIST(IPOS) = 0
IPOS = IPOS + 1
ENDIF
ENDDO
IF(NOES .EQ. -9) THEN
NOES = IPOS
NMVOEXIST(IPOS) = 0
IPOS = IPOS + 1
ENDIF
IF(NOPS .EQ. -9) THEN
NOPS = IPOS
NMVOEXIST(IPOS) = 0
IPOS = IPOS + 1
ENDIF
if(notg .eq. -9) then
notg = ipos
nmvoexist(ipos) = 0
ipos = ipos + 1
endif
C
RETURN
END