!-------------------------------------- LICENCE BEGIN ------------------------------------
!Environment Canada - Atmospheric Science and Technology License/Disclaimer,
! version 3; Last Modified: May 7, 2008.
!This is free but copyrighted software; you can use/redistribute/modify it under the terms
!of the Environment Canada - Atmospheric Science and Technology License/Disclaimer
!version 3 or (at your option) any later version that should be found at:
!http://collaboration.cmc.ec.gc.ca/science/rpn.comm/license.html
!
!This software is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
!without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
!See the above mentioned License/Disclaimer for more details.
!You should have received a copy of the License/Disclaimer along with this software;
!if not, you can write to: EC-RPN COMM Group, 2121 TransCanada, suite 500, Dorval (Quebec),
!CANADA, H9P 1J3; or send e-mail to service.rpn@ec.gc.ca
!-------------------------------------- LICENCE END --------------------------------------
!
SUBROUTINE SUSTATE 1,10
#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.
*
** 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"
*
INTEGER JVAR, IFLAG, IPOS
character*53 clmsg
C
C* 1. Initialize to default values
C
100 CONTINUE
C
C Initialisation of the state variable numbers
C
C Spectral model variable numbers
nsvor = 1
nsdiv = 2
nsgz = 3
nstt = 4
nsq = 5
nsoz = 6
nstr = 7
nsps = 8
nstg = 9
C
C Gridpoint model variable numbers
nguu = 1
ngvv = 2
nggz = 3
ngtt = 4
ngq = 5
ngoz = 6
ngtr = 7
ngps = 8
ngtg = 9
C
C Model state at the observation locations
nouu = 1
novv = 2
nogz = 3
nott = 4
noq = 5
nooz = 6
notr = 7
noes = 8
nops = 9
notg = 10
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
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.'O3') THEN
NSEXIST(NSOZ) = 1
NVSP = NVSP + 1
ELSE IF(CSNEED(JVAR).EQ.'XT') THEN
NSEXIST(NSTR) = 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
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.'O3') THEN
NGEXIST(NGOZ) = 1
NGEXIST(ngoz) = 1
NVGD = NVGD + 1
ELSE IF(CGNEED(JVAR).EQ.'XT') THEN
NGEXIST(NGTR) = 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
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.'O3') THEN
NMVOEXIST(NOOZ) = 1
NVO3D = NVO3D + 1
ELSE IF(CMVONEED(JVAR).EQ.'XT') THEN
NMVOEXIST(NOTR) = 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
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(NSOZ .EQ. JVAR) THEN
IF (NSEXIST(JVAR) .EQ. 1) THEN
NSOZ = IPOS
NSEXIST(IPOS) = 1
IPOS = IPOS + 1
ELSE
NSOZ = -9
ENDIF
ELSEIF(NSTR .EQ. JVAR) THEN
IF (NSEXIST(JVAR) .EQ. 1) THEN
NSTR = IPOS
NSEXIST(IPOS) = 1
IPOS = IPOS + 1
ELSE
NSTR = -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
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
IF(NSOZ .EQ. -9) THEN
NSOZ = IPOS
NSEXIST(IPOS) = 0
IPOS = IPOS + 1
ENDIF
IF(NSTR .EQ. -9) THEN
NSTR = IPOS
NSEXIST(IPOS) = 0
IPOS = IPOS + 1
ENDIF
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(NGOZ .EQ. JVAR) THEN
IF (NGEXIST(JVAR) .EQ. 1) THEN
NGOZ = IPOS
NGEXIST(IPOS) = 1
IPOS = IPOS + 1
IF(NMVOEXIST(NOOZ) .EQ. 0) THEN
CALL ABORT3D
(NULOUT,CLMSG)
ENDIF
ELSE
NGOZ = -9
ENDIF
ELSEIF(NGTR .EQ. JVAR) THEN
IF (NGEXIST(JVAR) .EQ. 1) THEN
NGTR = IPOS
NGEXIST(IPOS) = 1
IPOS = IPOS + 1
IF(NMVOEXIST(NOTR) .EQ. 0) THEN
CALL ABORT3D
(NULOUT,CLMSG)
ENDIF
ELSE
NGTR = -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
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
IF(NGOZ .EQ. -9) THEN
NGOZ = IPOS
NGEXIST(IPOS) = 0
IPOS = IPOS + 1
ENDIF
IF(NGTR .EQ. -9) THEN
NGTR = IPOS
NGEXIST(IPOS) = 0
IPOS = IPOS + 1
ENDIF
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(NOOZ .EQ. JVAR) THEN
IF (NMVOEXIST(JVAR) .EQ. 1) THEN
NOOZ = IPOS
NMVOEXIST(IPOS) = 1
IPOS = IPOS + 1
ELSE
NOOZ = -9
ENDIF
ELSEIF(NOTR .EQ. JVAR) THEN
IF (NMVOEXIST(JVAR) .EQ. 1) THEN
NOTR = IPOS
NMVOEXIST(IPOS) = 1
IPOS = IPOS + 1
ELSE
NOTR = -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
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
IF(NOOZ .EQ. -9) THEN
NOOZ = IPOS
NMVOEXIST(IPOS) = 0
IPOS = IPOS + 1
ENDIF
IF(NOTR .EQ. -9) THEN
NOTR = IPOS
NMVOEXIST(IPOS) = 0
IPOS = IPOS + 1
ENDIF
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