4 |
|
|
5 |
contains |
contains |
6 |
|
|
7 |
SUBROUTINE coefkzmin(ngrid, ypaprs, ypplay, yu, yv, yt, yq, ycoefm, km, kn) |
SUBROUTINE coefkzmin(knon, ypaprs, ypplay, yu, yv, yt, yq, ycoefm, kn) |
8 |
|
|
9 |
! From LMDZ4/libf/phylmd/coefkzmin.F, version 1.1.1.1 2004/05/19 12:53:08 |
! From LMDZ4/libf/phylmd/coefkzmin.F, version 1.1.1.1 2004/05/19 12:53:08 |
10 |
|
|
14 |
USE dimphy, ONLY: klev, klon |
USE dimphy, ONLY: klev, klon |
15 |
USE suphec_m, ONLY: rd, rg, rkappa |
USE suphec_m, ONLY: rd, rg, rkappa |
16 |
|
|
17 |
integer, intent(in):: ngrid |
integer, intent(in):: knon |
18 |
REAL, intent(in):: ypaprs(klon, klev+1), ypplay(klon, klev) |
REAL, intent(in):: ypaprs(klon, klev+1), ypplay(klon, klev) |
19 |
REAL, intent(in):: yu(klon, klev), yv(klon, klev) ! wind, in m s-1 |
REAL, intent(in):: yu(klon, klev), yv(klon, klev) ! wind, in m s-1 |
20 |
REAL, intent(in):: yt(klon, klev) ! temperature, in K |
REAL, intent(in):: yt(klon, klev) ! temperature, in K |
21 |
REAL, intent(in):: yq(klon, klev) |
REAL, intent(in):: yq(klon, klev) |
22 |
REAL, intent(in):: ycoefm(:) ! (ngrid) drag coefficient |
REAL, intent(in):: ycoefm(:) ! (knon) drag coefficient |
23 |
|
|
24 |
REAL, intent(inout):: km(klon, klev) |
REAL, intent(out):: kn(:, 2:) ! (knon, 2:klev) coefficient de |
25 |
! coefficient de diffusion turbulente de quantité de mouvement (au |
! diffusion turbulente de la quantité de mouvement et des |
26 |
! bas de chaque couche) (en sortie : la valeur à la fin du pas de |
! scalaires (au bas de chaque couche) (en sortie : la valeur à la |
27 |
! temps), m2 s-1 |
! fin du pas de temps), m2 s-1 |
|
|
|
|
REAL, intent(inout):: kn(klon, klev) |
|
|
! coefficient de diffusion turbulente des scalaires (au bas de |
|
|
! chaque couche) (en sortie : la valeur à la fin du pas de temps), m2 s-1 |
|
28 |
|
|
29 |
! Local: |
! Local: |
30 |
|
|
31 |
real ustar(ngrid) ! u* |
real ustar(knon) ! u* |
32 |
real zlay(ngrid, klev) ! in m |
real zlay(knon, klev) ! in m |
33 |
integer i, k |
integer i, k |
34 |
real pblhmin(ngrid) |
real pblhmin(knon) |
35 |
real, parameter:: coriol = 1e-4 |
real, parameter:: coriol = 1e-4 |
36 |
|
|
37 |
REAL zlev(ngrid, 2: klev) |
REAL zlev(knon, 2: klev) |
38 |
! altitude at level (interface between layer with same index), in m |
! altitude at level (interface between layer with same index), in m |
39 |
|
|
40 |
REAL teta(ngrid, klev) |
REAL teta(knon, klev) |
41 |
! température potentielle au centre de chaque couche (la valeur au |
! température potentielle au centre de chaque couche (la valeur au |
42 |
! debut du pas de temps) |
! debut du pas de temps) |
43 |
|
|
47 |
|
|
48 |
! Debut de la partie qui doit etre incluse a terme dans clmain. |
! Debut de la partie qui doit etre incluse a terme dans clmain. |
49 |
|
|
50 |
do i = 1, ngrid |
do i = 1, knon |
51 |
zlay(i, 1) = RD * yt(i, 1) * 2 / (ypaprs(i, 1) + ypplay(i, 1)) & |
zlay(i, 1) = RD * yt(i, 1) * 2 / (ypaprs(i, 1) + ypplay(i, 1)) & |
52 |
* (ypaprs(i, 1) - ypplay(i, 1)) / RG |
* (ypaprs(i, 1) - ypplay(i, 1)) / RG |
53 |
enddo |
enddo |
54 |
|
|
55 |
do k = 2, klev |
do k = 2, klev |
56 |
do i = 1, ngrid |
do i = 1, knon |
57 |
zlay(i, k) = zlay(i, k-1) + RD * 0.5 * (yt(i, k - 1) + yt(i, k)) & |
zlay(i, k) = zlay(i, k-1) + RD * 0.5 * (yt(i, k - 1) + yt(i, k)) & |
58 |
/ ypaprs(i, k) * (ypplay(i, k - 1) - ypplay(i, k)) / RG |
/ ypaprs(i, k) * (ypplay(i, k - 1) - ypplay(i, k)) / RG |
59 |
enddo |
enddo |
60 |
enddo |
enddo |
61 |
|
|
62 |
do k=1, klev |
do k=1, klev |
63 |
do i = 1, ngrid |
do i = 1, knon |
64 |
! Attention : on passe la temperature potentielle virtuelle |
! Attention : on passe la temperature potentielle virtuelle |
65 |
! pour le calcul de K. |
! pour le calcul de K. |
66 |
teta(i, k) = yt(i, k) * (ypaprs(i, 1) / ypplay(i, k))**rkappa & |
teta(i, k) = yt(i, k) * (ypaprs(i, 1) / ypplay(i, k))**rkappa & |
69 |
enddo |
enddo |
70 |
|
|
71 |
forall (k = 2: klev) zlev(:, k) = 0.5 * (zlay(:, k) + zlay(:, k-1)) |
forall (k = 2: klev) zlev(:, k) = 0.5 * (zlay(:, k) + zlay(:, k-1)) |
72 |
ustar = SQRT(ycoefm * (yu(:ngrid, 1)**2 + yv(:ngrid, 1)**2)) |
ustar = SQRT(ycoefm * (yu(:knon, 1)**2 + yv(:knon, 1)**2)) |
73 |
|
|
74 |
! Fin de la partie qui doit être incluse à terme dans clmain |
! Fin de la partie qui doit être incluse à terme dans clmain |
75 |
|
|
83 |
pblhmin = 0.07 * ustar / coriol |
pblhmin = 0.07 * ustar / coriol |
84 |
|
|
85 |
do k = 2, klev |
do k = 2, klev |
86 |
do i = 1, ngrid |
do i = 1, knon |
87 |
if (teta(i, 2) > teta(i, 1)) then |
if (teta(i, 2) > teta(i, 1)) then |
88 |
kn(i, k) = kap * zlev(i, k) * ustar(i) & |
kn(i, k) = kap * zlev(i, k) * ustar(i) & |
89 |
* (max(1. - zlev(i, k) / pblhmin(i), 0.))**2 |
* (max(1. - zlev(i, k) / pblhmin(i), 0.))**2 |
90 |
else |
else |
91 |
kn(i, k) = 0. ! min n'est utilisé que pour les SL stables |
kn(i, k) = 0. ! min n'est utilisé que pour les SL stables |
92 |
endif |
endif |
|
km(i, k) = kn(i, k) |
|
93 |
enddo |
enddo |
94 |
enddo |
enddo |
95 |
|
|