8 zustr, zvstr, d_u, d_v,east_gwstress,west_gwstress)
33 REAL,
intent(in)::DTIME
34 REAL,
intent(in):: PP(:, :)
35 REAL,
intent(in):: ROT(:,:)
36 REAL,
intent(in):: TT(:, :)
37 REAL,
intent(in):: UU(:, :)
38 REAL,
intent(in):: VV(:, :)
39 REAL,
intent(in):: PLAT(:)
42 REAL,
intent(out):: zustr(:), zvstr(:)
44 REAL,
intent(inout):: d_u(:, :), d_v(:, :)
45 REAL,
intent(inout):: east_gwstress(:, :)
46 REAL,
intent(inout):: west_gwstress(:, :)
62 INTEGER,
PARAMETER:: NK = 2, np = 2, no = 2, nw = nk * np * no
63 INTEGER JK, JP, JO, JW
64 INTEGER,
PARAMETER:: NA = 5
136 ruwfrt=gwd_front_ruwmax
169 corsec = romega*2.*sin(2.*rpi/180.)
172 call assert(
klon == (/
size(pp, 1),
size(tt, 1),
size(uu, 1), &
173 size(vv, 1),
size(rot,1),
size(zustr),
size(zvstr),
size(d_u, 1), &
175 size(east_gwstress,1),
size(west_gwstress,1) /), &
176 "ACAMA_GWD_RANDO klon")
177 call assert(
klev == (/
size(pp, 2),
size(tt, 2),
size(uu, 2), &
178 size(vv, 2),
size(d_u, 2),
size(d_v, 2), &
179 size(east_gwstress,2),
size(west_gwstress,2) /), &
180 "ACAMA_GWD_RANDO klev")
183 IF(deltat < dtime)
THEN
184 print *,
'flott_gwd_rando: deltat < dtime!'
189 print *,
'flott_gwd_rando: you will have problem with random numbers'
197 ph(:, ll) = exp((log(pp(:, ll)) + log(pp(:, ll - 1))) / 2.)
198 phm1(:, ll) = 1. / ph(:, ll)
202 phm1(:,
klev + 1) = 1. / psec
203 ph(:, 1) = 2. * pp(:, 1) - ph(:, 2)
210 IF (ph(
klon / 2, ll) / ph(
klon / 2, 1) > xlaunch) launch = ll
213 IF (ph(
klon / 2, ll) / ph(
klon / 2, 1) > xtrop) ltrop = ll
220 zh(:, ll) = h0 * log(pr / (ph(:, ll) + psec))
226 uh(:, ll) = 0.5 * (tt(:, ll) + tt(:, ll - 1)) &
227 * rd**2 / rcpd / h0**2 + (tt(:, ll) &
228 - tt(:, ll - 1)) / (zh(:, ll) - zh(:, ll - 1)) * rd / h0
230 bvlow = 0.5 * (tt(:, ltrop )+ tt(:, launch)) &
231 * rd**2 / rcpd / h0**2 + (tt(:, ltrop ) &
232 - tt(:, launch))/(zh(:, ltrop )- zh(:, launch)) * rd / h0
240 bv(:, ll)=(uh(:, ll+1)+2.*uh(:, ll)+uh(:, ll-1))/4.
243 bv=max(sqrt(max(bv, 0.)), bvsec)
244 bvlow=max(sqrt(max(bvlow, 0.)), bvsec)
248 uh(:, ll) = 0.5 * (uu(:, ll) + uu(:, ll - 1))
249 vh(:, ll) = 0.5 * (vv(:, ll) + vv(:, ll - 1))
250 uz(:, ll) = abs((sqrt(uu(:, ll)**2+vv(:, ll)**2) &
251 - sqrt(uu(:,ll-1)**2+vv(:, ll-1)**2)) &
252 /(zh(:, ll)-zh(:, ll-1)) )
261 uz(:, :) = max(uz(:,:), psec)
265 corio(:) = max(romega*2.*abs(sin(plat(:)*rpi/180.)),corsec)
270 rotba(:) = rotba(:) + &
272 (corio(:)*tanh(abs(rot(:,ll)+rot(:,ll+1))/2./corio(:)))**2 &
273 /
rg*(pp(:,ll)-pp(:,ll+1)) &
274 * exp(-rpi*bv(:,ll+1)/uz(:,ll+1)) &
276 * dz*bv(:,ll+1)/4./1.e-4
305 zp(jw, ii) = mod(tt(ii, jw) * 10., 1.) * rpi
309 zk(jw, ii) = kmin + (kmax - kmin) * mod(tt(ii, jw) * 100., 1.)
314 cmax*2.*(mod(tt(ii, jw+4*(jj-1)+jj)**2, 1.)-0.5)*sqrt(3.)/sqrt(na*1.)
318 zp(jw,ii) = zp(jw,ii) + rpi
324 zo(jw, ii) = cpha * zk(jw, ii)
326 zo(jw, ii) = zo(jw, ii) &
327 + zk(jw, ii) * cos(zp(jw, ii)) * uh(ii, launch) &
328 + zk(jw, ii) * sin(zp(jw, ii)) * vh(ii, launch)
334 ruw0(jw, ii) = ruw0(jw,ii) + &
335 2.*(mod(tt(ii, jw+4*(jj-1)+jj)**2, 1.)-0.5)*sqrt(3.)/sqrt(na*1.)
337 ruw0(jw, ii) = ruwfrt &
338 * exp(ruw0(jw,ii))/1250. &
339 *((1.05+sin(plat(ii)*rpi/180.))/(1.01+sin(plat(ii)*rpi/180.))-2.05/2.01)
356 zop(jw, :) = zo(jw, :) &
357 - zk(jw, :) * cos(zp(jw, :)) * uh(:, launch) &
358 - zk(jw, :) * sin(zp(jw, :)) * vh(:, launch)
366 wwp(jw, :) = ruwfrt &
387 ruwp(jw, :) = sign(1., zop(jw, :))*cos(zp(jw, :)) * wwp(jw, :)
388 rvwp(jw, :) = sign(1., zop(jw, :))*sin(zp(jw, :)) * wwp(jw, :)
398 ruw(:, ll) = ruw(:, ll) + ruwp(jw, :)
399 rvw(:, ll) = rvw(:, ll) + rvwp(jw, :)
407 DO ll = launch,
klev - 1
411 zom(jw, :) = zop(jw, :)
412 wwm(jw, :) = wwp(jw, :)
414 zop(jw, :) = zo(jw, :) - zk(jw, :) * cos(zp(jw, :)) * uh(:, ll + 1) &
415 - zk(jw, :) * sin(zp(jw, :)) * vh(:, ll + 1)
419 wwp(jw, :) = wwm(jw, :) * exp(- 2. * rdiss * pr / (ph(:, ll + 1) &
420 + ph(:, ll)) * ((bv(:, ll + 1) + bv(:, ll)) / 2.)**3 &
421 / max(abs(zop(jw, :) + zom(jw, :)) / 2., zoisec)**4 &
422 * zk(jw, :)**3 * (zh(:, ll + 1) - zh(:, ll)))
426 wwp(jw, :) = min(wwp(jw, :), max(0., &
427 sign(1., zop(jw, :) * zom(jw, :))) * abs(zop(jw, :))**3 &
429 / bv(:, ll + 1) * exp(- zh(:, ll + 1) / h0) * kmin**2 &
439 ruwp(jw, :) = sign(1., zop(jw, :))*cos(zp(jw, :)) * wwp(jw, :)
440 rvwp(jw, :) = sign(1., zop(jw, :))*sin(zp(jw, :)) * wwp(jw, :)
447 ruw(:, ll + 1) = ruw(:, ll + 1) + ruwp(jw, :)
448 rvw(:, ll + 1) = rvw(:, ll + 1) + rvwp(jw, :)
449 east_gwstress(:, ll)=east_gwstress(:, ll)+max(0.,ruwp(jw,:))/float(nw)
450 west_gwstress(:, ll)=west_gwstress(:, ll)+min(0.,ruwp(jw,:))/float(nw)
458 ruw(:,
klev + 1) = 0.
459 rvw(:,
klev + 1) = 0.
460 ruw(:, 1) = ruw(:, launch)
461 rvw(:, 1) = rvw(:, launch)
463 ruw(:, ll) = ruw(:, launch+1)
464 rvw(:, ll) = rvw(:, launch+1)
465 east_gwstress(:, ll)=east_gwstress(:, launch)
466 west_gwstress(:, ll)=west_gwstress(:, launch)
471 d_u(:, ll) = (1.-dtime/deltat) * d_u(:, ll) + dtime/deltat/
REAL(NW) * &
472 RG * (ruw(:, ll + 1) - ruw(:, ll)) &
473 / (ph(:, ll + 1) - ph(:, ll)) * DTIME
476 d_v(:, ll) = 1./
REAL(NW) * &
477 RG * (rvw(:, ll + 1) - rvw(:, ll)) &
478 / (ph(:, ll + 1) - ph(:, ll)) * DTIME
485 zustr = zustr + d_u(:, ll) / rg * (ph(:, ll + 1) - ph(:, ll))/dtime
subroutine acama_gwd_rando(DTIME, pp, plat, tt, uu, vv, rot, zustr, zvstr, d_u, d_v, east_gwstress, west_gwstress)