!-------------------------------------- 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 PTOT2(KULSTAT,KULCORNS,KULSTDEV) 1,11
#if defined (DOC)
*
***s/r PTOT2 - Statistical Estimation of A where:
* vec(T Ps) = A vec(P_b) + vec(T' Ps')
* Identical setup as correlation calculations
*
*Author : Mark Buehner *ARMA/AES July, 1998
*Revision: 001 R. Sarrazin oct. 98
* remove mean with call to meangd, add scaling by zfact
* . 002 P. Koclas *CMC/AES June 1999:
* . - Y2K conversion
* . 003 JM Belanger *CMDA/SMC* June 2001
* . - 32 bits conversion.
* . 004 JM Belanger *CMDA/SMC* June 2001
* . - Compute PTOT for three latitude bands.
* . 005 C. Charette *ARMA/SMC Oct 2002
* - Adapted for hybrid coordinates
* . 006 M. Buehner *ARMA/MSC* February 2004
* . - Vertical localization for ZM1,ZM2
* . 007 C. Charette - ARMA/SMC - Sep. 2004
* - Conversion to hybrid vertical coordinate
* . 008 M. Buehner - ARMA - May 2008
* - Modified call to getfst
*
*Arguments: KULSTAT logical unit number
* KULCORNS logical unit number
* KULSTDEV logical unit number
*
#endif
IMPLICIT NONE
*implicits
#include "comlun.cdk"
#include "pardim.cdk"
#include "comdim.cdk"
#include "comcst.cdk"
#include "comgem.cdk"
#include "comleg.cdk"
#include "comcorr.cdk"
#include "comsp.cdk"
#include "comgd0.cdk"
#include "comsp1.cdk"
#include "comgd1.cdk"
#include "comgdpar.cdk"
#include "comcse1.cdk"
#include "comstdd.cdk"
*
INTEGER KULSTAT, KULCORNS, KULSTDEV
C
INTEGER JENS, IENS, JK1, JK2, JLA
INTEGER IERR, JFILE, JK, JLAT, ILON, JLON, ILEN, JB, NLATBAND
C
INTEGER FNOM, FSTOUV, FSTFRM, FCLOS, FSTPRM, FSTINF, FSTINL
C
C RPN Standard files parameters
C
INTEGER INI, INJ, INK, INPAS, INBITS, IDATYP, IDEET,
+ IP1, IP2, IP3, IG1, IG2, IG3, IG4, ISWA, ILENGTH, IDLTF,
+ IUBC, IEXTR1, IEXTR2, IEXTR3
INTEGER ILISTE(100), IDATE(100), IDATV(100), IDIMAX, INFON, IFSTRUN, IHH
C
integer iip1s(jpnflev),iip2,iip3,itrlnlev,jlev, itrlgid
integer ipmode,ipkind,ip1_pak_trl,ip1_vco_trl
real zlev(jpnflev)
character*1 clstring
INTEGER IBND1,IBND2,JPNLATBND,ILAT
PARAMETER (JPNLATBND = 3)
C
REAL*8 DHEURES
CHARACTER*1 CLTYPVAR, CLGRTYP
CHARACTER*2 CLNOMVAR
CHARACTER*8 CLETIKET
C
REAL*8 ZFACT,ZMAXI,ZWT,ZPROF(JPNFLEV),ZPS
REAL*8 ZM1(NFLEV+1,NFLEV,JPNLATBND), ZM2(NFLEV,NFLEV,JPNLATBND)
REAL*8 ZTT(NFLEV+1,NFLEV,JPNLATBND)
REAL*8 ZPTOTBND(NFLEV+1,NFLEV,JPNLATBND)
REAL*8 ZM2INV(NFLEV,NFLEV,JPNLATBND), ZWORK(NFLEV*NFLEV), ZDET, ZEPS
REAL*8 ZCHIPSI(NFLEV,NJ), ZPSIPSI(NFLEV,NJ)
INTEGER INDXMID(JPNLATBND)
REAL*8 DLA2, DL1SA2
REAL*8 DLLATMIN(JPNLATBND), DLLATMAX(JPNLATBND)
REAL*8 DLLATMID(JPNLATBND)
REAL*8 ZLC,ZTLEN,ZR,ZCORR,ZPRES1,ZPRES2
ccc debug in
real*8 zeigwrk(4*nflev),zeigen(nflev,nflev),zeigenv(nflev)
real*8 zeigmax,zeigenvi(nflev)
real zfix
integer iwork,info
LOGICAL LFLTEIG
CCC DEBUG out
C
DATA DLLATMIN / -60.0D0, -30.0D0, 30.0D0 /
DATA DLLATMAX / -30.0D0, 30.0D0, 60.0D0 /
DATA DLLATMID / -45.0D0, 00.0D0, 45.0D0 /
ccc DATA DLLATMIN / -90.0D0, -30.0D0, 30.0D0 /
ccc DATA DLLATMAX / -30.0D0, 30.0D0, 90.0D0 /
ccc DATA DLLATMID / -45.0D0, 00.0D0, 45.0D0 /
C
EXTERNAL FNOM, FSTOUV, FSTFRM, FCLOS, FSTPRM, FSTINF,FSTINL
C---------------------------------------------------------------------
C
WRITE(NULOUT,FMT=9000)
9000 FORMAT(3(/,3x,80('.')),//
S ,4x,' PTOT2- Estimation of P_to_T Operator',//)
C
C Initialize a few constants
C
DLA2 = DBLE(RA)*DBLE(RA)
DL1SA2 = 1.D0/DLA2
C
C 1. Initialize P_to_T, ZM1, ZM2
C
100 CONTINUE
DO JK1= 1, (NFLEV+1)
DO JK2 = 1, NFLEV
DO JLAT = 1, NJ
PTOT(JK1,JK2,JLAT) = 0.0
END DO
END DO
END DO
DO JB= 1, JPNLATBND
DO JK1= 1, (NFLEV+1)
DO JK2 = 1, NFLEV
ZM1(JK1,JK2,JB) = 0.0
ZPTOTBND(JK1,JK2,JB) = 0.0
END DO
END DO
END DO
DO JB= 1, JPNLATBND
DO JK1= 1, NFLEV
DO JK2 = 1, NFLEV
ZM2(JK1,JK2,JB) = 0.0
ZTT(JK1,JK2,JB) = 0.0
END DO
END DO
END DO
C
C Initialize covariances for THETA estimation
C
DO JK1=1,NFLEV
DO JLAT=1,NJ
ZCHIPSI(JK1,JLAT) = 0.0
ZPSIPSI(JK1,JLAT) = 0.0
THETA(JK1,JLAT) = 0.0
ENDDO
ENDDO
C Calculate indexes
C NOTE: The latitudes in vector RLATI are stored from North to South
DO JB = 1, JPNLATBND
DO JLAT = 2, NJ
ILAT = NJ - JLAT + 1
IF ( 2.*RPI*DLLATMID(JB)/360. .LT. RLATI(JLAT-1)
& .AND. 2.*RPI*DLLATMID(JB)/360. .GE. RLATI(JLAT)) THEN
INDXMID(JB) = JLAT
ENDIF
ENDDO
ENDDO
C
C allocate space for accumulators
C
CALL STDDALL
C
C*********************************************************************
C* 2. Access the increments of PSI and (T,lnPs) from a set of files
C . (loop on the files)
C
200 CONTINUE
IDIMAX = 100
C
CALL MEANGD
(KULSTAT)
DO 201 JFILE = 1, NFLSTAT
C
CALL GETINCR
(KULSTAT,JFILE)
C
C* . 2.1 Find how many cases there are to be treated
C
210 CONTINUE
C
IP1 = -1
IP2 = -1
IP3 = -1
CLNOMVAR = CFSTVAR(1)
IF (CLNOMVAR.EQ.'P0') THEN
IP1 =0
ELSE
call getfldprm
(iip1s,iip2,iip3,itrlnlev,CETIKETN,cltypvar
& ,itrlgid,CLNOMVAR,-1,jpnflev,kulstat,nulout
& ,ip1_pak_trl,ip1_vco_trl)
c
c---------Decode and sort the levels
ipmode = -1
do jlev = 1,itrlnlev
call CONVIP(iip1s(jlev),ZLEV(jlev),IPKIND
& ,ipmode,clstring, .false. )
enddo
c
call sort(zlev,itrlnlev)
c---------Read in nomvar at the surface (at zlev(itrlnlev)
ipmode = ip1_pak_trl
call CONVIP(IP1,zlev(itrlnlev),ip1_vco_trl
& ,ipmode,clstring, .false. )
ENDIF
WRITE(NULOUT,*)
IERR = FSTINL (KULSTAT,INI,INJ,INK
S ,-1,CETIKETN,IP1,IP2,IP3,' '
S ,CLNOMVAR,ILISTE,INFON,IDIMAX)
WRITE(NULOUT,9210)INFON
9210 FORMAT(//,4X,"ENSEMBLE OF ",I4," INCREMENTS")
IF(INFON.EQ.0) THEN
WRITE(NULOUT,*)' THIS FILE IS EMPTY. CHECK THE SELECTION CRITERIA'
CALL ABORT3D
(NULOUT,'PTOT2: PROBLEM WITH FSTINL')
END IF
IENS = INFON
C
C* . 2.2 Get all the dates at which increments are available
C
220 CONTINUE
DO JENS = 1, IENS
IERR = FSTPRM(ILISTE(JENS),IDATE(JENS),IDEET,INPAS
+ ,INI,INJ,INK, INBITS, IDATYP
+ ,IP1,IP2,IP3,CLTYPVAR,CLNOMVAR,CLETIKET,CLGRTYP
+ ,IG1,IG2,IG3,IG4,ISWA,ILENGTH,IDLTF
+ ,IUBC,IEXTR1,IEXTR2,IEXTR3)
C
DHEURES = DBLE(INPAS*IDEET/3600)
CALL INCDATR(IDATV(JENS),IDATE(JENS),SNGL(DHEURES))
CALL NEWDATE(IDATV(JENS),IFSTRUN,IHH,-3)
WRITE(NULOUT,9320)JENS, IFSTRUN,IHH
END DO
9320 FORMAT(5X,"Case No. ",I3,5x,"Date and time: ",I10,5x,I8)
C
IF(NENSEMBLE.EQ.0) THEN
NDATESTAT = IDATE(1)
END IF
C
CTYPVARN = ' '
CETIKETN = CLETIKET
C
C* 3. Loop on the ensemble
C
300 CONTINUE
DO 321 JENS = 1, IENS
C
C* 3.1 Get the increment in grid-point form
C
310 CONTINUE
CALL NEWDATE(IDATV(JENS),IFSTRUN,IHH,-3)
WRITE(NULOUT,9310)JENS, IFSTRUN,IHH
9310 FORMAT(3(/),5X,"--- Case No. ",I3,5x,"Date and time: ",I10
& ,5x,I8)
NSTAMPN = IDATE(JENS)
CALL GETFST
(KULSTAT,'G','N',-1)
C
C remove ensemble mean from fields in gd
C
DO JLAT = 1, NJ
ILON = NILON(JLAT)
DO JLON = 1, ILON
DO JK1 = 1, NKGDIM
GD(JLON,JK1,JLAT) = GD(JLON,JK1,JLAT) -
+ XMGD(JLON,JK1,JLAT)
ENDDO
ENDDO
ENDDO
C
C . Estimation of P_to_T matrix (A)
C
C CALCULATE PB FROM WIND FIELD
C USE THE LINEAR BALANCE: INPUT=SPVOR1 OUTPUT=SPGZ
CALL GDSP
DO JK = 1, NFLEV
DO JLA = 1, NLA
SPVOR1(JLA,1,JK) = SPVOR(JLA,1,JK)
SPVOR1(JLA,2,JK) = SPVOR(JLA,2,JK)
END DO
END DO
CALL LINBAL
(+1,.FALSE.)
C
C . CONVERT VOR/DIV TO PSI/CHI
C
DO JK = 1, NFLEV
DO JLA = 1, NLA
SPVOR(JLA,1,JK) = SPVOR(JLA,1,JK) * DLA2*R1SNP1(JLA)
SPVOR(JLA,2,JK) = SPVOR(JLA,2,JK) * DLA2*R1SNP1(JLA)
SPDIV(JLA,1,JK) = SPDIV(JLA,1,JK) * DLA2*R1SNP1(JLA)
SPDIV(JLA,2,JK) = SPDIV(JLA,2,JK) * DLA2*R1SNP1(JLA)
END DO
END DO
C
C . Transform to physical space
C P_b in gz1, and PSI, CHI in ut1,vt1
C tt,ps already in physical space (GD0)
CALL SPEREE
(NKSDIM,SP,GD1
S ,NLA,NIBEG,NIEND,NJBEG,NJEND,NKSDIM)
DO JB=1,JPNLATBND
C
C update ZM1 = sum_over_t_x_y[vec(T lnPs) vec(P_b)^T]
C
DO JLAT = 1, NJ
if ((RLATI(JLAT) .gt. 2.*RPI*DLLATMIN(JB)/360.)
+ .and. (RLATI(JLAT) .le. 2.*RPI*DLLATMAX(JB)/360.)) then
ZFACT = 1.0
else
ZFACT = 0.0
endif
ILON = NILON(JLAT)
DO JLON = 1, ILON
DO JK1 = 1, (NFLEV+1)
DO JK2 = 1, NFLEV
IF(JK1.LE.NFLEV) THEN
ZM1(JK1,JK2,JB) = ZM1(JK1,JK2,JB) +
+ ZFACT * TT0(JLON,JK1,JLAT) * GZ1(JLON,JK2,JLAT)
ELSE
ZM1(JK1,JK2,JB) = ZM1(JK1,JK2,JB) +
+ ZFACT * GPS0(JLON,1,JLAT) * GZ1(JLON,JK2,JLAT)
ENDIF
ENDDO
ENDDO
ENDDO
ENDDO
C
C update ZM2 = sum_over_t_x_y[vec(P_b) vec(P_b)^T]
C
DO JLAT = 1, NJ
if ((RLATI(JLAT) .gt. 2.*RPI*DLLATMIN(JB)/360.)
+ .and. (RLATI(JLAT) .le. 2.*RPI*DLLATMAX(JB)/360.)) then
ZFACT = 1.0
else
ZFACT = 0.0
endif
ILON = NILON(JLAT)
DO JLON = 1, ILON
DO JK1 = 1, NFLEV
DO JK2 = 1, NFLEV
ZM2(JK1,JK2,JB) = ZM2(JK1,JK2,JB) +
+ ZFACT * GZ1(JLON,JK1,JLAT) * GZ1(JLON,JK2,JLAT)
ZTT(JK1,JK2,JB) = ZTT(JK1,JK2,JB) +
+ ZFACT * TT0(JLON,JK1,JLAT) * TT0(JLON,JK2,JLAT)
ENDDO
ENDDO
ENDDO
ENDDO
END DO ! Loop on JPNLATBND
C
C update ZCHIPSI and ZPSIPSI covariances
DO JLAT = 1, NJ
ILON = NILON(JLAT)
DO JLON = 1, ILON
DO JK1 = 1, NFLEV
ZPSIPSI(JK1,JLAT) = ZPSIPSI(JK1,JLAT) +
+ UT1(JLON,JK1,JLAT) * UT1(JLON,JK1,JLAT)
ZCHIPSI(JK1,JLAT) = ZCHIPSI(JK1,JLAT) +
+ VT1(JLON,JK1,JLAT) * UT1(JLON,JK1,JLAT)
ENDDO
ENDDO
ENDDO
c
321 CONTINUE
C
C* . 3.7 Ending the processing of one file
C
370 CONTINUE
NENSEMBLE = NENSEMBLE + IENS
WRITE(NULOUT,9370) IENS, NENSEMBLE
9370 FORMAT(5X,I4," cases have been processed",
S 5x,"Current size of the ensemble: ",I4)
C
IERR = FSTFRM (KULSTAT)
IERR = FCLOS (KULSTAT)
C
C* ---- Ending the loop on files -----
C
201 CONTINUE
C
C
C Filter ZM2 by setting smallest eigenvalues to zero
C
CCC DEBUG IN
write(601,*)zm1
write(602,*)zm2
write(603,*)ztt
LFLTEIG = .FALSE.
IWORK=4*NFLEV
do JB=1,JPNLATBND
DO JK1=1,NFLEV
DO JK2=1,NFLEV
ZEIGEN(JK1,JK2)=ZM2(JK1,JK2,JB)
END DO
END DO
CALL DSYEV('V','U',NFLEV, ZEIGEN,NFLEV, ZEIGENV,ZEIGWRK, IWORK
& ,INFO )
*
zeigmax=maxval(ZEIGENV)
write(nulout,*)'zm2 eigmax= ',jb,zeigmax
WRITE(NULOUT,'(1x,"ZM2 ORIGINAL EIGEN VALUES BAND= ",I3)') JB
WRITE(NULOUT,'(1x,5e15.8)') (ZEIGENV(JK1),JK1=1,NFLEV)
do JK1=1,NFLEV
if(LFLTEIG .and. (ZEIGENV(JK1).lt. (1.0e-4*zeigmax))) then
ZEIGENV(JK1)=0.0
ZEIGENVI(JK1)=0.0
else
ZEIGENVI(JK1)=1.0/ZEIGENV(JK1)
endif
enddo
WRITE(NULOUT,'(1x,"ZM2 FILTERED EIGEN VALUES BAND= ",I3)') JB
WRITE(NULOUT,'(1x,5e15.8)') (ZEIGENV(JK1),JK1=1,NFLEV)
DO JK1=1,NFLEV
DO JK2=1,NFLEV
ZM2INV(JK1,JK2,JB)=0.0
ZM2(JK1,JK2,JB)=0.0
DO JK=1,NFLEV
ZM2INV(JK1,JK2,JB)=ZM2INV(JK1,JK2,JB)+ZEIGEN(JK1,JK)
& *ZEIGENVI(JK)*ZEIGEN(JK2,JK)
ZM2(JK1,JK2,JB) =ZM2(JK1,JK2,JB) +ZEIGEN(JK1,JK)
& *ZEIGENV(JK) *ZEIGEN(JK2,JK)
END DO
END DO
END DO
enddo
C
C* . Calculate A = ZM1*inv(ZM2)
C . ----------------------------------------------------------
C
*
C seem to need to scale ZM2 before calling MINV (otherwise overflow error)
C scale by maximum value (zmaxi) - rescale in final calculation
DO JB=1,JPNLATBND
ZMAXI = 0.0
DO JK1 = 1, NFLEV
DO JK2 = 1, NFLEV
IF(ZM2(JK1,JK2,JB).GT.ZMAXI) ZMAXI = ZM2(JK1,JK2,JB)
ENDDO
ENDDO
C
cbue DO JK1 = 1, NFLEV
cbue DO JK2 = 1, NFLEV
cbue ZM2INV(JK1,JK2,JB) = ZM2(JK1,JK2,JB)/ZMAXI
cbue ENDDO
cbue ENDDO
C
cbue ZEPS = RZERO
cbue CALL MINV(ZM2INV,NFLEV,NFLEV,ZWORK,ZDET,ZEPS,0,1)
DO JK1 = 1, (NFLEV+1)
DO JK2 = 1, NFLEV
DO JK = 1, NFLEV
ZPTOTBND(JK1,JK2,JB) = ZPTOTBND(JK1,JK2,JB) +
$ ZM1(JK1,JK,JB) * ZM2INV(JK,JK2,JB)
ENDDO
ENDDO
ENDDO
END DO ! Loop on JPNLATBND
CCC DEBUG
write(701,*)zm1
write(702,*)zm2
write(703,*)zm2inv
C
c Copy BAND #3 into BAND #1
ccc DO JK1 = 1, (NFLEV+1)
ccc DO JK2 = 1, NFLEV
ccc ZPTOTBND(JK1,JK2,1) = ZPTOTBND(JK1,JK2,3)
ccc ENDDO
ccc ENDDO
C
C Apply vertical localization to both covariance matrices: ZM1,ZM2
C ----------------------------------------------------------------
ccc ztlen= 2.5 ! specify length scale (in units of ln(Pressure))
ccc ztlen= 3.0 ! specify length scale (in units of ln(Pressure))
ccc ztlen= 4.0 ! specify length scale (in units of ln(Pressure))
CCC ztlen= 2.0 ! specify length scale (in units of ln(Pressure))
ztlen= -1.0 ! specify length scale (in units of ln(Pressure))
C
C Calculate typical vertical profile of the pressure
C ----------------------------------------------------------------
zps = 101000. 0
call calcpres
(ZPROF,vhybinc,nflev,ZPS,rptopinc
& ,rprefinc,rcoefinc,1)
C
do jk1=1,nflev
write(nulout,*)'ptot2:lev,hyb,zprof,log= ',jk1,vhybinc(jk1)
& ,zprof(jk1),log(zprof(jk1))
enddo
write(nulout,*)'ptot2:ztlen= ',ztlen
c
if(ZTLEN.gt.0.0) then
c calculate 5'th order function (from Gaspari and Cohn)
ZLC=ZTLEN/2.0
do jk1=1,nflev+1
if(jk1.gt.nflev) then
zpres1=log(ZPROF(nflev))
else
zpres1=log(ZPROF(jk1))
endif
do jk2=1,nflev
zpres2=log(ZPROF(jk2))
ZR = abs(zpres2 - zpres1)
if(ZR.le.ZLC) then
zcorr=-0.250*(ZR/ZLC)**5+0.5*(ZR/ZLC)**4
+ +0.625*(ZR/ZLC)**3-(5.0/3.0)*(ZR/ZLC)**2+1.0
elseif(ZR.le.(2.0*ZLC)) then
zcorr=(1.0/12.0)*(ZR/ZLC)**5-0.5*(ZR/ZLC)**4
+ +0.625*(ZR/ZLC)**3+(5.0/3.0)*(ZR/ZLC)**2
+ -5.0*(ZR/ZLC)+4.0-(2.0/3.0)*(ZLC/ZR)
else
zcorr= 0.0
endif
if(zcorr.lt.0.0) zcorr=0.0
write(NULOUT,*) 'VERT LOCALIZATION=',
+ jk1,jk2,zpres1,zpres2,zr,zlc,zcorr
c apply to ZPTOTBND for all latitude bands
do JB=1,JPNLATBND
ZPTOTBND(jk1,jk2,jb)=ZPTOTBND(jk1,jk2,jb)*zcorr
enddo
enddo
enddo
endif
C
C Apply smoothing over latitude on operator PTOT(nflev+1,nflev,nj).
C NOTE: The latitudes in PTOT are stored from South to North
C
C PP_Tb (NFLEV,NFLEV,120) STORED in PTOT(1:NFLEV,1:NFLEV,1:NJ)
C
DO JK1 = 1, NFLEV
DO JK2 = 1, NFLEV
DO JLAT = 1,NJ
ILAT = NJ -JLAT + 1
if (RLATI(JLAT) .ge.RLATI(INDXMID(3))) THEN
IBND1 = 3
PTOT(JK1,JK2,ILAT) = ZPTOTBND(JK1,JK2,IBND1)
ELSEIF (RLATI(JLAT) .LE. RLATI(INDXMID(1))) THEN
IBND1 = 1
PTOT(JK1,JK2,ILAT) = ZPTOTBND(JK1,JK2,IBND1)
ELSEIF ((RLATI(JLAT) .GT. RLATI(INDXMID(1)))
+ .and. (RLATI(JLAT) .LE. RLATI(INDXMID(2)))) then
IBND1 = 1
IBND2 = 2
ZWT = (RLATI(JLAT) - RLATI(INDXMID(2)))/
+ (RLATI(INDXMID(1)) - RLATI(INDXMID(2)))
PTOT(JK1,JK2,ILAT) = ZWT * ZPTOTBND(JK1,JK2,IBND1) +
+ (1.0 - ZWT) * ZPTOTBND(JK1,JK2,IBND2)
ELSEIF ((RLATI(JLAT) .GT. RLATI(INDXMID(2)))
+ .and. (RLATI(JLAT) .LE. RLATI(INDXMID(3)))) then
IBND1 = 3
IBND2 = 2
ZWT = (RLATI(JLAT) - RLATI(INDXMID(2)))/
+ (RLATI(INDXMID(3)) - RLATI(INDXMID(2)))
PTOT(JK1,JK2,ILAT) = ZWT * ZPTOTBND(JK1,JK2,IBND1) +
+ (1.0 - ZWT) * ZPTOTBND(JK1,JK2,IBND2)
ENDIF
ENDDO
ENDDO
ENDDO
C
C PP_Ps (1,NFLEV,NJ) STORED in PTOT(NFLEV+1,1:NFLEV,1:NJ)
C
DO JK2 = 1, NFLEV
DO JLAT = 1,NJ
ILAT = NJ -JLAT + 1
if (RLATI(JLAT) .ge.RLATI(INDXMID(3))) THEN
IBND1 = 3
PTOT(NFLEV+1,JK2,ILAT) = ZPTOTBND(NFLEV+1,JK2,IBND1)
ELSEIF (RLATI(JLAT) .LE. RLATI(INDXMID(1))) THEN
IBND1 = 1
PTOT(NFLEV+1,JK2,ILAT) = ZPTOTBND(NFLEV+1,JK2,IBND1)
ELSEIF ((RLATI(JLAT) .GT. RLATI(INDXMID(1)))
+ .and. (RLATI(JLAT) .LE. RLATI(INDXMID(2)))) then
IBND1 = 1
IBND2 = 2
ZWT = (RLATI(JLAT) - RLATI(INDXMID(2)))/
+ (RLATI(INDXMID(1)) - RLATI(INDXMID(2)))
PTOT(NFLEV+1,JK2,ILAT) = ZWT * ZPTOTBND(NFLEV+1,JK2,IBND1) +
+ (1.0 - ZWT) * ZPTOTBND(NFLEV+1,JK2,IBND2)
ELSEIF ((RLATI(JLAT) .GT. RLATI(INDXMID(2)))
+ .and. (RLATI(JLAT) .LE. RLATI(INDXMID(3)))) then
IBND1 = 3
IBND2 = 2
ZWT = (RLATI(JLAT) - RLATI(INDXMID(2)))/
+ (RLATI(INDXMID(3)) - RLATI(INDXMID(2)))
PTOT(NFLEV+1,JK2,ILAT) = ZWT * ZPTOTBND(NFLEV+1,JK2,IBND1) +
+ (1.0 - ZWT) * ZPTOTBND(NFLEV+1,JK2,IBND2)
ENDIF
ENDDO
ENDDO
C
C calculate THETA
C
DO JLAT = 1, NJ
DO JK1 = 1, NFLEV
THETA(JK1,JLAT) =
+ ATAN(-ZCHIPSI(JK1,JLAT) / ZPSIPSI(JK1,JLAT))
ENDDO
ENDDO
C deallcate space
C
CALL STDDDAL
C
C
C TEMPORARALLY SET TO ZERO FOR TESTS
ccc DO JK1 = 1, (NFLEV+1)
ccc DO JK2 = 1, NFLEV
ccc DO JLAT = 1,NJ
ccc PTOT(JK1,JK2,JLAT)=0.0
ccc ENDDO
ccc ENDDO
ccc ENDDO
RETURN
END