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