25 |
use clvent_m, only: clvent |
use clvent_m, only: clvent |
26 |
use coefkz_m, only: coefkz |
use coefkz_m, only: coefkz |
27 |
use coefkzmin_m, only: coefkzmin |
use coefkzmin_m, only: coefkzmin |
28 |
|
use coefkz2_m, only: coefkz2 |
29 |
USE conf_gcm_m, ONLY: lmt_pas |
USE conf_gcm_m, ONLY: lmt_pas |
30 |
USE conf_phys_m, ONLY: iflag_pbl |
USE conf_phys_m, ONLY: iflag_pbl |
31 |
USE dimphy, ONLY: klev, klon, zmasq |
USE dimphy, ONLY: klev, klon, zmasq |
37 |
USE suphec_m, ONLY: rd, rg, rkappa |
USE suphec_m, ONLY: rd, rg, rkappa |
38 |
use time_phylmdz, only: itap |
use time_phylmdz, only: itap |
39 |
use ustarhb_m, only: ustarhb |
use ustarhb_m, only: ustarhb |
|
use vdif_kcay_m, only: vdif_kcay |
|
40 |
use yamada4_m, only: yamada4 |
use yamada4_m, only: yamada4 |
41 |
|
|
42 |
REAL, INTENT(IN):: dtime ! interval du temps (secondes) |
REAL, INTENT(IN):: dtime ! interval du temps (secondes) |
96 |
! flux de vapeur d'eau (kg / m2 / s) à la surface |
! flux de vapeur d'eau (kg / m2 / s) à la surface |
97 |
|
|
98 |
REAL, intent(out):: flux_u(klon, nbsrf), flux_v(klon, nbsrf) |
REAL, intent(out):: flux_u(klon, nbsrf), flux_v(klon, nbsrf) |
99 |
! tension du vent à la surface, en Pa |
! tension du vent (flux turbulent de vent) à la surface, en Pa |
100 |
|
|
101 |
REAL, INTENT(out):: cdragh(klon), cdragm(klon) |
REAL, INTENT(out):: cdragh(klon), cdragm(klon) |
102 |
real q2(klon, klev + 1, nbsrf) |
real q2(klon, klev + 1, nbsrf) |
168 |
REAL yu(klon, klev), yv(klon, klev) |
REAL yu(klon, klev), yv(klon, klev) |
169 |
REAL yt(klon, klev), yq(klon, klev) |
REAL yt(klon, klev), yq(klon, klev) |
170 |
REAL ypaprs(klon, klev + 1), ypplay(klon, klev), ydelp(klon, klev) |
REAL ypaprs(klon, klev + 1), ypplay(klon, klev), ydelp(klon, klev) |
|
|
|
171 |
REAL ycoefm0(klon, klev), ycoefh0(klon, klev) |
REAL ycoefm0(klon, klev), ycoefh0(klon, klev) |
|
|
|
172 |
REAL yzlay(klon, klev), zlev(klon, klev + 1), yteta(klon, klev) |
REAL yzlay(klon, klev), zlev(klon, klev + 1), yteta(klon, klev) |
173 |
REAL ykmm(klon, klev + 1), ykmn(klon, klev + 1) |
REAL ykmm(klon, klev + 1), ykmn(klon, klev + 1) |
174 |
REAL ykmq(klon, klev + 1) |
REAL ykmq(klon, klev + 1) |
175 |
REAL yq2(klon, klev + 1) |
REAL yq2(klon, klev + 1) |
|
REAL q2diag(klon, klev + 1) |
|
|
|
|
176 |
REAL delp(klon, klev) |
REAL delp(klon, klev) |
177 |
INTEGER i, k, nsrf |
INTEGER i, k, nsrf |
|
|
|
178 |
INTEGER ni(klon), knon, j |
INTEGER ni(klon), knon, j |
179 |
|
|
180 |
REAL pctsrf_pot(klon, nbsrf) |
REAL pctsrf_pot(klon, nbsrf) |
312 |
|
|
313 |
! calculer Cdrag et les coefficients d'echange |
! calculer Cdrag et les coefficients d'echange |
314 |
CALL coefkz(nsrf, ypaprs, ypplay, ksta, ksta_ter, yts(:knon), & |
CALL coefkz(nsrf, ypaprs, ypplay, ksta, ksta_ter, yts(:knon), & |
315 |
yrugos, yu, yv, yt, yq, yqsurf(:knon), coefm(:knon, :), & |
yrugos, yu, yv, yt, yq, yqsurf(:knon), coefm(:knon, 2:), & |
316 |
coefh(:knon, :)) |
coefh(:knon, 2:), coefm(:knon, 1), coefh(:knon, 1)) |
317 |
|
|
318 |
IF (iflag_pbl == 1) THEN |
IF (iflag_pbl == 1) THEN |
319 |
CALL coefkz2(nsrf, knon, ypaprs, ypplay, yt, ycoefm0, ycoefh0) |
CALL coefkz2(nsrf, knon, ypaprs, ypplay, yt, ycoefm0, ycoefh0) |
320 |
coefm(:knon, :) = max(coefm(:knon, :), ycoefm0(:knon, :)) |
coefm(:knon, :) = max(coefm(:knon, :), ycoefm0(:knon, :)) |
330 |
IF (ok_kzmin) THEN |
IF (ok_kzmin) THEN |
331 |
! Calcul d'une diffusion minimale pour les conditions tres stables |
! Calcul d'une diffusion minimale pour les conditions tres stables |
332 |
CALL coefkzmin(knon, ypaprs, ypplay, yu, yv, yt, yq, & |
CALL coefkzmin(knon, ypaprs, ypplay, yu, yv, yt, yq, & |
333 |
coefm(:knon, 1), ycoefm0, ycoefh0) |
coefm(:knon, 1), ycoefm0(:knon, 2:), ycoefh0(:knon, 2:)) |
334 |
coefm(:knon, :) = max(coefm(:knon, :), ycoefm0(:knon, :)) |
coefm(:knon, :) = max(coefm(:knon, :), ycoefm0(:knon, :)) |
335 |
coefh(:knon, :) = max(coefh(:knon, :), ycoefh0(:knon, :)) |
coefh(:knon, :) = max(coefh(:knon, :), ycoefh0(:knon, :)) |
336 |
END IF |
END IF |
337 |
|
|
338 |
IF (iflag_pbl >= 3) THEN |
IF (iflag_pbl >= 6) THEN |
339 |
! Mellor et Yamada adapt\'e \`a Mars, Richard Fournier et |
! Mellor et Yamada adapt\'e \`a Mars, Richard Fournier et |
340 |
! Fr\'ed\'eric Hourdin |
! Fr\'ed\'eric Hourdin |
341 |
yzlay(:knon, 1) = rd * yt(:knon, 1) / (0.5 * (ypaprs(:knon, 1) & |
yzlay(:knon, 1) = rd * yt(:knon, 1) / (0.5 * (ypaprs(:knon, 1) & |
342 |
+ ypplay(:knon, 1))) & |
+ ypplay(:knon, 1))) & |
343 |
* (ypaprs(:knon, 1) - ypplay(:knon, 1)) / rg |
* (ypaprs(:knon, 1) - ypplay(:knon, 1)) / rg |
344 |
|
|
345 |
DO k = 2, klev |
DO k = 2, klev |
346 |
yzlay(:knon, k) = yzlay(:knon, k-1) & |
yzlay(:knon, k) = yzlay(:knon, k-1) & |
347 |
+ rd * 0.5 * (yt(1:knon, k-1) + yt(1:knon, k)) & |
+ rd * 0.5 * (yt(1:knon, k-1) + yt(1:knon, k)) & |
370 |
END DO |
END DO |
371 |
|
|
372 |
ustar(:knon) = ustarhb(yu(:knon, 1), yv(:knon, 1), coefm(:knon, 1)) |
ustar(:knon) = ustarhb(yu(:knon, 1), yv(:knon, 1), coefm(:knon, 1)) |
373 |
|
CALL yamada4(dtime, rg, zlev(:knon, :), yzlay(:knon, :), & |
374 |
! iflag_pbl peut \^etre utilis\'e comme longueur de m\'elange |
yu(:knon, :), yv(:knon, :), yteta(:knon, :), & |
375 |
|
coefm(:knon, 1), yq2(:knon, :), ykmm(:knon, :), & |
376 |
IF (iflag_pbl >= 11) THEN |
ykmn(:knon, :), ykmq(:knon, :), ustar(:knon)) |
|
CALL vdif_kcay(knon, dtime, rg, zlev, yzlay, yu, yv, yteta, & |
|
|
coefm(:knon, 1), yq2, q2diag, ykmm, ykmn, ustar(:knon), & |
|
|
iflag_pbl) |
|
|
ELSE |
|
|
CALL yamada4(dtime, rg, zlev(:knon, :), yzlay(:knon, :), & |
|
|
yu(:knon, :), yv(:knon, :), yteta(:knon, :), & |
|
|
coefm(:knon, 1), yq2(:knon, :), ykmm(:knon, :), & |
|
|
ykmn(:knon, :), ykmq(:knon, :), ustar(:knon), iflag_pbl) |
|
|
END IF |
|
|
|
|
377 |
coefm(:knon, 2:) = ykmm(:knon, 2:klev) |
coefm(:knon, 2:) = ykmm(:knon, 2:klev) |
378 |
coefh(:knon, 2:) = ykmn(:knon, 2:klev) |
coefh(:knon, 2:) = ykmn(:knon, 2:klev) |
379 |
END IF |
END IF |
380 |
|
|
381 |
! calculer la diffusion des vitesses "u" et "v" |
CALL clvent(dtime, yu(:knon, 1), yv(:knon, 1), coefm(:knon, 2:), & |
382 |
CALL clvent(knon, dtime, yu(:knon, 1), yv(:knon, 1), & |
coefm(:knon, 1), yt(:knon, :), yu(:knon, :), ypaprs(:knon, :), & |
383 |
coefm(:knon, :), yt, yu, ypaprs, ypplay, ydelp, y_d_u, & |
ypplay(:knon, :), ydelp(:knon, :), y_d_u(:knon, :), & |
384 |
y_flux_u(:knon)) |
y_flux_u(:knon)) |
385 |
CALL clvent(knon, dtime, yu(:knon, 1), yv(:knon, 1), & |
CALL clvent(dtime, yu(:knon, 1), yv(:knon, 1), coefm(:knon, 2:), & |
386 |
coefm(:knon, :), yt, yv, ypaprs, ypplay, ydelp, y_d_v, & |
coefm(:knon, 1), yt(:knon, :), yv(:knon, :), ypaprs(:knon, :), & |
387 |
|
ypplay(:knon, :), ydelp(:knon, :), y_d_v(:knon, :), & |
388 |
y_flux_v(:knon)) |
y_flux_v(:knon)) |
389 |
|
|
390 |
! calculer la diffusion de "q" et de "h" |
! calculer la diffusion de "q" et de "h" |