SUBROUTINE CH_SUPREP 1,7
#if defined (DOC)
*
*s/r CH_SUPREP -FILTER CMA BEFORE 3D-VAR ANALYSIS
*
*Author : P. Koclas *CMC/AES September 1994
*Revision:
* P. Koclas *CMC/AES August 1995
* -Exclude T-Td ABOVE 300 Mbs
* P. Koclas *CMC/AES April 1996
* -print more information on rejected elements
* -set NCMLOBS
* -replace comstat by comtstato
* C.Charette *ARMA/AES Jan 1997
* -remove readnml. remove default values
* now done in suobs.ftn
* 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).
* C. Charette *ARMA/AES Oct 98.
* -Adapt code to the fact that pressure coordinate
* is in Pascal instead of Millibar in the CMA
* J. Halle *CMDA/AES Oct 1999
* -processing of TOVS data
* P. KOCLAS *CMC/CMDA JAN 2000
* -PRINT REJECT DATA IN MORE DETAIL
* C. Charette *ARMA/AES Jun 2000.
* -Added pointers and tables for surface elements
* J. Halle *CMC/CMDA Dec 2000
* - TOVS level 1B data.
* JM Belanger *CMDA/SMC june 2001.
* - 32 bits conversion.
* P. KOCLAS *cmda Sept 2001 .
* -changes to loops that set NCMLOBS PARAMETER
* -allow bogus gz data to analysis ( conf =141)
* S. Pellerin *ARMA/SMC Nov. 2001
* - Comment out conflicting ikout* unit
* C. Charette *ARMA/SMC Feb. 2002
* - Removed conflicting ikout* unit
* J. Halle *CMDA/SMC May 2002
* - allow T-Td observations up to 70mbs.
* - adapt to RTTOV-7
* N. Wagneur *CMDA/MSC June 2002
* -processing of GOES data
* J. Halle *CMDA/SMC april 2003
* -use RLIMLVHU, which is the top level of humidity analysis (mbs).
* C. Charette - ARMA/SMC - Jun. 2003
* - Conversion to hybrid vertical coordinate
* D. Anselmo *ARMA/SMC October 2004
* -set NCMASS to exclude assimilation of RAOBS and surface ln q
* added to CMA by estohu.ftn
* -define NCMPOS for ln q, ln q at surface
* Y. Yang Oct. 2003
* - Accommodate multiple species
* Y. Yang Aug. 2004
* - Add filtering for chemistry data that are above model top
* For this, add calculation of model top level pressure
* - Filter out satellite data with solar zenith angle
* larger than a specific value
* - Separate output of summary of species observation
* - Special treatment for species when recording the pointer
* NCMPOS that indicates the position of the trial field
* variable within GOMOBS
* Y. Yang Feb. 2005
* - Removal of 'OZ' as it is now part of 'TR'.
* Y.J. Rochon *ARQX/MSC July 2005, Feb 2006
* - Adjustments of rejection and selection criteria and
* output for 'TR' family.
* - Added consideration of MODATA(NCMCORD1,*). Its value
* is only set for 'TR' obs and would be
* zero by default (for dynamics).
* C. Charette *ARMA/AES Jun 2006.
* -Introduced JPNNIV and split the layer 10-0 mb
* into the layers 10-1 and 1-0 mb in the
* statistical tables
* Y.J. Rochon *ARQX/EC June 2008
* -Addition of NEDW, IKNTDWA, IKNTDWR, DW, and 011200 for
* Doppler wind speed obs.
* -Removed OZ, IKNTOA, IKNTOR
* Y.J. Rochon *ARQX/EC Jan 2010
* -Added use if CH_KGETPOS
*
** Purpose:
* -Select the data in the CMA file which is to be
C assimilated
* by the 3D-var.
* -Set "NCMPOS" of CMA as pointers to U V and T of GOMOBS
* -Set "Transformed latitude" with ISRCHILA
* -Set NCMLOBS: RELATIVE POSTION OF DATA WITH RESPECT TO A
* FULL SOUNDING. (Dependent on data family)
*
*Arguments
* none
*
#endif
use mod_tovs
*
IMPLICIT NONE
*implicits
*
#include "comct0.cdk"
#include "partov.cdk"
#include "comtov.cdk"
#include "comdimo.cdk"
#include "comlun.cdk"
#include "comdim.cdk"
#include "comleg.cdk"
#include "comnumbr.cdk"
#include "cparbrp.cdk"
#include "comoabdy.cdk"
#include "comoahdr.cdk"
#include "comchem.cdk"
#include "comoba.cdk"
#include "commvo.cdk"
#include "comfilt.cdk"
#include "comstato.cdk"
#include "cvcord.cdk"
#include "pardim.cdk"
#include "comgem.cdk"
#include "comcst.cdk"
#include "comstate.cdk"
#include "comtovst.cdk"
#include "comvfiles.cdk"
#include "cparamgoes.cdk"
#include "comgoes.cdk"
#include "comgoesst.cdk"
#include "comvarqc.cdk"
#include "comgd0.cdk"
#include "rpnstd.cdk"
C
C ....... DEFINITION OF A FEW BUFR ELEMENTS ..........................
C ....
C NAME BUFR CODE
C HEIGHT 0 10 194
C TEMPERATURE 0 12 001
C TEMPERATURE AT 2M 0 12 004
C T - TD 0 12 192
C T - TD AT 2M 0 12 203
C WIND DIRECTION 0 11 001
C WIND SPEED 0 11 002
C U-COMPONENT 0 11 003
C V-COMPONENT 0 11 004
C WIND DIRECTION AT 10M 0 11 011
C WIND SPEED AT 10M 0 11 012
C U-COMPONENT AT 10M 0 11 215
C V-COMPONENT AT 10M 0 11 216
C PRESSURE 0 07 004
C MSL PRESSURE 0 10 051
C STATION PRESSURE 0 10 004
C BRIGHTNESS TEMPERATURE 0 12 062
C BRIGHTNESS TEMPERATURE 0 12 063
C BRIGHTNESS TEMPERATURE 0 12 163
C Doppler wind speed 0 11 200
C
C ........ Quality control flags bit definitions (see ADE BANCO
C document)
C BIT #
C 1 'RESERVED '
C 2 'RESERVED '
C 3 'GENERATED OI'
C 4 'REJECTION OI'
C 5 'BLACK LIST '
C 6 'RESERVED '
C 7 'RESERVED '
C 8 'INTERPOL EL'
C 9 'DOUBTFUL EL'
C 10 'MODIFIED EL'
C 11 'CLIMAT XTRM'
C 12 'ERRONEOUS EL'
C 13 'RESERVED '
C
INTEGER JPNNIV
PARAMETER (JPNNIV=18)
REAL*8 ZZLAT, ZLON, ZLEV, ZVAR
REAL*8 ZLAT
REAL*8 DLLAO
INTEGER IZLEV,IZP1,IZXI
INTEGER LL,JJ,JI
CHARACTER*2 CLFAM,CLFAMSAV
CHARACTER*8 CLFILNAM
CHARACTER*35 CREASON(-7:13)
CHARACTER*90 CELLIST, CSFLIST
CHARACTER*120 CTRPROFLIST, CLIST
CHARACTER*120 CTRTCOLLIST
INTEGER IOBS,IDATYP,IVCO,IOBSTYP
INTEGER ILA,ISRCHILA,IPRES,IPRESMB
INTEGER IERR, JD,JDATA,JO,JJO,JK,J
INTEGER IJ,ITY,IDBURP,ITYP,IFLG,IBIT,IBAD,IKNT,IBEGIN,ILAST
INTEGER IDATA,IDATEND,FNOM,FCLOS
INTEGER ILANSEA,IPROCES,INDXREG,INDXCLD,ICHN
INTEGER INDXSAT,ISAT,INDCH,INDXM
integer index,ibin(JPNNIV),IBINS,isum,INIV(JPNNIV)
LOGICAL LLOK,LLREJ,LLEV,LLBOGUS
INTEGER ISRCHEQ
INTEGER ISOLARZA,CH_KGETPOS
EXTERNAL ISRCHEQ,CH_KGETPOS
INTEGER vfstlir, ezgprm, fstinf, fstprm
REAL*8 pmodtop, ptop, pbtm, pobs
INTEGER IP1, IP2, IP3
REAL*8 et
LOGICAL LFILT
REAL*8 BUFS(1,1)
pointer (pbufs,bufs)
integer key, ip0id
integer inbitstr
INTEGER itrcode, npos
C
INTEGER IKNTDSA,IKNTFSA,IKNTUSA,IKNTVSA,IKNTTSA,IKNTESSA,IKNTPSA
& ,IKNTPNA
INTEGER IKNTDSR,IKNTFSR,IKNTUSR,IKNTVSR,IKNTTSR,IKNTESSR,IKNTPSR
& ,IKNTPNR
INTEGER IKNTFFR(JPNNIV),IKNTDDR(JPNNIV),IKNTUR(JPNNIV)
& ,IKNTVR(JPNNIV),IKNTZR(JPNNIV),IKNTTR(JPNNIV),IKNTER(JPNNIV)
& ,IKNTDR(JPNNIV),IKNTBTR(JPNNIV),IKNTDWR(JPNNIV)
INTEGER IKNTFFA(JPNNIV),IKNTDDA(JPNNIV),IKNTUA(JPNNIV)
& ,IKNTVA(JPNNIV),IKNTZA(JPNNIV),IKNTTA(JPNNIV),IKNTEA(JPNNIV)
& ,IKNTDA(JPNNIV),IKNTBTA(JPNNIV),IKNTDWA(JPNNIV)
INTEGER IKNTTRR(JPNNIV,NCMTMAX), IKNTTRCOLR(NCMTMAX)
INTEGER IKNTTRA(JPNNIV,NCMTMAX), IKNTTRCOLA(NCMTMAX)
C
DATA INIV/1000,925,850,700,500,400,300,250,200,150,100,070,050,
& 030,020,010,001,000/
DATA CREASON/'ABS OROGRAPH-PHI ','MASQUE TERRE-MER '
& ,'OROGRAPHIE ','REJECTED BY QCVAR '
& ,'REJECTED BY BACKGROUND GCHECK '
& ,'BACKGROUND CHECK LEVEL 3 ','BACKGROUND CHECK LEVEL 2 '
& ,'BACKGROUND GHECK LEVEL 1 ','RESERVED '
& ,'REJECTED BY SELECTION PROCESS ','GENERATED BY OI '
& ,'REJECTION BY OI','ELEMENT ON BLACK LIST ','RESERVED '
& ,'CORRECTED ELEMENT','INTERPOLATED ELEMENT'
& ,'DOUBTFUL ELEMENT','POSSIBLY ERRONEOUS ELEMENT '
& ,'ERRONEOUS ELEMENT','ELEMENT EXCEEDS CLIMATE EXTREME'
& ,'ELEMENT MODIFIED OR GEN BY ADE'/
C-----------------------------------------------------------------------
DO JK=1,JPNNIV
IKNTFFR(JK)=0
IKNTDDR(JK)=0
IKNTUR(JK)=0
IKNTVR(JK)=0
IKNTZR(JK)=0
IKNTTR(JK)=0
IKNTER(JK)=0
IKNTDR(JK)=0
IKNTBTR(JK)=0
IKNTDWR(JK)=0
DO LL = 1,NCMTMAX
IKNTTRR(JK,LL)=0
ENDDO
C
IKNTFFA(JK)=0
IKNTDDA(JK)=0
IKNTUA(JK)=0
IKNTVA(JK)=0
IKNTZA(JK)=0
IKNTTA(JK)=0
IKNTEA(JK)=0
IKNTDA(JK)=0
IKNTBTA(JK)=0
IKNTDWA(JK)=0
DO LL = 1,NCMTMAX
IKNTTRA(JK,LL)=0
ENDDO
C
IBIN(JK)=0.
ENDDO
C
IKNTDSA =0
IKNTFSA =0
IKNTUSA =0
IKNTVSA =0
IKNTTSA =0
IKNTESSA=0
IKNTPSA =0
IKNTPNA =0
DO LL = 1,NCMTMAX
IKNTTRCOLA(LL) = 0
ENDDO
C
IKNTDSR =0
IKNTFSR =0
IKNTUSR =0
IKNTVSR =0
IKNTTSR =0
IKNTESSR=0
IKNTPSR =0
IKNTPNR =0
DO LL = 1,NCMTMAX
IKNTTRCOLR(LL)=0
ENDDO
IBINS =0
C
WRITE(NULOUT,'(1X,"SUBROUTINE CH_SUPREP")')
WRITE(NULOUT,'(1X,"-----------------",/)')
WRITE(NULOUT,'(1X,"***********************************")')
WRITE(NULOUT,'(1X," ELEMENTS SELECTED FOR ASSIMILATION:",/)')
WRITE(NULOUT,'(1X,"***********************************")')
DO JD=1,NELEMS
WRITE(NULOUT,'(15X,I5,/)') NLIST(JD)
END DO
WRITE(NULOUT,'(1X,"***********************************")')
WRITE(NULOUT,*) ' REJECT ELEMENTS WITH REJECT FLAG '
WRITE(NULOUT,*)' BIT : '
DO JD=1,NFLAGS
IBIT= NLISTFLG(JD)
WRITE(NULOUT,*) IBIT,' ',CREASON(IBIT)
END DO
WRITE(NULOUT,'(1X,"***********************************")')
C
100 CONTINUE
C
C 2. Put observation number in each data of CMA file. Find
C largest number of data contained in any observation(NMAXLEN).
C
C Displace observations located between poles and the last row
C of the grid being used to the last row when cvcord not equal to MAM.
C For MAM the wind observations are removed.
IF (CVCORD(1:3).NE.'MAM') THEN
DO JO = 1, NOBTOT
ZLAT = ROBHDR(NCMLAT,JO)
IF(ZLAT .GT. RLATI(1)) THEN
ROBHDR(NCMLAT,JO) = RLATI(1)
ELSEIF(ZLAT .LT. RLATI(NJ)) THEN
ROBHDR(NCMLAT,JO) = RLATI(NJ)
ENDIF
END DO
ENDIF
C
IJ=0
NMAXLEN=0
DO JJO = 1, NOBTOT
IDATA = MOBHDR(NCMRLN,JJO)
IDATEND = MOBHDR(NCMNLV,JJO) + IDATA - 1
NMAXLEN = MAX( MOBHDR(NCMNLV,JJO),NMAXLEN )
DO JDATA= IDATA, IDATEND
IJ = IJ+1
MOBDATA(NCMOBS,IJ)= JJO
END DO
C
DLLAO=DBLE(ROBHDR(NCMLAT,JJO))
ILA = ISRCHILA (DLLAO)
MOBHDR(NCMTLA,JJO)=ILA
END DO
C
200 CONTINUE
C
C 3. filter data in CMA file
C . -----------------------
IKNT=0
CLFAMSAV=CFAMTYP(1)
CELLIST
& =' FF DD UU VV GZ TT ES DZ'
& //' BT DW '
CSFLIST
& =' FS DS US VS TS ES PS PN '
CTRPROFLIST = ''
NPOS = 2
DO JJ = 1, NCMTASSI
IF (NETR(JJ).EQ.nvnumb(58)) THEN
CTRPROFLIST(NPOS:NPOS+7) = ' '//'DW'//' '
ELSE
CTRPROFLIST(NPOS:NPOS+7) = ' '//CNAMANAL(JJ)//' '
END IF
NPOS = NPOS +8
ENDDO
C
CTRTCOLLIST = ''
NPOS = 2
DO JJ = 1, NCMTASSI
IF (NETR(JJ).EQ.nvnumb(58)) THEN
CTRPROFLIST(NPOS:NPOS+7) = ' '//'DW'//' '
ELSE
CTRPROFLIST(NPOS:NPOS+7) = ' '//CNAMANAL(JJ)//' '
END IF
NPOS = NPOS +8
ENDDO
C
C get surface pressure for use in calculating top pressure
C
c suface pressure at model points -- gomps has not been filled yet
c so first read in P0 from trial field
C
IP1 = -1
IP2 = -1
IP3 = -1
IDATEO = -1
CLTYPVAR = ' '
CLETIKET = ' '
c
ip0id = FSTINF(ninmpg,INI,INJ,INK,idateo
& ,cletiket,ip1,ip2,ip3,cltypvar,'P0')
if (ip0id.lt.0) then
write(nulout,*) ' in suprep, Problems finding variable P0'
stop
else
call hpalloc(pbufs,max(ini*inj,1),ierr,8)
KEY = VFSTLIR
(BUFS,ninmpg,INI,INJ,INK,IDATEO,CLETIKET,
+ IP1,IP2,IP3,CLTYPVAR,'P0')
C
C get field info
C
c ierr = ezgprm(ip0id,TYPVAR,ini,inj,iig1,iig2,iig3,iig4)
ierr = FSTPRM(ip0id, IDATEO, IDEET, IPAS, INI, INJ, INK, INBITSTR,
& IDATYP,IP1,IP2, IP3, CLTYPVAR, CLNOMVAR, CLETIKET, CLGRTYP,
& IG1, IG2,IG3,IG4, ISWA, ILENGTH, IDLTF, IUBC, IEXTR1,
& IEXTR2,IEXTR3)
endif
if(NGEXIST(ngps).eq.1) then
CALL INITGD0
(BUFS,1,INI,INJ,IG2,'P0')
call gd2mvo
('PS',1)
else
write(nulout, *) '!!! warning !!! in suprep: ps should be a model variable! '
endif
et=rptopinc/rprefinc
C
DO J = 1,NFILES
CLFILNAM='KOUNTR'//CFAMTYP(J)
IF ( NBEGINTYP(J) .GT. 0) THEN
IBEGIN=NBEGINTYP(J)
ILAST=NENDTYP(J)
CLFAMSAV =CFAMTYP(J)
C
DO JK=1,JPNNIV
IKNTFFR(JK)=0
IKNTDDR(JK)=0
IKNTUR(JK)=0
IKNTVR(JK)=0
IKNTZR(JK)=0
IKNTTR(JK)=0
IKNTER(JK)=0
IKNTDR(JK)=0
IKNTBTR(JK)=0
IKNTDWR(JK)=0
DO LL = 1, NCMTMAX
IKNTTRR(JK,LL)=0
ENDDO
IKNTFFA(JK)=0
IKNTDDA(JK)=0
IKNTUA(JK)=0
IKNTVA(JK)=0
IKNTZA(JK)=0
IKNTTA(JK)=0
IKNTEA(JK)=0
IKNTDA(JK)=0
IKNTBTA(JK)=0
IKNTDWA(JK)=0
DO LL = 1, NCMTMAX
IKNTTRA(JK,LL)=0
ENDDO
END DO
IKNTDSA =0
IKNTFSA =0
IKNTUSA =0
IKNTVSA =0
IKNTTSA =0
IKNTESSA=0
IKNTPSA =0
IKNTPNA =0
DO LL = 1, NCMTMAX
IKNTTRCOLA(LL) =0
ENDDO
C
IKNTDSR =0
IKNTFSR =0
IKNTUSR =0
IKNTVSR =0
IKNTTSR =0
IKNTESSR=0
IKNTPSR =0
IKNTPNR =0
DO LL = 1, NCMTMAX
IKNTTRCOLR(LL) =0
ENDDO
C
DO JDATA=IBEGIN,ILAST
ITYP = MOBDATA(NCMVNM,JDATA)
IFLG = MOBDATA(NCMFLG,JDATA)
IPRES= NINT(ROBDATA8(NCMPPP,JDATA))
IOBS = MOBDATA(NCMOBS,JDATA)
IVCO = MOBDATA(NCMVCO,JDATA)
IOBSTYP = MOBDATA(NCMCORD1,JDATA)
ITRCODE =MOBDATA(NCMSPEC,JDATA)
ITY=MOBHDR(NCMITY,IOBS)
IDBURP=MOD(ITY,1000)
C
C a. Unwanted data types via types specified in NLIST
C
LLEV=.TRUE.
LLOK = .FALSE.
LLBOGUS=(IDBURP .eq. 150 .or. IDBURP .eq. 151 .or. IDBURP
& .eq. 152 .or. IDBURP .eq. 153)
DO JD =1,NELEMS
LLOK=( (ITYP .EQ. NLIST(JD)) .AND. LLEV ) .OR. LLOK
END DO
*
*pik ALLOW GZ FOR BOGUS DATA ONLY in analysis case ( nconf 141)
*
if ( nconf .eq. 141 .and. llok .and. (ityp .eq. negz) .and.
& .not. llbogus ) then
llok=.false.
endif
*
*pik
C
C Process data reported in pressure coordinate
C
IF (IVCO.EQ.2.AND.(IOBSTYP.EQ.0.OR.IOBSTYP.EQ.1)) THEN
C
C b. Exclude T-Td above level RLIMLVHU (mbs)
C
IF ( (ITYP .EQ. NEES) .AND.
& (IPRES .LT. NINT(RLIMLVHU*100)) ) LLOK=.FALSE.
C
C c. Bad data with quality control flags via bit list
C specified in NLISTFLG
C
IPRESMB=ipres/100
DO INDEX=JPNNIV-1,1,-1
if (IPRESMB.le.INIV(INDEX)) EXIT
END DO
if (ipresmb.gt.iniv(1)) index=1
ibin(index)=ibin(index) +1
ENDIF
C
LLREJ = .FALSE.
C
DO JD=1,NFLAGS
IBAD= 13-NLISTFLG(JD)
LLREJ=( BTEST(IFLG,IBAD) ) .OR. LLREJ
END DO
C
C d. Filter TOVS data
C
ITYP = MOBDATA(NCMVNM,JDATA)
IF ( ITYP .EQ. NBT1 .OR.
S ITYP .EQ. NBT2 .OR.
S ITYP .EQ. NBT3 .AND.
S (IDATYP .EQ. 164 .OR. IDATYP .EQ. 181) ) THEN
C
C d.1 Valid channel?
C
ICHN = NINT(ROBDATA8(NCMPPP,JDATA))
IF ( ICHN .LE. 0 .OR.
S ICHN .GT. JPCH ) THEN
LLOK = .FALSE.
ENDIF
C
C d.2 Data from this satellite to be assimilated?
C
C .....this check not done anymore, jh may 2002....
C
C d.3 Invalid land/sea/sea-ice flag, processing technique
C
ILANSEA = MOBHDR(NCMOFL,IOBS)
INDXM = ILANSEA
IF (INDXM .EQ. 2 ) INDXM = 0
INDXREG = ISRCHEQ(MLISREG,NREGST,INDXM)
IPROCES = MOBHDR(NCMITY,IOBS)/1000000
INDXCLD = ISRCHEQ(MLISCLD,NCLDST,IPROCES)
IF ( INDXREG .EQ.0 .OR. INDXCLD .EQ.0 ) THEN
LLOK = .FALSE.
ENDIF
C
C d.4 Channel not included in list of channels to
C be assimilated
C
C .....this check not done anymore, jh may 2002....
ENDIF
C
C
C e. Filter GOES data
C
ITYP = MOBDATA(NCMVNM,JDATA)
IDATYP = MOD(MOBHDR(NCMITY,IOBS),1000)
IF ( ITYP .EQ. NBT1
S .OR. ITYP .EQ. NBT2
S .OR. ITYP .EQ. NBT3
S .AND. IDATYP .EQ. 180 ) THEN
C
C e.1 Valid channel?
C
ICHN = NINT(ROBDATA8(NCMPPP,JDATA))
IF ( ICHN .LE. 0 .OR.
S ICHN .GT. JPCHGO ) THEN
LLOK = .FALSE.
ENDIF
C
C e.2 Data from this satellite to be assimilated?
C
ISAT = MOD(MOBHDR(NCMITY,IOBS)/1000,1000)
ISAT = ISAT-244
INDXSAT = ISRCHEQ(NIDSATGO,NSATGO,ISAT)
IF ( INDXSAT .EQ. 0 ) THEN
LLOK = .FALSE.
ENDIF
C
C
C
C e.3 Invalid land/sea flag
C
C A modifier selon le canal
C
ILANSEA = MOBHDR(NCMOFL,IOBS)
INDXREG = ISRCHEQ(MLISREGGO,NREGSTGO,ILANSEA)
IPROCES = MOBHDR(NCMITY,IOBS)/1000000
INDXCLD = ISRCHEQ(MLISCLDGO,NCLDSTGO,IPROCES)
C
C e.4 Channel not included in list of channels to
C be assimilated
C
IF (LLOK) THEN
INDCH=ISRCHEQ(MLISCHNAGO(1,INDXCLD,INDXREG,INDXSAT),
S NCHNAGO(INDXCLD,INDXREG,INDXSAT),ICHN)
IF ( INDCH .EQ. 0 ) THEN
LLOK = .FALSE.
ENDIF
ENDIF
ENDIF
C
C f. Exclude measurements with very large solar zenith angles.
C
IF (.NOT.LLREJ.AND.CFAMTYP(J).EQ.'TR') THEN
ITYP = MOBDATA(NCMVNM,JDATA)
IDATYP = MOD(MOBHDR(NCMITY,IOBS),1000)
DO LL= 1,NCMTASSI
IF (ITYP .EQ. NETR(LL)
S .AND. MOBHDR(NCMBOX,IOBS) .GT. 0 ) THEN
ISOLARZA = MOBHDR(NCMBOX,IOBS)/10000
IF (ISOLARZA .GT. INT(MAXFILTSZA*100)) THEN
LLREJ = .TRUE.
ENDIF
go to 700
ENDIF
ENDDO
700 continue
END IF
C
C g. Filter out the observations that are higher than the top model level
C
c g.1 Determine which obs. family should be filtered. for now only the
C species data are to be filtered.
C
LFILT = .FALSE.
IF (.NOT.LLREJ.AND.CFAMTYP(J).EQ.'TR') THEN
DO LL= 1,NCMTASSI
IF( ITYP .EQ. NETR(LL)) LFILT = .TRUE.
ENDDO
END IF
if (.NOT.LLREJ.AND.LFILT) then
C
C g.2. Set flag
C
IF (MOBDATA(NCMASS,JDATA).EQ.0) THEN
C
C Obs rejected in CH_CMABDY
C
LLREJ=.TRUE.
C
ELSE IF (IVCO.eq.2.AND.(IOBSTYP.EQ.0.OR.IOBSTYP.EQ.1)) THEN
C
c Calculate the model top pressure
C
pmodtop = rprefinc*vhybinc(1)+(gomps(1,iobs)-rprefinc)
+ *((vhybinc(1)-et)/(1.0-et))**rcoefinc
C
C Observation element in presure coordinate
C
IF (ROBDATA8(NCMPOB,JDATA).lt.0.0) then
C
C Observation element is point value.
C
LLREJ = .FALSE.
POBS = ROBDATA8(NCMPPP, JDATA)
if (pobs .lt. pmodtop) then
LLREJ = .TRUE.
MOBDATA(NCMFLG,JDATA)=2048+MOBDATA(NCMFLG,JDATA)
endif
else
C
C Observation element is layer average or integral.
C Have upper and lower boundaries.
C
PTOP = ROBDATA8(NCMPPP, JDATA)
PBTM = ROBDATA8(NCMPOB,JDATA)
if (ptop.lt.pmodtop.and.pbtm.lt.pmodtop*10.0) then
LLREJ = .TRUE.
MOBDATA(NCMFLG,JDATA)=2048+MOBDATA(NCMFLG,JDATA)
endif
END IF
END IF
C
endif !(LFILT)
C
IF ( ITYP .EQ. NEHU .or. ITYP .EQ. NEHS ) LLOK=.FALSE.
C
IF ( LLOK .AND..NOT. LLREJ ) THEN
IF (IVCO .EQ. 2.AND.(IOBSTYP.EQ.0.OR.IOBSTYP.EQ.1)) THEN
IF (CFAMTYP(J).NE.'TR') THEN
IF( ITYP .EQ. NEFF) IKNTFFA(INDEX)=IKNTFFA(INDEX) + 1
IF( ITYP .EQ. NEDD) IKNTDDA(INDEX)=IKNTDDA(INDEX) + 1
IF( ITYP .EQ. NEUU) IKNTUA(INDEX)=IKNTUA(INDEX) + 1
IF( ITYP .EQ. NEVV) IKNTVA(INDEX)=IKNTVA(INDEX) + 1
IF( ITYP .EQ. NEGZ) IKNTZA(INDEX)=IKNTZA(INDEX) + 1
IF( ITYP .EQ. NETT) IKNTTA(INDEX)=IKNTTA(INDEX) + 1
IF( ITYP .EQ. NEES) IKNTEA(INDEX)=IKNTEA(INDEX) + 1
IF( ITYP .EQ. NEDZ) IKNTDA(INDEX)=IKNTDA(INDEX) + 1
IF( ITYP .EQ. NBT1) IKNTBTA(INDEX)=IKNTBTA(INDEX) + 1
IF( ITYP .EQ. NBT2) IKNTBTA(INDEX)=IKNTBTA(INDEX) + 1
IF( ITYP .EQ. NBT3) IKNTBTA(INDEX)=IKNTBTA(INDEX) + 1
IF( ITYP .EQ. NEDW) IKNTDWA(INDEX)=IKNTDWA(INDEX) + 1
ELSE
LL=CH_KGETPOS
(ITYP,ITRCODE,CSTNID(IOBS))
IF (LL.GT.0) IKNTTRA(INDEX,LL)=IKNTTRA(INDEX,LL) + 1
END IF
ELSE IF (IVCO.GT.0) THEN
IF (CFAMTYP(J).NE.'TR') THEN
IF( ITYP .EQ. NEDS) IKNTDSA=IKNTDSA + 1
IF( ITYP .EQ. NEFS) IKNTFSA=IKNTFSA + 1
IF( ITYP .EQ. NEUS) IKNTUSA=IKNTUSA + 1
IF( ITYP .EQ. NEVS) IKNTVSA=IKNTVSA + 1
IF( ITYP .EQ. NETS) IKNTTSA=IKNTTSA + 1
IF( ITYP .EQ. NESS) IKNTESSA=IKNTESSA + 1
IF( ITYP .EQ. NEPS) IKNTPSA=IKNTPSA + 1
IF( ITYP .EQ. NEPN) IKNTPNA=IKNTPNA + 1
ELSE
LL=CH_KGETPOS
(ITYP,ITRCODE,CSTNID(IOBS))
IF (LL.GT.0) IKNTTRCOLA(LL)=IKNTTRCOLA(LL) + 1
END IF
IBINS = IBINS + 1
ENDIF
ELSE IF ( LLOK .AND. LLREJ ) THEN
IF (IVCO.EQ.2.AND.(IOBSTYP.EQ.0.OR.IOBSTYP.EQ.1)) THEN
IF (CFAMTYP(J).NE.'TR') THEN
IF( ITYP .EQ. NEFF) IKNTFFR(INDEX)=IKNTFFR(INDEX) + 1
IF( ITYP .EQ. NEDD) IKNTDDR(INDEX)=IKNTDDR(INDEX) + 1
IF( ITYP .EQ. NEUU) IKNTUR(INDEX)=IKNTUR(INDEX) + 1
IF( ITYP .EQ. NEVV) IKNTVR(INDEX)=IKNTVR(INDEX) + 1
IF( ITYP .EQ. NEGZ) IKNTZR(INDEX)=IKNTZR(INDEX) + 1
IF( ITYP .EQ. NETT) IKNTTR(INDEX)=IKNTTR(INDEX) + 1
IF( ITYP .EQ. NEES) IKNTER(INDEX)=IKNTER(INDEX) + 1
IF( ITYP .EQ. NEDZ) IKNTDR(INDEX)=IKNTDR(INDEX) + 1
IF( ITYP .EQ. NBT1) IKNTBTR(INDEX)=IKNTBTR(INDEX) + 1
IF( ITYP .EQ. NBT2) IKNTBTR(INDEX)=IKNTBTR(INDEX) + 1
IF( ITYP .EQ. NBT3) IKNTBTR(INDEX)=IKNTBTR(INDEX) + 1
IF( ITYP .EQ. NEDW) IKNTDWR(INDEX)=IKNTDWR(INDEX) + 1
ELSE
LL=CH_KGETPOS
(ITYP,ITRCODE,CSTNID(IOBS))
IF (LL.GT.0) IKNTTRR(INDEX,LL)=IKNTTRR(INDEX,LL) + 1
END IF
ELSEIF (IVCO.GT.0) THEN
IF (CFAMTYP(J).NE.'TR') THEN
IF( ITYP .EQ. NEDS) IKNTDSR=IKNTDSR + 1
IF( ITYP .EQ. NEFS) IKNTFSR=IKNTFSR + 1
IF( ITYP .EQ. NEUS) IKNTUSR=IKNTUSR + 1
IF( ITYP .EQ. NEVS) IKNTVSR=IKNTVSR + 1
IF( ITYP .EQ. NETS) IKNTTSR=IKNTTSR + 1
IF( ITYP .EQ. NESS) IKNTESSR=IKNTESSR + 1
IF( ITYP .EQ. NEPS) IKNTPSR=IKNTPSR + 1
IF( ITYP .EQ. NEPN) IKNTPNR=IKNTPNR + 1
ELSE
LL=CH_KGETPOS
(ITYP,ITRCODE,CSTNID(IOBS))
IF (LL.GT.0) IKNTTRCOLR(LL)=IKNTTRCOLR(LL) + 1
END IF
IBINS = IBINS + 1
ENDIF
ENDIF
C
IF (LLOK .AND. .NOT. LLREJ) THEN
MOBDATA(NCMASS,JDATA)=1
IKNT= IKNT + 1
ELSE
MOBDATA(NCMASS,JDATA)=0
ENDIF
CSMP
CSMP e. Filter UU, VV data close to poles FOR MAM (June 18, 2001)
CSMP
IF (CVCORD(1:3).EQ.'MAM') THEN
ZLAT = ROBHDR(NCMLAT,IOBS)
ZZLAT = ZLAT*180./RPI
ZLON = ROBHDR(NCMLON,IOBS)*180./RPI
ZVAR = ROBDATA(NCMVAR,JDATA)
ZLEV = ROBDATA(NCMPPP,JDATA)*0.01
IF(ZLAT .GT. RLATI(1) .or. ZLAT .LT. RLATI(NJ)) THEN
IF (ITYP .EQ. NEUU .OR. ITYP .EQ. NEVV ) THEN
write(NULOUT,98) IOBS,ZZLAT,ZLON,ZLEV,ZVAR,ITYP
MOBDATA(NCMASS,JDATA) = 0
ENDIF
ENDIF
98 format(1x,'CH_SUPREP REMOVED: IOBS,ZLAT,ZLON,ZLEV,ZVAR= '
& ,I5,2x,2(F8.2,2x),F5.0,2x,F11.4,2x,I6)
ENDIF
C
END DO
C
ENDIF
cpik END DO
C
write(NULOUT,'(5x,a8,2x,a2,2x,a12)')CBURP(j), CFAMTYP(j)
& ,'DATA FAMILY'
WRITE(NULOUT
& ,'(12x," ")')
WRITE(NULOUT
& ,'(12x," NUMBER OF REJECTED DATA PRESSURE COORD")')
WRITE(NULOUT
& ,'(12x," =======================================================================")')
IF (CFAMTYP(J).NE.'TR') THEN
WRITE(NULOUT,'(12x,A90)')CELLIST
WRITE(NULOUT,'(12x,10(" ------"))' )
C
DO JK=1,JPNNIV-1
WRITE(NULOUT,888)iniv(jk),'-',iniv(jk+1),
& IKNTFFR(JK),IKNTDDR(JK),IKNTUR(JK),IKNTVR(JK),IKNTZR(JK)
& ,IKNTTR(JK),IKNTER(JK),IKNTDR(JK),IKNTBTR(JK),IKNTDWR(JK),'rej'
END DO
WRITE(NULOUT
& ,'(12x," =======================================================================")')
ELSE
WRITE(NULOUT,'(12x,A80)')CTRPROFLIST
WRITE(NULOUT,'(12x,11(" ------"))' )
C
DO JK=1,JPNNIV-1
WRITE(NULOUT,999)iniv(jk),'-',iniv(jk+1),
& (IKNTTRR(JK,JJ), JJ =1,10), 'rej'
END DO
C
WRITE(NULOUT
& ,'(12x," =======================================================================",/)')
WRITE(NULOUT
& ,'(12x," ")'
& )
WRITE(NULOUT,'(12x," NUMBER OF OTHER REJECTED DATA")')
WRITE(NULOUT
& ,'(12x," =======================================================================")')
WRITE(NULOUT,'(12x,A80)')CTRTCOLLIST
WRITE(NULOUT,'(12x,4(" ------"))' )
WRITE(NULOUT,990)' col ', (IKNTTRCOLR(JJ), JJ =1,10),'rej'
WRITE(NULOUT
& ,'(12x," =======================================================================",/)')
END IF
if ( cfamtyp(j) .eq. 'UA' .or. cfamtyp(j) .eq. 'SF' ) then
WRITE(NULOUT
& ,'(12x," =======================================================================",/)')
WRITE(NULOUT
& ,'(12x," ")'
& )
WRITE(NULOUT,'(12x," NUMBER OF REJECTED SURFACE DATA")')
WRITE(NULOUT
& ,'(12x," =======================================================================")')
WRITE(NULOUT,'(12x,A90)')CSFLIST
WRITE(NULOUT,'(12x,8(" ------"))' )
WRITE(NULOUT,890)' sfc ',
& IKNTFSR,IKNTDSR,IKNTUSR,IKNTVSR,IKNTTSR,IKNTESSR,IKNTPSR
& ,IKNTPNR,'rej'
WRITE(NULOUT
& ,'(12x," =======================================================================",/)')
endif
C
WRITE(NULOUT
& ,'(12x," ")')
WRITE(NULOUT
& ,'(12x," NUMBER OF ACCEPTED DATA PRESSURE COORD")')
WRITE(NULOUT
& ,'(12x," =======================================================================")')
IF (CFAMTYP(J).NE.'TR') THEN
WRITE(NULOUT,'(12x,A90)')CELLIST
WRITE(NULOUT,'(12x,10(" ------"))' )
DO JK=1,JPNNIV-1
WRITE(NULOUT,888)iniv(jk),'-',iniv(jk+1),
& IKNTFFA(JK),IKNTDDA(JK),IKNTUA(JK),IKNTVA(JK),IKNTZA(JK)
& ,IKNTTA(JK),IKNTEA(JK),IKNTDA(JK),IKNTBTA(JK),IKNTDWA(JK),'acc'
END DO
WRITE(NULOUT
& ,'(12x," =======================================================================")')
ELSE
WRITE(NULOUT,'(12x,A80)')CTRPROFLIST
WRITE(NULOUT,'(12x,11(" ------"))' )
C
DO JK=1,JPNNIV-1
WRITE(NULOUT,999)iniv(jk),'-',iniv(jk+1),
& (IKNTTRA(JK, JJ), JJ =1,10) ,'acc'
END DO
WRITE(NULOUT
& ,'(12x," =======================================================================",/)')
C
WRITE(NULOUT
& ,'(12x," =======================================================================",/)')
WRITE(NULOUT
& ,'(12x," ")'
& )
WRITE(NULOUT,'(12x," NUMBER OF OTHER ACCEPTED DATA")')
WRITE(NULOUT
& ,'(12x," =======================================================================")')
WRITE(NULOUT,'(12x,A80)')CTRTCOLLIST
WRITE(NULOUT,'(12x,4(" ------"))' )
WRITE(NULOUT,990)' col ', (IKNTTRCOLA(JJ), JJ =1,10), 'acc'
WRITE(NULOUT
& ,'(12x," =======================================================================",/)')
END IF
C
if ( cfamtyp(j) .eq. 'UA' .or. cfamtyp(j) .eq. 'SF' ) then
WRITE(NULOUT
& ,'(12x," ")'
& )
WRITE(NULOUT,'(12x," NUMBER OF ACCEPTED SURFACE DATA")')
WRITE(NULOUT
& ,'(12x," =======================================================================")')
WRITE(NULOUT,'(12x,A90)')CSFLIST
WRITE(NULOUT,'(12x,8(" ------"))' )
WRITE(NULOUT,890)' sfc ',
& IKNTFSA,IKNTDSA,IKNTUSA,IKNTVSA,IKNTTSA,IKNTESSA,IKNTPSA
& ,IKNTPNA,'acc'
WRITE(NULOUT
& ,'(12x," =======================================================================",/)')
endif
888 FORMAT(1X,i4,a1,i4,10(2x,i6),3x,a3)
890 FORMAT(1X,a9,8(2x,i6),3x,a3)
999 FORMAT(1X,i4,a1,i4,10(2x,i6),3x,a3)
990 FORMAT(1X,a9,10(2x,i6),3x,a3)
END DO
300 CONTINUE
C
C-----------------------------------------------------------------------
WRITE(NULOUT,'(1x," Number of data assimilated by 3d-var:",i10)')
& IKNT
C
C
C-----------------------------------------------------------------------
C
DO JDATA=1,NDATA
ITYP = MOBDATA(NCMVNM,JDATA)
IOBS = MOBDATA(NCMOBS,JDATA)
ITRCODE = MOBDATA(NCMSPEC,JDATA)
C
IF ( ITYP .EQ. NEUU) MOBDATA(NCMPOS,JDATA) = nouu - 1
IF ( ITYP .EQ. NEVV) MOBDATA(NCMPOS,JDATA) = novv - 1
IF ( ITYP .EQ. NETT) MOBDATA(NCMPOS,JDATA) = nott - 1
IF ( ITYP .EQ. NEDZ) MOBDATA(NCMPOS,JDATA) = nogz - 1
IF ( ITYP .EQ. NEES) MOBDATA(NCMPOS,JDATA) = noes - 1
IF ( ITYP .EQ. NEHU) MOBDATA(NCMPOS,JDATA) = noq - 1
IF ( ITYP .EQ. NEGZ) MOBDATA(NCMPOS,JDATA) = nogz - 1
IF ( ITYP .EQ. NEUS) MOBDATA(NCMPOS,JDATA) = nouu - 1
IF ( ITYP .EQ. NEVS) MOBDATA(NCMPOS,JDATA) = novv - 1
IF ( ITYP .EQ. NETS) MOBDATA(NCMPOS,JDATA) = nott - 1
IF ( ITYP .EQ. NESS) MOBDATA(NCMPOS,JDATA) = noes - 1
IF ( ITYP .EQ. NEHS) MOBDATA(NCMPOS,JDATA) = noq - 1
IF ( ITYP .EQ. NEPS) MOBDATA(NCMPOS,JDATA) = nops - 1
IF ( ITYP .EQ. NEPN) MOBDATA(NCMPOS,JDATA) = nops - 1
IF ( ITYP .EQ. NEDW) MOBDATA(NCMPOS,JDATA) = nouu - 1
C
C Chemical species.
C Note: MOBDATA(NCMPOS,*) for dynamics or water vapour
C provided in 'TR' family should not be set from notr.
C
DO JJ = 1, NCMTASSI
IF(ITYP .EQ. NETR(JJ).and.ITRCODE.EQ.NTRCODELIST(JJ).AND.
& ITRCODE.NE.0) then
C
IF (CNAMANAL(JJ).EQ.'LQ'.OR.CNAMANAL(JJ).EQ.'HU') THEN
C
MOBDATA(NCMPOS,JDATA) = noq - 1
go to 800
C
ELSE
C
C Look for index of the trial field corresponding to obs. variable
C
DO JI = 1, NOCMT
if (CNAMANAL(JJ) .eq.CMVOCMT(JI)) then
MOBDATA(NCMPOS,JDATA) = (notr(1) + JI -1)-1
go to 800
endif
ENDDO
END IF
ENDIF
ENDDO
800 continue
C
END DO
500 CONTINUE
C-----------------------------------------------------------------------
C
C SET NCMLOBS PARAMETER FOR:
C
if ( nconf .ne. 121 .and. nconf .ne. 101) then
DO J = 1,NFILES
IF ( NBEGINTYP(J) .GT. 0) THEN
IBEGIN=NBEGINTYP(J)
ILAST=NENDTYP(J)
DO JDATA= IBEGIN,ILAST
MOBDATA(NCMLOBS,JDATA)=0
END DO
C
C 1. RAOB LEVELS
C
IF (CFAMTYP(J) .EQ. 'UA' ) THEN
C
DO JK=1,JPRLEV
IZP1 = NILV(JK )
DO JDATA= IBEGIN,ILAST
IZLEV = ROBDATA8(NCMPPP,JDATA)
IOBS = MOBDATA(NCMOBS,JDATA)
IDATYP=MOBHDR (NCMOTP,IOBS)
CLFAM =CFAMTYP(IDATYP)
LLOK = (MOBDATA(NCMASS,JDATA) .EQ. 1) .AND. (CLFAM .EQ
& . 'UA')
IF ( LLOK ) THEN
IZXI=ISIGN( 1,(IZLEV-IZP1) )
MOBDATA(NCMLOBS,JDATA)=MOBDATA(NCMLOBS,JDATA)+MAX(0
& ,IZXI)
ENDIF
END DO
END DO
ENDIF
C
C 2. HUMSAT LEVELS
C
IF (CFAMTYP(J) .EQ. 'HU' ) THEN
DO JK=1,JPHLEV
IZP1 = NIHULV(JK )
DO JDATA= IBEGIN,ILAST
IZLEV = ROBDATA8(NCMPPP,JDATA)
IOBS = MOBDATA(NCMOBS,JDATA)
IDATYP=MOBHDR (NCMOTP,IOBS)
CLFAM =CFAMTYP(IDATYP)
LLOK = (MOBDATA(NCMASS,JDATA) .EQ. 1) .AND. (CLFAM .EQ
& . 'HU')
IF ( LLOK ) THEN
IZXI=ISIGN( 1,(IZLEV-IZP1) )
MOBDATA(NCMLOBS,JDATA)=MOBDATA(NCMLOBS,JDATA)+MAX(0
& ,IZXI)
ENDIF
END DO
END DO
ENDIF
C
C 3. SATEM LEVELS
C
IF (CFAMTYP(J) .EQ. 'ST' ) THEN
DO JK=1,JPSALEV
IZP1 = NISLV(JK)
DO JDATA= IBEGIN,ILAST
IZLEV = ANINT( ROBDATA8(NCMPPP,JDATA) )
IOBS = MOBDATA(NCMOBS,JDATA)
IDATYP=MOBHDR (NCMOTP,IOBS)
CLFAM =CFAMTYP(IDATYP)
LLOK = (MOBDATA(NCMASS,JDATA) .EQ. 1) .AND. (CLFAM .EQ
& . 'ST')
IF ( LLOK ) THEN
IZXI=ISIGN( 1,(IZLEV-IZP1) )
MOBDATA(NCMLOBS,JDATA)=MOBDATA(NCMLOBS,JDATA)+MAX(0
& ,IZXI)
ENDIF
END DO
END DO
ENDIF
ENDIF
enddo
endif
600 CONTINUE
C
WRITE(NULOUT,'(1X,"****************************************** ")')
WRITE(NULOUT,'(1X," ---END OF CH_SUPREP---")')
WRITE(NULOUT,'(1X,"****************************************** ",/)')
C
C SUM OVER ALL BINS SHOULD BE EQUAL TO NDATA
C
isum=0
do jk=1,JPNNIV-1
isum=isum+ibin(jk)
enddo
ISUM = ISUM + IBINS
write(nulout,*) ' isum ndata ',isum,ndata
C
C ABORT IF THERE IS NO DATA TO BE ASSIMILATED
C
IF (IKNT .EQ. 0 ) THEN
write(nulout,*) 'CH_SUPREP. NO DATA TO BE ASSIMILATED'
C call abort3d(nulout,'CH_SUPREP. NO DATA TO BE ASSIMILATED')
ENDIF
C
RETURN
END