/[lmdze]/trunk/Sources/phylmd/Orography/orosetup.f
ViewVC logotype

Contents of /trunk/Sources/phylmd/Orography/orosetup.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 178 - (show annotations)
Fri Mar 11 18:47:26 2016 UTC (8 years, 1 month ago) by guez
File size: 11487 byte(s)
Moved variables date0, deltat, datasz_max, ncvar_ids, point, buff_pos,
buffer, regular from module histcom_var to modules where they are
defined.

Removed procedure ioipslmpp, useless for a sequential program.

Added argument datasz_max to histwrite_real (to avoid circular
dependency with histwrite).

Removed useless variables and computations everywhere.

Changed real litteral constants from default kind to double precision
in lwb, lwu, lwvn, sw1s, swtt, swtt1, swu.

Removed unused arguments: paer of sw, sw1s, sw2s, swclr; pcldsw of
sw1s, sw2s; pdsig, prayl of swr; co2_ppm of clmain, clqh; tsol of
transp_lay; nsrf of screenp; kcrit and kknu of gwstress; pstd of
orosetup.

Added output of relative humidity.

1 module orosetup_m
2
3 IMPLICIT NONE
4
5 contains
6
7 SUBROUTINE orosetup(nlon, ktest, kkcrit, kkcrith, kcrit, kkenvh, kknu, &
8 kknu2, paphm1, papm1, pum1, pvm1, ptm1, pgeom1, prho, pri, pstab, ptau, &
9 pvph, ppsi, pzdep, pulow, pvlow, ptheta, pgamma, pmea, ppic, pval, pnu, &
10 pd1, pd2, pdmod)
11
12 ! *gwsetup*
13 ! interface from *orodrag*
14 ! see ecmwf research department documentation of the "i.f.s."
15 ! modifications f.lott for the new-gwdrag scheme november 1993
16
17 USE dimens_m
18 USE dimphy
19 use nr_util, only: pi
20 USE suphec_m
21 USE yoegwd
22
23 ! 0.1 arguments
24
25 INTEGER nlon
26 INTEGER jl, jk
27 REAL zdelp
28
29 INTEGER kkcrit(nlon), kkcrith(nlon), kcrit(nlon), ktest(nlon), &
30 kkenvh(nlon)
31
32 REAL paphm1(nlon, klev+1), papm1(nlon, klev), pum1(nlon, klev), &
33 pvm1(nlon, klev), ptm1(nlon, klev), pgeom1(nlon, klev), &
34 prho(nlon, klev+1), pri(nlon, klev+1), pstab(nlon, klev+1), &
35 ptau(nlon, klev+1), pvph(nlon, klev+1), ppsi(nlon, klev+1), &
36 pzdep(nlon, klev)
37 REAL pulow(nlon), pvlow(nlon), ptheta(nlon), pgamma(nlon), pnu(nlon), &
38 pd1(nlon), pd2(nlon), pdmod(nlon)
39 REAL pmea(nlon), ppic(nlon), pval(nlon)
40
41 ! 0.2 local arrays
42
43 INTEGER ilevh
44 REAL zcons1, zcons2, zhgeo
45 REAL zu, zphi, zvt1, zvt2, zst, zdwind, zwind
46 REAL zstabm, zstabp, zrhom, zrhop
47 LOGICAL lo
48 LOGICAL ll1(klon, klev+1)
49 INTEGER kknu(klon), kknu2(klon), kknub(klon), kknul(klon)
50
51 REAL zhcrit(klon, klev), zvpf(klon, klev), zdp(klon, klev)
52 REAL znorm(klon), zb(klon), zc(klon), znup(klon), znum(klon)
53
54 !------------------------------------------------------------------
55
56 !!print *, "Call sequence information: orosetup"
57 ! 1. initialization
58 ! 1.1 computational constants
59
60 ilevh = klev/3
61
62 zcons1 = 1./rd
63 !old zcons2=g**2/cpd
64 zcons2 = rg**2/rcpd
65
66 ! 2.
67
68 ! 2.1 define low level wind, project winds in plane of
69 ! low level wind, determine sector in which to take
70 ! the variance and set indicator for critical levels.
71
72 DO jl = 1, klon
73 kknu(jl) = klev
74 kknu2(jl) = klev
75 kknub(jl) = klev
76 kknul(jl) = klev
77 pgamma(jl) = max(pgamma(jl), gtsec)
78 ll1(jl, klev+1) = .FALSE.
79 end DO
80
81 ! Ajouter une initialisation (L. Li, le 23fev99):
82
83 DO jk = klev, ilevh, -1
84 DO jl = 1, klon
85 ll1(jl, jk) = .FALSE.
86 END DO
87 END DO
88
89 ! define top of low level flow
90
91 DO jk = klev, ilevh, -1
92 DO jl = 1, klon
93 lo = (paphm1(jl, jk)/paphm1(jl, klev+1)) >= gsigcr
94 IF (lo) THEN
95 kkcrit(jl) = jk
96 END IF
97 zhcrit(jl, jk) = ppic(jl)
98 zhgeo = pgeom1(jl, jk)/rg
99 ll1(jl, jk) = (zhgeo>zhcrit(jl, jk))
100 IF (ll1(jl, jk) .NEQV. ll1(jl, jk+1)) THEN
101 kknu(jl) = jk
102 END IF
103 IF ( .NOT. ll1(jl, ilevh)) kknu(jl) = ilevh
104 end DO
105 end DO
106 DO jk = klev, ilevh, -1
107 DO jl = 1, klon
108 zhcrit(jl, jk) = ppic(jl) - pval(jl)
109 zhgeo = pgeom1(jl, jk)/rg
110 ll1(jl, jk) = (zhgeo>zhcrit(jl, jk))
111 IF (ll1(jl, jk) .NEQV. ll1(jl, jk+1)) THEN
112 kknu2(jl) = jk
113 END IF
114 IF ( .NOT. ll1(jl, ilevh)) kknu2(jl) = ilevh
115 end DO
116 end DO
117 DO jk = klev, ilevh, -1
118 DO jl = 1, klon
119 zhcrit(jl, jk) = amax1(ppic(jl)-pmea(jl), pmea(jl)-pval(jl))
120 zhgeo = pgeom1(jl, jk)/rg
121 ll1(jl, jk) = (zhgeo>zhcrit(jl, jk))
122 IF (ll1(jl, jk) .NEQV. ll1(jl, jk+1)) THEN
123 kknub(jl) = jk
124 END IF
125 IF ( .NOT. ll1(jl, ilevh)) kknub(jl) = ilevh
126 end DO
127 end DO
128
129 DO jl = 1, klon
130 kknu(jl) = min(kknu(jl), nktopg)
131 kknu2(jl) = min(kknu2(jl), nktopg)
132 kknub(jl) = min(kknub(jl), nktopg)
133 kknul(jl) = klev
134 end DO
135
136 !c* initialize various arrays
137
138 DO jl = 1, klon
139 prho(jl, klev+1) = 0.0
140 pstab(jl, klev+1) = 0.0
141 pstab(jl, 1) = 0.0
142 pri(jl, klev+1) = 9999.0
143 ppsi(jl, klev+1) = 0.0
144 pri(jl, 1) = 0.0
145 pvph(jl, 1) = 0.0
146 pulow(jl) = 0.0
147 pvlow(jl) = 0.0
148 kkcrith(jl) = klev
149 kkenvh(jl) = klev
150 kcrit(jl) = 1
151 ll1(jl, klev+1) = .FALSE.
152 end DO
153
154 ! define low-level flow
155
156 DO jk = klev, 2, -1
157 DO jl = 1, klon
158 IF (ktest(jl)==1) THEN
159 zdp(jl, jk) = papm1(jl, jk) - papm1(jl, jk-1)
160 prho(jl, jk) = 2. * paphm1(jl, jk) * zcons1 &
161 / (ptm1(jl, jk) + ptm1(jl, jk-1))
162 pstab(jl, jk) = 2. * zcons2 / (ptm1(jl, jk) + ptm1(jl, jk-1)) &
163 * (1. - rcpd * prho(jl, jk) &
164 * (ptm1(jl, jk) - ptm1(jl, jk - 1)) / zdp(jl, jk))
165 pstab(jl, jk) = max(pstab(jl, jk), gssec)
166 END IF
167 end DO
168 end DO
169
170 ! define blocked flow
171
172 DO jk = klev, ilevh, -1
173 DO jl = 1, klon
174 IF (jk>=kknub(jl) .AND. jk<=kknul(jl)) THEN
175 pulow(jl) = pulow(jl) + pum1(jl, jk)*(paphm1(jl, jk+1)-paphm1(jl, jk) &
176 )
177 pvlow(jl) = pvlow(jl) + pvm1(jl, jk)*(paphm1(jl, jk+1)-paphm1(jl, jk) &
178 )
179 END IF
180 end DO
181 end DO
182 DO jl = 1, klon
183 pulow(jl) = pulow(jl)/(paphm1(jl, kknul(jl)+1)-paphm1(jl, kknub(jl)))
184 pvlow(jl) = pvlow(jl)/(paphm1(jl, kknul(jl)+1)-paphm1(jl, kknub(jl)))
185 znorm(jl) = max(sqrt(pulow(jl)**2+pvlow(jl)**2), gvsec)
186 pvph(jl, klev+1) = znorm(jl)
187 end DO
188
189 ! setup orography axes and define plane of profiles
190
191 DO jl = 1, klon
192 lo = (pulow(jl)<gvsec) .AND. (pulow(jl)>=-gvsec)
193 IF (lo) THEN
194 zu = pulow(jl) + 2.*gvsec
195 ELSE
196 zu = pulow(jl)
197 END IF
198 zphi = atan(pvlow(jl)/zu)
199 ppsi(jl, klev+1) = ptheta(jl)*pi/180. - zphi
200 zb(jl) = 1. - 0.18*pgamma(jl) - 0.04*pgamma(jl)**2
201 zc(jl) = 0.48*pgamma(jl) + 0.3*pgamma(jl)**2
202 pd1(jl) = zb(jl) - (zb(jl)-zc(jl))*(sin(ppsi(jl, klev+1))**2)
203 pd2(jl) = (zb(jl)-zc(jl))*sin(ppsi(jl, klev+1))*cos(ppsi(jl, klev+1))
204 pdmod(jl) = sqrt(pd1(jl)**2+pd2(jl)**2)
205 end DO
206
207 ! define flow in plane of lowlevel stress
208
209 DO jk = 1, klev
210 DO jl = 1, klon
211 IF (ktest(jl)==1) THEN
212 zvt1 = pulow(jl)*pum1(jl, jk) + pvlow(jl)*pvm1(jl, jk)
213 zvt2 = -pvlow(jl)*pum1(jl, jk) + pulow(jl)*pvm1(jl, jk)
214 zvpf(jl, jk) = (zvt1*pd1(jl)+zvt2*pd2(jl))/(znorm(jl)*pdmod(jl))
215 END IF
216 ptau(jl, jk) = 0.0
217 pzdep(jl, jk) = 0.0
218 ppsi(jl, jk) = 0.0
219 ll1(jl, jk) = .FALSE.
220 end DO
221 end DO
222 DO jk = 2, klev
223 DO jl = 1, klon
224 IF (ktest(jl)==1) THEN
225 zdp(jl, jk) = papm1(jl, jk) - papm1(jl, jk-1)
226 pvph(jl, jk) = ((paphm1(jl, jk)-papm1(jl, jk-1))*zvpf(jl, jk)+(papm1( &
227 jl, jk)-paphm1(jl, jk))*zvpf(jl, jk-1))/zdp(jl, jk)
228 IF (pvph(jl, jk)<gvsec) THEN
229 pvph(jl, jk) = gvsec
230 kcrit(jl) = jk
231 END IF
232 END IF
233 end DO
234 end DO
235
236 ! 2.2 brunt-vaisala frequency and density at half levels.
237
238 DO jk = ilevh, klev
239 DO jl = 1, klon
240 IF (ktest(jl)==1) THEN
241 IF (jk>=(kknub(jl)+1) .AND. jk<=kknul(jl)) THEN
242 zst = zcons2/ptm1(jl, jk)*(1.-rcpd*prho(jl, jk)*(ptm1(jl, &
243 jk)-ptm1(jl, jk-1))/zdp(jl, jk))
244 pstab(jl, klev+1) = pstab(jl, klev+1) + zst*zdp(jl, jk)
245 pstab(jl, klev+1) = max(pstab(jl, klev+1), gssec)
246 prho(jl, klev+1) = prho(jl, klev+1) + paphm1(jl, jk)*2.*zdp(jl, jk)* &
247 zcons1/(ptm1(jl, jk)+ptm1(jl, jk-1))
248 END IF
249 END IF
250 end DO
251 end DO
252
253 DO jl = 1, klon
254 pstab(jl, klev + 1) = pstab(jl, klev + 1) &
255 / (papm1(jl, kknul(jl)) - papm1(jl, kknub(jl)))
256 prho(jl, klev + 1) = prho(jl, klev + 1) &
257 / (papm1(jl, kknul(jl)) - papm1(jl, kknub(jl)))
258 end DO
259
260 ! 2.3 mean flow richardson number.
261 ! and critical height for froude layer
262
263 DO jk = 2, klev
264 DO jl = 1, klon
265 IF (ktest(jl)==1) THEN
266 zdwind = max(abs(zvpf(jl, jk)-zvpf(jl, jk-1)), gvsec)
267 pri(jl, jk) = pstab(jl, jk)*(zdp(jl, jk)/(rg*prho(jl, jk)*zdwind))**2
268 pri(jl, jk) = max(pri(jl, jk), grcrit)
269 END IF
270 end DO
271 end do
272
273 ! define top of 'envelope' layer
274
275 DO jl = 1, klon
276 pnu(jl) = 0.0
277 znum(jl) = 0.0
278 end DO
279
280 DO jk = 2, klev - 1
281 DO jl = 1, klon
282
283 IF (ktest(jl)==1) THEN
284
285 IF (jk>=kknub(jl)) THEN
286
287 znum(jl) = pnu(jl)
288 zwind = (pulow(jl)*pum1(jl, jk)+pvlow(jl)*pvm1(jl, jk))/ &
289 max(sqrt(pulow(jl)**2+pvlow(jl)**2), gvsec)
290 zwind = max(sqrt(zwind**2), gvsec)
291 zdelp = paphm1(jl, jk+1) - paphm1(jl, jk)
292 zstabm = sqrt(max(pstab(jl, jk), gssec))
293 zstabp = sqrt(max(pstab(jl, jk+1), gssec))
294 zrhom = prho(jl, jk)
295 zrhop = prho(jl, jk+1)
296 pnu(jl) = pnu(jl) + (zdelp/rg)*((zstabp/zrhop+zstabm/zrhom)/2.)/ &
297 zwind
298 IF ((znum(jl)<=gfrcrit) .AND. (pnu(jl)>gfrcrit) .AND. (kkenvh( &
299 jl)==klev)) kkenvh(jl) = jk
300
301 END IF
302
303 END IF
304
305 end DO
306 end do
307
308 ! calculation of a dynamical mixing height for the breaking
309 ! of gravity waves:
310
311 DO jl = 1, klon
312 znup(jl) = 0.0
313 znum(jl) = 0.0
314 end DO
315
316 DO jk = klev - 1, 2, -1
317 DO jl = 1, klon
318
319 IF (ktest(jl)==1) THEN
320
321 znum(jl) = znup(jl)
322 zwind = (pulow(jl)*pum1(jl, jk)+pvlow(jl)*pvm1(jl, jk))/ &
323 max(sqrt(pulow(jl)**2+pvlow(jl)**2), gvsec)
324 zwind = max(sqrt(zwind**2), gvsec)
325 zdelp = paphm1(jl, jk+1) - paphm1(jl, jk)
326 zstabm = sqrt(max(pstab(jl, jk), gssec))
327 zstabp = sqrt(max(pstab(jl, jk+1), gssec))
328 zrhom = prho(jl, jk)
329 zrhop = prho(jl, jk+1)
330 znup(jl) = znup(jl) + (zdelp/rg)*((zstabp/zrhop+zstabm/zrhom)/2.)/ &
331 zwind
332 IF ((znum(jl)<=pi/2.) .AND. (znup(jl)>pi/2.) .AND. (kkcrith( &
333 jl)==klev)) kkcrith(jl) = jk
334
335 END IF
336
337 end DO
338 end DO
339
340 DO jl = 1, klon
341 kkcrith(jl) = min0(kkcrith(jl), kknu2(jl))
342 kkcrith(jl) = max0(kkcrith(jl), ilevh*2)
343 end DO
344
345 ! directional info for flow blocking
346
347 DO jk = ilevh, klev
348 DO jl = 1, klon
349 IF (jk>=kkenvh(jl)) THEN
350 lo = (pum1(jl, jk)<gvsec) .AND. (pum1(jl, jk)>=-gvsec)
351 IF (lo) THEN
352 zu = pum1(jl, jk) + 2.*gvsec
353 ELSE
354 zu = pum1(jl, jk)
355 END IF
356 zphi = atan(pvm1(jl, jk)/zu)
357 ppsi(jl, jk) = ptheta(jl)*pi/180. - zphi
358 END IF
359 end DO
360 end DO
361 ! forms the vertical 'leakiness'
362
363 DO jk = ilevh, klev
364 DO jl = 1, klon
365 IF (jk>=kkenvh(jl)) THEN
366 pzdep(jl, jk) = (pgeom1(jl, kkenvh(jl)-1)-pgeom1(jl, jk))/ &
367 (pgeom1(jl, kkenvh(jl)-1)-pgeom1(jl, klev))
368 END IF
369 end DO
370 end DO
371
372 END SUBROUTINE orosetup
373
374 end module orosetup_m

  ViewVC Help
Powered by ViewVC 1.1.21