SUBROUTINE BGCGPSRO 1 #if defined (DOC) * ***s/r BGCGPSRO - Set backcground check flags to the GPSRO observations * * *Author : P. KOCLAS. Mar 2008 * ------------------- ** Purpose: * calculate (o-p)/p for all ro profiles and set background check flag on if * ABS(O-P)/P is too large * *Revision: * Y.Yang Feb. 2009 * -- deleted duplicate 'INTEGER NH' *Arguments * #endif use modgps04profile use modgps05refstruct use modgps06gravity use modgps07geostruct use modgps08refop IMPLICIT NONE *implicits #include "pardim.cdk"
#include "comdim.cdk"
#include "comcva.cdk"
#include "comgem.cdk"
#include "comdimo.cdk"
#include "comlun.cdk"
#include "comcst.cdk"
#include "comct0.cdk"
#include "comnumbr.cdk"
#include "comoabdy.cdk"
#include "comoahdr.cdk"
#include "comoba.cdk"
#include "commvo.cdk"
#include "commvohr.cdk"
#include "cvcord.cdk"
#include "comphy.cdk"
#include "comgpsro.cdk"
* C REAL*8 ZTODEG REAL*8 ZLAT, Lat REAL*8 ZLON, Lon REAL*8 ZETA(JPNFLEV) REAL*8 ZTT (JPNFLEV) REAL*8 ZHU (JPNFLEV) REAL*8 ZGZ (JPNFLEV) REAL*8 ZP0 REAL*8 ZPT, ZPR, ZCF REAL*8 ZMT REAL*8 DH REAL*8 BIAS REAL*8 HNH1, HSF, HTP C REAL*8 ZOBS, ZMHX C INTEGER JF INTEGER IBEGIN , ILAST INTEGER IBEGINOB, ILASTOB, JO, JD INTEGER IDATYP INTEGER IDATA , IDATEND, JDATA INTEGER JL, JH, NGPSLEV INTEGER NH, NH1 C LOGICAL ASSIM TYPE(GPSPROFILE) :: PRF REAL(DP) , ALLOCATABLE :: H (:) TYPE(GPSDIFF), ALLOCATABLE :: RSTV(:) WRITE(NULOUT,*)'ENTER BGCSGPSRO' C C * 1. Initializations C * --------------- C ZTODEG = 180.0 / RPI C C * . 1.1 Eta vector C * . ---------- C NGPSLEV=NLEVTRL DO JL = 1, NLEVTRL ZETA(JL) = VLEVHR(JL) ENDDO C C* * 1.2 Read the NAMELIST NAMGGPSRO C * --------------------------------------- write(NULOUT,*)'NAMGPSRO',SURFMIN,HSFMIN,HTPMAX,BGCKBAND C C C Loop over all files C DO JF = 1, NFILES IF ( CFAMTYP(JF).EQ.'RO' .AND. NBEGINTYP(JF).GT.0 ) THEN IBEGIN = NBEGINTYP(JF) ILAST = NENDTYP (JF) IBEGINOB = MOBDATA(NCMOBS,IBEGIN) ILASTOB = MOBDATA(NCMOBS,ILAST ) C C * Loop over all observations of the file C DO JO = IBEGINOB, ILASTOB C C * Process only refractivity data (codtyp 169) C IDATYP = MOD(MOBHDR(NCMITY,JO),1000) IF ( IDATYP .EQ. 169 ) THEN C C Loops over data in the observation C IDATA = MOBHDR(NCMRLN,JO) IDATEND = MOBHDR(NCMNLV,JO) + IDATA - 1 ASSIM = .FALSE. C C Scan for requested assimilations, and count them C NH = 0 DO JDATA= IDATA, IDATEND IF ( MOBDATA(NCMASS,JDATA).EQ.1 ) THEN ASSIM = .TRUE. NH = NH + 1 ENDIF ENDDO C C * If assimilations are requested, apply the observation operator C IF (ASSIM) THEN C C * Profile at the observation location: C Lat = ROBHDR(NCMLAT,JO) Lon = ROBHDR(NCMLON,JO) ZLAT = Lat * ZTODEG ZLON = Lon * ZTODEG DO JL = 1, NLEVTRL C C * Profile x C ZTT(JL) = GOMTHR (JL,JO)-273.15 ZHU(JL) = GOMQHR (JL,JO) ZGZ(JL) = GOMGZHR(JL,JO) ENDDO ZP0 = GOMPSHR(1,JO) ZPT = RPPOBSHR(1,JO) ZMT = ZGZ(NLEVTRL)/RG ZMT = gpsgeopotential(Lat, ZMT)/RG ZPR = rprefinc ZCF = rcoefinc C C * GPS profile structure: C CALL GPSSTRUCT1H(NGPSLEV,ZLAT,ZLON,ZETA, + ZTT,ZHU,ZP0,ZMT,ZPT,ZPR,ZCF,PRF) CALL GPSGEO(PRF) C C * Prepare the vector of all the observations: C ALLOCATE( H (NH) ) ALLOCATE( RSTV (NH) ) NH1 = 0 DO JDATA= IDATA, IDATEND IF ( MOBDATA(NCMASS,JDATA).EQ.1 ) THEN NH1 = NH1 + 1 HNH1 = ROBDATA8(NCMPPP,JDATA) H(NH1)= gpsgeopotential(Lat,HNH1)/9.80616 ENDIF ENDDO C C * Apply the observation operator: C CALL GPSREFOPV (H, PRF, RSTV) C C * Perform the (H(x)-Y)/H operation C NH1 = 0 DO JDATA= IDATA, IDATEND IF ( MOBDATA(NCMASS,JDATA).EQ.1 ) THEN NH1 = NH1 + 1 C C * Observation operator H(x) C ZMHX = RSTV(NH1)%VAR C C * Observation value Y C ZOBS = ROBDATA8(NCMVAR,JDATA) C C OMF Tested criteria: C IF (DABS(ZOBS-ZMHX)/ZMHX.GT.BGCKBAND) THEN MOBDATA(NCMFLG,JDATA)=IBSET(MOBDATA(NCMFLG,JDATA),16) MOBDATA(NCMFLG,JDATA)=IBSET(MOBDATA(NCMFLG,JDATA),9) WRITE(nulout,'(A40,F10.0,3F12.4)') + ' REJECT BGCSGPSRO H O P (O-P/P) =', + H(NH1),ZOBS,ZMHX,(ZOBS-ZMHX)/ZMHX ENDIF ENDIF ENDDO DEALLOCATE( RSTV ) DEALLOCATE( H ) ENDIF ENDIF ENDDO ENDIF ENDDO WRITE(NULOUT,*)'EXIT BGCSGPSRO' RETURN END