4 |
|
|
5 |
contains |
contains |
6 |
|
|
7 |
subroutine coef_diff_turb(dtime, nsrf, ni, ypaprs, ypplay, yu, yv, yq, yt, & |
subroutine coef_diff_turb(dtime, nsrf, ni, paprs, pplay, u, v, q, t, ts, & |
8 |
yts, ycdragm, zgeop, ycoefm, ycoefh, yq2) |
cdragm, zgeop, coefm, coefh, q2) |
9 |
|
|
10 |
|
! Computes coefficients for turbulent diffusion in the atmosphere. |
11 |
|
|
12 |
|
use nr_util, only: assert |
13 |
|
|
14 |
USE clesphys, ONLY: ok_kzmin |
USE clesphys, ONLY: ok_kzmin |
15 |
use coefkz_m, only: coefkz |
use coefkz_m, only: coefkz |
16 |
use coefkzmin_m, only: coefkzmin |
use coefkzmin_m, only: coefkzmin |
17 |
use coefkz2_m, only: coefkz2 |
use coefkz2_m, only: coefkz2 |
18 |
USE conf_phys_m, ONLY: iflag_pbl |
USE conf_phys_m, ONLY: iflag_pbl |
19 |
USE dimphy, ONLY: klev, klon |
USE dimphy, ONLY: klev |
20 |
USE suphec_m, ONLY: rd, rg, rkappa |
USE suphec_m, ONLY: rd, rg, rkappa |
21 |
use ustarhb_m, only: ustarhb |
use ustarhb_m, only: ustarhb |
22 |
use yamada4_m, only: yamada4 |
use yamada4_m, only: yamada4 |
24 |
REAL, INTENT(IN):: dtime ! interval du temps (secondes) |
REAL, INTENT(IN):: dtime ! interval du temps (secondes) |
25 |
INTEGER, INTENT(IN):: nsrf |
INTEGER, INTENT(IN):: nsrf |
26 |
INTEGER, INTENT(IN):: ni(:) ! (knon) |
INTEGER, INTENT(IN):: ni(:) ! (knon) |
27 |
REAL, INTENT(IN):: ypaprs(:, :) ! (klon, klev + 1) |
REAL, INTENT(IN):: paprs(:, :) ! (knon, klev + 1) |
28 |
REAL, INTENT(IN):: ypplay(:, :) ! (klon, klev) |
REAL, INTENT(IN):: pplay(:, :) ! (knon, klev) |
29 |
REAL, INTENT(IN), dimension(:, :):: yu, yv, yq, yt ! (klon, klev) |
REAL, INTENT(IN), dimension(:, :):: u, v, q, t ! (knon, klev) |
30 |
REAL, INTENT(IN):: yts(:), ycdragm(:) ! (knon) |
REAL, INTENT(IN):: ts(:), cdragm(:) ! (knon) |
31 |
REAL, INTENT(IN):: zgeop(:, :) ! (knon, klev) |
REAL, INTENT(IN):: zgeop(:, :) ! (knon, klev) |
32 |
REAL, intent(out):: ycoefm(:, 2:) ! (knon, 2:klev) coefficient, vitesse |
REAL, intent(out):: coefm(:, 2:) ! (knon, 2:klev) coefficient, vitesse |
33 |
|
|
34 |
real, intent(out):: ycoefh(:, 2:) ! (knon, 2:klev) |
real, intent(out):: coefh(:, 2:) ! (knon, 2:klev) |
35 |
! coefficient, chaleur et humidité |
! coefficient, chaleur et humidité |
36 |
|
|
37 |
real, intent(inout):: yq2(:, :) ! (klon, klev + 1) |
real, intent(inout):: q2(:, :) ! (knon, klev + 1) |
38 |
|
|
39 |
! Local: |
! Local: |
40 |
REAL ycoefm0(klon, 2:klev), ycoefh0(klon, 2:klev) |
REAL coefm0(size(ni), 2:klev), coefh0(size(ni), 2:klev) ! (knon, 2:klev) |
41 |
REAL yzlay(klon, klev), zlev(klon, klev + 1), yteta(klon, klev) |
REAL zlay(size(ni), klev), teta(size(ni), klev) ! (knon, klev) |
42 |
REAL ustar(klon) |
real zlev(size(ni), klev + 1) ! (knon, klev + 1) |
43 |
integer k, knon |
integer k |
44 |
|
|
45 |
!------------------------------------------------------------------------- |
!------------------------------------------------------------------------- |
46 |
|
|
47 |
knon = size(ni) |
call assert(size(ni) == [size(paprs, 1), size(pplay, 1), size(u, 1), & |
48 |
CALL coefkz(nsrf, ypaprs(:knon, :), ypplay(:knon, :), yts(:knon), & |
size(v, 1), size(q, 1), size(t, 1), size(ts), size(cdragm), & |
49 |
yu(:knon, :), yv(:knon, :), yt(:knon, :), yq(:knon, :), zgeop, & |
size(zgeop, 1), size(coefm, 1), size(coefh, 1), size(q2, 1)], & |
50 |
ycoefm, ycoefh) |
"coef_diff_turb knon") |
|
|
|
|
IF (iflag_pbl == 1) THEN |
|
|
CALL coefkz2(nsrf, knon, ypaprs, ypplay, yt, ycoefm0(:knon, :), & |
|
|
ycoefh0(:knon, :)) |
|
|
ycoefm = max(ycoefm, ycoefm0(:knon, :)) |
|
|
ycoefh = max(ycoefh, ycoefh0(:knon, :)) |
|
|
END IF |
|
|
|
|
|
IF (ok_kzmin) THEN |
|
|
! Calcul d'une diffusion minimale pour les conditions tres stables |
|
|
CALL coefkzmin(knon, ypaprs, ypplay, yu, yv, yt, yq, ycdragm(:knon), & |
|
|
ycoefh0(:knon, :)) |
|
|
ycoefm0(:knon, :) = ycoefh0(:knon, :) |
|
|
ycoefm = max(ycoefm, ycoefm0(:knon, :)) |
|
|
ycoefh = max(ycoefh, ycoefh0(:knon, :)) |
|
|
END IF |
|
51 |
|
|
52 |
IF (iflag_pbl >= 6) THEN |
IF (iflag_pbl >= 6) THEN |
53 |
! Mellor et Yamada adapt\'e \`a Mars, Richard Fournier et |
! Mellor et Yamada adapt\'e \`a Mars, Richard Fournier et |
54 |
! Fr\'ed\'eric Hourdin |
! Fr\'ed\'eric Hourdin |
55 |
yzlay(:knon, 1) = rd * yt(:knon, 1) / (0.5 * (ypaprs(:knon, 1) & |
zlay(:, 1) = rd * t(:, 1) / (0.5 * (paprs(:, 1) & |
56 |
+ ypplay(:knon, 1))) & |
+ pplay(:, 1))) * (paprs(:, 1) - pplay(:, 1)) / rg |
|
* (ypaprs(:knon, 1) - ypplay(:knon, 1)) / rg |
|
57 |
|
|
58 |
DO k = 2, klev |
DO k = 2, klev |
59 |
yzlay(:knon, k) = yzlay(:knon, k-1) & |
zlay(:, k) = zlay(:, k-1) + rd * 0.5 * (t(:, k-1) + t(:, k)) & |
60 |
+ rd * 0.5 * (yt(1:knon, k-1) + yt(1:knon, k)) & |
/ paprs(:, k) * (pplay(:, k-1) - pplay(:, k)) / rg |
|
/ ypaprs(1:knon, k) & |
|
|
* (ypplay(1:knon, k-1) - ypplay(1:knon, k)) / rg |
|
61 |
END DO |
END DO |
62 |
|
|
63 |
DO k = 1, klev |
forall (k = 1:klev) teta(:, k) = t(:, k) & |
64 |
yteta(1:knon, k) = yt(1:knon, k) * (ypaprs(1:knon, 1) & |
* (paprs(:, 1) / pplay(:, k))**rkappa * (1. + 0.61 * q(:, k)) |
|
/ ypplay(1:knon, k))**rkappa * (1. + 0.61 * yq(1:knon, k)) |
|
|
END DO |
|
|
|
|
|
zlev(:knon, 1) = 0. |
|
|
zlev(:knon, klev + 1) = 2. * yzlay(:knon, klev) & |
|
|
- yzlay(:knon, klev - 1) |
|
|
|
|
|
DO k = 2, klev |
|
|
zlev(:knon, k) = 0.5 * (yzlay(:knon, k) + yzlay(:knon, k-1)) |
|
|
END DO |
|
65 |
|
|
66 |
ustar(:knon) = ustarhb(yu(:knon, 1), yv(:knon, 1), ycdragm(:knon)) |
zlev(:, 1) = 0. |
67 |
CALL yamada4(dtime, rg, zlev(:knon, :), yzlay(:knon, :), & |
zlev(:, klev + 1) = 2. * zlay(:, klev) - zlay(:, klev - 1) |
68 |
yu(:knon, :), yv(:knon, :), yteta(:knon, :), yq2(:knon, :), & |
forall (k = 2:klev) zlev(:, k) = 0.5 * (zlay(:, k) + zlay(:, k-1)) |
69 |
ycoefm, ycoefh, ustar(:knon)) |
|
70 |
|
CALL yamada4(dtime, zlev, zlay, u, v, teta, q2, coefm, coefh, & |
71 |
|
ustarhb(u(:, 1), v(:, 1), cdragm)) |
72 |
|
else |
73 |
|
CALL coefkz(nsrf, paprs, pplay, ts, u, v, t, q, zgeop, coefm, coefh) |
74 |
|
|
75 |
|
IF (iflag_pbl == 1) THEN |
76 |
|
CALL coefkz2(nsrf, paprs, pplay, t, coefm0, coefh0) |
77 |
|
coefm = max(coefm, coefm0) |
78 |
|
coefh = max(coefh, coefh0) |
79 |
|
END IF |
80 |
|
|
81 |
|
IF (ok_kzmin) THEN |
82 |
|
! Calcul d'une diffusion minimale pour les conditions tres stables |
83 |
|
CALL coefkzmin(paprs, pplay, u, v, t, q, cdragm, coefh0) |
84 |
|
coefm = max(coefm, coefh0) |
85 |
|
coefh = max(coefh, coefh0) |
86 |
|
END IF |
87 |
END IF |
END IF |
88 |
|
|
89 |
end subroutine coef_diff_turb |
end subroutine coef_diff_turb |