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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 298 - (show annotations)
Thu Jul 26 16:45:51 2018 UTC (5 years, 9 months ago) by guez
File size: 5680 byte(s)
Use directly dtphys from module comconst when possible instead of
having it trickle down through procedure arguments.

1 module conflx_m
2
3 IMPLICIT none
4
5 contains
6
7 SUBROUTINE conflx(pres_h, pres_f, t, q, con_t, con_q, qhfl, omega, d_t, d_q, &
8 rain, snow, mfu, mfd, pen_u, pde_u, pen_d, pde_d, kcbot, kctop, kdtop, &
9 pmflxr, pmflxs)
10
11 ! From LMDZ4/libf/phylmd/conflx.F, version 1.1.1.1 2004/05/19 12:53:08
12
13 ! Author: Z. X. Li (LMD/CNRS)
14 ! Date: 1994/10/14
15
16 ! Objet: schéma en flux de masse pour la convection (schéma de
17 ! Tiedtke avec quelques modifications mineures)
18
19 ! Décembre 1997 : prise en compte des modifications introduites
20 ! par Olivier Boucher et Alexandre Armengaud pour le mélange et le
21 ! lessivage des traceurs passifs.
22
23 use comconst, only: dtphys
24 USE dimphy, ONLY: klev, klon
25 USE fcttre, ONLY: foeew
26 use flxmain_m, only: flxmain
27 USE suphec_m, ONLY: rd, retv, rtt
28 USE yoethf_m, ONLY: r2es
29
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 (no dimension)
34
35 REAL, intent(in):: con_t(:, :)
36 ! (klon, klev) convergence de temperature (K/s)
37
38 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):: omega(:, :) ! (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 REAL, intent(out):: mfu(:, :) ! (klon, klev)
50 ! flux de masse (kg/m2/s) panache ascendant
51
52 REAL, intent(out):: mfd(:, :) ! (klon, klev)
53 ! flux de masse (kg/m2/s) panache descendant
54
55 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
65 ! Local:
66
67 REAL qsen(klon, klev)
68 REAL pvervel(klon, klev)
69 LOGICAL land(klon)
70
71 REAL d_t_bis(klon, klev)
72 REAL d_q_bis(klon, klev)
73 REAL paprs(klon, klev + 1)
74 REAL paprsf(klon, klev)
75 REAL zgeom(klon, klev)
76 REAL zcvgq(klon, klev)
77 REAL zcvgt(klon, klev)
78
79 REAL zen_u(klon, klev)
80 REAL zen_d(klon, klev)
81 REAL zde_u(klon, klev)
82 REAL zde_d(klon, klev)
83 REAL zmflxr(klon, klev + 1)
84 REAL zmflxs(klon, klev + 1)
85
86 INTEGER i, k
87 REAL zqsat
88
89 !--------------------------------------------------------------------
90
91 ! Initialiser les variables de sortie (pour securité):
92 rain = 0.
93 snow = 0.
94 kcbot = 0
95 kctop = 0
96 kdtop = 0
97 d_t = 0.
98 d_q = 0.
99
100 zen_u = 0.
101 zde_u = 0.
102 zen_d = 0.
103 zde_d = 0.
104 zmflxr = 0.
105 zmflxs = 0.
106
107 ! Calculer la nature du sol (pour l'instant, océan partout):
108 land = .FALSE.
109
110 ! Préparer les variables d'entrée (attention: l'indice des niveaux
111 ! verticaux augmente du haut vers le bas) :
112 DO k = 1, klev
113 DO i = 1, klon
114 paprsf(i, k) = pres_f(i, klev-k + 1)
115 paprs(i, k) = pres_h(i, klev + 1-k + 1)
116 pvervel(i, k) = omega(i, klev + 1-k)
117 zcvgt(i, k) = con_t(i, klev-k + 1)
118 zcvgq(i, k) = con_q(i, klev-k + 1)
119
120 zqsat = MIN(0.5, R2ES * FOEEW(t(i, k), rtt >= t(i, k)) &
121 / paprsf(i, k))
122 qsen(i, k) = zqsat / (1. - RETV * zqsat)
123 ENDDO
124 ENDDO
125 DO i = 1, klon
126 paprs(i, klev + 1) = pres_h(i, 1)
127 zgeom(i, klev) = RD * t(i, klev) &
128 / (0.5*(paprs(i, klev + 1) + paprsf(i, klev))) &
129 * (paprs(i, klev + 1)-paprsf(i, klev))
130 ENDDO
131 DO k = klev-1, 1, -1
132 DO i = 1, klon
133 zgeom(i, k) = zgeom(i, k + 1) &
134 + RD * 0.5*(t(i, k + 1) + t(i, k)) / paprs(i, k + 1) &
135 * (paprsf(i, k + 1)-paprsf(i, k))
136 ENDDO
137 ENDDO
138
139 ! Appeler la routine principale :
140 CALL flxmain(dtphys, t, q, qsen, qhfl, paprsf, paprs, zgeom, land, &
141 zcvgt, zcvgq, pvervel, rain, snow, kcbot, kctop, kdtop, mfu, mfd, &
142 zen_u, zde_u, zen_d, zde_d, d_t_bis, d_q_bis, zmflxr, zmflxs)
143
144 ! De la même façon que l'on effectue le réindiçage pour la
145 ! température t et le champ q, on réindice les flux nécessaires à
146 ! la convection des traceurs.
147 DO k = 1, klev
148 DO i = 1, klon
149 d_q(i, klev + 1-k) = dtphys*d_q_bis(i, k)
150 d_t(i, klev + 1-k) = dtphys*d_t_bis(i, k)
151 ENDDO
152 ENDDO
153
154 mfu = eoshift(mfu, shift=1, dim=2)
155 mfd = eoshift(mfd, shift=1, dim=2)
156 pen_d(:, 1)= 0.
157 pde_d(:, 1)= 0.
158
159 DO k = 1, klev
160 DO i = 1, klon
161 pen_u(i, klev + 1-k)= zen_u(i, k)
162 pde_u(i, klev + 1-k)= zde_u(i, k)
163 ENDDO
164 ENDDO
165
166 DO k = 1, klev-1
167 DO i = 1, klon
168 pen_d(i, klev + 1-k)= -zen_d(i, k + 1)
169 pde_d(i, klev + 1-k)= -zde_d(i, k + 1)
170 ENDDO
171 ENDDO
172
173 DO k = 1, klev + 1
174 DO i = 1, klon
175 pmflxr(i, klev + 2-k)= zmflxr(i, k)
176 pmflxs(i, klev + 2-k)= zmflxs(i, k)
177 ENDDO
178 ENDDO
179
180 END SUBROUTINE conflx
181
182 end module conflx_m

  ViewVC Help
Powered by ViewVC 1.1.21