SUBROUTINE CH_BRPACMA(CDTYPE,LDAPPEND,KFILE,KNRECS) 1,4
#if defined (DOC)
*
***s/r CH_BRPACMA -CONVERT DATA IN CMC BURP FILES (BURPV2.0 species format)
* TO CMA FOR 'TR' OBS FAMILY.
*
*Author . Y.J. Rochon, ARQX/EC Feb 2006
* Based on BRPACMA of P. KOCLAS(CMC TEL. 4665) and on earlier
* adaptations by Y. YANG for initial 'TR' BURP files.
*
*Revision:
* . See revisions for BRAPCMA
* Y.J. Rochon, Aug 2010
* - Added reading of info block to check for the need to read
* averaging kernels or correlation matrix.
* - Added *AVGKER* and *CORREL*
* Note: Identification of correlation/covariance matrices may need
* to be revisited (i.e. use of 25145).
*
*Important differences with BRPACMA (other than reading species BURP data)
*
* - Additions:
* 1) Checking for, and reading of, std. dev.
* 2) Can have multiple DATA blocks per report
* - Restrictions:
* 1) Does not handle 3D blocks at this time.
* 2) There must be only one DATA block per distinct BFAM value.
*
* PURPOSE: TO READ DATA BLOCK IN BURP FILE (AND OTHER RELATED BLOCKS)
* AND TRANSFER ALL GOOD 'TR' FAMILY DATA TO CMA.
*
*
* 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 FILE
* -KNRECS : NUMBER OF RECORDS IN BURP FILE
*
* OUTPUT: NONE
*
#endif
*
IMPLICIT NONE
#include "comlun.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 "comnumbr.cdk"
#include "cvcord.cdk"
*
INTEGER KFILE,KNRECS
INTEGER INUM,ICOUNT
INTEGER ITOTDAT,IMXL
INTEGER ITECH,IMASK,ISAT,ISATCNT,ISATZEN,ITERRAIN
INTEGER ISENSOR,INSTRUM
*
CHARACTER *(*) CDTYPE
LOGICAL LDAPPEND
*
INTEGER IER
INTEGER IBTYP,IBKNAT,IBKTYP,IBKSTP,IBKNATMA
INTEGER IHANDL,IBKNO,I3D
INTEGER INELE,INVAL,INSELE,INSVAL
INTEGER ITIME,IFLGS,IDBURP,ILAT,ILON,IDX,IDY,
+ IALT,IDELAY,IDATE,IRS,IRUNN,INBLK,ISUP,IXAUX
INTEGER ISTNID14,ISTNID58,ISTNID99
CHARACTER *4 CSID14,CSID58
CHARACTER *2 CSID2
CHARACTER *1 CSID99
REAL*8 ZLONG,ZLAT
*
INTEGER MRFPUT,MRFVOI,MRBTYP,VMRFOPR,MRFOPN,MRFLOC,MRFGET
+ ,MRFMXL
INTEGER MRBINI,MRBADD,VMRBCVT,MRBXTR,MRBPRM,MRBDCL,MRBHDR
+ ,MRBPRML,MRBLOCX,MRBTBL
*
EXTERNAL MRFPUT,MRFVOI,MRBTYP,VMRFOPR,MRFOPN,MRFLOC,MRFGET
+ ,MRFMXL
EXTERNAL MRBINI,MRBADD,VMRBCVT,MRBXTR,MRBPRM,MRBDCL,MRBHDR
+ ,MRBPRML,MRBLOCX,MRBTBL
*
CHARACTER*9 CLSTNID
*
INTEGER ITBL(10,JPMXBK)
INTEGER ILSTM(JPMXNEL)
INTEGER ILISTIN(JPMXNEL)
INTEGER ILIST(JPMXNEL), ISLIST(JPMXNEL)
INTEGER ILCOD(JPMXNEL)
INTEGER ILCODS(JPMXNEL)
INTEGER ILCODMA(JPMXNEL)
*
INTEGER ITBLINF(1)
INTEGER IMARK(1)
INTEGER IBUF(1)
REAL*8 ZVAL(1),ZSVAL(1)
POINTER(PXVAL ,ZVAL)
POINTER(PXSVAL ,ZSVAL)
POINTER(PXmark ,Imark)
POINTER(PXTBL ,ITBLINF)
POINTER(PXBUF ,Ibuf)
*
INTEGER ISZA
REAL*8 ZTORAD, XLAT, XLON, ZSZA(JPMXNLV)
*
INTEGER JI,JJ,JK
INTEGER ICHECK,INELM,INVM,INTM,IBKNMA,IBFAM,ISPECN
INTEGER ILONG,INBLKS,IKOUNT,IND,INBON
LOGICAL LLERR,LLMA
LOGICAL LCHECNAT,LCHECTYP,LCHECSTP
C
INTEGER IAVGKERN,IAVGKERP,ICORREL,ICORRELP
C
*
************************************************************************
* SET BURP RELATED PARAMETERS VIA CALL TO RESUME SUBROUTINE
************************************************************************
*
WRITE(NULOUT,*)' ------------------------------------------------'
WRITE(NULOUT,*)' --------- BEGIN CH_BRPACMA ---------------'
WRITE(NULOUT,*)' ------------------------------------------------'
*
ZTORAD=RPI/180.
*
************************************************************************
* ALLOCATE SPACE FOR DATA BUFFFER AND SET "ATTRIBUTES"
* OF DATA TO BE READ VIA CALL TO RESUME ROUTINE
************************************************************************
*
ILONG=MRFMXL(KFILE)+20
CALL HPALLOC(PXBUF,ILONG,IER,1)
IBUF(1)=ILONG
IHANDL=MRFLOC(KFILE,0,'>>*******',-1,-1,-1,-1,-1,-1,0)
IF ( IHANDL .LT. 0 ) THEN
IHANDL=MRFLOC(KFILE,0,'*********',-1,-1,-1,-1,-1,-1,0)
IF ( IHANDL .LT. 0 ) THEN
WRITE(NULOUT,*)' BRPACMA: IMPOSSIBLE TO FIND VALID HANDLE'
RETURN
ENDIF
ENDIF
CALL RESUME
(IHANDL,CDTYPE,IBUF)
IER=VMRFOPR('MISSING',PPMIS)
*
************************************************************************
* 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 CH_BRPACMA -------------'
WRITE(NULOUT,*)' ------------------------------------------'
RETURN
ENDIF
ENDIF
*
IKOUNT=0
IND =0
*
************************************************************************
* ALLOCATE SPACE TO READ DATA
************************************************************************
*
IHANDL=0
IMXL=1000
CALL HPALLOC(PXTBL,IMXL,IER,1)
CALL HPALLOC(PXVAL, IMXL,IER,8)
CALL HPALLOC(PXSVAL, IMXL,IER,8)
CALL HPALLOC(PXmark,IMXL,IER,1)
*-----------------------------------------------------------------------
DO 1 JI=1,KNRECS
LLERR=.FALSE.
*
************************************************************************
* LOCATE AND READ THE OBSERVATION
************************************************************************
*
IHANDL=MRFLOC(KFILE,IHANDL,'*********',-1,-1,-1,-1,-1,-1,0)
IF ( IHANDL .LT. 0 )LLERR=.TRUE.
*
IER=MRFGET(IHANDL,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)
ZLONG = (REAL(ILON)*0.01)
ZLAT = (REAL(ILAT)*0.01-90.)
*
IF (IER.LT.0) LLERR=.TRUE.
if (CLSTNID(1:2).eq.'>>') LLERR=.TRUE.
if (CLSTNID(1:1).eq.'^') THEN
WRITE(NULOUT,*) 'CH_BRPACMA: WARNING. Cannot handle grouped data.'
LLERR=.TRUE.
end if
IF ( .NOT. LLERR ) THEN
INBLKS=MRBPRML(IBUF,0,ITBL,10,JPMXBK)
*
************************************************************************
* Read and check uni info block
************************************************************************
*
IAVGKERN=0
IAVGKERP=0
ICORREL=0
ICORRELP=0
IBKNO=MRBLOCX(IBUF,-1,-1,1,-1,-1,0)
IF ( IBKNO .GT. 0 ) THEN
INELE =ITBL(2,IBKNO)
IF (INELE.GT.IMXL) THEN
IMXL=INELE
CALL HPDEALLC(PXTBL,IER,1)
CALL HPALLOC(PXTBL,INELE,IER,1)
ENDIF
IER=MRBXTR(IBUF,IBKNO,ILCOD,ITBLINF)
IER=MRBDCL(ILCOD,ILISTIN,INELE)
DO JK=1,INELE
IF (ILISTIN(JK).eq.15043) IAVGKERN=ITBLINF(JK)
IF (ILISTIN(JK).eq.25145) ICORREL=ITBLINF(JK)
END DO
ENDIF
*
************************************************************************
* Read and store obs data, stats, and flag blocks
************************************************************************
**
*
* Make certain work arrays large enough
*
ITOTDAT=IMXL
DO JK=1,INBLKS
INELE =ITBL(2,JK)
INVAL =ITBL(3,JK)
I3D =ITBL(4,JK)
IF (INELE*INVAL*I3D.GT.ITOTDAT)
& ITOTDAT=INELE*INVAL*I3D
END DO
IF (ITOTDAT.GT.IMXL) THEN
IMXL=ITOTDAT
CALL HPDEALLC(PXTBL,IER,1)
CALL HPDEALLC(PXVAL,IER,1)
CALL HPDEALLC(PXSVAL,IER,1)
CALL HPDEALLC(PXmark,IER,1)
CALL HPALLOC(PXTBL,ITOTDAT,IER,1)
CALL HPALLOC(PXVAL,ITOTDAT,IER,8)
CALL HPALLOC(PXSVAL,ITOTDAT,IER,8)
CALL HPALLOC(PXmark,ITOTDAT,IER,1)
ENDIF
C
INBON=0
ICOUNT=0
DO JK=1,INBLKS
IBTYP=ITBL(7,JK)
IER=MRBTYP(IBKNAT,IBKTYP,IBKSTP,IBTYP)
IBKNMA=-1
IF( LCHECNAT(IBKNAT) .AND. LCHECTYP(IBKTYP)
+ .AND. LCHECSTP(IBKSTP) ) THEN
*
IBKNO =ITBL(1,JK) ! Should be the same as JK
INELE =ITBL(2,JK)
INVAL =ITBL(3,JK)
I3D =ITBL(4,JK)
IBFAM =ITBL(5,JK)
*
* Identify species (or dynamics variable)
* Species identifier number is stored using the 7 left-most
* bits of the 12 bit IBFAM. When ISPECN=0, data are not
* species obs. but dynamics obs (unless specified as first
* two digits in STNID)
*
ISPECN=(IBFAM/32)*32
*
* Set number of values in block
*
ITOTDAT=INELE*INVAL*I3D
IKOUNT=IKOUNT+ITOTDAT
*
* Read DATA block content
*
CALL CH_RDBRPBLK
(IBKNO,ILONG,IBUF,ILCOD,10,JPMXBK,
& ITBL,ZVAL,ITBLINF,ILIST,INELE,INVAL,I3D)
*
* Search for MARKER block.
*
IBFAM=ISPECN
IBKNATMA=IBKNAT+3
IBKNMA=MRBLOCX(IBUF,IBFAM,-1,IBKNATMA,IBKTYP,IBKSTP,0)
c
c IBKNMA=MRBLOCX(IBUF,IBFAM,-1,NBKNAUN,IBKTYP,IBKSTP,0)
c IF ( IBKNMA .LE. 0 ) THEN
c IBKNMA=MRBLOCX(IBUF,IBFAM,-1,NBKNAMU,IBKTYP,IBKSTP,0)
c ENDIF
*
IF ( IBKNMA.GT.0) THEN
*
* Marker block found. Extract relevant info.
*
LLMA=.TRUE.
IER =MRBXTR(IBUF,IBKNMA,ILCODMA,IMARK)
*
INELM=ITBL(2,IBKNMA)
INVM=ITBL(3,IBKNMA)
INTM=ITBL(4,IBKNMA)
*
IER =MRBDCL(ILCODMA,ILSTM,INELM)
*
* Check for size consistency of marker and data block sizes
*
ICHECK=
+ IABS(INELE-INELM)+IABS(INVAL-INVM)+IABS(I3D-INTM)
DO JJ=1,INELE
ICHECK=ICHECK+IABS((ILSTM(JJ)-200000-ILIST(JJ)))
END DO
IF (ICHECK.NE.0) THEN
WRITE(NULOUT,*)
WRITE(NULOUT,*) 'INELE,INELM,INVAL,INVM,I3D,INTM: ',
& INELE,INELM,INVAL,INVM,I3D,INTM
CALL ABORT3D(NULOUT,'CH_BRPACMA: Size inconsistency.')
END IF
ENDIF
*
* Search for obs. STD. DEV. block.
*
IBFAM=ISPECN+10
IBKNMA=MRBLOCX(IBUF,IBFAM,-1,-1,-1,14,0)
*
IF (IBKNMA.GT.0) THEN
*
* Found block with std. dev.. Extract relevant info.
*
CALL CH_RDBRPBLK
(IBKNMA,ILONG,IBUF,ILCODS,10,JPMXBK,
& ITBL,ZSVAL,ITBLINF,ISLIST,INSELE,INSVAL,I3D)
*
* Only require consistency of INVAL and INSVAL.
*
IF (INSVAL.NE.INVAL) THEN
WRITE(NULOUT,*)
WRITE(NULOUT,*) 'INSVAL, INVAL: ',INSVAL,INVAL
CALL ABORT3D(NULOUT,'CH_BRPACMA: Size inconsistency.')
END IF
*
ELSE
INSVAL=0
INSELE=0
END IF
*
* INSERT OBS DATA INTO CMA
*
CALL CH_BRP2BDY
(IBKNO,ILIST,ISLIST,IMXL
& ,IMARK,ZVAL,ZSVAL,IALT,IDBURP,CLSTNID
& ,LLMA,INELE,INVAL,INSELE
& ,ZSZA,ISZA,ZLONG,ZLAT
& ,IAVGKERN,IAVGKERP,ICORREL,ICORRELP
& ,10,JPMXBK,ITBL,INUM,INBON)
ICOUNT=ICOUNT+INUM
*
ENDIF
END DO
1000 CONTINUE
*
************************************************************************
* INSERT MISCELLANEOUS OBS INFO INTO CMA HEADER ARRAYS
************************************************************************
*
IF (ICOUNT.GT.0) THEN
IF (ISZA.GT.0) THEN
*
* Change SZA into integer to be stored in MOBHDR(NCMBOX,..)
*
ISATZEN = INT(ZSZA(1) *100.0)
IMASK=0
INSTRUM=0
ISAT =0
ITECH=0
ELSE
ITECH=0
IMASK=0
INSTRUM=0
ISAT=0
ISATZEN=0
ENDIF
*
************************************************************************
* IF VALID DATA WAS FOUND GENERATE THE CMA HEADER
* AND INCREMENT NOBTOT
************************************************************************
*
IF ( NOBTOT .LT. NMXOBS) THEN
NOBTOT=NOBTOT + 1
csid14=CLSTNID(1:4)
csid58=CLSTNID(5:8)
csid99=CLSTNID(9:9)
READ(csid14,'(a4)')ISTNID14
READ(csid58,'(a4)')ISTNID58
READ(csid99,'(a1)')ISTNID99
CSTNID(NOBTOT)=CLSTNID
ROBHDR(NCMLON,NOBTOT) = (REAL(ILON)*0.01)*ZTORAD
ROBHDR(NCMLAT,NOBTOT) = (REAL(ILAT)*0.01-90.)*ZTORAD
ROBHDR(NCMALT,NOBTOT) = (REAL(IALT)-400)
ROBHDR(NCMTLO,NOBTOT) = (REAL(ILON)*0.01)*ZTORAD
ROBHDR(NCMTLA,NOBTOT) = (REAL(ILAT)*0.01-90.)*ZTORAD
MOBHDR(NCMNLV,NOBTOT) = INBON
*
IF ( NOBTOT .EQ. 1) THEN
MOBHDR(NCMRLN,1)=1
ELSE
MOBHDR(NCMRLN,NOBTOT) = MOBHDR(NCMRLN,NOBTOT-1)
+ + MOBHDR(NCMNLV,NOBTOT-1)
ENDIF
*
************************************************************************
* REMAINDER OF HEADER
************************************************************************
*
MOBHDR(NCMONM,NOBTOT) = NOBTOT
MOBHDR(NCMBOX,NOBTOT) = INSTRUM + ISATZEN*10000
MOBHDR(NCMOTP,NOBTOT) = NVTYP
MOBHDR(NCMITY,NOBTOT) = IDBURP+ 1000*ISAT+ 1000000*ITECH
MOBHDR(NCMDAT,NOBTOT) = IDATE
MOBHDR(NCMETM,NOBTOT) = ITIME
MOBHDR(NCMSID,NOBTOT) = ISTNID14
MOBHDR(NCMSI2,NOBTOT) = ISTNID58
MOBHDR(NCMSI3,NOBTOT) = ISTNID99
MOBHDR(NCMOEC,NOBTOT) = 999
MOBHDR(NCMOFL,NOBTOT) = IMASK
MOBHDR(NCMST1,NOBTOT) = IFLGS
*
MOBHDR(NCMNUM,NOBTOT) = ICOUNT
*
MOBHDR(NCMKER,NOBTOT) = IAVGKERP
MOBHDR(NCMCOR,NOBTOT) = ICORRELP
ENDIF
c ELSE
c WRITE(NULOUT,*)' WARNING: CH_BRPACMA: NO VALID DATA'
c & ,' OBS ',CLSTNID,' TYPE ',IDBURP,' LAT ', ILAT,
c & ' LON ', ILON
ENDIF
IF ( NDATA .GE. NDATAMX .OR. NOBTOT .GE. NMXOBS ) THEN
CALL HPDEALLC(PXTBL ,IER,1)
CALL HPDEALLC(PXVAL ,IER,1)
CALL HPDEALLC(PXmark ,IER,1)
CALL HPDEALLC(PXBUF ,IER,1)
*
*-----------------------------------------------------------------------
WRITE(NULOUT,*)' ******************************************'
WRITE(NULOUT,*)' * ATTN ATTN ATTN ATTN ATTN ATTN *'
WRITE(NULOUT,*)' * ATTN ATTN ATTN ATTN ATTN ATTN *'
WRITE(NULOUT,*)' * *'
WRITE(NULOUT,*)' * CMA FILE FULL: NO MORE DATA READ *'
WRITE(NULOUT,*)' * ABORT WHEN LABORTFULL = .TRUE. *'
WRITE(NULOUT,*)' * *'
WRITE(NULOUT,*)' * CHECK NMXOBS, NDATAMX IN NAMELIST *'
WRITE(NULOUT,*)' * *'
WRITE(NULOUT,*)' * LABORTFULL = .TRUE. ==> CALL ABORT *'
WRITE(NULOUT,*)' * LABORTFULL = .FALSE. ===> CONTINUE *'
WRITE(NULOUT,*)' * *'
WRITE(NULOUT,*)' ******************************************'
*
WRITE(NULOUT,*)'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
WRITE(NULOUT,*)' WARNING: CH_BPRACMA: CMA FILE FULL'
WRITE(NULOUT,*)'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
*
WRITE(NULOUT,'(1x,"NDATA = ",I10," NDATAMX",I10)')
& NDATA, NDATAMX
WRITE(NULOUT,'(1x,"NOBTOT= ",I10," NMXOBS = ",I10)')
& NOBTOT, NMXOBS
WRITE(NULOUT,*)' LABORTFULL = ', LABORTFULL
*
CALL PRNTBRP(NOBTOT,IKOUNT,NDATA)
*
IF (LABORTFULL) THEN
WRITE(NULOUT,*)' CH_BRPACMA: CMA FILE FULL - CALL ABORT3D '
call abort3d(nulout,'CH_BRPACMA')
ELSE
WRITE(NULOUT,*)' CH_BRPACMA: CMA FILE FULL - CONTINUE '
ENDIF
*
WRITE(NULOUT,*)' ------------------------------------------'
WRITE(NULOUT,*)' ------ END CH_BRPACMA -------------'
WRITE(NULOUT,*)' ------------------------------------------'
RETURN
ENDIF
ENDIF
1 CONTINUE
CALL HPDEALLC(PXTBL ,IER,1)
CALL HPDEALLC(PXVAL ,IER,1)
CALL HPDEALLC(PXSVAL ,IER,1)
CALL HPDEALLC(PXmark ,IER,1)
CALL HPDEALLC(PXBUF ,IER,1)
*
*-----------------------------------------------------------------------
CALL PRNTBRP(NOBTOT,IKOUNT,NDATA)
*
WRITE(NULOUT,*)' ------------------------------------------'
WRITE(NULOUT,*)' ------ END CH_BRPACMA -------------'
WRITE(NULOUT,*)' ------------------------------------------'
*
RETURN
END