!-------------------------------------- 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 SETFGESURF 3 #if defined (DOC) * ***s/r SURFC1DZ - Computation of Jo and the residuals to the observations * FOR SURFACE DATAFILES * * *Author : P. Koclas *CMC/AES September 2000 *Revision: * JM Belanger CMDA/SMC Feb 2004 * . Introduce "scatterometer family SC" * S. Macpherson *ARMA/MRD Sep 2009 * - exclude GP family ZTD (FGE is set in SETFGEGPS) * ** Purpose: -Interpolate vertically the contents of commvo to * the pressure levels of the observations. Then * compute Jo. * A linear interpolation in ln(p) is performed. * * *Arguments * #endif IMPLICIT NONE *implicits #include "comlun.cdk"
#include "comdim.cdk"
#include "comdimo.cdk"
#include "comphy.cdk"
#include "comoabdy.cdk"
#include "comoahdr.cdk"
#include "comoba.cdk"
#include "commvo.cdk"
#include "commvog.cdk"
#include "cvcord.cdk"
#include "comnumbr.cdk"
#include "comfilt.cdk"
* INTEGER IPB,IPT,IXTR,IDIM INTEGER IOBS,IPOS,IK,IBEGIN,ILAST,JO,IDATA,IDATEND INTEGER J,JDATA,IBEGINOB,ILASTOB,ITYP,JJ,ISTYP,JDATA2 INTEGER ICOUNT,IERR,ILEN,JLIST,JCOUNT,IPOINTR(1) REAL*8 ZVAR,ZOER,ZCON,ZINC,ZPHI,ZJON,ZGAMI,ZSLEV,ZQCARG,ZPPOST REAL*8 ZWB,ZWT,ZEXP,zexpgz,ZGAMMA,ZTVG,ZPSGOBS REAL*8 ZLEV,ZPT,ZPB,ZHHH,ZGAMAZ LOGICAL LLOK, LLPRINT,LLUV POINTER(PXPOINTR ,IPOINTR) C C Temperature lapse rate for extrapolation of gz below model surface C LLPRINT = .FALSE. c LLPRINT = .TRUE. ZGAMMA = 0.0065 / GRAV zexp = 1/(RGASD*ZGAMMA) zexpgz = (RGASD*ZGAMMA) C DO J = 1,NFILES IF ( (CFAMTYP(J) == 'SF') .AND.( NBEGINTYP(J) > 0) .OR. & (CFAMTYP(J) == 'UA') .AND.( NBEGINTYP(J) > 0) .OR. & (CFAMTYP(J) == 'SC') .AND.( NBEGINTYP(J) > 0) .OR. & (CFAMTYP(J) == 'GP') .AND.( NBEGINTYP(J) > 0) ) THEN c ***** debug ********* c WRITE(NULOUT,*) 'Setting FGE for SURFACE DATA type ', CFAMTYP(J) c ***** debug ********* IBEGIN=NBEGINTYP(J) ILAST=NENDTYP(J) C C* 1. Computation of (HX - Z)/SIGMA C . ----------------------------- C 100 CONTINUE C C Process all data within the domain of the model (excluding GB-GPS C ZTD and ZTD error data) C C ILEN = ILAST - IBEGIN +1 CALL HPALLOC(PXPOINTR,ILEN,IERR,1) DO JLIST = 1,NELEMS ICOUNT = 0 DO JDATA=IBEGIN,ILAST LLOK=.FALSE. IF ( MOBDATA(NCMVCO,JDATA) == 1 ) THEN ITYP = MOBDATA(NCMVNM,JDATA) IF (ITYP == NETS .OR. ITYP == NEPS .OR. & ITYP == NEPN .OR. ITYP == NESS .OR. & ITYP == NEUS .OR. ITYP == NEVS ) THEN LLOK=(MOBDATA(NCMASS,JDATA) .EQ. 1 .AND. & ITYP .EQ. NLIST(JLIST)) ELSE LLOK=(MOBDATA(NCMASS,JDATA) .EQ. 1 .AND. & ITYP .EQ. NLIST(JLIST) .AND. & MOBDATA(NCMXTR,JDATA) .ge. 0) ENDIF IF ( ITYP == NEZD .OR. ITYP == NEFE ) LLOK=.FALSE. IF ( LLOK ) THEN ICOUNT = ICOUNT + 1 IPOINTR(ICOUNT) = JDATA ENDIF ENDIF ENDDO C C-------------- Surface data and data with height vertical coordinate C IF(ICOUNT.GT.0) THEN DO JCOUNT = 1,ICOUNT JDATA = IPOINTR(JCOUNT) IOBS = MOBDATA(NCMOBS,JDATA) ITYP = MOBDATA(NCMVNM,JDATA) IPOS = MOBDATA(NCMPOS,JDATA) idim=1 if ( ipos .gt. 5 )idim=0 IK = ROBDATA(NCMLYR,JDATA) ZLEV = ROBDATA8(NCMPPP,JDATA) ZHHH = ZLEV * GRAV IF (ITYP == NETS .OR. ITYP == NEPS .OR. & ITYP == NEPN .OR. ITYP == NESS .OR. & ITYP == NEUS .OR. ITYP == NEVS ) THEN IPT = IK + IPOS*NFLEV IPB = IPT+1 ROBDATA(NCMFGE,JDATA) = GOMOBS(IPB,IOBS) c ***** debug ********* c write(nulout,*) 'stn,ityp,ipt,ipb,fge' c write(nulout,*) cstnid(iobs),ityp,ipt,ipb, c & ROBDATA(NCMFGE,JDATA) c ***** debug ********* ELSE IPT = IK + IPOS*NFLEV IPB = IPT+1 ZPT = GOMGZG(IK,IOBS) ZPB = GOMGZG(IK+1,IOBS) ZWB = idim*(ZPT-ZHHH)/(ZPT-ZPB) ZWT = 1. - ZWB IF ( MOBDATA(NCMXTR,JDATA) .eq. 0) then ROBDATA(NCMFGE,JDATA) = zwb*GOMOBS(IPB,IOBS) + + ZWT*GOMOBS(IPT,IOBS) ELSE ROBDATA(NCMFGE,JDATA) = GOMOBS(IK + IPOS*NFLEV & ,IOBS) ENDIF if(cstnid(iobs) .eq. '99999999') then write(nulout,*) 'setfgesurf:stn,ityp,xtr,ipt,ipb,zwt,zwb' & ,cstnid(iobs),ityp,MOBDATA(NCMXTR,JDATA),ipt,ipb & ,zwt,zwb write(nulout,*) 'setfgesurf:gobs(ipb),gobs(ipt),fge' & ,GOMOBS(IPB,IOBS),GOMOBS(IPT,IOBS),ROBDATA(NCMFGE & ,JDATA) endif ENDIF ENDDO ENDIF ENDDO CALL HPDEALLC(PXPOINTR,IERR,1) C C ENDIF END DO C-------------------------------------------------------------------- RETURN END