/[lmdze]/trunk/libf/phylmd/concvl.f90
ViewVC logotype

Contents of /trunk/libf/phylmd/concvl.f90

Parent Directory Parent Directory | Revision Log Revision Log


Revision 62 - (show annotations)
Thu Jul 26 14:37:37 2012 UTC (11 years, 9 months ago) by guez
File size: 5047 byte(s)
Changed handling of compiler in compilation system.

Removed the prefix letters "y", "p", "t" or "z" in some names of variables.

Replaced calls to NetCDF by calls to NetCDF95.

Extracted "ioget_calendar" procedures from "calendar.f90" into a
separate file.

Extracted to a separate file, "mathop2.f90", procedures that were not
part of the generic interface "mathop" in "mathop.f90".

Removed computation of "dq" in "bilan_dyn", which was not used.

In "iniadvtrac", removed schemes 20 Slopes and 30 Prather. Was not
compatible with declarations of array sizes.

In "clcdrag", "ustarhb", "vdif_kcay", "yamada4" and "coefkz", changed
the size of some arrays from "klon" to "knon".

Removed possible call to "conema3" in "physiq".

Removed unused argument "cd" in "yamada".

1 module concvl_m
2
3 IMPLICIT NONE
4
5 contains
6
7 SUBROUTINE concvl(iflag_con, dtime, paprs, pplay, t, q, u, v, tra, &
8 ntra, work1, work2, d_t, d_q, d_u, d_v, d_tra, rain, snow, kbas, &
9 ktop, upwd, dnwd, dnwd0, ma, cape, tvp, iflag, pbase, bbase, &
10 dtvpdt1, dtvpdq1, dplcldt, dplcldr, qcondc, wd, pmflxr, pmflxs, &
11 da, phi, mp)
12
13 ! From phylmd/concvl.F, version 1.3 2005/04/15 12:36:17
14 ! Author: Z. X. Li (LMD/CNRS)
15 ! date: 1993/08/18
16 ! Objet : schéma de convection d'Emanuel (1991), interface
17
18 USE dimens_m, ONLY : nqmx
19 USE dimphy, ONLY : klev, klon
20 USE suphec_m, ONLY : retv, rtt
21 USE yoethf_m, ONLY : r2es
22 USE fcttre, ONLY : foeew
23 use cv_driver_m, only: cv_driver
24
25 INTEGER, PARAMETER:: ntrac = nqmx - 2
26
27 INTEGER, INTENT (IN) :: iflag_con
28 REAL, INTENT (IN) :: dtime ! pas d'integration (s)
29 REAL, INTENT (IN) :: paprs(klon, klev+1)
30 REAL, INTENT (IN) :: pplay(klon, klev)
31 REAL, intent(in):: t(klon, klev)
32 real q(klon, klev), u(klon, klev), v(klon, klev)
33 ! q-------input-R-vapeur d'eau (en kg/kg)
34 REAL, INTENT (IN):: tra(klon, klev, ntrac)
35 INTEGER ntra
36 REAL work1(klon, klev), work2(klon, klev)
37 ! work*: input et output: deux variables de travail,
38 ! on peut les mettre a 0 au debut
39 REAL pmflxr(klon, klev+1), pmflxs(klon, klev+1)
40
41 REAL d_t(klon, klev), d_q(klon, klev), d_u(klon, klev), d_v(klon, &
42 klev)
43 ! d_q-----output-R-increment de la vapeur d'eau
44 REAL d_tra(klon, klev, ntrac)
45 REAL rain(klon), snow(klon)
46 ! rain----output-R-la pluie (mm/s)
47 ! snow----output-R-la neige (mm/s)
48
49 INTEGER kbas(klon), ktop(klon)
50 REAL em_ph(klon, klev+1), em_p(klon, klev)
51
52 REAL, intent(out):: upwd(klon, klev)
53 ! saturated updraft mass flux (kg/m**2/s)
54
55 real, intent(out):: dnwd(klon, klev)
56 ! saturated downdraft mass flux (kg/m**2/s)
57
58 real, intent(out):: dnwd0(klon, klev)
59 ! unsaturated downdraft mass flux (kg/m**2/s)
60
61 REAL ma(klon, klev), cape(klon), tvp(klon, klev)
62 ! Cape----output-R-CAPE (J/kg)
63 ! Tvp-----output-R-Temperature virtuelle d'une parcelle soulevee
64 ! adiabatiquement a partir du niveau 1 (K)
65 REAL da(klon, klev), phi(klon, klev, klev), mp(klon, klev)
66 INTEGER iflag(klon)
67 REAL pbase(klon), bbase(klon)
68 REAL dtvpdt1(klon, klev), dtvpdq1(klon, klev)
69 REAL dplcldt(klon), dplcldr(klon)
70 REAL qcondc(klon, klev)
71 REAL wd(klon)
72
73 REAL zx_t, zdelta, zx_qs, zcor
74
75 INTEGER i, k, itra
76 REAL qs(klon, klev)
77 REAL, save:: cbmf(klon)
78 INTEGER:: ifrst = 0
79
80 !-----------------------------------------------------------------
81
82 snow = 0
83
84 IF (ifrst==0) THEN
85 ifrst = 1
86 DO i = 1, klon
87 cbmf(i) = 0.
88 END DO
89 END IF
90
91 DO k = 1, klev + 1
92 DO i = 1, klon
93 em_ph(i, k) = paprs(i, k)/100.0
94 pmflxs(i, k) = 0.
95 END DO
96 END DO
97
98 DO k = 1, klev
99 DO i = 1, klon
100 em_p(i, k) = pplay(i, k)/100.0
101 END DO
102 END DO
103
104
105 IF (iflag_con==4) THEN
106 DO k = 1, klev
107 DO i = 1, klon
108 zx_t = t(i, k)
109 zdelta = max(0., sign(1., rtt-zx_t))
110 zx_qs = min(0.5, r2es*foeew(zx_t, zdelta)/em_p(i, k)/100.0)
111 zcor = 1./(1.-retv*zx_qs)
112 qs(i, k) = zx_qs*zcor
113 END DO
114 END DO
115 ELSE
116 ! iflag_con=3 (modif de puristes qui fait la diffce pour la
117 ! convergence numerique)
118 DO k = 1, klev
119 DO i = 1, klon
120 zx_t = t(i, k)
121 zdelta = max(0., sign(1., rtt-zx_t))
122 zx_qs = r2es*foeew(zx_t, zdelta)/em_p(i, k)/100.0
123 zx_qs = min(0.5, zx_qs)
124 zcor = 1./(1.-retv*zx_qs)
125 zx_qs = zx_qs*zcor
126 qs(i, k) = zx_qs
127 END DO
128 END DO
129 END IF
130
131 ! Main driver for convection:
132 ! iflag_con = 3 -> equivalent to convect3
133 ! iflag_con = 4 -> equivalent to convect1/2
134
135 CALL cv_driver(klon, klev, klev+1, ntra, iflag_con, t, q, qs, u, v, tra, &
136 em_p, em_ph, iflag, d_t, d_q, d_u, d_v, d_tra, rain, pmflxr, cbmf, &
137 work1, work2, kbas, ktop, dtime, ma, upwd, dnwd, dnwd0, qcondc, &
138 wd, cape, da, phi, mp)
139
140 DO i = 1, klon
141 rain(i) = rain(i)/86400.
142 END DO
143
144 DO k = 1, klev
145 DO i = 1, klon
146 d_t(i, k) = dtime*d_t(i, k)
147 d_q(i, k) = dtime*d_q(i, k)
148 d_u(i, k) = dtime*d_u(i, k)
149 d_v(i, k) = dtime*d_v(i, k)
150 END DO
151 END DO
152 DO itra = 1, ntra
153 DO k = 1, klev
154 DO i = 1, klon
155 d_tra(i, k, itra) = dtime*d_tra(i, k, itra)
156 END DO
157 END DO
158 END DO
159 ! les traceurs ne sont pas mis dans cette version de convect4:
160 IF (iflag_con==4) THEN
161 DO itra = 1, ntra
162 DO k = 1, klev
163 DO i = 1, klon
164 d_tra(i, k, itra) = 0.
165 END DO
166 END DO
167 END DO
168 END IF
169
170 END SUBROUTINE concvl
171
172 end module concvl_m

  ViewVC Help
Powered by ViewVC 1.1.21