7 SUBROUTINE flott_gwd_rando(DTIME, pp, tt, uu, vv, prec, zustr, zvstr, d_u, &
8 d_v,east_gwstress,west_gwstress)
31 REAL,
intent(in)::DTIME
32 REAL,
intent(in):: pp(:, :)
33 REAL,
intent(in):: prec(:)
34 REAL,
intent(in):: TT(:, :)
35 REAL,
intent(in):: UU(:, :)
36 REAL,
intent(in):: VV(:, :)
39 REAL,
intent(out):: zustr(:), zvstr(:)
41 REAL,
intent(inout):: d_u(:, :), d_v(:, :)
42 REAL,
intent(inout):: east_gwstress(:, :)
43 REAL,
intent(inout):: west_gwstress(:, :)
59 INTEGER,
PARAMETER:: NK = 2, np = 2, no = 2, nw = nk * np * no
60 INTEGER JK, JP, JO, JW
61 INTEGER,
PARAMETER:: NA = 5
124 ruwmax=gwd_rando_ruwmax
132 prmax = 20. / 24. /3600.
159 call assert(
klon == (/
size(pp, 1),
size(tt, 1),
size(uu, 1), &
160 size(vv, 1),
size(zustr),
size(zvstr),
size(d_u, 1), &
162 size(east_gwstress, 1),
size(west_gwstress, 1) /), &
163 "FLOTT_GWD_RANDO klon")
164 call assert(
klev == (/
size(pp, 2),
size(tt, 2),
size(uu, 2), &
165 size(vv, 2),
size(d_u, 2),
size(d_v, 2), &
166 size(east_gwstress,2),
size(west_gwstress,2) /), &
167 "FLOTT_GWD_RANDO klev")
170 IF(deltat < dtime)
THEN
171 print *,
'flott_gwd_rando: deltat < dtime!'
176 print *,
'flott_gwd_rando: you will have problem with random numbers'
184 ph(:, ll) = exp((log(pp(:, ll)) + log(pp(:, ll - 1))) / 2.)
185 phm1(:, ll) = 1. / ph(:, ll)
189 phm1(:,
klev + 1) = 1. / psec
190 ph(:, 1) = 2. * pp(:, 1) - ph(:, 2)
197 IF (ph(
klon / 2, ll) / ph(
klon / 2, 1) > xlaunch) launch = ll
200 IF (ph(
klon / 2, ll) / ph(
klon / 2, 1) > xtrop) ltrop = ll
205 zh(:, ll) = h0 * log(pr / (ph(:, ll) + psec))
211 uh(:, ll) = 0.5 * (tt(:, ll) + tt(:, ll - 1)) &
212 * rd**2 / rcpd / h0**2 + (tt(:, ll) &
213 - tt(:, ll - 1)) / (zh(:, ll) - zh(:, ll - 1)) * rd / h0
215 bvlow(:) = 0.5 * (tt(:, ltrop )+ tt(:, launch)) &
216 * rd**2 / rcpd / h0**2 + (tt(:, ltrop ) &
217 - tt(:, launch))/(zh(:, ltrop )- zh(:, launch)) * rd / h0
225 bv(:, ll)=(uh(:, ll+1)+2.*uh(:, ll)+uh(:, ll-1))/4.
228 bv=max(sqrt(max(bv, 0.)), bvsec)
229 bvlow=max(sqrt(max(bvlow, 0.)), bvsec)
234 uh(:, ll) = 0.5 * (uu(:, ll) + uu(:, ll - 1))
235 vh(:, ll) = 0.5 * (vv(:, ll) + vv(:, ll - 1))
255 zp(jw, ii) = (sign(1., 0.5 - mod(tt(ii, jw) * 10., 1.)) + 1.) &
258 zk(jw, ii) = kmin + (kmax - kmin) * mod(tt(ii, jw) * 100., 1.)
263 cmax*2.*(mod(tt(ii, jw+3*jj)**2, 1.)-0.5)*sqrt(3.)/sqrt(na*1.)
267 zp(jw,ii) = zp(jw,ii) + rpi
270 zo(jw, ii) = cpha * zk(jw, ii)
272 zo(jw, ii) = zo(jw, ii) &
273 + zk(jw, ii) * cos(zp(jw, ii)) * uh(ii, launch) &
274 + zk(jw, ii) * sin(zp(jw, ii)) * vh(ii, launch)
276 ruw0(jw, ii) = ruwmax
290 zop(jw, :) = zo(jw, :) &
291 - zk(jw, :) * cos(zp(jw, :)) * uh(:, launch) &
292 - zk(jw, :) * sin(zp(jw, :)) * vh(:, launch)
301 wwp(jw, :) = ruw0(jw, :) &
302 * (rd / rcpd / h0 * rlvtt * prmax * tanh(prec(:) / prmax))**2
305 wwp(jw, :) = wwp(jw, :) * zk(jw, :)**3 / kmin / bvlow(:) &
306 / max(abs(zop(jw, :)), zoisec)**3
309 wwp(jw, :) = wwp(jw, :) &
310 * exp(- bvlow(:)**2 / max(abs(zop(jw, :)), zoisec)**2 * zk(jw, :)**2 &
314 ruwp(jw, :) = zop(jw, :) / max(abs(zop(jw, :)), zoisec)**2 &
315 * bv(:, launch) * cos(zp(jw, :)) * wwp(jw, :)**2
316 rvwp(jw, :) = zop(jw, :) / max(abs(zop(jw, :)), zoisec)**2 &
317 * bv(:, launch) * sin(zp(jw, :)) * wwp(jw, :)**2
327 ruw(:, ll) = ruw(:, ll) + ruwp(jw, :)
328 rvw(:, ll) = rvw(:, ll) + rvwp(jw, :)
336 DO ll = launch,
klev - 1
340 zom(jw, :) = zop(jw, :)
341 wwm(jw, :) = wwp(jw, :)
343 zop(jw, :) = zo(jw, :) - zk(jw, :) * cos(zp(jw, :)) * uh(:, ll + 1) &
344 - zk(jw, :) * sin(zp(jw, :)) * vh(:, ll + 1)
348 wwp(jw, :) = wwm(jw, :) * exp(- 2. * rdiss * pr / (ph(:, ll + 1) &
349 + ph(:, ll)) * ((bv(:, ll + 1) + bv(:, ll)) / 2.)**3 &
350 / max(abs(zop(jw, :) + zom(jw, :)) / 2., zoisec)**4 &
351 * zk(jw, :)**3 * (zh(:, ll + 1) - zh(:, ll)))
355 wwp(jw, :) = min(wwp(jw, :), max(0., &
356 sign(1., zop(jw, :) * zom(jw, :))) * abs(zop(jw, :))**3 &
357 / bv(:, ll + 1) * exp(- zh(:, ll + 1) / h0) * kmin**2 &
358 * sat**2 / zk(jw, :)**4)
365 ruwp(jw, :) = sign(1., zop(jw, :))*cos(zp(jw, :)) * wwp(jw, :)
366 rvwp(jw, :) = sign(1., zop(jw, :))*sin(zp(jw, :)) * wwp(jw, :)
373 ruw(:, ll + 1) = ruw(:, ll + 1) + ruwp(jw, :)
374 rvw(:, ll + 1) = rvw(:, ll + 1) + rvwp(jw, :)
375 east_gwstress(:, ll)=east_gwstress(:, ll)+max(0.,ruwp(jw,:))/float(nw)
376 west_gwstress(:, ll)=west_gwstress(:, ll)+min(0.,ruwp(jw,:))/float(nw)
389 ruw(:,
klev + 1) = 0.
390 rvw(:,
klev + 1) = 0.
391 ruw(:, 1) = ruw(:, launch)
392 rvw(:, 1) = rvw(:, launch)
394 ruw(:, ll) = ruw(:, launch+1)
395 rvw(:, ll) = rvw(:, launch+1)
396 east_gwstress(:, ll) = east_gwstress(:, launch)
397 west_gwstress(:, ll) = west_gwstress(:, launch)
402 d_u(:, ll) = (1.-dtime/deltat) * d_u(:, ll) + dtime/deltat/
REAL(NW) * &
403 RG * (ruw(:, ll + 1) - ruw(:, ll)) &
404 / (ph(:, ll + 1) - ph(:, ll)) * DTIME
406 d_v(:, ll) = 1./
REAL(NW) * &
407 RG * (rvw(:, ll + 1) - rvw(:, ll)) &
408 / (ph(:, ll + 1) - ph(:, ll)) * DTIME
415 zustr = zustr + d_u(:, ll) / rg * (ph(:, ll + 1) - ph(:, ll))/dtime
416 zvstr = zvstr + d_v(:, ll) / rg * (ph(:, ll + 1) - ph(:, ll))/dtime
subroutine flott_gwd_rando(DTIME, pp, tt, uu, vv, prec, zustr, zvstr, d_u, d_v, east_gwstress, west_gwstress)
!$Id NSTRA real GKLIFT real GVSEC REAL GWD_RANDO_RUWMAX!Maximum Eliassen Palm flux at launch in FLOTT_GWD_rando REAL GWD_RANDO_SAT!saturation parameter in FLOTT_GWD_rando!S_c in REAL GWD_FRONT_SAT!Same as GWD_RANDO params but for fronal GWs COMMON YOEGWD gwd_rando_sat