LMDZ
gpxyb.F90
Go to the documentation of this file.
1 SUBROUTINE gpxyb(KPROMA,KSTART,KPROF,KFLEV,PVDELB,PVC,&
2  & pres,pdelp,prdelp,plnpr,palph,prtgr,&
3  & prpres,prpp)
4 
5 !**** *GPXYB* - Computes auxillary arrays
6 
7 ! Purpose.
8 ! --------
9 ! COMPUTES AUXILLARY ARRAYS RELATED TO THE HYBRID COORDINATE
10 
11 !** Interface.
12 ! ----------
13 ! *CALL* *GPXYB(..)
14 
15 ! Explicit arguments :
16 ! --------------------
17 ! KPROMA : dimensioning
18 ! KSTART : start of work
19 ! KPROF : depth of work
20 ! KFLEV : vert. dimensioning
21 
22 ! PVDELB(KPROMA,0:KFLEV) : related to vert. coordinate (input)
23 ! PVC (KPROMA,0:KFLEV) : " " " " " (input)
24 ! PRES (KPROMA,0:KFLEV) : HALF LEVEL PRESSURE (input)
25 ! PDELP (KPROMA,KFLEV) : PRESSURE DIFFERENCE ACROSS LAYERS (output)
26 ! PRDELP(KPROMA,KFLEV) : THEIR INVERSE (output)
27 ! PLNPR (KPROMA,KFLEV) : LOGARITHM OF RATIO OF PRESSURE (output)
28 ! PALPH (KPROMA,KFLEV) : COEFFICIENTS OF THE HYDROSTATICS (output)
29 ! PRTGR (KPROMA,KFLEV) : FOR PRES. GRAD. TERM AND ENE. CONV.(output)
30 ! ((rssavnabla prehyd/prehyd)_[layer]
31 ! = prtgr_[layer] * (rssavnabla prehyds))
32 ! PRPRES(KPROMA,KFLEV) : inverse of HALF LEVEL PRESSURE (output)
33 ! PRPP (KPROMA,KFLEV) : inverse of PRES(J)*PRES(J-1) (output)
34 
35 ! Implicit arguments : None.
36 ! --------------------
37 
38 ! Method.
39 ! -------
40 ! See documentation
41 
42 ! Externals. None.
43 ! ----------
44 
45 ! Reference.
46 ! ----------
47 ! ECMWF Research Department documentation of the IFS
48 
49 ! Author.
50 ! -------
51 ! Mats Hamrud and Philippe Courtier *ECMWF*
52 
53 ! Modifications.
54 ! --------------
55 ! Original : 88-02-04
56 ! Modified : 94-10-11 by Radmila Bubnova: correction in the case
57 ! of the other approximation of d (ln p).
58 ! Modified : 99-06-04 Optimisation D.SALMOND
59 ! Modified : 02-03-08 K. YESSAD: consistent discretisations of
60 ! "alpha" (PALPH) and "prtgr" (PRTGR)
61 ! for finite element vertical discretisation
62 ! to allow model to run with MF-physics and DDH.
63 ! Modified : 03-07-07 J. Hague: Replace divides with reciprocal
64 ! M.Hamrud 01-Oct-2003 CY28 Cleaning
65 ! Modified : 15-Feb-2005 by K. YESSAD: ZTOPPRES becomes TOPPRES
66 ! ------------------------------------------------------------------
67 
68 USE parkind1 ,ONLY : jpim ,jprb
69 USE yomhook ,ONLY : lhook, dr_hook
70 
71 USE yomdyn , ONLY : ndlnpr ,rhydr0
72 USE yomcst , ONLY : rd ,rcvd
73 USE yomgem , ONLY : vdela ,vaf ,vbf ,toppres
74 USE yomcver , ONLY : lvertfe
75 
76 ! ------------------------------------------------------------------
77 
78 IMPLICIT NONE
79 
80 INTEGER(KIND=JPIM),INTENT(IN) :: KPROMA
81 INTEGER(KIND=JPIM),INTENT(IN) :: KFLEV
82 INTEGER(KIND=JPIM),INTENT(IN) :: KSTART
83 INTEGER(KIND=JPIM),INTENT(IN) :: KPROF
84 REAL(KIND=JPRB) ,INTENT(IN) :: PVDELB(kflev)
85 REAL(KIND=JPRB) ,INTENT(IN) :: PVC(kflev)
86 REAL(KIND=JPRB) ,INTENT(IN) :: PRES(kproma,0:kflev)
87 REAL(KIND=JPRB) ,INTENT(INOUT) :: PDELP(kproma,kflev)
88 REAL(KIND=JPRB) ,INTENT(INOUT) :: PRDELP(kproma,kflev)
89 REAL(KIND=JPRB) ,INTENT(INOUT) :: PLNPR(kproma,kflev)
90 REAL(KIND=JPRB) ,INTENT(OUT) :: PALPH(kproma,kflev)
91 REAL(KIND=JPRB) ,INTENT(OUT) :: PRTGR(kproma,kflev)
92 REAL(KIND=JPRB) ,INTENT(OUT) :: PRPRES(kproma,kflev)
93 REAL(KIND=JPRB) ,INTENT(INOUT) :: PRPP(kproma,kflev)
94 
95 ! ------------------------------------------------------------------
96 
97 INTEGER(KIND=JPIM) :: IFIRST, JLEV, JLON, JJ, JTEMP, JM
98 
99 REAL(KIND=JPRB) :: ZPRESF
100 REAL(KIND=JPRB) :: ZRPRES(kproma,2)
101 REAL(KIND=JPRB) :: ZPRESFD
102 REAL(KIND=JPRB) :: ZHOOK_HANDLE
103 
104 ! ------------------------------------------------------------------
105 
106 #include "abor1.intfb.h"
107 
108 ! ------------------------------------------------------------------
109 
110 IF (lhook) CALL dr_hook('GPXYB',0,zhook_handle)
111 
112 ! ------------------------------------------------------------------
113 
114 !* 0. Level to begin normal computations
115 ! ----------------------------------
116 
117 ! This is introduced to allow the use of GPXYB without the implicit
118 ! assumption that the top level input for pressure is 0 hPa. This
119 ! is used in the surface observation operators where you do not want
120 ! to compute geopotential at all model levels.
121 ! The first block if is for economy (no do loop start up) and the second
122 ! for safety.
123 !print *,'GPXYB: NDLNPR RHYDR0=',NDLNPR,RHYDR0
124 toppres=0.1 !!!!! A REVOIR (MPL) 29042010 passe de 0 a 0.1 comme ARPEGE
125 IF(pres(kstart,0) <= toppres)THEN
126  ifirst=2
127 ELSE
128  ifirst=1
129  DO jlon=kstart,kprof
130  IF(pres(jlon,0) <= toppres)then
131  ifirst=2
132  EXIT
133  ENDIF
134  ENDDO
135 ENDIF
136 ! ------------------------------------------------------------------
137 
138 !* 1. COMPUTES EVERYTHING.
139 ! --------------------
140 
141 !print *,'NDLNPR LVERTFE',NDLNPR,LVERTFE
142 IF(ndlnpr == 0) THEN
143 
144  IF(lvertfe) THEN
145  DO jlev=1,kflev
146  DO jlon=kstart,kprof
147  pdelp(jlon,jlev)=vdela(jlev) + pvdelb(jlev)*pres(jlon,kflev)
148  prdelp(jlon,jlev)=1.0_jprb/pdelp(jlon,jlev)
149  zpresf =vaf(jlev) + vbf(jlev)*pres(jlon,kflev)
150  zpresfd=1.0_jprb/zpresf
151  plnpr(jlon,jlev)=pdelp(jlon,jlev)*zpresfd
152  ! * PRTGR needed for DDH and option LVERCOR=T.
153  ! for finite element vertical discretisation,
154  ! "prtgr_[layer]" is simply B_[layer]/prehyd_[layer]
155  prtgr(jlon,jlev)=vbf(jlev)*zpresfd
156  ! * PALPH needed for MF physics:
157  palph(jlon,jlev)=(pres(jlon,jlev)-zpresf)*zpresfd
158  ENDDO
159  ENDDO
160  ELSE
161  jj=1
162  jm=2
163  DO jlon=kstart,kprof
164  zrpres(jlon,jm)=1.0_jprb/pres(jlon,ifirst-1)
165  ENDDO
166  DO jlev=ifirst,kflev
167  DO jlon=kstart,kprof
168  zrpres(jlon,jj)=1.0_jprb/pres(jlon,jlev)
169  pdelp(jlon,jlev)=pres(jlon,jlev)-pres(jlon,jlev-1)
170  prdelp(jlon,jlev)=1.0_jprb/pdelp(jlon,jlev)
171  plnpr(jlon,jlev)=log(pres(jlon,jlev)*zrpres(jlon,jm))
172  prpres(jlon,jlev)=zrpres(jlon,jj)
173  palph(jlon,jlev)=1.0_jprb-pres(jlon,jlev-1)*prdelp(jlon,jlev)&
174  & *plnpr(jlon,jlev)
175  prpp(jlon,jlev)=zrpres(jlon,jj)*zrpres(jlon,jm)
176  prtgr(jlon,jlev)=prdelp(jlon,jlev)&
177  & *(pvdelb(jlev)+pvc(jlev)*plnpr(jlon,jlev)*prdelp(jlon,&
178  & jlev))
179 ! print *,'GPXYB JLEV JLON JJ PRES ZPRES PDELP ', JLEV,JLON,JJ,PRES(JLON,JLEV),ZRPRES(JLON,JJ),PDELP(JLON,JLEV)
180 ! print *,'GPXYB JLEV JLON JM PRDELP PLNPR ', JLEV,JLON,JM,PRDELP(JLON,JLEV),PLNPR (JLON,JLEV)
181 ! print *,'GPXYB JLEV JLON JJ PRPRES PALPH ', JLEV,JLON,JJ,PRPRES(JLON,JLEV),PALPH (JLON,JLEV)
182 ! print *,'GPXYB JLEV JLON PRPP PRTGR PVDELB PVC ', JLEV,JLON,PRPP (JLON,JLEV),PRTGR (JLON,JLEV),PVDELB(JLEV),PVC(JLEV)
183  ENDDO
184  jtemp=jm
185  jm=jj
186  jj=jtemp
187  ENDDO
188  DO jlev=1,ifirst-1
189  DO jlon=kstart,kprof
190  pdelp(jlon,jlev)=pres(jlon,jlev)-pres(jlon,jlev-1)
191  prdelp(jlon,jlev)=1.0_jprb/pdelp(jlon,jlev)
192  plnpr(jlon,jlev)=log(pres(jlon,1)/toppres)
193  prpres(jlon,jlev)=1.0_jprb/pres(jlon,1)
194  palph(jlon,jlev)=rhydr0
195  prpp(jlon,jlev)=1.0_jprb/(pres(jlon,1)*toppres)
196  prtgr(jlon,jlev)=prdelp(jlon,jlev)*pvdelb(jlev)
197  ENDDO
198  ENDDO
199  ENDIF
200 
201 ELSEIF(ndlnpr == 1) THEN
202  IF(lvertfe) THEN
203  CALL abor1(' LVERTFE=.T. NOT COMPATIBLE WITH NDLNPR == 1')
204  ENDIF
205 
206  DO jlev=ifirst,kflev
207  DO jlon=kstart,kprof
208  pdelp(jlon,jlev)=pres(jlon,jlev)-pres(jlon,jlev-1)
209  prdelp(jlon,jlev)=1.0_jprb/pdelp(jlon,jlev)
210  prpp(jlon,jlev)=1.0_jprb/(pres(jlon,jlev)*pres(jlon,jlev-1))
211  plnpr(jlon,jlev)=pdelp(jlon,jlev)*sqrt(prpp(jlon,jlev))
212  palph(jlon,jlev)=1.0_jprb-pres(jlon,jlev-1)*prdelp(jlon,jlev)&
213  & *plnpr(jlon,jlev)
214  prtgr(jlon,jlev)=prdelp(jlon,jlev)&
215  & *(pvdelb(jlev)+pvc(jlev)*plnpr(jlon,jlev)*prdelp(jlon,&
216  & jlev))
217  prpres(jlon,jlev)=1.0_jprb/pres(jlon,jlev)
218  ENDDO
219  ENDDO
220 
221  DO jlev=1,ifirst-1
222  DO jlon=kstart,kprof
223  pdelp(jlon,jlev)=pres(jlon,jlev)
224  prdelp(jlon,jlev)=1.0_jprb/pdelp(jlon,jlev)
225  plnpr(jlon,jlev)=2.0_jprb+rcvd/rd
226  palph(jlon,jlev)=1.0_jprb
227  prtgr(jlon,jlev)=prdelp(jlon,jlev)*pvdelb(jlev)
228  prpres(jlon,jlev)=1.0_jprb/pres(jlon,1)
229  prpp(jlon,jlev)=(plnpr(jlon,jlev)*prdelp(jlon,jlev))**2
230  ENDDO
231  ENDDO
232 
233 ENDIF
234 
235 ! (PLNPR(JLON,1) AND PRPP(JLON,1) ARE A PRIORI NOT USED LATER)
236 
237 ! ------------------------------------------------------------------
238 
239 IF (lhook) CALL dr_hook('GPXYB',1,zhook_handle)
240 END SUBROUTINE gpxyb
real(kind=jprb), dimension(:), allocatable vbf
Definition: yomgem.F90:174
real(kind=jprb) rd
Definition: yomcst.F90:39
subroutine abor1(CDTEXT)
Definition: abor1.F90:2
real(kind=jprb) rhydr0
Definition: yomdyn.F90:290
Definition: yomgem.F90:1
integer, parameter jprb
Definition: parkind1.F90:31
real(kind=jprb), dimension(:), allocatable vdela
Definition: yomgem.F90:172
subroutine gpxyb(KPROMA, KSTART, KPROF, KFLEV, PVDELB, PVC, PRES, PDELP, PRDELP, PLNPR, PALPH, PRTGR, PRPRES, PRPP)
Definition: gpxyb.F90:4
real(kind=jprb) toppres
Definition: yomgem.F90:176
logical lhook
Definition: yomhook.F90:12
logical lvertfe
Definition: yomcver.F90:20
subroutine dr_hook(CDNAME, KSWITCH, PKEY)
Definition: yomhook.F90:17
Definition: yomdyn.F90:1
integer, parameter jpim
Definition: parkind1.F90:13
real(kind=jprb), dimension(:), allocatable vaf
Definition: yomgem.F90:173
integer(kind=jpim) ndlnpr
Definition: yomdyn.F90:258
Definition: yomcst.F90:1
real(kind=jprb) rcvd
Definition: yomcst.F90:43