/[lmdze]/trunk/phylmd/Conflx/conflx.f
ViewVC logotype

Annotation of /trunk/phylmd/Conflx/conflx.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 70 - (hide annotations)
Mon Jun 24 15:39:52 2013 UTC (10 years, 11 months ago) by guez
Original Path: trunk/libf/phylmd/Conflx/conflx.f90
File size: 6432 byte(s)
In procedure, "addfi" access directly the module variable "dtphys"
instead of going through an argument.

In "conflx", do not create a local variable for temperature with
reversed order of vertical levels. Instead, give an actual argument
with reversed order in "physiq".

Changed names of variables "rmd" and "rmv" from module "suphec_m" to
"md" and "mv".

In "hgardfou", print only the first temperature out of range found.

1 guez 62 module conflx_m
2 guez 3
3 guez 62 IMPLICIT none
4 guez 3
5 guez 62 contains
6 guez 3
7 guez 70 SUBROUTINE conflx (dtime, pres_h, pres_f, t, q, con_t, con_q, qhfl, w, &
8 guez 62 d_t, d_q, rain, snow, pmfu, pmfd, pen_u, pde_u, pen_d, pde_d, kcbot, &
9     kctop, kdtop, pmflxr, pmflxs)
10 guez 3
11 guez 62 ! From LMDZ4/libf/phylmd/conflx.F, version 1.1.1.1 2004/05/19 12:53:08
12 guez 3
13 guez 62 ! Author: Z. X. Li (LMD/CNRS)
14 guez 70 ! Date: 1994/10/14
15 guez 52
16 guez 70 ! Objet: schéma en flux de masse pour la convection (schéma de
17 guez 62 ! Tiedtke avec quelques modifications mineures)
18 guez 52
19 guez 62 ! Décembre 1997 : prise en compte des modifications introduites
20 guez 70 ! par Olivier Boucher et Alexandre Armengaud pour le mélange et le
21 guez 62 ! lessivage des traceurs passifs.
22    
23     use flxmain_m, only: flxmain
24     USE dimphy, ONLY: klev, klon
25     USE suphec_m, ONLY: rd, retv, rtt
26     USE yoethf_m, ONLY: r2es
27     USE fcttre, ONLY: foeew
28    
29 guez 70 REAL, intent(in):: dtime ! pas d'integration (s)
30     REAL, intent(in):: pres_h(:, :) ! (klon, klev+1) pression half-level (Pa)
31     REAL, intent(in):: pres_f(:, :) ! (klon, klev) pression full-level (Pa)
32     REAL, intent(in):: t(:, :) ! (klon, klev) temperature (K)
33     REAL, intent(in):: q(:, :) ! (klon, klev) humidité spécifique (g/g)
34 guez 62
35 guez 70 REAL, intent(in):: con_t(:, :)
36     ! (klon, klev) convergence de temperature (K/s)
37 guez 62
38 guez 70 REAL, intent(in):: con_q(:, :)
39     ! (klon, klev) convergence de l'eau vapeur (g/g/s)
40    
41     REAL, intent(in):: qhfl(:) ! (klon) evaporation (negative vers haut) mm/s
42     REAL, intent(in):: w(:, :) ! (klon, klev) vitesse verticale (Pa/s)
43    
44     REAL, intent(out):: d_t(:, :) ! (klon, klev) incrementation de temperature
45     REAL, intent(out):: d_q(:, :) ! (klon, klev) incrementation d'humidite
46     REAL, intent(out):: rain(:) ! (klon) pluie (mm/s)
47     REAL, intent(out):: snow(:) ! (klon) neige (mm/s)
48    
49 guez 62 REAL, intent(out):: pmfu(:, :) ! (klon, klev)
50     ! flux masse (kg/m2/s) panache ascendant
51 guez 70
52 guez 62 REAL, intent(out):: pmfd(:, :) ! (klon, klev)
53     ! flux masse (kg/m2/s) panache descendant
54    
55 guez 70 REAL, intent(out):: pen_u(:, :) ! (klon, klev)
56     REAL, intent(out):: pde_u(:, :) ! (klon, klev)
57     REAL, intent(out):: pen_d(:, :) ! (klon, klev)
58     REAL, intent(out):: pde_d(:, :) ! (klon, klev)
59     INTEGER, intent(out):: kcbot(:) ! (klon) niveau du bas de la convection
60     INTEGER, intent(out):: kctop(:) ! (klon) niveau du haut de la convection
61     INTEGER, intent(out):: kdtop(:) ! (klon) niveau du haut des downdrafts
62     REAL, intent(out):: pmflxr(:, :) ! (klon, klev+1)
63     REAL, intent(out):: pmflxs(:, :) ! (klon, klev+1)
64 guez 62
65     ! Local:
66    
67     REAL pq(klon, klev)
68     REAL pqs(klon, klev)
69     REAL pvervel(klon, klev)
70     LOGICAL land(klon)
71    
72     REAL d_t_bis(klon, klev)
73     REAL d_q_bis(klon, klev)
74     REAL paprs(klon, klev+1)
75     REAL paprsf(klon, klev)
76     REAL zgeom(klon, klev)
77     REAL zcvgq(klon, klev)
78     REAL zcvgt(klon, klev)
79    
80     REAL zmfu(klon, klev)
81     REAL zmfd(klon, klev)
82     REAL zen_u(klon, klev)
83     REAL zen_d(klon, klev)
84     REAL zde_u(klon, klev)
85     REAL zde_d(klon, klev)
86     REAL zmflxr(klon, klev+1)
87     REAL zmflxs(klon, klev+1)
88    
89     INTEGER i, k
90 guez 70 REAL zqsat
91 guez 62
92     !--------------------------------------------------------------------
93    
94     ! initialiser les variables de sortie (pour securite)
95     DO i = 1, klon
96     rain(i) = 0.0
97     snow(i) = 0.0
98     kcbot(i) = 0
99     kctop(i) = 0
100     kdtop(i) = 0
101     ENDDO
102     DO k = 1, klev
103     DO i = 1, klon
104     d_t(i, k) = 0.0
105     d_q(i, k) = 0.0
106     pmfu(i, k) = 0.0
107     pmfd(i, k) = 0.0
108     pen_u(i, k) = 0.0
109     pde_u(i, k) = 0.0
110     pen_d(i, k) = 0.0
111     pde_d(i, k) = 0.0
112     zmfu(i, k) = 0.0
113     zmfd(i, k) = 0.0
114     zen_u(i, k) = 0.0
115     zde_u(i, k) = 0.0
116     zen_d(i, k) = 0.0
117     zde_d(i, k) = 0.0
118     ENDDO
119     ENDDO
120     DO k = 1, klev+1
121     DO i = 1, klon
122     zmflxr(i, k) = 0.0
123     zmflxs(i, k) = 0.0
124     ENDDO
125     ENDDO
126    
127     ! calculer la nature du sol (pour l'instant, ocean partout)
128     DO i = 1, klon
129     land(i) = .FALSE.
130     ENDDO
131    
132     ! preparer les variables d'entree (attention: l'ordre des niveaux
133     ! verticaux augmente du haut vers le bas)
134     DO k = 1, klev
135     DO i = 1, klon
136     pq(i, k) = q(i, klev-k+1)
137     paprsf(i, k) = pres_f(i, klev-k+1)
138     paprs(i, k) = pres_h(i, klev+1-k+1)
139     pvervel(i, k) = w(i, klev+1-k)
140     zcvgt(i, k) = con_t(i, klev-k+1)
141     zcvgq(i, k) = con_q(i, klev-k+1)
142    
143 guez 70 zqsat = MIN(0.5, R2ES * FOEEW(t(i, k), &
144     merge(0., 1., rtt < t(i, k))) / paprsf(i, k))
145     pqs(i, k) = zqsat / (1. - RETV * zqsat)
146 guez 62 ENDDO
147     ENDDO
148     DO i = 1, klon
149     paprs(i, klev+1) = pres_h(i, 1)
150 guez 70 zgeom(i, klev) = RD * t(i, klev) &
151 guez 62 / (0.5*(paprs(i, klev+1)+paprsf(i, klev))) &
152     * (paprs(i, klev+1)-paprsf(i, klev))
153     ENDDO
154     DO k = klev-1, 1, -1
155     DO i = 1, klon
156     zgeom(i, k) = zgeom(i, k+1) &
157 guez 70 + RD * 0.5*(t(i, k+1)+t(i, k)) / paprs(i, k+1) &
158 guez 62 * (paprsf(i, k+1)-paprsf(i, k))
159     ENDDO
160     ENDDO
161    
162 guez 70 ! Appeler la routine principale :
163     CALL flxmain(dtime, t, pq, pqs, qhfl, paprsf, paprs, zgeom, land, &
164 guez 62 zcvgt, zcvgq, pvervel, rain, snow, kcbot, kctop, kdtop, zmfu, zmfd, &
165     zen_u, zde_u, zen_d, zde_d, d_t_bis, d_q_bis, zmflxr, zmflxs)
166    
167     ! De la même façon que l'on effectue le réindiçage pour la
168     ! température t et le champ q, on réindice les flux nécessaires à
169     ! la convection des traceurs.
170     DO k = 1, klev
171     DO i = 1, klon
172     d_q(i, klev+1-k) = dtime*d_q_bis(i, k)
173     d_t(i, klev+1-k) = dtime*d_t_bis(i, k)
174     ENDDO
175     ENDDO
176    
177     DO i = 1, klon
178     pmfu(i, 1)= 0.
179     pmfd(i, 1)= 0.
180     pen_d(i, 1)= 0.
181     pde_d(i, 1)= 0.
182     ENDDO
183    
184     DO k = 2, klev
185     DO i = 1, klon
186     pmfu(i, klev+2-k)= zmfu(i, k)
187     pmfd(i, klev+2-k)= zmfd(i, k)
188     ENDDO
189     ENDDO
190    
191     DO k = 1, klev
192     DO i = 1, klon
193 guez 70 pen_u(i, klev+1-k)= zen_u(i, k)
194     pde_u(i, klev+1-k)= zde_u(i, k)
195 guez 62 ENDDO
196     ENDDO
197    
198     DO k = 1, klev-1
199     DO i = 1, klon
200     pen_d(i, klev+1-k)= -zen_d(i, k+1)
201     pde_d(i, klev+1-k)= -zde_d(i, k+1)
202     ENDDO
203     ENDDO
204    
205     DO k = 1, klev+1
206     DO i = 1, klon
207     pmflxr(i, klev+2-k)= zmflxr(i, k)
208     pmflxs(i, klev+2-k)= zmflxs(i, k)
209     ENDDO
210     ENDDO
211    
212     END SUBROUTINE conflx
213    
214     end module conflx_m

  ViewVC Help
Powered by ViewVC 1.1.21