/[lmdze]/trunk/Sources/phylmd/coefkzmin.f
ViewVC logotype

Contents of /trunk/Sources/phylmd/coefkzmin.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 251 - (show annotations)
Mon Jan 8 14:12:02 2018 UTC (6 years, 3 months ago) by guez
File size: 3237 byte(s)
Polishing.
1 module coefkzmin_m
2
3 IMPLICIT NONE
4
5 contains
6
7 SUBROUTINE coefkzmin(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
10
11 ! Entrées modifiées en attendant une version où les zlev et zlay
12 ! soient disponibles.
13
14 USE dimphy, ONLY: klev
15 USE suphec_m, ONLY: rd, rg, rkappa
16
17 REAL, intent(in):: ypaprs(:, :) ! (knon, klev+1)
18 REAL, intent(in):: ypplay(:, :) ! (knon, klev)
19 REAL, intent(in):: yu(:, :), yv(:, :) ! (knon, klev) wind, in m s-1
20 REAL, intent(in):: yt(:, :) ! (knon, klev) temperature, in K
21 REAL, intent(in):: yq(:, :) ! (knon, klev)
22 REAL, intent(in):: ycoefm(:) ! (knon) drag coefficient
23
24 REAL, intent(out):: kn(:, 2:) ! (knon, 2:klev) coefficient de
25 ! diffusion turbulente de la quantité de mouvement et des
26 ! scalaires (au bas de chaque couche) (en sortie : la valeur à la
27 ! fin du pas de temps), m2 s-1
28
29 ! Local:
30
31 integer knon
32 real ustar(size(ypaprs, 1)) ! (knon) u*
33 real zlay(size(ypaprs, 1), klev) ! (knon, klev) in m
34 integer i, k
35 real pblhmin(size(ypaprs, 1)) ! (knon)
36 real, parameter:: coriol = 1e-4
37
38 REAL zlev(size(ypaprs, 1), 2: klev) ! (knon, 2: klev)
39 ! altitude at level (interface between layer with same index), in m
40
41 REAL teta(size(ypaprs, 1), klev) ! (knon, klev)
42 ! température potentielle au centre de chaque couche (la valeur au
43 ! debut du pas de temps)
44
45 real, PARAMETER:: kap = 0.4
46
47 !---------------------------------------------------------------------
48
49 knon = size(ypaprs, 1)
50
51 ! Debut de la partie qui doit etre incluse a terme dans clmain.
52
53 do i = 1, knon
54 zlay(i, 1) = RD * yt(i, 1) * 2 / (ypaprs(i, 1) + ypplay(i, 1)) &
55 * (ypaprs(i, 1) - ypplay(i, 1)) / RG
56 enddo
57
58 do k = 2, klev
59 do i = 1, knon
60 zlay(i, k) = zlay(i, k-1) + RD * 0.5 * (yt(i, k - 1) + yt(i, k)) &
61 / ypaprs(i, k) * (ypplay(i, k - 1) - ypplay(i, k)) / RG
62 enddo
63 enddo
64
65 do k=1, klev
66 do i = 1, knon
67 ! Attention : on passe la temperature potentielle virtuelle
68 ! pour le calcul de K.
69 teta(i, k) = yt(i, k) * (ypaprs(i, 1) / ypplay(i, k))**rkappa &
70 * (1. + 0.61 * yq(i, k))
71 enddo
72 enddo
73
74 forall (k = 2: klev) zlev(:, k) = 0.5 * (zlay(:, k) + zlay(:, k-1))
75 ustar = SQRT(ycoefm * (yu(:, 1)**2 + yv(:, 1)**2))
76
77 ! Fin de la partie qui doit être incluse à terme dans clmain
78
79 ! Cette routine est ecrite pour avoir en entree ustar, teta et zlev
80 ! Ici, on a inclus le calcul de ces trois variables dans la routine
81 ! coefkzmin en attendant une nouvelle version de la couche limite
82 ! ou ces variables seront disponibles.
83
84 ! Debut de la routine coefkzmin proprement dite
85
86 pblhmin = 0.07 * ustar / coriol
87
88 do k = 2, klev
89 do i = 1, knon
90 if (teta(i, 2) > teta(i, 1)) then
91 kn(i, k) = kap * zlev(i, k) * ustar(i) &
92 * (max(1. - zlev(i, k) / pblhmin(i), 0.))**2
93 else
94 kn(i, k) = 0. ! min n'est utilisé que pour les SL stables
95 endif
96 enddo
97 enddo
98
99 end SUBROUTINE coefkzmin
100
101 end module coefkzmin_m

  ViewVC Help
Powered by ViewVC 1.1.21