!-------------------------------------- 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 VOBSLYRS(CDMVO) 3,1
#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
** 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 "cvcord.cdk"
#include "comnumbr.cdk"
#include "commvo.cdk"
#include "commvog.cdk"
#include "commvohr.cdk"
#include "comcst.cdk"
*
character*2 cdmvo
INTEGER J,JK,JDATA
REAL*8 ZLEV,ZPREF,ZPT,ZPB,ZXI
INTEGER IOBS,IDATYP,IBEGIN,ILAST,IK,ITYP
LOGICAL LLOK, LLPRINT
CHARACTER *2 CLFAM
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
MOBDATA(NCMXTR,JDATA)=1
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 )
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 )
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