!-------------------------------------- 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 CMAABRP(CDTYPE,LDAPPEND,KFILE,KNRECS,KLIST,KNVALS) 1,22
#if defined (DOC)
*
***s/r CMAABRP -CONVERT DATA IN CMA FORMAT TO CMC BURP FILES.
*
*Author . P. KOCLAS/CMC
*
*Revision 001: J. Halle, AES/CMDA, september 1996 (421-4660)
* correct handling of "grouped" data.
*
*Revision 002: P. Koclas AES/CMDA, January 1997 (421-4628)
* Modifications necessary for ssmi data.
* Change to call sequence to simplify the
* output to the BURP file.
*Revision 003: P. Koclas AES/CMDA, September 1997 (421-4628)
* Eliminate unnecesary call to mrfloc to get record
* handles of burp file.
*Revision 004: P. Koclas AES/CMDA, November 1997 (421-4628)
* ALL VALUES ARE EXTRACTED IN SINGLE CALL TO THIS ROUTINE
*Revision 005: J. Halle *CMDA/AES Oct 1999
* Adapt to TOVS.
*Revision 006: P. Koclas CMC/CMDA, March 2000
* UPDATE QUALITY CONTROL FLAGS FROM CMA
* UPDATE GLOBAL HEADER FLAG FOR REJECTED DATA
* FIXES FOR GROUPED DATA ( TOVS)
*Revision 007: P. Koclas CMC/CMDA, May 2000
* FIX FOR TOVS : -GLOBAL HEADER FLAGS (ELEMENT 55200) updated
* -BUGFIX FOR RESUME RECORD
*Revision 008: JM Belanger CMDA/SMC Jul 2000
* . 32 bits conversion
*
*Revision 009: J. Halle *CMDA/AES dec 2000
* adapt to TOVS level 1b.
*Revision 010: P. Koclas *CMDA/AES SEPT 2001
* fix bug for blocks whith bfam .ne. 0
*Revision 011: C. Charette *ARMA/AES Oct 2001
* Transfer Zmodel in burp postfile.
* Added >>BGCKALT. Set bit 12 in global flags of postfile
* fix bug for blocks whith bfam .ne. 0
*Revision 012:. J. Halle *CMDA/AES May 2002:
* Adapt to RTTOV-7: re-define NVCORD for GOES radiances.
*Revision 013:. J. St-James *CMDA/SMC July 2003:
* Add code for profiler data.
*Revision 014:. J. Halle *CMDA/AES nov 2003:
* Optimize code in J3D loop.
**Revision 015:. JM Belanger CMDA/SMC Feb 2004
* Introduce "scatterometer family SC"
*Revision 015:. D. Anselmo *MRB/ARMA October 2004:
* Addition of atmospheric and surface ln specific humidity
* O-P, O-A to POSTALT BURP file.
*Revision 016:. D. Anselmo *ARMA/SMC Jan 2004:
* Added codtyp=168 for processing of SSM/I obs.
*Revision 017:. A. Beaulne *CMDA/SMC July 2006:
* Added codtyp=183 for processing of AIRS obs.
* In loop on 3rd block dimension, set ibktyp to the one
* found at nt=1 (useful when itopost=/0 with grouped data)
*Revision 018:. R. Sarrazin CMDA April 2008
* Added codtyp 185, CSR fam
*Revision 019:. S. Heilliette
* Added codtyp 186, IASI fam
*Revision 020:. C.Cote CMDA Jan 2009
* Adapt to Metop
*Revision 019:. S. Macpherson *ARMA/MRD September 2009:
* Add code for GB-GPS data.
*Revision 020:. Luc Fillion - ARMA/EC - 11 Aug 2010 -
* Incorporate Cote's modifs below,
* originally incorporated in v_10_4_0 & v_10_5_0 but
* forgotten in MPI version v_11_01B:
* Revision 020:. C. Cote *MSC/CMDA Jan 2010
* - Modifier la conversion de NVCORD pour les plateforme tovs
* en utilisant seulement l'instrument comme test.
*
* PURPOSE: TO READ ALL DATA IN CMA AND TRANSFER
* TO POSTFILE OF 3D_VAR IN BURP FORMAT.
*
*
* ARGUMENTS:
* INPUT:
*
* -CDTYPE : DATA TYPE (I.E: UA=UPPER AIR ...)
* -LDAPPEND: .TRUE. -> APPEND DATA TO CMA FILE
* .FALSE.-> START NEW CMC FILE
* -KFILE : LOGICAL UNIT NUMBER OF BURP DATA FILE
* -KNRECS : NUMBERY OF RECORDS IN BURP FILE
* -KLIST : LIST OF INDICES POINTING
* TO VALUES TO BE EXTRACED FROM
* CMA ( 1 ---> OBS ERROR , 2 ---> O-A )
* -KNVALS : NUMBER OF VALUES IN KLIST
*
* OUTPUT: NONE
*
#endif
*
IMPLICIT NONE
#include "comlun.cdk"
#include "comct0.cdk"
#include "comdim.cdk"
#include "comdimo.cdk"
#include "comcst.cdk"
#include "comoabdy.cdk"
#include "comoahdr.cdk"
#include "comoba.cdk"
#include "cbtypes.cdk"
#include "cparbrp.cdk"
#include "cvcord.cdk"
#include "partov.cdk"
#include "comtov.cdk"
#include "commvo.cdk"
*
*
INTEGER KNVALS,IVAL,jji,ITYPDATA
INTEGER KFILE,KNRECS,KLIST(KNVALS)
INTEGER IIND,IPOS,ILPOS,inelefd,ideb
INTEGER ITOTDAT,IMXL,IMXL3D,IMXLINF
INTEGER ITECH,IMASK,ISAT
INTEGER IBIT0,INBIT,IDATYP
*
CHARACTER *(*) CDTYPE
LOGICAL LDAPPEND,LLTEST,LLRESET,LLGOOD,LLSURF
*
INTEGER IER,JJEL
INTEGER IBTYP,IBTYPblk,IBKNAT,IBKTYP,IBKSTP,IBFAM,IBDESC,IBKNMAOUT,IBKNOUT
INTEGER IBKTYPnt1
INTEGER IBTYPMA,IBKNATMA,IDATYPMA,INBITMA
INTEGER IHANDL,IHANDLP,IBKNO,IBKNO3D,IBKNAD,I3D,ITY
INTEGER INELE,INVAL
INTEGER INELEIN,IOBTOT,IDATA, IZMODEL, ICOUNT
INTEGER INELE3D, IPOSB, ILPOSB, IBTYPB
INTEGER ITIME,IDLT,IFLGS,IDBURP,ILAT,ILON,IDX,IDY,
+ IALT,IDELAY,IDATE,IRS,IRUNN,INBLK,ISUP,IXAUX
*
INTEGER IFIND
INTEGER MRFPUT,MRFVOI,MRBTYP,VMRFOPR,MRFOPN,MRFLOC,MRFGET
+ ,MRFMXL,MRFGOC
INTEGER MRBINI,MRBADD,VMRBCVT,MRBXTR,MRBPRM,MRBDCL,MRBHDR
+ ,MRBPRML,MRBLOCX,MRBTBL,MRBCOL,MRBDEL,MRBREP,MRBUPD
*
EXTERNAL MRFPUT,MRFVOI,MRBTYP,VMRFOPR,MRFOPN,MRFLOC,MRFGET
+ ,MRFMXL
EXTERNAL MRBINI,MRBADD,VMRBCVT,MRBXTR,MRBPRM,MRBDCL,MRBHDR
+ ,MRBPRML,MRBLOCX,MRBTBL,MRBCOL,MRBDEL,MRBREP,MRBUPD,MRFGOC
*
*
CHARACTER*9 CLSTNID
*
REAL*8 ZPROF(jpmxnlv),ZEXTRA(jpmxnlv)
INTEGER IPROF(jpmxnlv)
INTEGER ITBL(10,JPMXBK)
INTEGER ILSTM(JPMXNEL)
INTEGER ILIST3D(JPMXNEL)
INTEGER ILISTIN(JPMXNEL)
INTEGER ILIST(JPMXNEL)
INTEGER ILCOD3D(JPMXNEL)
INTEGER ILCOD(JPMXNEL)
INTEGER ILCODMA(JPMXNEL)
INTEGER ILISTNELE(JPMXNEL)
*
INTEGER ITBLVAL(1)
INTEGER ITBL3D(1)
INTEGER ITBLINF(1)
INTEGER IMARK(1)
INTEGER IBUF(1)
REAL*8 ZVAL(1)
REAL*8 ZVALP(1)
POINTER(PXVAL ,ZVAL)
POINTER(PXVALP ,ZVALP)
POINTER(PXTABL ,ITBLVAL)
POINTER(PXTABL3D ,ITBL3D)
POINTER(PXTABLINF,ITBLINF)
POINTER(PXmark ,Imark)
POINTER(PXBUF ,IBUF)
*
REAL*8 ZTORAD
*
INTEGER JI,JJ,JK,J3D
INTEGER ICHECK,INELM,INVM,INTM,IBKNMA,ITOPOST
INTEGER ILONG,INBLKS,IKOUNT,IND,INBON,IEXTRAEL
LOGICAL LLERR,LLMA,LLGROUP,LLERROR,LLSAT
LOGICAL LCHECNAT,LCHECTYP,LCHECSTP,LLRESUM
LOGICAL LLTOPOST
*
************************************************************************
* SET BURP RELATED PARAMETERS VIA CALL TO RESUME SUBROUTINE
************************************************************************
*
WRITE(NULOUT,*)' ------------------------------------------------'
WRITE(NULOUT,*)' --------- BEGIN CMAABRP ---------------'
WRITE(NULOUT,*)' ------------------------------------------------'
*
ZTORAD=RPI/180.
LLTOPOST = .FALSE.
*
************************************************************************
* ALLOCATE SPACE FOR DATA BUFFER AND SET "ATTRIBUTES"
* OF DATA TO BE READ VIA CALL TO RESUME ROUTINE
************************************************************************
*
ILONG=MRFMXL(KFILE)
CALL HPALLOC(PXBUF, ILONG*6 ,IER,8)
IBUF(1) =ILONG*10
LLRESUM=.TRUE.
IHANDL=MRFLOC(KFILE,0,'>>*******',-1,-1,-1,-1,-1,-1,0)
IF ( IHANDL .LT. 0 ) THEN
LLRESUM=.FALSE.
IHANDL=MRFLOC(KFILE,0,'*********',-1,-1,-1,-1,-1,-1,0)
IF ( IHANDL .LT. 0 ) THEN
WRITE(NULOUT,*)' CMAABRP: IMPOSSIBLE TO FIND VALID HANDLE'
RETURN
ENDIF
ENDIF
*
************************************************************************
* CHANGE THE RESUME RECORD TO POSTALT TYPE
************************************************************************
*
CALL RESUME
(IHANDL,CDTYPE,IBUF)
IER=VMRFOPR
('MISSING',PPMIS)
IER=MRFGOC('ERRTOLR','INFORMATIF')
*
IER=MRFGET(IHANDL,IBUF)
IER=MRBHDR(IBUF,ITIME,IFLGS,CLSTNID,IDBURP,ILAT,ILON,IDX,IDY,
& IALT,IDELAY,IDATE,IRS,IRUNN,INBLK,ISUP,0,IXAUX,0)
*
* FOR BACKGROUND CHECK THE LAST 6 BITS OF BTYP NEED TO BE CHANGED.
* N.B.: FOR TOVS, THERE IS NO BACKGROUND CHECK FOR NOW.
* THE CONFIGURATION NCONF=121 FOR TOVS MEANS THAT WE WANT TO
* CALCULATE RADIANCE RESIDUALS,
* WITHOUT SETTING THE "POST" BIT AND
* WITHOUT SETTING THE RESUME STNID TO '>>POSTALT'.
* WHEN TOVS ARE FULLY INTEGRATED IN THE BACKGROUND CHECK SYSTEM, THIS
* SPECIAL CASE WILL DISAPPEAR.
*
IF ( CDTYPE .EQ. 'TO' .AND. NCONF .EQ. 121 ) THEN
ITOPOST=0
*
ELSE
IF ( (NCONF .EQ. 101 .AND. CLSTNID .NE. '>>POSTALT') .OR.
& (NCONF .EQ. 101 .AND. CLSTNID .NE. '>>BGCKALT') ) THEN
ITOPOST=4
ELSE
ITOPOST=0
ENDIF
*
IF ( nconf.eq.141 .OR. NCONF .EQ. 101
& .OR. NINT(NCONF/100.0) .EQ.6) THEN
CLSTNID='>>POSTALT'
IF ( NCONF .EQ. 101 ) CLSTNID='>>BGCKALT'
IF ( LLRESUM) THEN
LLTOPOST = .TRUE.
IER=MRBUPD(KFILE,IBUF,-1,-1,CLSTNID,-1,-1,-1,-1,-1,
& -1,-1,-1,-1,-1,-1,0,-1,0)
IER=MRFPUT(KFILE,IHANDL,IBUF)
ELSE
WRITE(NULOUT,*)' NO RESUME RECORD FOR CDTYPE :',CDTYPE
ENDIF
ENDIF
*
ENDIF
*
************************************************************************
* INITIALIZE DATA COUNTERS THEN BEGIN LOOP TO READ DATA
************************************************************************
*
IF ( .NOT. LDAPPEND ) THEN
NOBTOT =0
NDATA =0
ELSE
*
WRITE(NULOUT,*)' '
WRITE(NULOUT,*)'=============================================='
WRITE(NULOUT,*)'NUMBER OF REPORTS CURRENTLY IN CMA FILE',NOBTOT
WRITE(NULOUT,*)'DATA CURRENTLY IN CMA FILE ',NDATA
WRITE(NULOUT,*)'=============================================='
WRITE(NULOUT,*) ' '
IF ( NOBTOT .GE. NMXOBS) THEN
WRITE(NULOUT,*) ' CMA FILE FULL: NO DATA READ'
WRITE(NULOUT,*)' ------------------------------------------'
WRITE(NULOUT,*)' ------ END CMAABRP -------------'
WRITE(NULOUT,*)' ------------------------------------------'
RETURN
ENDIF
ENDIF
*
IKOUNT=0
IND =0
*
************************************************************************
* ALLOCATE SPACE TO READ DATA
************************************************************************
*
IHANDL=0
IHANDLP=0
IMXL=1000
IMXL3D=400
IMXLINF=400
CALL HPALLOC(PXVAL, IMXL,IER,8)
CALL HPALLOC(PXVALP,IMXL,IER,8)
CALL HPALLOC(PXTABL,IMXL,IER,8)
CALL HPALLOC(PXmark,IMXL,IER,8)
CALL HPALLOC(PXTABL3D,IMXL3D,IER,8)
CALL HPALLOC(PXTABLINF,IMXLINF,IER,8)
*-----------------------------------------------------------------------
DO 1 JI=1,KNRECS
LLERR=.FALSE.
*
************************************************************************
* LOCATE AND READ RECORD ON DATA FILE
************************************************************************
*
IHANDLP=MRFLOC(KFILE,IHANDLP,'*********',-1,-1,-1,-1,-1,-1,0)
IF ( IHANDLP .LT. 0 )LLERR=.TRUE.
*
IER=MRFGET(IHANDLP,IBUF)
IF (IER.LT.0) LLERR=.TRUE.
*
************************************************************************
* EXTRACT THE HEADER
************************************************************************
*
IER=MRBHDR(IBUF,ITIME,IFLGS,CLSTNID,IDBURP,ILAT,ILON,IDX,IDY,
& IALT,IDELAY,IDATE,IRS,IRUNN,INBLK,ISUP,0,IXAUX,0)
*
*
** Re-define NVCORD for SSMI, GOES, AIRS, GeoRad and IASI radiances
** (IDBURP=168,180,183,185,186)
** This is done until a more general BURP structure is defined
** and valid for all radiances from any platform.
** ------------
*
SELECT CASE (IDBURP)
CASE (164,181,182)
!amsua, amsub, mhs
!cas special d'un CLSTNID = UNKNOWN
IF (CLSTNID .EQ. 'UNKNOWN' ) THEN
NVCORD = 5042
ELSE
NVCORD = 2150
ENDIF
CASE (168,180,183,185,186)
!ssmi, goes, airs
NVCORD = 5042
ENDSELECT
*
IF (IER.LT.0) LLERR=.TRUE.
*
************************************************************************
* EXTRACT THE DATA AND FLAG BLOCKS
************************************************************************
*
IF ( CLSTNID(1:2) .eq. '>>')LLERR=.TRUE.
IF ( .NOT. LLERR ) THEN
INBLKS=MRBPRML(IBUF,0,ITBL,10,JPMXBK)
*
IF ( CLSTNID(1:1) .EQ. '^' ) THEN
IBKNO=MRBLOCX(IBUF,-1,-1,2,-1,-1,0)
IF (IBKNO .LT. 0) IBKNO=MRBLOCX(IBUF,-1,-1,6,-1,-1,0)
LLGROUP=.TRUE.
IF ( IBKNO .GT. 0 ) THEN
I3D =ITBL(4,IBKNO)
INELE3D =ITBL(2,IBKNO)
ITOTDAT=I3D*INELE3D
IBKNO3D=IBKNO
IF ( ITOTDAT .GT. IMXL3D) THEN
IMXL3D=ITOTDAT
CALL HPDEALLC(PXTABL3D,IER,1)
CALL HPALLOC(PXTABL3D,IMXL3D,IER,8)
ENDIF
IER=MRBXTR(IBUF,IBKNO,ILCOD3D,ITBL3D)
IER=MRBDCL(ILCOD3D,ILIST3D,INELE3D)
ENDIF
ELSE
LLGROUP=.FALSE.
I3D=1
ENDIF
*
*----------------------->
* uni info block
*----------------------->
*
IBKNO =MRBLOCX(IBUF,-1,-1,1,-1,-1,0)
IF ( IBKNO .GT. 0 ) THEN
INELEIN =ITBL(2,IBKNO)
ITOTDAT=I3D*INELEIN
IF ( ITOTDAT .GT. IMXLINF) THEN
IMXLINF=ITOTDAT
CALL HPDEALLC(PXTABLINF,IER,1)
CALL HPALLOC(PXTABLINF,IMXLINF,IER,8)
ENDIF
IER=MRBXTR(IBUF,IBKNO,ILCOD3D,ITBLINF)
IER=MRBDCL(ILCOD3D,ILISTIN,INELEIN)
ENDIF
*
*----------------------->
* data blocks
*----------------------->
*
IPOS=1
ILPOS=1
ITOTDAT=0
DO JK=1,INBLKS
IBTYP=ITBL(7,JK)
IER=MRBTYP(IBKNAT,IBKTYP,IBKSTP,IBTYP)
IF( LCHECNAT
(IBKNAT) .AND. LCHECTYP
(IBKTYP)
+ .AND. LCHECSTP
(IBKSTP) ) THEN
IBKNO =MRBLOCX(IBUF,-1,-1,IBKNAT,IBKTYP,IBKSTP,0)
INELE =ITBL(2,JK)
INVAL =ITBL(3,JK)
* ALLOW 2 EXTRA ELEMENTS IN CASE WE NEED TO ADDP FF DD WIND ARRAYS TO CMA
* ALLOW 1 EXTRA ELEMENT FOR LQ
IEXTRAEL=3
ibknatma=(IBKNAT + 3)
ITOTDAT=ITOTDAT + (INELE+IEXTRAEL)*INVAL*I3D
IF ( ITOTDAT .GT. IMXL) THEN
IMXL=ITOTDAT
CALL HPDEALLC(PXVAL,IER,1)
CALL HPDEALLC(PXVALP,IER,1)
CALL HPDEALLC(PXTABL,IER,1)
CALL HPDEALLC(PXmark,IER,1)
CALL HPALLOC(PXVAL,ITOTDAT,IER,8)
CALL HPALLOC(PXVALP,ITOTDAT,IER,8)
CALL HPALLOC(PXTABL,ITOTDAT,IER,8)
CALL HPALLOC(PXmark,ITOTDAT,IER,8)
ENDIF
C
C INITIALIZE TO SOME VALUE FIRST ( BUT NOT PPMIS)
C
DO JJI =1,INELE*INVAL*I3D
ZVAL(ipos + jji-1)=RINFINI
END DO
IER=MRBXTR(IBUF,IBKNO,ILCOD(ILPOS),ITBLVAL(IPOS))
*
** temporary workaround for data which do not require MRBCVT conversion
** (e.g. element 8001).
*
do jji =1,INELE*INVAL*I3D
ZVAL(ipos + jji-1)=ITBLVAL(IPOS + jji -1)
end do
IER=VMRBCVT
(ILCOD(ILPOS),ITBLVAL(IPOS),ZVAL(ipos),
& INELE,INVAL,I3D,0)
IER=MRBDCL(ILCOD(ILPOS),ILIST(ilpos),INELE)
Cpik IBKNMA=MRBLOCX(IBUF,-1,-1,NBKNAUN,IBKTYP,IBKSTP,0)
Cpik IF ( IBKNMA .LE. 0 ) THEN
Cpik IBKNMA=MRBLOCX(IBUF,-1,-1,NBKNAMU,IBKTYP,IBKSTP,0)
Cpik ENDIF
*
LLMA=.FALSE.
IBKNATMA=IBKNAT+3
Cpik IBKNMA=MRBLOCX(IBUF,0,-1,ibknatma,IBKTYP,IBKSTP,0)
IBKNMA=MRBLOCX(IBUF,-1,-1,ibknatma,IBKTYP,IBKSTP,0)
IF ( IBKNMA .GT. 0 ) THEN
IER =MRBXTR(IBUF,IBKNMA,ILCODMA(ILPOS),IMARK(IPOS))
*
INELM =ITBL(2,IBKNMA)
INVM =ITBL(3,IBKNMA)
INTM =ITBL(4,IBKNMA)
IER =MRBDCL(ILCODMA(ILPOS),ILSTM(ilpos),INELM)
ICHECK=
+ IABS(INELE-INELM)+IABS(INVAL-INVM)+IABS(I3D-INTM)
DO JJ=1,INELE
ICHECK=ICHECK+IABS((ILSTM(JJ)-200000-ILIST(JJ)))
END DO
LLMA= (ICHECK .EQ. 0 )
ENDIF
*
*-------------------------------------------------------------------
* CONVERT F-D WIND TO U-V COMPONENTS
*-------------------------------------------------------------------
*
CALL FDTOUV
(ZVAL(IPOS),IMARK(IPOS),ILIST(ILPOS),INELE,
+ INVAL,I3D,INELEFD)
ILISTNELE(JK)=INELEfd
INELE=ILISTNELE(JK)
*
*-----------------------------------------------------------------------
* CONVERT ES TO HU
*-------------------------------------------------------------------
*
CALL ESTOHU
(ZVAL(IPOS),IMARK(IPOS),ILIST(ILPOS),INELE,
+ INVAL,I3D,INELEFD)
ILISTNELE(JK)=INELEfd
INELE=ILISTNELE(JK)
*-------------------------------------------------------------------
ILPOS=INELE + ILPOS
IPOS =INELE*INVAL*I3D + IPOS
IKOUNT=IKOUNT + INELE*INVAL*I3D
ENDIF
END DO
*
************************************************************************
* INSERT CMA DATA INTO BURP FILE
************************************************************************
*
IOBTOT=NOBTOT
IDATA=NDATA
DO 22 JJEL=1,KNVALS
NOBTOT=IOBTOT
NDATA=IDATA
IPOSB=0
ILPOSB=0
ICOUNT=0
IVAL=KLIST(JJEL)
*
** initialize zvalp array to original zval data array
*
do jk = 1, itotdat
zvalp(jk)= zval(jk)
enddo
*
ILPOS=1
IPOS=1
LLGOOD=.FALSE.
DO 3 JK=1,inblks
LLSURF=.FALSE.
INBON=0
IND=0
IBTYPblk=ITBL(7,JK)
IER=MRBTYP(IBKNAT,IBKTYP,IBKSTP,IBTYPblk)
IF( LCHECNAT
(IBKNAT) .AND. LCHECTYP
(IBKTYP)
+ .AND. LCHECSTP
(IBKSTP) )THEN
*
* COUNT THE NUMBER OF OBSERVATION BLOCKS PROCESSED
*
ICOUNT = ICOUNT + 1
*
if ( ibknat .eq. 0 .and. cdtype .eq. 'UA') then
nvcordtyp=1
LLSURF = .TRUE.
endif
*
IBKNO=MRBLOCX(IBUF,-1,-1,IBKNAT,IBKTYP,IBKSTP,0)
IBKNATMA=IBKNAT+3
Cpik IBKNMA=MRBLOCX(IBUF,0,-1,ibknatma,IBKTYP,IBKSTP,0)
IBKNMA=MRBLOCX(IBUF,-1,-1,ibknatma,IBKTYP,IBKSTP,0)
INELE =ilistnele(jk)
INVAL =ITBL(3,JK)
IBDESC=ITBL(6,JK)
INBIT =ITBL(8,JK)
IDATYP=ITBL(10,JK)
IBKTYPnt1 = IBKTYP
DO 5 J3D=1,I3D
IBKTYP = IBKTYPnt1
CALL GETELE
(NVCORD,J3D,ILIST(ILPOS),ZVALP(IPOS),
+ ZPROF,INELE,INVAL,I3D,IIND)
*
if (cdtype == 'SF' .OR. cdtype == 'SC' .OR.
& LLSURF ) then
iind=1
zprof(1)=REAL(IALT-400)
endif
c
if ( cdtype .eq. 'GP' ) then
iind=1
zprof(1)=REAL(IALT-400)
endif
c
IF ( IIND .GT. 0 ) THEN
C======================================================================
IF (LLGROUP ) THEN
C *** save starting address of 3d block *****
IF ( IPOSB .EQ. 0 ) IPOSB = IPOS
IF ( ILPOSB .EQ. 0 ) ILPOSB = ILPOS
ENDIF
*
*----------------------------------------------------------------------
* FOR SATEMS REFERENCE PRESSURE IS CONTAINED IN THE REPORT DATA BLOCK
*----------------------------------------------------------------------
*
IF ( CDTYPE .EQ. 'ST' ) THEN
LLSAT=.TRUE.
ELSE
LLSAT=.FALSE.
ENDIF
CALL GETCMA
(ZVALP(IPOS),ILIST(ILPOS),IMARK(IPOS),
+ LLMA,ZEXTRA,LLERROR,LLSAT,INELE,INVAL,I3D,IND,
+ NVCORD,ZPROF,J3D,IVAL)
*
*-----------------------------------------------------------------------
* TRANSFER REJECT FLAGS BETWEEN WIND DIRECTION AND SPEED
*-----------------------------------------------------------------------
*
CALL FLAGUVTOFD
(IMARK(IPOS)
+ ,ILIST(ILPOS),INELE,INVAL,I3D
+ ,CLSTNID,IDBURP,ILAT,ILON)
*
*-----------------------------------------------------------------------
* SET REJECT FLAGS FOR LQ BASED ON ES,TT
*-----------------------------------------------------------------------
*
CALL FLAGHU
(ZVALP(IPOS),ILIST(ILPOS),IMARK(IPOS),
& INELE,INVAL,I3D,J3D,IVAL)
*
IF ( CDTYPE .EQ. 'ST' ) THEN
CALL PUTELE
(7193,J3D,ILIST(ILPOS),ZVALP(IPOS),
+ zextra,INELE,INVAL,I3D,IIND)
ENDIF
CALL PUTELE
(NVCORD,J3D,ILIST(ILPOS),ZVALP(IPOS),
+ ZPROF,INELE,INVAL,I3D,IIND)
IF (CDTYPE .EQ. 'MI') THEN
CALL GETCMA
(ZVALP(IPOS),ILIST(ILPOS),IMARK(IPOS),
+ LLMA,ZEXTRA,LLERROR,LLSAT,INELE,INVAL,I3D,IND,
+ -1,ZPROF,J3D,IVAL)
ENDIF
C======================================================================
DO JJI=ilpos,ilpos +inele-1
ILSTM(JJI)=ILIST(JJI) + 200000
END DO
IER=MRBCOL(ILSTM(ilpos),ILCODMA(ilpos),INELE)
IER=MRBCOL(ILIST(ilpos),ILCOD(ilpos),INELE)
ideb = INELE*INVAL*(J3D-1)
do jji =ideb+1,ideb+INELE*INVAL
IF ( ZVALP(ipos + jji-1) .EQ. PPMIS ) THEN
ITBLVAL(IPOS + jji-1)=-1
ELSE
ITBLVAL(IPOS + jji-1)=ANINT( ZVALP(ipos + jji-1))
ENDIF
ENDDO
IER=VMRBCVT
(ILCOD(ILPOS),ITBLVAL(IPOS+ideb),
& ZVALP(IPOS+ideb),INELE,INVAL,1,1)
IBKNO=MRBLOCX(IBUF,-1,-1,IBKNAT,IBKTYP,IBKSTP,0)
IBKNATMA=IBKNAT+3
Cpik IBKNMA=MRBLOCX(IBUF,0,-1,ibknatma,IBKTYP,IBKSTP,0)
IBKNMA=MRBLOCX(IBUF,-1,-1,ibknatma,IBKTYP,IBKSTP,0)
C
C***********************************************************************
C
C GET LAST 6 BITS OF BTYP
C
C***********************************************************************
C
LLTEST=BTEST(IBKTYP,6)
IF ( LLTEST) THEN
ITYPDATA=IBKTYP-64 + ITOPOST
ELSE
ITYPDATA=IBKTYP + ITOPOST
ENDIF
IF (IBKTYP .EQ. NBKTYPS) THEN
C SURFACE BLOCK
C ---------------
IBKTYP=ITYPDATA + 0
ELSE IF (IBKTYP .EQ. NBKTYPA) THEN
C ALTITUDE BLOCK
C ---------------
IBKTYP=ITYPDATA + 64
ELSE IF (IBKTYP .EQ. NBKTYPSSMI) THEN
C SSMI BLOCK
C ---------------
IBKTYP= NBKTYPSSMI
ELSE
ENDIF
C
IF ( IVAL .EQ. NCMOER) THEN
C OBSERVATION ERRORS BLOCK
C ------------------------
IBKSTP=14
IBFAM=10
ELSE IF ( IVAL .EQ. NCMFGE) THEN
C FORECAST ERRORS
C ------------------------
IBKSTP=15
IBFAM=10
ELSE IF ( IVAL .EQ. NCMOMF) THEN
C RESIDUALS BLOCK
C ------------------------
IBKSTP=10
IBFAM=14
IDATYP=4
IF (CDTYPE .EQ. 'TO' .AND.
+ LRTNADIR ) THEN
IBFAM=32
ENDIF
ELSE IF ( IVAL .EQ. NCMVAR) THEN
C DATA BLOCK SEEN BY 3D-VAR
C ------------------------
cpik IBKSTP=0
IBFAM=0
ELSE IF ( IVAL .EQ. NCMOMA) THEN
C ANALYSIS INCREMENT BLOCK
C ------------------------
IBKSTP=10
IBFAM=12
IDATYP=4
ELSE
ENDIF
C
C***********************************************************************
C
IBKNATMA=IBKNAT+3
IBTYP=MRBTYP(IBKNAT,IBKTYP,IBKSTP,-1)
IBTYPMA=MRBTYP(IBKNATMA,IBKTYP,IBKSTP,-1)
LLGOOD=.TRUE.
IDATYPMA=2
INBITMA=16
IBTYPB = IBTYP
IF ( (.NOT.LLGROUP) .AND. (IND .GT. 0) ) THEN
IF ( IVAL .EQ. NCMVAR) THEN
IER=MRBDEL(IBUF,IBKNMA)
IER=MRBDEL(IBUF,IBKNO)
IER=MRBADD(IBUF,IBKNOUT,INELE,INVAL,I3D,IBFAM,
+ IBDESC,IBTYP,INBIT,IBIT0,IDATYP,ILCOD(ILPOS),
+ ITBLVAL(IPOS))
IER=MRBADD(IBUF,IBKNMAOUT,INELE,INVAL,I3D,IBFAM,
+ IBDESC,IBTYPMA,INBITMA,IBIT0,IDATYPMA,
+ ILCODMA(ILPOS),IMARK(IPOS))
ELSE
IER=MRBADD(IBUF,IBKNAD,INELE,INVAL,I3D,IBFAM,
+ IBDESC,IBTYP,INBIT,IBIT0,IDATYP,
+ ILCOD(ILPOS),ITBLVAL(IPOS))
ENDIF
ENDIF
ELSE
IND =0
ENDIF
*----------------------------------------------------------------------
*
INBON =INBON + IND
IF ( INd .GT. 0 ) THEN
*
************************************************************************
* IF VALID DATA WAS FOUND INCREMENT NOBTOT (only one time per burp
* record read
************************************************************************
*
IF (NOBTOT .LT. NMXOBS) THEN
*
IF(ICOUNT .EQ. 1) THEN
NOBTOT=NOBTOT + 1
IFLGS=MOBHDR(NCMST1,NOBTOT)
IZMODEL= NINT(RMTMOBS(NOBTOT)/RG) + 400
IF(LLTOPOST) IFLGS = ibset(IFLGS , 12 )
ENDIF
IF ( LLGROUP) THEN
iprof(1)=iflgs
call iputele
(55200,J3d,ilist3d,itbl3d,iprof,
+ inele3d,1,i3d,iind)
ENDIF
ENDIF
ENDIF
*
** fin boucle 3d
5 END DO
IF ( INBON .EQ. 0) THEN
IF ( JJEL .EQ. KNVALS)WRITE(NULOUT,*)'OBS ',CLSTNID,
+ ' TYPE ',IDBURP,' BLOCK NUMBER: ',JK,' NO VALID DATA'
ENDIF
ILPOS=INELE + ILPOS
IPOS =INELE*INVAL*I3D + IPOS
ENDIF
********************************
** fin boucle blocs
if ( LLGROUP)ier=mrbrep(ibuf,ibkno3d,itbl3d)
3 CONTINUE
IF ( LLGOOD ) THEN
IF (LLGROUP ) THEN
IF( IVAL .EQ. NCMVAR) THEN
IER=MRBDEL(IBUF,IBKNMA)
IER=MRBDEL(IBUF,IBKNO)
IER=MRBADD(IBUF,IBKNOUT,INELE,INVAL,I3D,IBFAM,IBDESC
+ ,IBTYP,INBIT,IBIT0,IDATYP,ILCOD(ILPOSB),ITBLVAL(IPOSB))
IER=MRBADD(IBUF,IBKNMAOUT,INELE,INVAL,I3D,IBFAM,
+ IBDESC,IBTYPMA,INBIT,IBIT0,IDATYPMA,
+ ILCODMA(ILPOSB),IMARK(IPOSB))
ELSE
IER = MRBADD(IBUF,IBKNAD,INELE,INVAL,I3D,IBFAM,
+ IBDESC,IBTYPB,INBIT,IBIT0,IDATYP,
+ ILCOD(ILPOSB),ITBLVAL(IPOSB))
ENDIF
ENDIF
ENDIF
********************************
IF( (NDATA .GE. NDATAP .OR. NOBTOT .GE. NMXOBS)
+ .AND. JJEL .EQ. KNVALS) THEN
IF( LLGOOD ) THEN
IF( .NOT. LLGROUP) THEN
ier=mrbupd(KFILE,IBUF,-1,iflgs,CLSTNID,
+ -1,-1,-1,-1,-1,-1,-1,-1,IZMODEL,-1,-1,-1,-1,-1)
ELSE
ier=mrbupd(KFILE,IBUF,-1,iflgs,CLSTNID,
+ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1)
ENDIF
IER=MRFPUT(KFILE,IHANDLP,IBUF)
ENDIF
WRITE(NULOUT,*) ' END OF CMA FILE : NO MORE DATA READ'
CALL PRNTBRP
(NOBTOT,IKOUNT,NDATA)
WRITE(NULOUT,*)' ------------------------------------------'
WRITE(NULOUT,*)' ------ END CMAABRP -------------'
WRITE(NULOUT,*)' ------------------------------------------'
CALL HPDEALLC(PXVAL ,IER,1)
CALL HPDEALLC(PXVALP ,IER,1)
CALL HPDEALLC(PXTABL ,IER,1)
CALL HPDEALLC(PXTABL3D ,IER,1)
CALL HPDEALLC(PXTABLINF,IER,1)
CALL HPDEALLC(PXmark ,IER,1)
CALL HPDEALLC(PXBUF ,IER,1)
RETURN
ENDIF
********************************
*
** knvals
22 END DO
*
IF ( LLGOOD ) THEN
IF( .NOT. LLGROUP) THEN
ier=mrbupd(KFILE,IBUF,-1,iflgs,CLSTNID,
+ -1,-1,-1,-1,-1,-1,-1,-1,IZMODEL,-1,-1,-1,-1,-1)
ELSE
ier=mrbupd(KFILE,IBUF,-1,iflgs,CLSTNID,
+ -1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1)
ENDIF
IER=MRFPUT(KFILE,IHANDLP,IBUF)
ENDIF
** handlp >0
ENDIF
*
** knrecs
1 CONTINUE
CALL HPDEALLC(PXVAL ,IER,1)
CALL HPDEALLC(PXVALP ,IER,1)
CALL HPDEALLC(PXTABL ,IER,1)
CALL HPDEALLC(PXTABL3D ,IER,1)
CALL HPDEALLC(PXTABLINF,IER,1)
CALL HPDEALLC(PXmark ,IER,1)
CALL HPDEALLC(PXBUF ,IER,1)
*
*-----------------------------------------------------------------------
CALL PRNTBRP
(NOBTOT,IKOUNT,NDATA)
*
WRITE(NULOUT,*)' ------------------------------------------'
WRITE(NULOUT,*)' ------ END CMAABRP -------------'
WRITE(NULOUT,*)' ------------------------------------------'
*
RETURN
END