!-------------------------------------- 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 DOBSSATEM(PJO) 1 #if defined (DOC) * ***s/r DOBSSATEM -Computation of Jo and the residuals to the C observations * for SATEM data files. * * *Author : P. Koclas *CMC/AES April 1996 *Revision: * C. Charette ARMA/AES NOV 1998 * - Extrapolation GZ below model orography. * - Adapt code to follow Luc Fillion's notes on 3dvar-eta * analysis. LLPRINT to print diagnostics * S. Pellerin *ARMA/SMC May 2000 * - Fix for F90 conversion * S. Pellerin ARMA/SMC Sept. 2000 * - Change references to GOMOBS for GOMOBSG (regional C implementation) * C. Charette ARMA/SMC Oct. 2000 * - Accept observations on pressure vertical coordinate * * ** Purpose: -Interpolate vertically the contents of commvo to * the pressure levels of the observations. Then * compute Jo for satem thicknesses. * A linear interpolation in ln(p) is performed. * *Arguments * PJO: CONTRIBUTION to Jo * #endif IMPLICIT NONE *implicits #include "comlun.cdk"
#include "comphy.cdk"
#include "comdim.cdk"
#include "comdimo.cdk"
#include "comoabdy.cdk"
#include "comoahdr.cdk"
#include "comoba.cdk"
#include "commvo.cdk"
#include "commvohr.cdk"
#include "cvcord.cdk"
* INTEGER IPB,IPT,IELMDZ INTEGER IOBS,IPOS,IK,IBEGIN,ILAST INTEGER J,JDATA REAL*8 ZVAR,ZOER REAL*8 ZPT,ZPB,ZWB,ZWT,ZEXP,ZGAMMA,ZTVG REAL*8 ZLEV,ZPREF,ZPHIB,ZPHIT REAL*8 ZINC REAL*8 PJO REAL*8 DLSUM LOGICAL LLOK, LLPRINT DATA IELMDZ /10192 / C C C Temperature lapse rate for extrapolation of gz below model surface C ZGAMMA = 0.0065 / GRAV ZEXP = RGASD*ZGAMMA C LLPRINT = .FALSE. DLSUM=0. DO J = 1,NFILES IF ( (CFAMTYP(J) .EQ. 'ST') .AND. ( NBEGINTYP(J) .GT. 0) ) THEN IBEGIN=NBEGINTYP(J) ILAST=NENDTYP(J) C C C* 1. Computation of (HX - Z)/SIGMA C . ----------------------------- C C 100 CONTINUE C C C Process all data within the domain of the model C DO JDATA = IBEGIN,ILAST IOBS = MOBDATA(NCMOBS,JDATA) LLOK=(MOBDATA(NCMASS,JDATA) .EQ. 1) & .AND. (MOBDATA(NCMXTR,JDATA) .EQ. 0) & .AND. (MOBDATA(NCMVCO,JDATA) .EQ. 2) IF ( LLOK ) THEN IPOS = MOBDATA(NCMPOS,JDATA) ZVAR = ROBDATA8(NCMVAR,JDATA) ZOER = ROBDATA8(NCMOER,JDATA) ZLEV = ROBDATA8(NCMPPP,JDATA) ZPREF= ROBDATA8(NCMPRL,JDATA) C C CALCULATE PHI AT REFERENCE LEVEL C IK = ROBDATA(NCMLYR,JDATA)/1000 IPT = IK + IPOS*NLEVTRL IPB = IPT + 1 IF ( IK .EQ. NLEVTRL) THEN ZPHIB =GOMOBSHR(IPB,IOBS) *************************************************************** IF(LLPRINT .AND. IOBS.EQ.1) THEN write(nulout,*) & 'dobssatem: ik=nlevtrl: IOBS,zpref,ZVAR= ',IOBS & ,zpref,IK,ZVAR write(nulout,*) & 'dobssatem: ik=nlevtrl:ipos,ipb,GOMOBSHR(IPB,IOBS)= ',ik,ipb,GOMOBSHR(IPB,IOBS) write(nulout,*) & 'dobssatem: ik=nlevtrl : ipos,zphib,zoer = ',ipos & ,zphib,ZOER ENDIF ************************************************************** ELSE ZPT = RPPOBSHR(IK,IOBS) ZPB = RPPOBSHR(IK+1,IOBS) ZWB = LOG(ZPREF/ZPT)/LOG(ZPB/ZPT) ZWT = 1. - ZWB ZPHIB = ZWB*GOMOBSHR(IPB,IOBS)+ ZWT*GOMOBSHR(IPT,IOBS) *************************************************************** IF(LLPRINT .AND. IOBS.EQ.1) THEN write(nulout,*) & 'dobssatem: IOBS,zpref,ZPT,ZPB,ZWB,ZWT,ZVAR= ' & ,IOBS,zpref,ZPT,ZPB,ZWB,ZWT,ZVAR write(nulout,*) & 'dobssatem: ik,ipb,ipt,GOMOBSHR(IPB,),GOMOBSHR(IPT)= ',ik,ipb,ipt,GOMOBSHR(IPB,IOBS),GOMOBSHR(IPT,IOBS) write(nulout,*) 'dobssatem: ipos,zphib,zoer = ' & ,ipos,zphib,ZOER ENDIF *************************************************************** ENDIF C C CALCULATE PHI AT PRESSURE LEVEL C IK = MOD ( ROBDATA(NCMLYR,JDATA),1000. ) IPT = IK + IPOS*NLEVTRL IPB = IPT + 1 ZPT = RPPOBSHR(IK,IOBS) ZPB = RPPOBSHR(IK+1,IOBS) ZWB = LOG(ZLEV/ZPT)/LOG(ZPB/ZPT) ZWT = 1. - ZWB ZPHIT = ZWB*GOMOBSHR(IPB,IOBS) + ZWT*GOMOBSHR(IPT,IOBS) *************************************************************** IF(LLPRINT .AND. IOBS.EQ.1) THEN zinc = (ZPHIT - ZPHIB)/GRAV write(nulout,*) 'dobssatem: IOBS,zlev,ZPT,ZPB,ZWB,ZWT= ' & ,IOBS,zpref,ZPT,ZPB,ZWB,ZWT write(nulout,*) & 'dobssatem: ik,ipb,ipt,GMOBSHR(IPb,),GMOBSHR(IPt,)= ',ik,ipb,ipt,GOMOBSHR(IPb,IOBS),GOMOBSHR(IPt,IOBS) write(nulout,*) 'dobssatem: ipos,zphit,dz,zvar,zoer = ' & ,ipos,zphit,zinc,ZVAR,ZOER ENDIF *************************************************************** C C CONTRIBUTION TO Jo C ROBDATA8(NCMOMA,JDATA) = + ( (ZPHIT - ZPHIB)/GRAV - ZVAR )/ZOER DLSUM=DLSUM+ROBDATA8(NCMOMA,JDATA)* & ROBDATA8(NCMOMA,JDATA) ROBDATA8(NCMOMI,JDATA)=ROBDATA8(NCMOMA,JDATA) ENDIF END DO 200 CONTINUE C C Process all geopotential data below model's orography C DO JDATA = IBEGIN,ILAST IOBS = MOBDATA(NCMOBS,JDATA) LLOK=(MOBDATA(NCMASS,JDATA) .EQ. 1) & .AND. (MOBDATA(NCMXTR,JDATA) .EQ. 2) & .AND. (MOBDATA(NCMVNM,JDATA) .EQ. IELMDZ ) & .AND. (MOBDATA(NCMVCO,JDATA) .EQ. 2 ) IF ( LLOK ) THEN IPOS = MOBDATA(NCMPOS,JDATA) ZVAR = ROBDATA8(NCMVAR,JDATA) ZOER = ROBDATA8(NCMOER,JDATA) ZLEV = ROBDATA8(NCMPPP,JDATA) ZPREF= ROBDATA8(NCMPRL,JDATA) C C CALCULATE PHI AT REFERENCE LEVEL C c c forward nonlinear model for geopotential data below model's orography c ZTVG = (1.0 + DELTA * EXP(GOMQHR(NLEVTRL,IOBS))) & *GOMTHR(NLEVTRL,IOBS) ZPHIB = RMTMOBS(iobs) & + ZTVG/zgamma & *(1.-(ZPREF/gompshr(1,iobs))**zexp) C C CALCULATE PHI AT PRESSURE LEVEL C IK = MOD ( ROBDATA(NCMLYR,JDATA),1000. ) IPT = IK + IPOS*NLEVTRL IPB = IPT + 1 ZPT = RPPOBSHR(IK,IOBS) ZPB = RPPOBSHR(IK+1,IOBS) ZWB = LOG(ZLEV/ZPT)/LOG(ZPB/ZPT) ZWT = 1. - ZWB ZPHIT = ZWB*GOMOBSHR(IPB,IOBS) + ZWT*GOMOBSHR(IPT,IOBS) *************************************************************** IF(LLPRINT .AND. IOBS.EQ.1) THEN zinc = (ZPHIT - ZPHIB)/GRAV write(nulout,*) & 'dobssatem: IOBS,ZTVG,GOMQHR(NLEVTRL),GOMTHR(NLEVTRL)',IOBS,ZTVG,GOMQHR(NLEVTRL,IOBS),GOMTHR(NLEVTRL,IOBS) write(nulout,*) & 'dobssatem: RMTMOBS,ZPREF,zgamma,zexp,gompshr(1,iobs)',RMTMOBS(IOBS),ZPREF,zgamma,zexp,gompshr(1,iobs) write(nulout,*) & 'dobssatem: ZWB,ZWT,ZPT,ZPB,zphiB(m2s-2),zphit(m2s-2)', ZWB,ZWT,ZPT,ZPB,zphiB,zphit write(nulout,*) & 'dobssatem: ik,zlev,ipb,ipt,GOBSHR(IPB,),GOBSHR(IPT,)',ik,zlev,ipt,GOMOBSHR(IPB,IOBS),GOMOBSHR(IPT,IOBS) write(nulout,*) & 'dobssatem: ipos,dzinc(m),dzobs(m),std-dev-obs(m) = ',ipos,zinc,ZVAR,ZOER ENDIF *************************************************************** C C CONTRIBUTION TO Jo C ROBDATA8(NCMOMA,JDATA) = + ( (ZPHIT - ZPHIB)/GRAV - ZVAR )/ZOER DLSUM=DLSUM+ROBDATA8(NCMOMA,JDATA)* & ROBDATA8(NCMOMA,JDATA) ROBDATA8(NCMOMI,JDATA)=ROBDATA8(NCMOMA,JDATA) ENDIF END DO C 300 CONTINUE C-------------------------------------------------------------------- C ENDIF END DO C===================== PJO = DLSUM C===================== RETURN END