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

Annotation of /trunk/Sources/phylmd/yamada.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 188 - (hide annotations)
Tue Mar 22 16:31:39 2016 UTC (8 years, 2 months ago) by guez
File size: 5028 byte(s)
Removed argument ncum of cv30_unsat, arguments nloc, ncum, nd, na of cv30_yield.

1 guez 108 module yamada_m
2 guez 3
3 guez 81 IMPLICIT NONE
4 guez 3
5 guez 108 contains
6 guez 3
7 guez 145 SUBROUTINE yamada(ngrid, g, zlev, zlay, u, v, teta, q2, km, kn)
8 guez 3
9 guez 108 ! From LMDZ4/libf/phylmd/yamada.F,v 1.1 2004/06/22 11:45:36
10 guez 3
11 guez 108 USE dimens_m
12     USE dimphy
13     ! .......................................................................
14     ! .......................................................................
15 guez 3
16 guez 108 ! g : g
17     ! zlev : altitude a chaque niveau (interface inferieure de la couche
18     ! de meme indice)
19     ! zlay : altitude au centre de chaque couche
20     ! u,v : vitesse au centre de chaque couche
21     ! (en entree : la valeur au debut du pas de temps)
22     ! teta : temperature potentielle au centre de chaque couche
23     ! (en entree : la valeur au debut du pas de temps)
24     ! q2 : $q^2$ au bas de chaque couche
25     ! (en entree : la valeur au debut du pas de temps)
26     ! (en sortie : la valeur a la fin du pas de temps)
27     ! km : diffusivite turbulente de quantite de mouvement (au bas de chaque
28     ! couche)
29     ! (en sortie : la valeur a la fin du pas de temps)
30     ! kn : diffusivite turbulente des scalaires (au bas de chaque couche)
31     ! (en sortie : la valeur a la fin du pas de temps)
32 guez 3
33 guez 108 ! .......................................................................
34     REAL, INTENT (IN) :: g
35     REAL zlev(klon, klev+1)
36     REAL zlay(klon, klev)
37     REAL u(klon, klev)
38     REAL v(klon, klev)
39     REAL teta(klon, klev)
40     REAL q2(klon, klev+1)
41     REAL km(klon, klev+1)
42     REAL kn(klon, klev+1)
43 guez 145 INTEGER ngrid
44 guez 3
45    
46 guez 188 INTEGER nlay
47 guez 108 PARAMETER (nlay=klev)
48 guez 3
49 guez 108 LOGICAL first
50     SAVE first
51     DATA first/.TRUE./
52 guez 3
53    
54 guez 108 INTEGER ig, k
55 guez 3
56 guez 108 REAL ri, zrif, zalpha, zsm
57     REAL rif(klon, klev+1), sm(klon, klev+1), alpha(klon, klev)
58 guez 3
59 guez 108 REAL m2(klon, klev+1), dz(klon, klev+1), zq, n2(klon, klev+1)
60     REAL l(klon, klev+1), l0(klon)
61 guez 3
62 guez 108 REAL sq(klon), sqz(klon), zz(klon, klev+1)
63     INTEGER iter
64 guez 3
65 guez 108 REAL ric, rifc, b1, kap
66     SAVE ric, rifc, b1, kap
67     DATA ric, rifc, b1, kap/0.195, 0.191, 16.6, 0.3/
68 guez 3
69 guez 108 IF (0==1 .AND. first) THEN
70     DO ig = 1, 1000
71     ri = (ig-800.)/500.
72     IF (ri<ric) THEN
73     zrif = frif(ri)
74     ELSE
75     zrif = rifc
76     END IF
77     IF (zrif<0.16) THEN
78     zalpha = falpha(zrif)
79     zsm = fsm(zrif)
80     ELSE
81     zalpha = 1.12
82     zsm = 0.085
83     END IF
84     PRINT *, ri, rif, zalpha, zsm
85     END DO
86     first = .FALSE.
87     END IF
88 guez 3
89 guez 108 ! Correction d'un bug sauvage a verifier.
90     ! do k=2,nlev
91     DO k = 2, nlay
92     DO ig = 1, ngrid
93     dz(ig, k) = zlay(ig, k) - zlay(ig, k-1)
94     m2(ig, k) = ((u(ig,k)-u(ig,k-1))**2+(v(ig,k)-v(ig, &
95     k-1))**2)/(dz(ig,k)*dz(ig,k))
96     n2(ig, k) = g*2.*(teta(ig,k)-teta(ig,k-1))/(teta(ig,k-1)+teta(ig,k))/ &
97     dz(ig, k)
98     ri = n2(ig, k)/max(m2(ig,k), 1.E-10)
99     IF (ri<ric) THEN
100     rif(ig, k) = frif(ri)
101     ELSE
102     rif(ig, k) = rifc
103     END IF
104     IF (rif(ig,k)<0.16) THEN
105     alpha(ig, k) = falpha(rif(ig,k))
106     sm(ig, k) = fsm(rif(ig,k))
107     ELSE
108     alpha(ig, k) = 1.12
109     sm(ig, k) = 0.085
110     END IF
111     zz(ig, k) = b1*m2(ig, k)*(1.-rif(ig,k))*sm(ig, k)
112     END DO
113 guez 81 END DO
114    
115 guez 108 ! iterration pour determiner la longueur de melange
116    
117 guez 81 DO ig = 1, ngrid
118 guez 108 l0(ig) = 100.
119 guez 81 END DO
120     DO k = 2, klev - 1
121 guez 108 DO ig = 1, ngrid
122     l(ig, k) = l0(ig)*kap*zlev(ig, k)/(kap*zlev(ig,k)+l0(ig))
123     END DO
124 guez 81 END DO
125    
126 guez 108 DO iter = 1, 10
127     DO ig = 1, ngrid
128     sq(ig) = 1.E-10
129     sqz(ig) = 1.E-10
130     END DO
131     DO k = 2, klev - 1
132     DO ig = 1, ngrid
133     q2(ig, k) = l(ig, k)**2*zz(ig, k)
134     l(ig, k) = min(l0(ig)*kap*zlev(ig,k)/(kap*zlev(ig, &
135     k)+l0(ig)), 0.5*sqrt(q2(ig,k))/sqrt(max(n2(ig,k),1.E-10)))
136     zq = sqrt(q2(ig,k))
137     sqz(ig) = sqz(ig) + zq*zlev(ig, k)*(zlay(ig,k)-zlay(ig,k-1))
138     sq(ig) = sq(ig) + zq*(zlay(ig,k)-zlay(ig,k-1))
139     END DO
140     END DO
141     DO ig = 1, ngrid
142     l0(ig) = 0.2*sqz(ig)/sq(ig)
143     END DO
144     ! (abd 3 5 2) print*,'ITER=',iter,' L0=',l0
145 guez 81
146     END DO
147    
148 guez 108 DO k = 2, klev
149     DO ig = 1, ngrid
150     l(ig, k) = min(l0(ig)*kap*zlev(ig,k)/(kap*zlev(ig, &
151     k)+l0(ig)), 0.5*sqrt(q2(ig,k))/sqrt(max(n2(ig,k),1.E-10)))
152     q2(ig, k) = l(ig, k)**2*zz(ig, k)
153     km(ig, k) = l(ig, k)*sqrt(q2(ig,k))*sm(ig, k)
154     kn(ig, k) = km(ig, k)*alpha(ig, k)
155     END DO
156     END DO
157    
158     contains
159    
160     REAL function frif(ri)
161     real ri
162     frif = 0.6588*(ri+0.1776-sqrt(ri*ri-0.3221*ri+0.03156))
163     end function frif
164    
165     REAL function falpha(ri)
166     real ri
167     falpha = 1.318*(0.2231-ri)/(0.2341-ri)
168     end function falpha
169    
170     REAL function fsm(ri)
171     real ri
172     fsm = 1.96*(0.1912-ri)*(0.2341-ri)/((1.-ri)*(0.2231-ri))
173     end function fsm
174    
175     END SUBROUTINE yamada
176    
177     end module yamada_m

  ViewVC Help
Powered by ViewVC 1.1.21