LMDZ
conema3.F90
Go to the documentation of this file.
1 
2 ! $Id: conema3.F90 2346 2015-08-21 15:13:46Z emillour $
3 
4 SUBROUTINE conema3(dtime, paprs, pplay, t, q, u, v, tra, ntra, work1, work2, &
5  d_t, d_q, d_u, d_v, d_tra, rain, snow, kbas, ktop, upwd, dnwd, dnwdbis, &
6  bas, top, ma, cape, tvp, rflag, pbase, bbase, dtvpdt1, dtvpdq1, dplcldt, &
7  dplcldr, qcond_incld)
8 
9  USE dimphy
10  USE infotrac_phy, ONLY: nbtr
11  IMPLICIT NONE
12  ! ======================================================================
13  ! Auteur(s): Z.X. Li (LMD/CNRS) date: 19930818
14  ! Objet: schema de convection de Emanuel (1991) interface
15  ! Mai 1998: Interface modifiee pour implementation dans LMDZ
16  ! ======================================================================
17  ! Arguments:
18  ! dtime---input-R-pas d'integration (s)
19  ! paprs---input-R-pression inter-couches (Pa)
20  ! pplay---input-R-pression au milieu des couches (Pa)
21  ! t-------input-R-temperature (K)
22  ! q-------input-R-humidite specifique (kg/kg)
23  ! u-------input-R-vitesse du vent zonal (m/s)
24  ! v-------input-R-vitesse duvent meridien (m/s)
25  ! tra-----input-R-tableau de rapport de melange des traceurs
26  ! work*: input et output: deux variables de travail,
27  ! on peut les mettre a 0 au debut
28 
29  ! d_t-----output-R-increment de la temperature
30  ! d_q-----output-R-increment de la vapeur d'eau
31  ! d_u-----output-R-increment de la vitesse zonale
32  ! d_v-----output-R-increment de la vitesse meridienne
33  ! d_tra---output-R-increment du contenu en traceurs
34  ! rain----output-R-la pluie (mm/s)
35  ! snow----output-R-la neige (mm/s)
36  ! kbas----output-R-bas du nuage (integer)
37  ! ktop----output-R-haut du nuage (integer)
38  ! upwd----output-R-saturated updraft mass flux (kg/m**2/s)
39  ! dnwd----output-R-saturated downdraft mass flux (kg/m**2/s)
40  ! dnwdbis-output-R-unsaturated downdraft mass flux (kg/m**2/s)
41  ! bas-----output-R-bas du nuage (real)
42  ! top-----output-R-haut du nuage (real)
43  ! Ma------output-R-flux ascendant non dilue (kg/m**2/s)
44  ! cape----output-R-CAPE
45  ! tvp-----output-R-virtual temperature of the lifted parcel
46  ! rflag---output-R-flag sur le fonctionnement de convect
47  ! pbase---output-R-pression a la base du nuage (Pa)
48  ! bbase---output-R-buoyancy a la base du nuage (K)
49  ! dtvpdt1-output-R-derivative of parcel virtual temp wrt T1
50  ! dtvpdq1-output-R-derivative of parcel virtual temp wrt Q1
51  ! dplcldt-output-R-derivative of the PCP pressure wrt T1
52  ! dplcldr-output-R-derivative of the PCP pressure wrt Q1
53  ! ======================================================================
54 
55  include "conema3.h"
56  INTEGER i, l, m, itra
57  INTEGER ntra ! if no tracer transport
58  ! is needed, set ntra = 1 (or 0)
59  REAL dtime
60 
61  REAL d_t2(klon, klev), d_q2(klon, klev) ! sbl
62  REAL d_u2(klon, klev), d_v2(klon, klev) ! sbl
63  REAL em_d_t2(klev), em_d_q2(klev) ! sbl
64  REAL em_d_u2(klev), em_d_v2(klev) ! sbl
65 
66  REAL paprs(klon, klev+1), pplay(klon, klev)
67  REAL t(klon, klev), q(klon, klev), d_t(klon, klev), d_q(klon, klev)
68  REAL u(klon, klev), v(klon, klev), tra(klon, klev, ntra)
69  REAL d_u(klon, klev), d_v(klon, klev), d_tra(klon, klev, ntra)
70  REAL work1(klon, klev), work2(klon, klev)
71  REAL upwd(klon, klev), dnwd(klon, klev), dnwdbis(klon, klev)
72  REAL rain(klon)
73  REAL snow(klon)
74  REAL cape(klon), tvp(klon, klev), rflag(klon)
75  REAL pbase(klon), bbase(klon)
76  REAL dtvpdt1(klon, klev), dtvpdq1(klon, klev)
77  REAL dplcldt(klon), dplcldr(klon)
78  INTEGER kbas(klon), ktop(klon)
79 
80  REAL wd(klon)
81  REAL qcond_incld(klon, klev)
82 
83  LOGICAL, SAVE :: first = .true.
84  !$OMP THREADPRIVATE(first)
85 
86  ! ym REAL em_t(klev)
87  REAL, ALLOCATABLE, SAVE :: em_t(:)
88  !$OMP THREADPRIVATE(em_t)
89  ! ym REAL em_q(klev)
90  REAL, ALLOCATABLE, SAVE :: em_q(:)
91  !$OMP THREADPRIVATE(em_q)
92  ! ym REAL em_qs(klev)
93  REAL, ALLOCATABLE, SAVE :: em_qs(:)
94  !$OMP THREADPRIVATE(em_qs)
95  ! ym REAL em_u(klev), em_v(klev), em_tra(klev,nbtr)
96  REAL, ALLOCATABLE, SAVE :: em_u(:), em_v(:), em_tra(:, :)
97  !$OMP THREADPRIVATE(em_u,em_v,em_tra)
98  ! ym REAL em_ph(klev+1), em_p(klev)
99  REAL, ALLOCATABLE, SAVE :: em_ph(:), em_p(:)
100  !$OMP THREADPRIVATE(em_ph,em_p)
101  ! ym REAL em_work1(klev), em_work2(klev)
102  REAL, ALLOCATABLE, SAVE :: em_work1(:), em_work2(:)
103  !$OMP THREADPRIVATE(em_work1,em_work2)
104  ! ym REAL em_precip, em_d_t(klev), em_d_q(klev)
105  REAL, SAVE :: em_precip
106  !$OMP THREADPRIVATE(em_precip)
107  REAL, ALLOCATABLE, SAVE :: em_d_t(:), em_d_q(:)
108  !$OMP THREADPRIVATE(em_d_t,em_d_q)
109  ! ym REAL em_d_u(klev), em_d_v(klev), em_d_tra(klev,nbtr)
110  REAL, ALLOCATABLE, SAVE :: em_d_u(:), em_d_v(:), em_d_tra(:, :)
111  !$OMP THREADPRIVATE(em_d_u,em_d_v,em_d_tra)
112  ! ym REAL em_upwd(klev), em_dnwd(klev), em_dnwdbis(klev)
113  REAL, ALLOCATABLE, SAVE :: em_upwd(:), em_dnwd(:), em_dnwdbis(:)
114  !$OMP THREADPRIVATE(em_upwd,em_dnwd,em_dnwdbis)
115  REAL em_dtvpdt1(klev), em_dtvpdq1(klev)
116  REAL em_dplcldt, em_dplcldr
117  ! ym SAVE em_t,em_q, em_qs, em_ph, em_p, em_work1, em_work2
118  ! ym SAVE em_u,em_v, em_tra
119  ! ym SAVE em_d_u,em_d_v, em_d_tra
120  ! ym SAVE em_precip, em_d_t, em_d_q, em_upwd, em_dnwd, em_dnwdbis
121 
122  INTEGER em_bas, em_top
123  SAVE em_bas, em_top
124  !$OMP THREADPRIVATE(em_bas,em_top)
125  REAL em_wd
126  REAL em_qcond(klev)
127  REAL em_qcondc(klev)
128 
129  REAL zx_t, zx_qs, zdelta, zcor
130  INTEGER iflag
131  REAL sigsum
132  ! cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
133  ! VARIABLES A SORTIR
134  ! ccccccccccccccccccccccccccccccccccccccccccccccccc
135 
136  ! ym REAL emmip(klev) !variation de flux ascnon dilue i et i+1
137  REAL, ALLOCATABLE, SAVE :: emmip(:)
138  !$OMP THREADPRIVATE(emmip)
139  ! ym SAVE emmip
140  ! ym real emMke(klev)
141  REAL, ALLOCATABLE, SAVE :: emmke(:)
142  !$OMP THREADPRIVATE(emMke)
143  ! ym save emMke
144  REAL top
145  REAL bas
146  ! ym real emMa(klev)
147  REAL, ALLOCATABLE, SAVE :: emma(:)
148  !$OMP THREADPRIVATE(emMa)
149  ! ym save emMa
150  REAL ma(klon, klev)
151  REAL ment(klev, klev)
152  REAL qent(klev, klev)
153  REAL tps(klev), tls(klev)
154  REAL sij(klev, klev)
155  REAL em_cape, em_tvp(klev)
156  REAL em_pbase, em_bbase
157  INTEGER iw, j, k, ix, iy
158 
159  ! -- sb: pour schema nuages:
160 
161  INTEGER iflagcon
162  INTEGER em_ifc(klev)
163 
164  REAL em_pradj
165  REAL em_cldf(klev), em_cldq(klev)
166  REAL em_ftadj(klev), em_fradj(klev)
167 
168  INTEGER ifc(klon, klev)
169  REAL pradj(klon)
170  REAL cldf(klon, klev), cldq(klon, klev)
171  REAL ftadj(klon, klev), fqadj(klon, klev)
172 
173  ! sb --
174 
175  ! cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
176 
177  include "YOMCST.h"
178  include "YOETHF.h"
179  include "FCTTRE.h"
180 
181  IF (first) THEN
182 
183  ALLOCATE (em_t(klev))
184  ALLOCATE (em_q(klev))
185  ALLOCATE (em_qs(klev))
186  ALLOCATE (em_u(klev), em_v(klev), em_tra(klev,nbtr))
187  ALLOCATE (em_ph(klev+1), em_p(klev))
188  ALLOCATE (em_work1(klev), em_work2(klev))
189  ALLOCATE (em_d_t(klev), em_d_q(klev))
190  ALLOCATE (em_d_u(klev), em_d_v(klev), em_d_tra(klev,nbtr))
191  ALLOCATE (em_upwd(klev), em_dnwd(klev), em_dnwdbis(klev))
192  ALLOCATE (emmip(klev))
193  ALLOCATE (emmke(klev))
194  ALLOCATE (emma(klev))
195 
196  first = .false.
197  END IF
198 
199  qcond_incld(:, :) = 0.
200 
201  ! @$$ print*,'debut conema'
202 
203  DO i = 1, klon
204  DO l = 1, klev + 1
205  em_ph(l) = paprs(i, l)/100.0
206  END DO
207 
208  DO l = 1, klev
209  em_p(l) = pplay(i, l)/100.0
210  em_t(l) = t(i, l)
211  em_q(l) = q(i, l)
212  em_u(l) = u(i, l)
213  em_v(l) = v(i, l)
214  DO itra = 1, ntra
215  em_tra(l, itra) = tra(i, l, itra)
216  END DO
217  ! @$$ print*,'em_t',em_t
218  ! @$$ print*,'em_q',em_q
219  ! @$$ print*,'em_qs',em_qs
220  ! @$$ print*,'em_u',em_u
221  ! @$$ print*,'em_v',em_v
222  ! @$$ print*,'em_tra',em_tra
223  ! @$$ print*,'em_p',em_p
224 
225 
226 
227  zx_t = em_t(l)
228  zdelta = max(0., sign(1.,rtt-zx_t))
229  zx_qs = r2es*foeew(zx_t, zdelta)/em_p(l)/100.0
230  zx_qs = min(0.5, zx_qs)
231  ! @$$ print*,'zx_qs',zx_qs
232  zcor = 1./(1.-retv*zx_qs)
233  zx_qs = zx_qs*zcor
234  em_qs(l) = zx_qs
235  ! @$$ print*,'em_qs',em_qs
236 
237  em_work1(l) = work1(i, l)
238  em_work2(l) = work2(i, l)
239  emmke(l) = 0
240  ! emMa(l)=0
241  ! Ma(i,l)=0
242 
243  em_dtvpdt1(l) = 0.
244  em_dtvpdq1(l) = 0.
245  dtvpdt1(i, l) = 0.
246  dtvpdq1(i, l) = 0.
247  END DO
248 
249  em_dplcldt = 0.
250  em_dplcldr = 0.
251  rain(i) = 0.0
252  snow(i) = 0.0
253  kbas(i) = 1
254  ktop(i) = 1
255  ! ajout SB:
256  bas = 1
257  top = 1
258 
259 
260  ! sb3d write(*,1792) (em_work1(m),m=1,klev)
261 1792 FORMAT ('sig avant convect ', /, 10(1x,e13.5))
262 
263  ! sb d write(*,1793) (em_work2(m),m=1,klev)
264 1793 FORMAT ('w avant convect ', /, 10(1x,e13.5))
265 
266  ! @$$ print*,'avant convect'
267  ! cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
268 
269 
270  ! print*,'avant convect i=',i
271  CALL convect3(dtime, epmax, ok_adj_ema, em_t, em_q, em_qs, em_u, em_v, &
272  em_tra, em_p, em_ph, klev, klev+1, klev-1, ntra, dtime, iflag, em_d_t, &
273  em_d_q, em_d_u, em_d_v, em_d_tra, em_precip, em_bas, em_top, em_upwd, &
274  em_dnwd, em_dnwdbis, em_work1, em_work2, emmip, emmke, emma, ment, &
275  qent, tps, tls, sij, em_cape, em_tvp, em_pbase, em_bbase, em_dtvpdt1, &
276  em_dtvpdq1, em_dplcldt, em_dplcldr, & ! sbl
277  em_d_t2, em_d_q2, em_d_u2, em_d_v2, em_wd, em_qcond, em_qcondc) !sbl
278  ! print*,'apres convect '
279 
280  ! cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
281 
282  ! -- sb: Appel schema statistique de nuages couple a la convection
283  ! (Bony et Emanuel 2001):
284 
285  ! -- creer cvthermo.h qui contiendra les cstes thermo de LMDZ:
286 
287  iflagcon = 3
288  ! CALL cv_thermo(iflagcon)
289 
290  ! -- appel schema de nuages:
291 
292  ! CALL CLOUDS_SUB_LS(klev,em_q,em_qs,em_t
293  ! i ,em_p,em_ph,dtime,em_qcondc
294  ! o ,em_cldf,em_cldq,em_pradj,em_ftadj,em_fradj,em_ifc)
295 
296  DO k = 1, klev
297  cldf(i, k) = em_cldf(k) ! cloud fraction (0-1)
298  cldq(i, k) = em_cldq(k) ! in-cloud water content (kg/kg)
299  ftadj(i, k) = em_ftadj(k) ! (dT/dt)_{LS adj} (K/s)
300  fqadj(i, k) = em_fradj(k) ! (dq/dt)_{LS adj} (kg/kg/s)
301  ifc(i, k) = em_ifc(k) ! flag convergence clouds_gno (1 ou 2)
302  END DO
303  pradj(i) = em_pradj ! precip from LS supersat adj (mm/day)
304 
305  ! sb --
306 
307  ! SB:
308  IF (iflag/=1 .AND. iflag/=4) THEN
309  em_cape = 0.
310  DO l = 1, klev
311  em_upwd(l) = 0.
312  em_dnwd(l) = 0.
313  em_dnwdbis(l) = 0.
314  emma(l) = 0.
315  em_tvp(l) = 0.
316  END DO
317  END IF
318  ! fin SB
319 
320  ! If sig has been set to zero, then set Ma to zero
321 
322  sigsum = 0.
323  DO k = 1, klev
324  sigsum = sigsum + em_work1(k)
325  END DO
326  IF (sigsum==0.0) THEN
327  DO k = 1, klev
328  emma(k) = 0.
329  END DO
330  END IF
331 
332  ! sb3d print*,'i, iflag=',i,iflag
333 
334  ! cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
335 
336  ! SORTIE DES ICB ET INB
337  ! en fait inb et icb correspondent au niveau ou se trouve
338  ! le nuage,le numero d'interface
339  ! ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
340 
341  ! modif SB:
342  IF (iflag==1 .OR. iflag==4) THEN
343  top = em_top
344  bas = em_bas
345  kbas(i) = em_bas
346  ktop(i) = em_top
347  END IF
348 
349  pbase(i) = em_pbase
350  bbase(i) = em_bbase
351  rain(i) = em_precip/86400.0
352  snow(i) = 0.0
353  cape(i) = em_cape
354  wd(i) = em_wd
355  rflag(i) = real(iflag)
356  ! SB kbas(i) = em_bas
357  ! SB ktop(i) = em_top
358  dplcldt(i) = em_dplcldt
359  dplcldr(i) = em_dplcldr
360  DO l = 1, klev
361  d_t2(i, l) = dtime*em_d_t2(l)
362  d_q2(i, l) = dtime*em_d_q2(l)
363  d_u2(i, l) = dtime*em_d_u2(l)
364  d_v2(i, l) = dtime*em_d_v2(l)
365 
366  d_t(i, l) = dtime*em_d_t(l)
367  d_q(i, l) = dtime*em_d_q(l)
368  d_u(i, l) = dtime*em_d_u(l)
369  d_v(i, l) = dtime*em_d_v(l)
370  DO itra = 1, ntra
371  d_tra(i, l, itra) = dtime*em_d_tra(l, itra)
372  END DO
373  upwd(i, l) = em_upwd(l)
374  dnwd(i, l) = em_dnwd(l)
375  dnwdbis(i, l) = em_dnwdbis(l)
376  work1(i, l) = em_work1(l)
377  work2(i, l) = em_work2(l)
378  ma(i, l) = emma(l)
379  tvp(i, l) = em_tvp(l)
380  dtvpdt1(i, l) = em_dtvpdt1(l)
381  dtvpdq1(i, l) = em_dtvpdq1(l)
382 
383  IF (iflag_clw==0) THEN
384  qcond_incld(i, l) = em_qcondc(l)
385  ELSE IF (iflag_clw==1) THEN
386  qcond_incld(i, l) = em_qcond(l)
387  END IF
388  END DO
389  END DO
390 
391  ! On calcule une eau liquide diagnostique en fonction de la
392  ! precip.
393  IF (iflag_clw==2) THEN
394  DO l = 1, klev
395  DO i = 1, klon
396  IF (ktop(i)-kbas(i)>0 .AND. l>=kbas(i) .AND. l<=ktop(i)) THEN
397  qcond_incld(i, l) = rain(i)*8.e4 & ! s *(pplay(i,l
398  ! )-paprs(i,ktop(i)+1))
399  /(pplay(i,kbas(i))-pplay(i,ktop(i)))
400  ! s **2
401  ELSE
402  qcond_incld(i, l) = 0.
403  END IF
404  END DO
405  print *, 'l=', l, ', qcond_incld=', qcond_incld(1, l)
406  END DO
407  END IF
408 
409 
410  RETURN
411 END SUBROUTINE conema3
412 
integer, save nbtr
!$Id iflag_clw
Definition: conema3.h:15
!$Id ok_adj_ema
Definition: conema3.h:15
integer, save klon
Definition: dimphy.F90:3
integer, save klev
Definition: dimphy.F90:7
subroutine convect3(dtime, epmax, ok_adj, t1, r1, rs, u, v, tra, p, ph, nd,ndp1, nl, ntra, delt, iflag, ft, fr, fu, fv, ftra, precip, icb, inb,upwd, dnwd, dnwd0, sig, w0, mike, mke, ma, ments, qents, tps, tls, sigij,cape, tvp, pbase, buoybase,
Definition: convect3.F90:9
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL false
Definition: calcul_STDlev.h:26
!$Header!c c INCLUDE fxyprim h c c c Fonctions in line c c REAL fyprim REAL rj c c il faut la calculer avant d appeler ces fonctions c c c Fonctions a changer selon x(x) et y(y) choisis.c-----------------------------------------------------------------c c.....ici
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL ulevSTD CALL &zphi philevSTD CALL &zx_rh rhlevSTD!DO klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon du jour ou toutes les read_climoz CALL true
!$Id sig2feed!common comconema2 iflag_cvl_sigd common comconema1 epmax
Definition: conema3.h:15
Definition: dimphy.F90:1
subroutine conema3(dtime, paprs, pplay, t, q, u, v, tra, ntra, work1, work2, d_t, d_q, d_u, d_v, d_tra, rain, snow, kbas, ktop, upwd, dnwd, dnwdbis, bas, top, ma, cape, tvp, rflag, pbase, bbase, dtvpdt1, dtvpdq1, dplcldt, dplcldr, qcond_incld)
Definition: conema3.F90:8