4 SUBROUTINE stdlevvar(klon, knon, nsrf, zxli, &
6 ts1, qsurf, z0m, z0h, psol, pat1, &
7 t_2m, q_2m, t_10m, q_10m, u_10m, ustar)
46 INTEGER,
intent(in) :: klon, knon, nsrf
47 LOGICAL,
intent(in) :: zxli
48 REAL,
dimension(klon),
intent(in) :: u1, v1, t1, q1, z1, ts1
49 REAL,
dimension(klon),
intent(in) :: qsurf, z0m, z0h
50 REAL,
dimension(klon),
intent(in) :: psol, pat1
52 REAL,
dimension(klon),
intent(out) :: t_2m, q_2m, ustar
53 REAL,
dimension(klon),
intent(out) :: u_10m, t_10m, q_10m
63 REAL,
PARAMETER :: RKAR=0.40
66 INTEGER,
parameter :: niter=2, ncon=niter-1
71 REAL,
dimension(klon) :: speed
73 REAL,
dimension(klon) :: tpot
74 REAL,
dimension(klon) :: zri1, cdran
75 REAL,
dimension(klon) :: cdram, cdrah
77 REAL,
dimension(klon) :: ri1
78 REAL,
dimension(klon) :: testar, qstar
79 REAL,
dimension(klon) :: zdte, zdq
81 DOUBLE PRECISION,
dimension(klon) :: lmon
82 DOUBLE PRECISION,
parameter :: eps=1.0d-20
83 REAL,
dimension(klon) :: delu, delte, delq
84 REAL,
dimension(klon) :: u_zref, te_zref, q_zref
85 REAL,
dimension(klon) :: temp, pref
87 REAL,
dimension(klon) :: u_zref_p, te_zref_p, temp_p, q_zref_p
89 REAL,
dimension(klon) :: te_zref_con, q_zref_con
90 REAL,
dimension(klon) :: u_zref_c, te_zref_c, temp_c, q_zref_c
91 REAL,
dimension(klon) :: ok_pred, ok_corr
95 speed(i)=sqrt(u1(i)**2+v1(i)**2)
106 CALL cdrag(knon, nsrf, &
107 & speed, t1, q1, z1, &
108 & psol, ts1, qsurf, z0m, z0h, &
109 & cdram, cdrah, zri1, pref)
112 IF (ok_prescr_ust)
then
114 print *,
'cdram avant=',cdram(i)
115 cdram(i) =
ust*
ust/speed(i)/speed(i)
116 print *,
'cdram ust speed apres=',cdram(i),
ust,speed
124 tpot(i) = t1(i)* (psol(i)/pat1(i))**rkappa
125 ustar(i) = sqrt(cdram(i) * speed(i) * speed(i))
126 zdte(i) = tpot(i) - ts1(i)
127 zdq(i) = max(q1(i),0.0) - max(qsurf(i),0.0)
131 zdte(i) = sign(max(abs(zdte(i)),1.e-10),zdte(i))
133 testar(i) = (cdrah(i) * zdte(i) * speed(i))/ustar(i)
134 qstar(i) = (cdrah(i) * zdq(i) * speed(i))/ustar(i)
135 lmon(i) = (ustar(i) * ustar(i) * tpot(i))/ &
136 & (rkar *
rg * testar(i))
141 CALL screenp(klon, knon, nsrf, speed, tpot, q1, &
142 & ts1, qsurf, z0m, lmon, &
143 & ustar, testar, qstar, zref, &
148 q_zref(i) = max(qsurf(i),0.0) + delq(i)
149 te_zref(i) = ts1(i) + delte(i)
150 temp(i) = te_zref(i) * (psol(i)/pat1(i))**(-rkappa)
151 q_zref_p(i) = q_zref(i)
161 CALL screenc(klon, knon, nsrf, zxli, &
162 & u_zref, temp, q_zref, zref, &
163 & ts1, qsurf, z0m, z0h, psol, &
164 & ustar, testar, qstar, okri, ri1, &
165 & pref, delu, delte, delq)
169 q_zref(i) = delq(i) + max(qsurf(i),0.0)
170 te_zref(i) = delte(i) + ts1(i)
174 temp(i) = te_zref(i) * (psol(i)/pref(i))**(-rkappa)
185 te_zref_con(i) = te_zref(i)
186 q_zref_con(i) = q_zref(i)
207 q_zref_c(i) = q_zref(i)
226 t_2m(i) = temp_p(i) * ok_pred(i) + temp_c(i) * ok_corr(i)
227 q_2m(i) = q_zref_p(i) * ok_pred(i) + q_zref_c(i) * ok_corr(i)
243 CALL screenp(klon, knon, nsrf, speed, tpot, q1, &
244 & ts1, qsurf, z0m, lmon, &
245 & ustar, testar, qstar, zref, &
250 q_zref(i) = max(qsurf(i),0.0) + delq(i)
251 te_zref(i) = ts1(i) + delte(i)
252 temp(i) = te_zref(i) * (psol(i)/pat1(i))**(-rkappa)
255 u_zref_p(i) = u_zref(i)
263 CALL screenc(klon, knon, nsrf, zxli, &
264 & u_zref, temp, q_zref, zref, &
265 & ts1, qsurf, z0m, z0h, psol, &
266 & ustar, testar, qstar, okri, ri1, &
267 & pref, delu, delte, delq)
271 q_zref(i) = delq(i) + max(qsurf(i),0.0)
272 te_zref(i) = delte(i) + ts1(i)
273 temp(i) = te_zref(i) * (psol(i)/pref(i))**(-rkappa)
281 u_zref_c(i) = u_zref(i)
283 u_10m(i) = u_zref_p(i) * ok_pred(i) + u_zref_c(i) * ok_corr(i)
286 q_zref_c(i) = q_zref(i)
288 t_10m(i) = temp_p(i) * ok_pred(i) + temp_c(i) * ok_corr(i)
289 q_10m(i) = q_zref_p(i) * ok_pred(i) + q_zref_c(i) * ok_corr(i)
subroutine stdlevvar(klon, knon, nsrf, zxli, u1, v1, t1, q1, z1, ts1, qsurf, z0m, z0h, psol, pat1, t_2m, q_2m, t_10m, q_10m, u_10m, ustar)
subroutine screenp(klon, knon, nsrf, speed, tair, qair, ts, qsurf, rugos, lmon, ustar, testar, qstar, zref, delu, delte, delq)
!$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
subroutine screenc(klon, knon, nsrf, zxli, speed, temp, q_zref, zref, ts, qsurf, z0m, z0h, psol, ustar, testar, qstar, okri, ri1, pref, delu, delte, delq)
!$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
subroutine cdrag(knon, nsrf, speed, t1, q1, zgeop1, psol, tsurf, qsurf, z0m, z0h, pcfm, pcfh, zri, pref)