SUBROUTINE CH_CMAABRP(CDTYPE,LDAPPEND,KFILE,KNRECS,KLIST,KNVALS) 1,4
#if defined (DOC)
*-------------------------------------------------------------------
*
***s/r CH_CMAABRP - CONVERT DATA IN CMA FORMAT TO CMC BURP FILES
* FOR 'TR' OBS FAMILY.
*
*Author . Y.J. Rochon, ARQX/EC Feb. 2006
* Based on CMAABRP by P. KOCLAS/CMC and earlier updates
* by Y. YANG (ARQI) for initial 'TR' BURP files.
*
*Revisions 001-015: see CMAABRP
*
*Revision 017: Y.J. Rochon ARQX/MSC May 2005
* -Complete indentation re-alignment.
*Revision 018: Y.Yang May 2005
* - Consideration of second vertical coordinate.
*Revision 019: Y.J. Rochon ARQX July 2010
* Imposer ITOPOST=0 quand LSIMOB=.true.
*
*Important differences with CMAABRP (other than reading species BURP data)
*
* - Addtitions:
* 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.
* - Others:
* 1) No reading or check for existence of INFO block.
*
* PURPOSE: TO READ ALL 'TR' FAMILY DATA IN CMA AND TRANSFER
* TO POSTFILE OF 3D_VAR IN BURP FORMAT.
*
* ARGUMENTS:
* INPUT:
*
* -CDTYPE : DATA TYPE (I.E: UA=UPPER AIR ...)
* Must be 'TR' for this routine to be
* called.
* -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 "comnumbr.cdk"
#include "cvcord.cdk"
#include "partov.cdk"
#include "comtov.cdk"
#include "commvo.cdk"
#include "comchem.cdk"
*
INTEGER KNVALS
INTEGER KFILE,KNRECS,KLIST(KNVALS)
INTEGER ITOTDAT,IMXL
INTEGER IDATYP
*
CHARACTER *(*) CDTYPE
LOGICAL LDAPPEND,LLTOPOST
*
INTEGER IER
INTEGER IBTYP,IBKNAT,IBKTYP,IBKSTP,IBFAM,ISPECN
INTEGER IBKNATMA
INTEGER IHANDL,IHANDLP,IBKNO,I3D
INTEGER INELE,INVAL,INSELE,INSVAL,IBKNS
INTEGER IZMODEL
INTEGER ITIME,IDLT,IFLGS,IDBURP,ILAT,ILON,IDX,IDY,
+ IALT,IDELAY,IDATE,IRS,IRUNN,INBLK,ISUP,IXAUX
*
INTEGER MRFPUT,MRFVOI,MRBTYP,VMRFOPR,MRFOPN,MRFLOC,MRFGET
+ ,MRFMXL,MRFGOC,MRFDEL
INTEGER MRBINI,MRBADD,VMRBCVT,MRBXTR,MRBPRM,MRBDCL,MRBHDR
+ ,MRBPRML,MRBLOCX,MRBTBL,MRBCOL,MRBDEL,MRBREP,MRBUPD
*
EXTERNAL MRFPUT,MRFVOI,MRBTYP,VMRFOPR,MRFOPN,MRFLOC,MRFGET
+ ,MRFMXL,MRFDEL
EXTERNAL MRBINI,MRBADD,VMRBCVT,MRBXTR,MRBPRM,MRBDCL,MRBHDR
+ ,MRBPRML,MRBLOCX,MRBTBL,MRBCOL,MRBDEL,MRBREP,MRBUPD,MRFGOC
*
CHARACTER*9 CLSTNID,CLSTNID2
*
INTEGER ITBL(10,JPMXBK)
INTEGER ILSTM(JPMXNEL)
INTEGER ILIST(JPMXNEL),ISLIST(JPMXNEL)
INTEGER ILCOD(JPMXNEL)
INTEGER ILCODS(JPMXNEL)
INTEGER ILCODMA(JPMXNEL)
*
INTEGER ITBLVAL(1),ITBLVALS(1)
INTEGER IMARK(1)
INTEGER IBUF(1),IBUFW(1)
REAL*8 ZVAL(1),ZSVAL(1)
POINTER(PXVAL ,ZVAL)
POINTER(PXSVAL ,ZSVAL)
POINTER(PXTABL ,ITBLVAL)
POINTER(PXTABLS ,ITBLVALS)
POINTER(PXmark ,Imark)
POINTER(PXBUF ,IBUF)
POINTER(PXBUFW ,IBUFW)
*
INTEGER JI,JJ,JK
INTEGER ICHECK,INELM,INVM,INTM,IBKNMA,ITOPOST
INTEGER ILONG,INBLKS,IKOUNT,IND,INBON,IEXTRAEL,ICOUNT
LOGICAL LLERR
LOGICAL LCHECNAT,LCHECTYP,LCHECSTP,LLRESUM
*
************************************************************************
* SET BURP RELATED PARAMETERS VIA CALL TO RESUME SUBROUTINE
************************************************************************
*
WRITE(NULOUT,*)' ------------------------------------------------'
WRITE(NULOUT,*)' --------- BEGIN CH_CMAABRP ---------------'
WRITE(NULOUT,*)' ------------------------------------------------'
*
IF (CDTYPE.NE.'TR') RETURN
LLTOPOST = .FALSE.
*
************************************************************************
* ALLOCATE SPACE FOR DATA BUFFER AND SET "ATTRIBUTES"
* OF DATA TO BE READ VIA CALL TO RESUME ROUTINE
************************************************************************
*
ILONG=6*MRFMXL(KFILE)+20
CALL HPALLOC(PXBUF,ILONG,IER,1)
IBUF(1) =ILONG
CALL HPALLOC(PXBUFW,ILONG,IER,1)
IBUFW(1) =ILONG
*
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,*)' CH_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.
*
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
IF (LSIMOB.AND.
& (CLSTNID.EQ.'>>POSTALT'.or.CLSTNID.EQ.'>>BGCKALT')) ITOPOST=0
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.
IHANDLP=IHANDL
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)
write(nulout,*) 'Modified IHANDL: ',IHANDL,CLSTNID
C
C Remove previously existing resume record(s)
C
1234 IHANDL=MRFLOC(KFILE,IHANDL,'>>*******',-1,-1,-1,-1,-1,-1,0)
write(nulout,*) 'Identified IHANDL ',IHANDL
IF (IHANDL.GT.0) THEN
IER=MRFGET(IHANDL,IBUF)
IER=MRBHDR(IBUF,ITIME,IFLGS,CLSTNID2,IDBURP,ILAT,ILON,IDX,IDY,
& IALT,IDELAY,IDATE,IRS,IRUNN,INBLK,ISUP,0,IXAUX,0)
IF (CLSTNID2.NE.CLSTNID) THEN
write(nulout,*) 'Removed ',CLSTNID2
IER=MRFDEL(IHANDL)
ELSE
write(nulout,*) 'Kept'
END IF
GO TO 1234
END IF
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 CH_CMAABRP -------------'
WRITE(NULOUT,*)' ------------------------------------------'
RETURN
ENDIF
ENDIF
*
IKOUNT=0
IND =0
*
************************************************************************
* ALLOCATE SPACE TO READ DATA
************************************************************************
*
IHANDL=0
IHANDLP=0
IMXL=1000
CALL HPALLOC(PXVAL, IMXL,IER,8)
CALL HPALLOC(PXSVAL, IMXL,IER,8)
CALL HPALLOC(PXTABL,IMXL,IER,1)
CALL HPALLOC(PXTABLS,IMXL,IER,1)
CALL HPALLOC(PXmark,IMXL,IER,1)
*-----------------------------------------------------------------------
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)
*
IF (IER.LT.0) LLERR=.TRUE.
IF ( CLSTNID(1:2) .eq. '>>')LLERR=.TRUE.
if (CLSTNID(1:1).eq.'^') THEN
WRITE(NULOUT,*) 'CH_CMAABRP: WARNING. Cannot handle grouped data.'
LLERR=.TRUE.
end if
*
IF (.NOT.LLERR) THEN
*
* Determine number of blocks in original report.
*
INBLKS=MRBPRML(IBUF,0,ITBL,10,JPMXBK)
*
* Get work copy of original report array.
*
* IBUF is kept unchanged.
* IBUFW will become the modified report.
*
IER=MRFGET(IHANDLP,IBUFW)
*
* 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(PXVAL,IER,1)
CALL HPDEALLC(PXSVAL,IER,1)
CALL HPDEALLC(PXTABL,IER,1)
CALL HPDEALLC(PXTABLS,IER,1)
CALL HPDEALLC(PXmark,IER,1)
CALL HPALLOC(PXVAL,ITOTDAT,IER,8)
CALL HPALLOC(PXSVAL,ITOTDAT,IER,8)
CALL HPALLOC(PXTABL,ITOTDAT,IER,1)
CALL HPALLOC(PXTABLS,ITOTDAT,IER,1)
CALL HPALLOC(PXmark,ITOTDAT,IER,1)
ENDIF
*
* Loop over blocks
*
INBON=0
ICOUNT=INBLKS
DO JK=1,INBLKS
IBTYP=ITBL(7,JK)
IER=MRBTYP(IBKNAT,IBKTYP,IBKSTP,IBTYP)
IF( LCHECNAT(IBKNAT) .AND. LCHECTYP(IBKTYP)
+ .AND. LCHECSTP(IBKSTP) ) THEN
*
* Extract required data, std. dev. and marker blocks.
* Required to identify observations for which to extract
* info from the CMA and to set format of additional
* blocks to be added to the report.
*
IBKNO =ITBL(1,JK) ! Should be equal JK
INELE =ITBL(2,JK)
INVAL =ITBL(3,JK)
I3D =ITBL(4,JK)
IBFAM =ITBL(5,JK)
IDATYP=ITBL(10,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.
*
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,ITBLVAL,ILIST,INELE,INVAL,I3D)
*
* Search for MARKER block.
*
IBFAM=ISPECN
IBKNATMA=IBKNAT+3
IBKNMA=MRBLOCX(IBUF,IBFAM,-1,IBKNATMA,IBKTYP,IBKSTP,0)
*
IF (IBKNMA.GT.0) THEN
*
* Marker block found. Extract relevant info.
*
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_CMAAPRB: Size inconsistency.')
END IF
ENDIF
*
* Search for obs. STD. DEV. block.
*
IBFAM=ISPECN+10
IBKNS=MRBLOCX(IBUF,IBFAM,-1,-1,-1,14,0)
*
IF (IBKNS.GT.0) THEN
*
* Found block with std. dev.. Extract relevant info.
*
CALL CH_RDBRPBLK
(IBKNS,ILONG,IBUF,ILCODS,10,JPMXBK,
& ITBL,ZSVAL,ITBLVALS,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
IBKNS=0
INSELE=1
END IF
*
* Acquire and insert CMC data into
* BURP report storage array IBUFW
*
CALL CH_BDY2BRP
(KLIST,KNVALS,IBKNO,IBKNMA,IBKNS
& ,ILIST,ISLIST,ITOPOST
& ,IBUFW,ILONG,IMARK,ZVAL,ZSVAL,IDBURP
& ,CLSTNID,INELE,INVAL,I3D,INSELE
& ,10,JPMXBK,ITBL,ILCOD,ILCODMA
& ,ILCODS,ITBLVAL,ITBLVALS,INBON,ICOUNT)
*
END IF
END DO
*
IF (INBON.GT.0) THEN
*
* Update BURP file with modified report.
*
NOBTOT=NOBTOT + 1
IFLGS=MOBHDR(NCMST1,NOBTOT)
IZMODEL= NINT(RMTMOBS(NOBTOT)/RG) + 400
IF(LLTOPOST) IFLGS = ibset(IFLGS , 12 )
ier=mrbupd(KFILE,IBUFW,-1,IFLGS,CLSTNID,
+ -1,-1,-1,-1,-1,-1,-1,-1,IZMODEL,
+ ICOUNT,-1,-1,-1,-1)
IER=MRFPUT(KFILE,IHANDLP,IBUFW)
ELSE
C
C Keep report but re-write (and do not increment NOBTOT)
C
ier=mrbupd(KFILE,IBUFW,-1,-1,CLSTNID,
+ -1,-1,-1,-1,-1,-1,-1,-1,-1,
+ ICOUNT,-1,-1,-1,-1)
IER=MRFPUT(KFILE,IHANDLP,IBUFW)
ENDIF
ENDIF
1 CONTINUE
*
CALL HPDEALLC(PXVAL ,IER,1)
CALL HPDEALLC(PXSVAL ,IER,1)
CALL HPDEALLC(PXTABL ,IER,1)
CALL HPDEALLC(PXTABLS ,IER,1)
CALL HPDEALLC(PXmark ,IER,1)
CALL HPDEALLC(PXBUFW ,IER,1)
CALL HPDEALLC(PXBUF ,IER,1)
*
CALL PRNTBRP(NOBTOT,IKOUNT,NDATA)
*
WRITE(NULOUT,*)' ------------------------------------------'
WRITE(NULOUT,*)' ------ END CH_CMAABRP -------------'
WRITE(NULOUT,*)' ------------------------------------------'
*
RETURN
END