SUBROUTINE VOBSLYRS(CDMVO) 5 #if defined (DOC) * ***s/r VOBSLYRS * *Author : P. Koclas *CMC/AES Sept 7 1994 *Revision: * P. Koclas *CMC/AES February 1995 * -Allow ROBDATA(NCMXTR,JDATA)=0 when * level of data= Bottom layer of model (pressure case) * * P. Koclas *CMC/AES July 1995 * -fix bugs * -( mobdata <---> robdata confusion) * -( IF ( NINT(ZLEV) .EQ. NINT(ZPB) ) THEN ) * P. Koclas *CMC/AES April 1996 * - new definition of "NCMLYR" to include reference levels of satem data * C. CHARETTE *CMC/AES OCT 1998 * - Adapted for version on eta levels * C. CHARETTE *CMC/AES OCT 2000 * - Adapted to process data with pressure vertical coordinate * D. Anselmo *ARMA/MSC OCT 2004 * - Adapted to process atmospheric and surface ln specific humidity * Y. Yang Sep. 2004 * - Switched order of "cvcord.cdk" and "comnumbr.cdk" * due to the dependence of the former on JPNBRELEM * - Added (MOBDATA(NCMVCO,JDATA) .EQ. 3) for geopotential height * Y.J. Rochon, Aug 2010 * - Added consideration of layers which extend to the model lid * when ROBDATA8(NCMPOB,JDATA)>0 * ** Purpose: * Find which model levels to use for the vertical interpolation * of model fields to CMA data. * *Arguments * * input: * CDMVO (character*2) : HR PROCESS HI RESOLUTION COMMVOHR * BG PROCESS LO RESOLUTION COMMVOG * none #endif IMPLICIT NONE *implicits #include "comlun.cdk"
#include "comdim.cdk"
#include "comdimo.cdk"
#include "comoabdy.cdk"
#include "comoahdr.cdk"
#include "comoba.cdk"
#include "comnumbr.cdk"
#include "cvcord.cdk"
#include "commvo.cdk"
#include "commvog.cdk"
#include "commvohr.cdk"
#include "comcst.cdk"
* character*(*) cdmvo INTEGER J,JK,JDATA REAL*8 ZLEV,ZPREF,ZPT,ZPB,ZXI INTEGER IOBS,IDATYP,IBEGIN,ILAST,IK,ITYP LOGICAL LLOK, LLPRINT C C -------- C LLPRINT = .FALSE. C C CHECK VALUE OF CDMVO C IF(CDMVO .NE. 'HR' .AND. CDMVO .NE. 'BG') THEN WRITE(NULOUT,*)'VOBSLYRS: CDMVO IS NOT VALID CDMVO= ',CDMVO CALL ABORT3D(NULOUT,'ERR. IN VOBSLYRS') ENDIF C 100 CONTINUE C----------------------------------------------------------------------- C C C -------- C ETA C -------- C C 1. Find where extrapolation is needed C ---------------------------------- C C 1.1 PPP Vertical coordinate C DO JDATA= 1,NDATA LLOK = ( (MOBDATA(NCMASS,JDATA) .EQ. 1 .OR. & MOBDATA(NCMVNM,JDATA) .EQ. NEHU) .AND. & MOBDATA(NCMVCO,JDATA) .EQ. 2 ) IF ( LLOK ) THEN IF(MOBDATA(NCMVNM,JDATA) .NE. NEDZ ) THEN ZLEV = ROBDATA8(NCMPPP,JDATA) ELSE ZLEV = ROBDATA8(NCMPRL,JDATA) ENDIF IOBS = MOBDATA(NCMOBS,JDATA) ITYP = MOBDATA(NCMVNM,JDATA) IF(CDMVO .EQ. 'HR') THEN ZPT= RPPOBSHR(1,IOBS) ZPB= RPPOBSHR(NLEVTRL,IOBS) ELSEIF(CDMVO .EQ. 'BG') THEN ZPT= RPPOBS(1,IOBS) cjmb ZPB= RPPOBS(NFLEV,IOBS) cjmb Surface pressure artificially modified to account cjmb for difference in rejections caused by 32 bits cjmb conversion (MRBCVT) of observed pressure. ZPB= RPPOBS(NFLEV,IOBS)+ 0.01D0 ENDIF IF ( ZLEV .LT. ZPT ) THEN IF (ROBDATA8(NCMPOB,JDATA).GT.0.0) THEN IF (ROBDATA8(NCMPOB,JDATA).LT.ZPT*10.) THEN MOBDATA(NCMXTR,JDATA)=1 ELSE MOBDATA(NCMXTR,JDATA)=0 END IF ELSE MOBDATA(NCMXTR,JDATA)=1 END IF ELSE IF ( ZLEV .GT. ZPB ) THEN MOBDATA(NCMXTR,JDATA)=2 ELSE MOBDATA(NCMXTR,JDATA)=0 ENDIF **************************************************************** if (LLPRINT .AND. cstnid(iobs) .eq. '72562') then write(nulout,*) & 'vobslyrs PPP:jdata,stn,ielm,zlev,ZPT,ZPB' & ,',MOB(XTR,),MOB(ASS,),CDMVO ',jdata,cstnid(iobs) & ,ityp,zlev,ZPT,ZPB,MOBDATA(NCMXTR,JDATA) & ,MOBDATA(NCMASS,JDATA),CDMVO endif ***************************************************************** ENDIF END DO C C 1.2 ZZZ Vertical coordinate C DO JDATA= 1,NDATA LLOK = (MOBDATA(NCMASS,JDATA) .EQ. 1 .AND. & (MOBDATA(NCMVCO,JDATA) .EQ. 1 .OR. & MOBDATA(NCMVCO,JDATA) .EQ. 3) ) IF ( LLOK ) THEN IF(MOBDATA(NCMVNM,JDATA) .NE. NEDZ ) THEN ZLEV = ROBDATA8(NCMPPP,JDATA) ELSE ZLEV = ROBDATA8(NCMPRL,JDATA) ENDIF IOBS = MOBDATA(NCMOBS,JDATA) ITYP = MOBDATA(NCMVNM,JDATA) IF(CDMVO .EQ. 'HR') THEN ZPT= GOMGZHR(1,IOBS)/RG ZPB= GOMGZHR(NLEVTRL,IOBS)/RG ELSEIF(CDMVO .EQ. 'BG') THEN ZPT= GOMGZG(1,IOBS)/RG ZPB= GOMGZG(NFLEV,IOBS)/RG ENDIF IF ( ZLEV .GT. ZPT ) THEN MOBDATA(NCMXTR,JDATA)=1 ELSE IF ( ZLEV .LT. ZPB ) THEN MOBDATA(NCMXTR,JDATA)=2 ELSE MOBDATA(NCMXTR,JDATA)=0 ENDIF **************************************************************** if (LLPRINT .AND. cstnid(iobs) .eq. '72562') then write(nulout,*) & 'vobslyrs ZZZ:jdata,stn,ielm,zlev,ZPT,ZPB' & ,',MOB(XTR,),MOB(ASS,),CDMVO ',jdata,cstnid(iobs) & ,ityp,zlev,ZPT,ZPB,MOBDATA(NCMXTR,JDATA) & ,MOBDATA(NCMASS,JDATA),CDMVO endif ***************************************************************** ENDIF END DO C C C 2. FInd interpolation layer C ------------------------ C (Model levels are assumed to be in increasing order in Mbs) C ...The SIGN and MAX intrinsincs are used for vectorization C purposes...... C C 2.1 PPP Vertical coordinate C DO JDATA=1,NDATA ROBDATA(NCMLYR,JDATA)=0 END DO C DO JDATA= 1,NDATA LLOK = ( (MOBDATA(NCMASS,JDATA) .EQ. 1 .OR. & MOBDATA(NCMVNM,JDATA) .EQ. NEHU) .AND. & MOBDATA(NCMVCO,JDATA) .EQ. 2 ) IF ( LLOK ) THEN IOBS = MOBDATA(NCMOBS,JDATA) ZLEV = ROBDATA8(NCMPPP,JDATA) ITYP = MOBDATA(NCMVNM,JDATA) IK = 1 IF(CDMVO .EQ. 'HR') THEN DO JK = 2,NLEVTRL - 1 ZPT = RPPOBSHR(JK,IOBS) IF( ZLEV .GT. ZPT ) IK = JK END DO ZPT = RPPOBSHR(IK,IOBS) zpb=RPPOBSHR(IK+1,IOBS) ELSEIF(CDMVO .EQ. 'BG') THEN DO JK = 2,NFLEV - 1 ZPT = RPPOBS(JK,IOBS) IF( ZLEV .GT. ZPT ) IK = JK END DO ZPT = RPPOBS(IK,IOBS) zpb=RPPOBS(IK+1,IOBS) ENDIF ROBDATA(NCMLYR,JDATA)= IK **************************************************************** if (LLPRINT .AND. cstnid(iobs) .eq. '72562') then write(nulout,*) & 'vobslyrs PPP:jdata,iobs,stn,ielm,ik,zlev' & ,',pppobs(ik+1,),pppobs(ik,),rdata(lyr,),CDMVO ' & ,jdata,iobs,cstnid(iobs),ityp,ik,zlev,ZPB,ZPT & ,ROBDATA(NCMLYR,JDATA),CDMVO endif ***************************************************************** ENDIF END DO C C 2.2 ZZZ Vertical coordinate and surface observations C DO JDATA= 1,NDATA LLOK = ( (MOBDATA(NCMASS,JDATA) .EQ. 1 .OR. & MOBDATA(NCMVNM,JDATA) .EQ. NEHS) .AND. & (MOBDATA(NCMVCO,JDATA) .EQ. 1 .OR. & MOBDATA(NCMVCO,JDATA) .EQ. 3) ) IF ( LLOK ) THEN IOBS = MOBDATA(NCMOBS,JDATA) ZLEV = ROBDATA8(NCMPPP,JDATA) ITYP = MOBDATA(NCMVNM,JDATA) IK = 1 IF(CDMVO .EQ. 'HR') THEN DO JK = 2,NLEVTRL - 1 ZPT = GOMGZHR(JK,IOBS)/RG IF( ZLEV .LT. ZPT ) IK = JK END DO IF((ITYP.EQ.NEPS .or. ityp .eq. NEPN) ) THEN IK=0 ELSEIF(ITYP.EQ.NETS .or. ityp .eq. NESS .OR. & ITYP.EQ.NEUS .or. ityp .eq. NEVS .OR. & ITYP.EQ.NEHS ) THEN IK=NLEVTRL-1 ENDIF ELSEIF(CDMVO .EQ. 'BG') THEN DO JK = 2,NFLEV - 1 ZPT = GOMGZG(JK,IOBS)/RG IF( ZLEV .LT. ZPT ) IK = JK END DO IF((ITYP.EQ.NEPS .or. ityp .eq. NEPN) ) THEN IK=0 ELSEIF(ITYP.EQ.NETS .or. ityp .eq. NESS .OR. & ITYP.EQ.NEUS .or. ityp .eq. NEVS .OR. & ITYP.EQ.NEHS ) THEN IK=NFLEV-1 ENDIF ENDIF ROBDATA(NCMLYR,JDATA)= IK **************************************************************** if (LLPRINT .AND. cstnid(iobs) .eq. '72562') then ZPB = GOMGZHR(IK+1,IOBS)/RG write(nulout,*) 'vobslyrs ZZZ:jdata,iobs,stn,ielm,ik,zlev' & ,',GZ(ik,),GZ(ik+1,),rdata(lyr,),CDMVO ' & ,jdata,iobs,cstnid(iobs),ityp,ik,zlev,ZPT,ZPB & ,ROBDATA(NCMLYR,JDATA),CDMVO endif ***************************************************************** ENDIF END DO C C 2.3 Reference ppp level of thickness data (SATEMS) C ----- C DO J = 1,NFILES IF ((CFAMTYP(J) .EQ. 'ST').AND.(NBEGINTYP(J) .GT. 0))THEN IBEGIN=NBEGINTYP(J) ILAST=NENDTYP(J) DO JDATA= IBEGIN,ILAST LLOK = (MOBDATA(NCMASS,JDATA) .EQ. 1 .AND. & MOBDATA(NCMVCO,JDATA) .EQ. 2 ) IF ( LLOK ) THEN IOBS = MOBDATA(NCMOBS,JDATA) ZLEV = ROBDATA8(NCMPRL,JDATA) IK = 1 IF(CDMVO .EQ. 'HR') THEN DO JK = 2,NLEVTRL - 1 ZPT = RPPOBSHR(JK,IOBS) IF( ZLEV .GT. ZPT ) IK = JK END DO ELSEIF(CDMVO .EQ. 'BG') THEN DO JK = 2,NFLEV - 1 ZPT = RPPOBS(JK,IOBS) IF( ZLEV .GT. ZPT ) IK = JK END DO ENDIF ROBDATA(NCMLYR,JDATA)= ROBDATA(NCMLYR,JDATA) & + 1000 * IK ENDIF **************************************************************** c write(nulout,*) 'vobslyrs PRL:JDATA,iobs,IK,zlev,ZPT,ZPB ' c & ,JDATA,iobs,IK,ZLEV,RPPOBS(IK,IOBS),RPPOBS(IK+1,IOBS) ***************************************************************** END DO ENDIF END DO 300 CONTINUE C RETURN END