7 SUBROUTINE clouds_gno(klon, nd, r, rs, qsub, ptconv, ratqsc, cldf)
30 REAL r(klon, nd), rs(klon, nd), qsub(klon, nd)
31 LOGICAL ptconv(klon, nd)
43 REAL epsilon, vmax0, vmax(klon)
50 REAL mu(klon), qsat, delta(klon), beta(klon)
52 REAL xx(klon), aux(klon), coeff, block
53 REAL dist, fprime, det
54 REAL pi, u, v, erfcu, erfcv
56 REAL erf, hsqrtlog_2, v2
57 REAL sqrtpi, sqrt2, zx1, zx2, exdel
62 cldf(1:klon, 1:nd) = 0.0
63 ratqsc(1:klon, 1:nd) = 0.0
64 ptconv(1:klon, 1:nd) = .
false.
70 hsqrtlog_2 = 0.5*sqrt(log(2.))
76 mu(i) = max(mu(i), min_mu)
78 qsat = max(qsat, min_mu)
79 delta(i) = log(mu(i)/qsat)
111 IF (qsub(i,k)<min_q)
THEN
112 ptconv(i, k) = .
false.
123 beta(i) = qsub(i, k)/mu(i) + exp(-min(0.0,delta(i)))
127 det = delta(i) + vmax(i)*vmax(i)
128 IF (det<=0.0) vmax(i) = vmax0 + 1.0
129 det = delta(i) + vmax(i)*vmax(i)
135 zx2 = sqrt(1.0+delta(i)/(vmax(i)*vmax(i)))
139 IF (xx1>=0.0) xx(i) = 0.5*xx2
141 IF (delta(i)<0.) xx(i) = -hsqrtlog_2
154 IF (.NOT. lconv(i))
THEN
156 u = delta(i)/(xx(i)*sqrt2) + xx(i)/(2.*sqrt2)
157 v = delta(i)/(xx(i)*sqrt2) - xx(i)/(2.*sqrt2)
162 IF (abs(u)>vmax(i) .AND. delta(i)<0.)
THEN
166 exdel = beta(i)*exp(delta(i))
167 aux(i) = 2.0*delta(i)*(1.-exdel)/(1.+exdel)
172 xx(i) = -sqrt(aux(i))
173 block = exp(-v*v)/v/sqrtpi
184 aux(i) = sqrtpi*erfcu*exp(min(v2,100.))
185 coeff = 1.0 - 0.5/(v2) + 0.75/(v2*v2)
186 block = coeff*exp(-v2)/v/sqrtpi
187 dist = v*aux(i)/coeff - beta(i)
188 fprime = 2.0/xx(i)*(v2)*(exp(-delta(i))-u*aux(i)/coeff)/coeff
199 dist = erfcu/erfcv - beta(i)
202 IF (zu2>20. .OR. zv2>20.)
THEN
212 fprime = 2./sqrtpi/xx(i)/(erfcv*erfcv)* &
213 (erfcv*v*exp(-zu2)-erfcu*u*exp(-zv2))
223 IF (abs(fprime)<1.e-11)
THEN
228 fprime = sign(1.e-11, fprime)
232 IF (abs(dist/beta(i))<epsilon)
THEN
235 ptconv(i, k) = .
true.
238 ratqsc(i, k) = min(2.*(v-u)*(v-u), 20.)
239 ratqsc(i, k) = sqrt(exp(ratqsc(i,k))-1.)
240 cldf(i, k) = 0.5*block
242 xx(i) = xx(i) - dist/fprime
subroutine clouds_gno(klon, nd, r, rs, qsub, ptconv, ratqsc, cldf)
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL false
!$Header!integer nvarmx parameter(nfmx=10, imx=200, jmx=150, lmx=200, nvarmx=1000) real xd(imx
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL ulevSTD CALL &zphi philevSTD CALL &zx_rh rhlevSTD!DO klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon du jour ou toutes les read_climoz CALL true