!-------------------------------------- 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 SUPREP 1,10
#if defined (DOC)
*
*s/r 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
* JM Belanger *CMDA/SMC* Feb 2004
* - Introducing Quikscat surface wind vectors.
* 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
* J. Halle *CMDA/SMC Sept. 2005
* -added codtyp=182 (MHS).
* J. Halle *CMDA/SMC May 2006
* -adapt to RTTOV-8, by removing check of validity of channel.
* A. Beaulne *CMDA/SMC July 2006
* -added codtyp=183 (AIRS)
* -added flag -8 to CREASON
* J.M. Aparicio *ARMA/MSC* October 2006
* - Adapt for GPSRO
* L. Fillion *ARMA/MSC- 4 Feb 2004 - On v9_5_0 - 24 Apr 2006 - On v10_0_0
* - For Limited-Area option:
* Put (x,y) grid-location of obs into ROBHDR for later use by gd2mvo_la
* - 15 Aug 2007 - Update lam4d to v_10_0_3.
* A. Beaulne *CMDA/SMC July 2007
* - add possibility for one channel assimilation for tovs
* S. Macpherson *ARMA/MRD Sept. 2007
* -added ground-based GPS data
* R. Sarrazin CMDA April 2008
* - add idatyp 185
* S. Heilliette
* - add idatyp 186
* L. Fillion *ARMA/EC- 24 Apr 2008 - Update lam4d to v_10_1_0.
* L. Fillion *ARMA/EC- 24 Jan 2009 - Update lam4d to v_10_2_1.
* P. Koclas *CMDA/ Jan 2009
* remove search for element 15036 in case of gps data(element
* must now be specified in namelist like all other elements)
* L. Fillion *ARMA/EC- 7 Oct 2009 - Include Rotated global Gaussian grid option.
* L. Fillion *ARMA/EC- 4 May 2010 - Update on v_11_01_2B.
*
** 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 "comcva.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 "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 "com1chn.cdk"
#include "comgpsgb.cdk"
#include "comgrd_param.cdk"
#include "comgrd.cdk"
#include "comgdpar.cdk"
#include "comgemla.cdk"
#include "comsim.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 GPS ZENITH TROPOSPHERIC DELAY 0 15 031
C GPS ZTD ERROR 0 15 032
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
REAL zlat_4,zlon_4,zx,zy
REAL*8 ZZLAT, ZLON, ZLEV, ZVAR
REAL*8 ZLAT, GPH
REAL*8 DLLAO,dlloo,zdlon
INTEGER IZLEV,IZP1,IZXI
CHARACTER*2 CLFAM,CLFAMSAV
CHARACTER*8 CLFILNAM
CHARACTER*35 CREASON(-8:13)
CHARACTER*80 CELLIST,CSFLIST
INTEGER IOBS,IDATYP,IVCO
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(17),IBINS,isum,INIV(17)
LOGICAL LLOK,LLREJ,LLEV,LLBOGUS
INTEGER ISRCHEQ
EXTERNAL ISRCHEQ
C
INTEGER IKNTDSA,IKNTFSA,IKNTUSA,IKNTVSA,IKNTTSA,IKNTESSA,IKNTPSA
& ,IKNTPNA,IKNTZDA
INTEGER IKNTDSR,IKNTFSR,IKNTUSR,IKNTVSR,IKNTTSR,IKNTESSR,IKNTPSR
& ,IKNTPNR,IKNTZDR
INTEGER IKNTFFR(17),IKNTDDR(17),IKNTUR(17),IKNTVR(17),IKNTZR(17)
& ,IKNTTR(17),IKNTER(17),IKNTDR(17),IKNTOR(17),IKNTBTR(17)
INTEGER IKNTFFA(17),IKNTDDA(17),IKNTUA(17),IKNTVA(17),IKNTZA(17)
& ,IKNTTA(17),IKNTEA(17),IKNTDA(17),IKNTOA(17),IKNTBTA(17)
DATA INIV/1000,925,850,700,500,400,300,250,200,150,100,070,050,
& 030,020,010,000/
DATA CREASON/'JACOBIAN IMPORTANT ABOVE MODEL TOP','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'/
!
character*1 clgr, ctyp, cltypvar
character*2 cnom
character*8 cetiket,cletiket
integer idatet,idt,ipas,ibits,idtyp,ip1,ip2,ip3,
& iswa,ilng,idltf,iubc,ix1,ix2,ix3
integer igdid,ier,ikey,ji,jj,ilatrot
INTEGER FSTOUV,NUMBLKS,fstinf,fstluk,fstprm
INTEGER ezgdef_fmem,gdxyfll,ezqkdef
integer ig1,ig2,ig3,ig4,ini,inj,ink
integer ig1tic,ig2tic,ig3tic,ig4tic
!
real zlat1,zlon1,zlat2,zlon2 ! for Lam4d
real zlatdeg,zlondeg,zlatransf,zlotransf ! for Lam4d
real ax(ni),ay(nj)
real zgrdx4(ni),zgrdy4(nj)
real zxlon1_4,zxlat1_4,zxlon2_4,zxlat2_4
real znjp1
real*8 zlatrot
!-----------------------------------------------------------------------
!!
znjp1 = real(nj+1)
!
DO JK=1,17
IKNTFFR(JK)=0
IKNTDDR(JK)=0
IKNTUR(JK)=0
IKNTVR(JK)=0
IKNTZR(JK)=0
IKNTTR(JK)=0
IKNTER(JK)=0
IKNTDR(JK)=0
IKNTOR(JK)=0
IKNTBTR(JK)=0
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
IKNTOA(JK)=0
IKNTBTA(JK)=0
IBIN(JK)=0.
ENDDO
IKNTDSA =0
IKNTFSA =0
IKNTUSA =0
IKNTVSA =0
IKNTTSA =0
IKNTESSA=0
IKNTPSA =0
IKNTPNA =0
IKNTZDA =0
C
IKNTDSR =0
IKNTFSR =0
IKNTUSR =0
IKNTVSR =0
IKNTTSR =0
IKNTESSR=0
IKNTPSR =0
IKNTPNR =0
IKNTZDR =0
IBINS =0
C
WRITE(NULOUT,'(1X,"SUBROUTINE 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.
!
! 2.1 Set EZ parameters before obs looping and using gdxyfll function
!
if(grd_typ.eq.'LU') then
do ji=1,ni
zgrdx4(ji)=rlon_an(ji,1)*rrad2deg
! write(nulout,*) 'suprep: ji,zgrdx4(ji)=',ji,zgrdx4(ji)
enddo
do jj=1,nj
zgrdy4(jj)=rlat_an(1,jj)*rrad2deg
! write(nulout,*) 'suprep: jj,zgrdy4(jj)=',jj,zgrdy4(jj)
enddo
igdid= ezgdef_fmem(ni,nj,'Z','E',mig1tic, mig2tic,mig3tic,
& mig4tic,zgrdx4,zgrdy4)
! write(nulout,*) 'suprep: ezgdef_fmem: igdid = ',igdid
!
else if(grd_typ.eq.'GU'.and.grd_roule) then
!
zxlon1_4 = grd_xlon1
zxlat1_4 = grd_xlat1
zxlon2_4 = grd_xlon2
zxlat2_4 = grd_xlat2
write(nulout,*) 'suprep: 1: zxlon1_4 =',zxlon1_4
write(nulout,*) 'suprep: 1: zxlat1_4 =',zxlat1_4
write(nulout,*) 'suprep: 1: zxlon2_4 =',zxlon2_4
write(nulout,*) 'suprep: 1: zxlat2_4 =',zxlat2_4
!
do ji=1,ni
ax(ji)=grd_x_8(ji)
enddo
do jj=1,nj
ay(jj)=grd_y_8(jj)
enddo
!
call cxgaig('E',ig1tic,ig2tic,ig3tic,ig4tic,
& zxlat1_4,zxlon1_4,zxlat2_4,zxlon2_4)
!
call cigaxg('E', zxlat1_4, zxlon1_4, zxlat2_4, zxlon2_4,
& ig1tic,ig2tic,ig3tic,ig4tic)
!
write(nulout,*) 'suprep: 2: zxlon1_4 =',zxlon1_4
write(nulout,*) 'suprep: 2: zxlat1_4 =',zxlat1_4
write(nulout,*) 'suprep: 2: zxlon2_4 =',zxlon2_4
write(nulout,*) 'suprep: 2: zxlat2_4 =',zxlat2_4
!
igdid = ezgdef_fmem(ni,nj,'Z','E',ig1tic, ig2tic,ig3tic,ig4tic,
& ax,ay)
endif
!
IF (CVCORD(1:3).NE.'MAM') THEN
if(Grd_typ.ne.'LU') 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
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
if(nobtot.eq.1) write(nulout,*) 'suprep: IJ,MOBDATA(NCMOBS,IJ)=',IJ,MOBDATA(NCMOBS,IJ)
END DO
C
DLLAO=DBLE(ROBHDR(NCMLAT,JJO))
DLLOO=DBLE(ROBHDR(NCMLON,JJO))
!
if(grd_typ.eq.'GU') then
if(grd_roule) then
zlat=rrad2deg*dllao
zlon=rrad2deg*dlloo
zlat_4=zlat
zlon_4=zlon
if(JJO.eq.1) then
write(nulout,*) 'suprep: JJO,zlat_4, zlon_4=',
& JJO,zlat_4, zlon_4
endif
ier = gdxyfll(igdid,zx,zy,zlat_4,zlon_4,1) ! Input (lat,lon) must be real earth (lat,lon)!!!
if(jjo.eq.1) then
write(nulout,*) 'suprep: zx, zy = ',zx,zy
endif
!
if((znjp1-zy).le.0.) then
call abort3d
(nulout,'suprep: real(nj+1)-zy).le.0.')
endif
robhdr(ncmtla,jjo)=znjp1-zy ! i.e. x-y coordinates of Obs on transformed sphere ready for later interpolation
robhdr(ncmtlo,jjo)=zx
if(jjo.eq.1) then
write(nulout,*) 'suprep: robhdr(ncmtla,jjo)=',robhdr(ncmtla,jjo)
write(nulout,*) 'suprep: robhdr(ncmtlo,jjo)=',robhdr(ncmtlo,jjo)
endif
ILA = int(znjp1-zy) - 1
if(JJO.eq.1) then
mxlocobs = int(zx)
mylocobs = int(znjp1-zy)
write(nulout,*) 'suprep: JJO,robhdr(ncmtla,jjo)=',
& JJO,robhdr(ncmtla,jjo)
write(nulout,*) 'suprep: JJO,robhdr(ncmtlo,jjo)=',
& JJO,robhdr(ncmtlo,jjo)
write(nulout,*) 'suprep: mxlocobs = ',mxlocobs
write(nulout,*) 'suprep: mylocobs = ',mylocobs
endif
else
ILA = ISRCHILA
(DLLAO)
MOBHDR(NCMTLA,JJO)=ILA
endif
else
zlat=rrad2deg*dllao
zlon=rrad2deg*dlloo
zlat_4=zlat
zlon_4=zlon
if(JJO.eq.1) then
write(nulout,*) 'suprep: JJO,zlat_4, zlon_4=',
& JJO,zlat_4, zlon_4
endif
ier = gdxyfll(igdid,zx,zy,zlat_4,zlon_4,1) ! Input (lat,lon) must be real earth (lat,lon)!!!
!
robhdr(ncmtla,jjo)=zy ! i.e. x-y coordinates of Obs on transformed sphere ready for later interpolation
robhdr(ncmtlo,jjo)=zx
if(JJO.eq.1) then
mxlocobs = int(zx)
mylocobs = int(zy)
write(nulout,*) 'suprep: JJO,robhdr(ncmtla,jjo)=',
& JJO,robhdr(ncmtla,jjo)
write(nulout,*) 'suprep: JJO,robhdr(ncmtlo,jjo)=',
& JJO,robhdr(ncmtlo,jjo)
write(nulout,*) 'suprep: mxlocobs = ',mxlocobs
write(nulout,*) 'suprep: mylocobs = ',mylocobs
endif
endif
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 OZ '
CSFLIST
& =' FS DS US VS TS ES PS PN ZD '
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,17
IKNTFFR(JK)=0
IKNTDDR(JK)=0
IKNTUR(JK)=0
IKNTVR(JK)=0
IKNTZR(JK)=0
IKNTTR(JK)=0
IKNTER(JK)=0
IKNTDR(JK)=0
IKNTOR(JK)=0
IKNTBTR(JK)=0
IKNTFFA(JK)=0
IKNTDDA(JK)=0
IKNTUA(JK)=0
IKNTVA(JK)=0
IKNTZA(JK)=0
IKNTTA(JK)=0
IKNTEA(JK)=0
IKNTDA(JK)=0
IKNTOA(JK)=0
IKNTBTA(JK)=0
END DO
IKNTDSA =0
IKNTFSA =0
IKNTUSA =0
IKNTVSA =0
IKNTTSA =0
IKNTESSA=0
IKNTPSA =0
IKNTPNA =0
IKNTZDA =0
C
IKNTDSR =0
IKNTFSR =0
IKNTUSR =0
IKNTVSR =0
IKNTTSR =0
IKNTESSR=0
IKNTPSR =0
IKNTPNR =0
IKNTZDR =0
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)
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 For GPS Radio Occultation data (codtyp 169):
C Allow only refractivity observations (ITYP=15036)
C
IF ( IDBURP .EQ. 169 ) THEN
C
C * Only refractivity data:
C
Cpik IF ( ITYP .EQ. 15036) THEN
Cpik LLOK = .TRUE.
Cpik ELSE
Cpik LLOK = .FALSE.
Cpik ENDIF
C
C * Only heights between 0 and 80000 m:
C
GPH = ROBDATA8(NCMPPP,JDATA)
IF (GPH .LT. 0. .OR. GPH .GT. 80000.) THEN
LLOK = .FALSE.
ENDIF
ENDIF
C
C Ground-based GPS (GP) data (codtyp 189)
C LLOK = .TRUE. DY DEFAULT IF ELEMENT IS IN NLIST
C Don't want to assimilate ZTD error (NEFE).
C If LASSMET = .FALSE. don't want to assimilate Ps (NEPS),
C Ts (NETS), or (T-Td)s (NESS)
C
IF ( IDBURP .EQ. 189 ) THEN
IF (ITYP .EQ. NEFE) THEN
LLOK = .FALSE.
ENDIF
IF (.NOT.LASSMET .AND. (ITYP .EQ. NEPS .OR.
+ ITYP .EQ. NETS .OR. ITYP .EQ. NESS)) THEN
LLOK = .FALSE.
ENDIF
ENDIF
C
C Process data reported in pressure coordinate
IF (IVCO .EQ. 2 ) 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
if ( IPRESMB .gt. INIV(1) ) then
index=1
else if ( IPRESMB.le.INIV(1) .and. IPRESMB.gt.INIV(2)
& )then
index=1
else if ( IPRESMB.le.INIV(2) .and. IPRESMB.gt.INIV(3)
& )then
index=2
else if ( IPRESMB.le.INIV(3) .and. IPRESMB.gt.INIV(4)
& )then
index=3
else if ( IPRESMB.le.INIV(4) .and. IPRESMB.gt.INIV(5)
& )then
index=4
else if ( IPRESMB.le.INIV(5) .and. IPRESMB.gt.INIV(6)
& )then
index=5
else if ( IPRESMB.le.INIV(6) .and. IPRESMB.gt.INIV(7)
& )then
index=6
else if ( IPRESMB.le.INIV(7) .and. IPRESMB.gt.INIV(8)
& )then
index=7
else if ( IPRESMB.le.INIV(8) .and. IPRESMB.gt.INIV(9)
& )then
index=8
else if ( IPRESMB.le.INIV(9) .and. IPRESMB.gt.INIV(10)
& )then
index=9
else if ( IPRESMB.le.INIV(10) .and. IPRESMB.gt.INIV(11)
& )then
index=10
else if ( IPRESMB.le.INIV(11) .and. IPRESMB.gt.INIV(12)
& )then
index=11
else if ( IPRESMB.le.INIV(12) .and. IPRESMB.gt.INIV(13)
& )then
index=12
else if ( IPRESMB.le.INIV(13) .and. IPRESMB.gt.INIV(14)
& )then
index=13
else if ( IPRESMB.le.INIV(14) .and. IPRESMB.gt.INIV(15)
& )then
index=14
else if ( IPRESMB.le.INIV(15) .and. IPRESMB.gt.INIV(16)
& )then
index=15
else
index=16
endif
ibin(index)=ibin(index) +1
ENDIF
C
C Check rejection bit in datum's FLAG
C
LLREJ = .FALSE.
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.
S IDATYP .EQ. 181 .OR.
S IDATYP .EQ. 182 .OR.
S IDATYP .EQ. 183 .OR.
S IDATYP .EQ. 185 .OR.
S IDATYP .EQ. 186 ) ) THEN
C
C d.1 Valid channel?
C
C ... channel validity check removed, jh may 2006 ....
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....
C
C d.5 Activation of single channel assimilation
C
IF (LONECHN) THEN
ICHN = NINT(ROBDATA8(NCMPPP,JDATA))
ICHN = MAX(0,MIN(ICHN,JPCH+1))
IF ( IDATYP .EQ. NONECODTYP .AND. ICHN .EQ. NONECHN ) THEN
LLOK = .TRUE.
ELSE IF ( IDATYP .EQ. NONECODTYP .AND. ICHN. NE. NONECHN ) THEN
LLOK = .FALSE.
END IF
END IF
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 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
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 RAOBS and surface ln q data added to CMA.
C
IF ( ITYP .EQ. NEHU .or. ITYP .EQ. NEHS ) LLOK=.FALSE.
C
C
IF ( LLOK .AND..NOT. LLREJ ) THEN
IF( IVCO .EQ. 2 ) 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. NEOZ) IKNTOA(INDEX)=IKNTOA(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
ELSEIF( IVCO .EQ. 1 ) 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
IF( ITYP .EQ. NEZD) IKNTZDA=IKNTZDA + 1
IBINS = IBINS + 1
ENDIF
ELSE IF ( LLOK .AND. LLREJ ) THEN
IF( IVCO .EQ. 2 ) 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. NEOZ) IKNTOR(INDEX)=IKNTOR(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
ELSEIF( IVCO .EQ. 1 ) 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
IF( ITYP .EQ. NEZD) IKNTZDR=IKNTZDR + 1
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,'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," =======================================================================")')
WRITE(NULOUT,'(12x,A80)')CELLIST
WRITE(NULOUT,'(12x,10(" ------"))' )
C
DO JK=1,16
WRITE(NULOUT,888)iniv(jk),'-',iniv(jk+1),
& IKNTFFR(JK),IKNTDDR(JK),IKNTUR(JK),IKNTVR(JK),IKNTZR(JK)
& ,IKNTTR(JK),IKNTER(JK),IKNTDR(JK),IKNTOR(JK),IKNTBTR(JK),'
& rej'
END DO
C
if ( cfamtyp(j) == 'UA' .OR. cfamtyp(j) == 'SF' .OR.
& cfamtyp(j) == 'SC' .OR. cfamtyp(j) == 'GP' ) then
WRITE(NULOUT
& ,'(12x," =======================================================================",/)')
WRITE(NULOUT
& ,'(12x," ")'
& )
WRITE(NULOUT,'(12x," NUMBER OF REJECTED SURFACE DATA")')
WRITE(NULOUT
& ,'(12x," =======================================================================")')
WRITE(NULOUT,'(12x,A80)')CSFLIST
WRITE(NULOUT,'(12x,9(" ------"))' )
WRITE(NULOUT,890)' sfc ',
& IKNTFSR,IKNTDSR,IKNTUSR,IKNTVSR,IKNTTSR,IKNTESSR,IKNTPSR
& ,IKNTPNR,IKNTZDR,'rej'
WRITE(NULOUT
& ,'(12x," =======================================================================",/)')
endif
C
WRITE(NULOUT
& ,'(12x," ")')
WRITE(NULOUT
& ,'(12x," NUMBER OF ACCEPTED DATA PRESSURE COORD")')
WRITE(NULOUT
& ,'(12x," =======================================================================")')
WRITE(NULOUT,'(12x,A80)')CELLIST
WRITE(NULOUT,'(12x,10(" ------"))' )
DO JK=1,16
WRITE(NULOUT,888)iniv(jk),'-',iniv(jk+1),
& IKNTFFA(JK),IKNTDDA(JK),IKNTUA(JK),IKNTVA(JK),IKNTZA(JK)
& ,IKNTTA(JK),IKNTEA(JK),IKNTDA(JK),IKNTOA(JK),IKNTBTA(JK),'
& acc'
END DO
WRITE(NULOUT
& ,'(12x," =======================================================================",/)')
C
if ( cfamtyp(j) == 'UA' .OR. cfamtyp(j) == 'SF' .OR.
& cfamtyp(j) == 'SC' .OR. cfamtyp(j) .eq. 'GP' ) then
WRITE(NULOUT
& ,'(12x," ")'
& )
WRITE(NULOUT,'(12x," NUMBER OF ACCEPTED SURFACE DATA")')
WRITE(NULOUT
& ,'(12x," =======================================================================")')
WRITE(NULOUT,'(12x,A80)')CSFLIST
WRITE(NULOUT,'(12x,9(" ------"))' )
WRITE(NULOUT,890)' sfc ',
& IKNTFSA,IKNTDSA,IKNTUSA,IKNTVSA,IKNTTSA,IKNTESSA,IKNTPSA
& ,IKNTPNA,IKNTZDA,'acc'
WRITE(NULOUT
& ,'(12x," =======================================================================",/)')
endif
888 FORMAT(1X,i4,a1,i4,10(2x,i6),1x,a3)
890 FORMAT(1X,a9,9(2x,i6),1x,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)
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. NEOZ) MOBDATA(NCMPOS,JDATA) = nooz - 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
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
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 SUPREP---")')
WRITE(NULOUT,'(1X,"****************************************** ",/)')
C
C SUM OVER ALL BINS SHOULD BE EQUAL TO NDATA
C
isum=0
do jk=1,16
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
IF (IKNT .EQ. 0 ) THEN
call abort3d
(nulout,'SUPREP. NO DATA TO BE ASSIMILATED')
ENDIF
C
RETURN
END