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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 250 - (hide annotations)
Fri Jan 5 18:18:53 2018 UTC (6 years, 4 months ago) by guez
File size: 18169 byte(s)
Extract part of clmain into a new procedure coef_diff_turb (following LMDZ).

1 guez 38 module clmain_m
2 guez 3
3 guez 38 IMPLICIT NONE
4 guez 3
5 guez 38 contains
6 guez 3
7 guez 221 SUBROUTINE clmain(dtime, pctsrf, t, q, u, v, julien, mu0, ftsol, cdmmax, &
8 guez 250 cdhmax, ftsoil, qsol, paprs, pplay, fsnow, qsurf, evap, falbe, fluxlat, &
9     rain_fall, snow_f, fsolsw, fsollw, frugs, agesno, rugoro, d_t, d_q, &
10     d_u, d_v, d_ts, flux_t, flux_q, flux_u, flux_v, cdragh, cdragm, q2, &
11     dflux_t, dflux_q, coefh, t2m, q2m, u10m_srf, v10m_srf, pblh, capcl, &
12     oliqcl, cteicl, pblt, therm, trmb1, trmb2, trmb3, plcl, fqcalving, &
13     ffonte, run_off_lic_0)
14 guez 3
15 guez 99 ! From phylmd/clmain.F, version 1.6, 2005/11/16 14:47:19
16 guez 62 ! Author: Z. X. Li (LMD/CNRS), date: 1993/08/18
17     ! Objet : interface de couche limite (diffusion verticale)
18 guez 3
19 guez 62 ! Tout ce qui a trait aux traceurs est dans "phytrac". Le calcul
20     ! de la couche limite pour les traceurs se fait avec "cltrac" et
21 guez 145 ! ne tient pas compte de la diff\'erentiation des sous-fractions
22     ! de sol.
23 guez 3
24 guez 248 use clcdrag_m, only: clcdrag
25 guez 49 use clqh_m, only: clqh
26 guez 62 use clvent_m, only: clvent
27 guez 250 use coef_diff_turb_m, only: coef_diff_turb
28 guez 227 USE conf_gcm_m, ONLY: lmt_pas
29 guez 62 USE conf_phys_m, ONLY: iflag_pbl
30     USE dimphy, ONLY: klev, klon, zmasq
31     USE dimsoil, ONLY: nsoilmx
32 guez 47 use hbtm_m, only: hbtm
33 guez 62 USE indicesol, ONLY: epsfra, is_lic, is_oce, is_sic, is_ter, nbsrf
34 guez 202 USE interfoce_lim_m, ONLY: interfoce_lim
35 guez 104 use stdlevvar_m, only: stdlevvar
36 guez 250 USE suphec_m, ONLY: rd, rg
37 guez 202 use time_phylmdz, only: itap
38 guez 15
39 guez 62 REAL, INTENT(IN):: dtime ! interval du temps (secondes)
40 guez 202
41 guez 62 REAL, INTENT(inout):: pctsrf(klon, nbsrf)
42 guez 202 ! tableau des pourcentages de surface de chaque maille
43 guez 62
44     REAL, INTENT(IN):: t(klon, klev) ! temperature (K)
45 guez 225 REAL, INTENT(IN):: q(klon, klev) ! vapeur d'eau (kg / kg)
46 guez 62 REAL, INTENT(IN):: u(klon, klev), v(klon, klev) ! vitesse
47 guez 221 INTEGER, INTENT(IN):: julien ! jour de l'annee en cours
48 guez 213 REAL, intent(in):: mu0(klon) ! cosinus de l'angle solaire zenithal
49 guez 222 REAL, INTENT(IN):: ftsol(:, :) ! (klon, nbsrf) temp\'erature du sol (en K)
50 guez 71 REAL, INTENT(IN):: cdmmax, cdhmax ! seuils cdrm, cdrh
51 guez 101
52 guez 118 REAL, INTENT(inout):: ftsoil(klon, nsoilmx, nbsrf)
53     ! soil temperature of surface fraction
54    
55 guez 225 REAL, INTENT(inout):: qsol(:) ! (klon)
56 guez 101 ! column-density of water in soil, in kg m-2
57    
58 guez 225 REAL, INTENT(IN):: paprs(klon, klev + 1) ! pression a intercouche (Pa)
59 guez 62 REAL, INTENT(IN):: pplay(klon, klev) ! pression au milieu de couche (Pa)
60 guez 215 REAL, INTENT(inout):: fsnow(:, :) ! (klon, nbsrf) \'epaisseur neigeuse
61 guez 70 REAL qsurf(klon, nbsrf)
62     REAL evap(klon, nbsrf)
63 guez 155 REAL, intent(inout):: falbe(klon, nbsrf)
64 guez 214 REAL, intent(out):: fluxlat(:, :) ! (klon, nbsrf)
65 guez 70
66 guez 101 REAL, intent(in):: rain_fall(klon)
67 guez 225 ! liquid water mass flux (kg / m2 / s), positive down
68 guez 101
69     REAL, intent(in):: snow_f(klon)
70 guez 225 ! solid water mass flux (kg / m2 / s), positive down
71 guez 101
72 guez 222 REAL, INTENT(IN):: fsolsw(klon, nbsrf), fsollw(klon, nbsrf)
73     REAL, intent(inout):: frugs(klon, nbsrf) ! longueur de rugosit\'e (en m)
74 guez 70 real agesno(klon, nbsrf)
75     REAL, INTENT(IN):: rugoro(klon)
76    
77 guez 38 REAL d_t(klon, klev), d_q(klon, klev)
78 guez 49 ! d_t------output-R- le changement pour "t"
79     ! d_q------output-R- le changement pour "q"
80 guez 62
81     REAL, intent(out):: d_u(klon, klev), d_v(klon, klev)
82     ! changement pour "u" et "v"
83    
84 guez 221 REAL, intent(out):: d_ts(:, :) ! (klon, nbsrf) variation of ftsol
85 guez 70
86 guez 206 REAL, intent(out):: flux_t(klon, nbsrf)
87 guez 225 ! flux de chaleur sensible (Cp T) (W / m2) (orientation positive vers
88 guez 206 ! le bas) à la surface
89 guez 70
90 guez 206 REAL, intent(out):: flux_q(klon, nbsrf)
91 guez 225 ! flux de vapeur d'eau (kg / m2 / s) à la surface
92 guez 70
93 guez 206 REAL, intent(out):: flux_u(klon, nbsrf), flux_v(klon, nbsrf)
94 guez 229 ! tension du vent (flux turbulent de vent) à la surface, en Pa
95 guez 206
96 guez 70 REAL, INTENT(out):: cdragh(klon), cdragm(klon)
97 guez 225 real q2(klon, klev + 1, nbsrf)
98 guez 70
99 guez 99 REAL, INTENT(out):: dflux_t(klon), dflux_q(klon)
100 guez 49 ! dflux_t derive du flux sensible
101     ! dflux_q derive du flux latent
102 guez 191 ! IM "slab" ocean
103 guez 70
104 guez 244 REAL, intent(out):: coefh(:, 2:) ! (klon, 2:klev)
105 guez 226 ! Pour pouvoir extraire les coefficients d'\'echange, le champ
106 guez 244 ! "coefh" a \'et\'e cr\'e\'e. Nous avons moyenn\'e les valeurs de
107 guez 226 ! ce champ sur les quatre sous-surfaces du mod\`ele.
108    
109 guez 221 REAL, INTENT(inout):: t2m(klon, nbsrf), q2m(klon, nbsrf)
110 guez 70
111 guez 225 REAL, INTENT(inout):: u10m_srf(:, :), v10m_srf(:, :) ! (klon, nbsrf)
112     ! composantes du vent \`a 10m sans spirale d'Ekman
113    
114     ! Ionela Musat. Cf. Anne Mathieu : planetary boundary layer, hbtm.
115     ! Comme les autres diagnostics on cumule dans physiq ce qui permet
116     ! de sortir les grandeurs par sous-surface.
117 guez 191 REAL pblh(klon, nbsrf) ! height of planetary boundary layer
118 guez 70 REAL capcl(klon, nbsrf)
119     REAL oliqcl(klon, nbsrf)
120     REAL cteicl(klon, nbsrf)
121 guez 221 REAL, INTENT(inout):: pblt(klon, nbsrf) ! T au nveau HCL
122 guez 70 REAL therm(klon, nbsrf)
123     REAL trmb1(klon, nbsrf)
124     ! trmb1-------deep_cape
125     REAL trmb2(klon, nbsrf)
126     ! trmb2--------inhibition
127     REAL trmb3(klon, nbsrf)
128     ! trmb3-------Point Omega
129     REAL plcl(klon, nbsrf)
130     REAL fqcalving(klon, nbsrf), ffonte(klon, nbsrf)
131     ! ffonte----Flux thermique utilise pour fondre la neige
132     ! fqcalving-Flux d'eau "perdue" par la surface et necessaire pour limiter la
133 guez 225 ! hauteur de neige, en kg / m2 / s
134 guez 70 REAL run_off_lic_0(klon)
135    
136     ! Local:
137 guez 15
138 guez 202 LOGICAL:: firstcal = .true.
139    
140     ! la nouvelle repartition des surfaces sortie de l'interface
141     REAL, save:: pctsrf_new_oce(klon)
142     REAL, save:: pctsrf_new_sic(klon)
143    
144 guez 70 REAL y_fqcalving(klon), y_ffonte(klon)
145     real y_run_off_lic_0(klon)
146     REAL rugmer(klon)
147 guez 38 REAL ytsoil(klon, nsoilmx)
148 guez 248 REAL yts(klon), ypct(klon), yz0_new(klon)
149     real yrugos(klon) ! longeur de rugosite (en m)
150 guez 38 REAL yalb(klon)
151 guez 215 REAL snow(klon), yqsurf(klon), yagesno(klon)
152 guez 225 real yqsol(klon) ! column-density of water in soil, in kg m-2
153     REAL yrain_f(klon) ! liquid water mass flux (kg / m2 / s), positive down
154     REAL ysnow_f(klon) ! solid water mass flux (kg / m2 / s), positive down
155 guez 38 REAL yrugm(klon), yrads(klon), yrugoro(klon)
156     REAL yfluxlat(klon)
157     REAL y_d_ts(klon)
158     REAL y_d_t(klon, klev), y_d_q(klon, klev)
159     REAL y_d_u(klon, klev), y_d_v(klon, klev)
160 guez 206 REAL y_flux_t(klon), y_flux_q(klon)
161     REAL y_flux_u(klon), y_flux_v(klon)
162 guez 38 REAL y_dflux_t(klon), y_dflux_q(klon)
163 guez 244 REAL ycoefh(klon, 2:klev), ycoefm(klon, 2:klev)
164 guez 237 real ycdragh(klon), ycdragm(klon)
165 guez 38 REAL yu(klon, klev), yv(klon, klev)
166     REAL yt(klon, klev), yq(klon, klev)
167 guez 225 REAL ypaprs(klon, klev + 1), ypplay(klon, klev), ydelp(klon, klev)
168     REAL yq2(klon, klev + 1)
169 guez 38 REAL delp(klon, klev)
170     INTEGER i, k, nsrf
171     INTEGER ni(klon), knon, j
172 guez 40
173 guez 38 REAL pctsrf_pot(klon, nbsrf)
174 guez 145 ! "pourcentage potentiel" pour tenir compte des \'eventuelles
175 guez 40 ! apparitions ou disparitions de la glace de mer
176 guez 15
177 guez 227 REAL yt2m(klon), yq2m(klon), wind10m(klon)
178     REAL ustar(klon)
179 guez 15
180 guez 38 REAL yt10m(klon), yq10m(klon)
181     REAL ypblh(klon)
182     REAL ylcl(klon)
183     REAL ycapcl(klon)
184     REAL yoliqcl(klon)
185     REAL ycteicl(klon)
186     REAL ypblt(klon)
187     REAL ytherm(klon)
188     REAL ytrmb1(klon)
189     REAL ytrmb2(klon)
190     REAL ytrmb3(klon)
191 guez 227 REAL u1(klon), v1(klon)
192 guez 38 REAL tair1(klon), qair1(klon), tairsol(klon)
193     REAL psfce(klon), patm(klon)
194 guez 15
195 guez 38 REAL qairsol(klon), zgeo1(klon)
196     REAL rugo1(klon)
197 guez 248 REAL zgeop(klon, klev)
198 guez 15
199 guez 38 !------------------------------------------------------------
200 guez 15
201 guez 38 ytherm = 0.
202 guez 15
203 guez 38 DO k = 1, klev ! epaisseur de couche
204     DO i = 1, klon
205 guez 225 delp(i, k) = paprs(i, k) - paprs(i, k + 1)
206 guez 38 END DO
207     END DO
208 guez 15
209 guez 40 ! Initialization:
210     rugmer = 0.
211     cdragh = 0.
212     cdragm = 0.
213     dflux_t = 0.
214     dflux_q = 0.
215     ypct = 0.
216     yqsurf = 0.
217     yrain_f = 0.
218     ysnow_f = 0.
219     yrugos = 0.
220     ypaprs = 0.
221     ypplay = 0.
222     ydelp = 0.
223     yu = 0.
224     yv = 0.
225     yt = 0.
226     yq = 0.
227     y_dflux_t = 0.
228     y_dflux_q = 0.
229 guez 38 yrugoro = 0.
230 guez 40 d_ts = 0.
231 guez 38 flux_t = 0.
232     flux_q = 0.
233     flux_u = 0.
234     flux_v = 0.
235 guez 214 fluxlat = 0.
236 guez 40 d_t = 0.
237     d_q = 0.
238     d_u = 0.
239     d_v = 0.
240 guez 244 coefh = 0.
241 guez 15
242 guez 145 ! Initialisation des "pourcentages potentiels". On consid\`ere ici qu'on
243     ! peut avoir potentiellement de la glace sur tout le domaine oc\'eanique
244     ! (\`a affiner)
245 guez 15
246 guez 202 pctsrf_pot(:, is_ter) = pctsrf(:, is_ter)
247     pctsrf_pot(:, is_lic) = pctsrf(:, is_lic)
248 guez 38 pctsrf_pot(:, is_oce) = 1. - zmasq
249     pctsrf_pot(:, is_sic) = 1. - zmasq
250 guez 15
251 guez 202 ! Tester si c'est le moment de lire le fichier:
252     if (mod(itap - 1, lmt_pas) == 0) then
253 guez 221 CALL interfoce_lim(julien, pctsrf_new_oce, pctsrf_new_sic)
254 guez 202 endif
255    
256 guez 99 ! Boucler sur toutes les sous-fractions du sol:
257    
258 guez 49 loop_surface: DO nsrf = 1, nbsrf
259     ! Chercher les indices :
260 guez 38 ni = 0
261     knon = 0
262     DO i = 1, klon
263 guez 145 ! Pour d\'eterminer le domaine \`a traiter, on utilise les surfaces
264 guez 38 ! "potentielles"
265     IF (pctsrf_pot(i, nsrf) > epsfra) THEN
266     knon = knon + 1
267     ni(knon) = i
268     END IF
269     END DO
270 guez 15
271 guez 62 if_knon: IF (knon /= 0) then
272 guez 38 DO j = 1, knon
273     i = ni(j)
274 guez 62 ypct(j) = pctsrf(i, nsrf)
275 guez 207 yts(j) = ftsol(i, nsrf)
276 guez 215 snow(j) = fsnow(i, nsrf)
277 guez 62 yqsurf(j) = qsurf(i, nsrf)
278 guez 155 yalb(j) = falbe(i, nsrf)
279 guez 62 yrain_f(j) = rain_fall(i)
280     ysnow_f(j) = snow_f(i)
281     yagesno(j) = agesno(i, nsrf)
282 guez 222 yrugos(j) = frugs(i, nsrf)
283 guez 62 yrugoro(j) = rugoro(i)
284 guez 222 yrads(j) = fsolsw(i, nsrf) + fsollw(i, nsrf)
285 guez 225 ypaprs(j, klev + 1) = paprs(i, klev + 1)
286 guez 62 y_run_off_lic_0(j) = run_off_lic_0(i)
287 guez 38 END DO
288 guez 3
289 guez 99 ! For continent, copy soil water content
290 guez 225 IF (nsrf == is_ter) yqsol(:knon) = qsol(ni(:knon))
291 guez 3
292 guez 208 ytsoil(:knon, :) = ftsoil(ni(:knon), :, nsrf)
293 guez 3
294 guez 38 DO k = 1, klev
295     DO j = 1, knon
296     i = ni(j)
297 guez 62 ypaprs(j, k) = paprs(i, k)
298     ypplay(j, k) = pplay(i, k)
299     ydelp(j, k) = delp(i, k)
300     yu(j, k) = u(i, k)
301     yv(j, k) = v(i, k)
302     yt(j, k) = t(i, k)
303     yq(j, k) = q(i, k)
304 guez 38 END DO
305     END DO
306 guez 3
307 guez 248 ! Calculer les géopotentiels de chaque couche:
308 guez 228
309 guez 248 zgeop(:knon, 1) = RD * yt(:knon, 1) / (0.5 * (ypaprs(:knon, 1) &
310     + ypplay(:knon, 1))) * (ypaprs(:knon, 1) - ypplay(:knon, 1))
311    
312     DO k = 2, klev
313     zgeop(:knon, k) = zgeop(:knon, k - 1) + RD * 0.5 &
314     * (yt(:knon, k - 1) + yt(:knon, k)) / ypaprs(:knon, k) &
315     * (ypplay(:knon, k - 1) - ypplay(:knon, k))
316     ENDDO
317    
318     CALL clcdrag(nsrf, yu(:knon, 1), yv(:knon, 1), yt(:knon, 1), &
319     yq(:knon, 1), zgeop(:knon, 1), yts(:knon), yqsurf(:knon), &
320     yrugos(:knon), ycdragm(:knon), ycdragh(:knon))
321    
322 guez 249 IF (iflag_pbl == 1) THEN
323     ycdragm(:knon) = max(ycdragm(:knon), 0.)
324     ycdragh(:knon) = max(ycdragh(:knon), 0.)
325     end IF
326 guez 250
327 guez 249 ! on met un seuil pour ycdragm et ycdragh
328     IF (nsrf == is_oce) THEN
329     ycdragm(:knon) = min(ycdragm(:knon), cdmmax)
330     ycdragh(:knon) = min(ycdragh(:knon), cdhmax)
331     END IF
332    
333 guez 250 IF (iflag_pbl >= 6) then
334 guez 62 DO k = 1, klev + 1
335     DO j = 1, knon
336     i = ni(j)
337     yq2(j, k) = q2(i, k, nsrf)
338     END DO
339     END DO
340 guez 250 end IF
341 guez 62
342 guez 250 call coef_diff_turb(dtime, nsrf, ni(:knon), ypaprs, ypplay, yu, yv, &
343     yq, yt, yts, ycdragm, zgeop(:knon, :), ycoefm(:knon, :), &
344     ycoefh(:knon, :), yq2)
345 guez 3
346 guez 244 CALL clvent(dtime, yu(:knon, 1), yv(:knon, 1), ycoefm(:knon, :), &
347 guez 237 ycdragm(:knon), yt(:knon, :), yu(:knon, :), ypaprs(:knon, :), &
348 guez 229 ypplay(:knon, :), ydelp(:knon, :), y_d_u(:knon, :), &
349 guez 225 y_flux_u(:knon))
350 guez 244 CALL clvent(dtime, yu(:knon, 1), yv(:knon, 1), ycoefm(:knon, :), &
351 guez 237 ycdragm(:knon), yt(:knon, :), yv(:knon, :), ypaprs(:knon, :), &
352 guez 229 ypplay(:knon, :), ydelp(:knon, :), y_d_v(:knon, :), &
353 guez 225 y_flux_v(:knon))
354 guez 3
355 guez 62 ! calculer la diffusion de "q" et de "h"
356 guez 221 CALL clqh(dtime, julien, firstcal, nsrf, ni(:knon), &
357 guez 225 ytsoil(:knon, :), yqsol(:knon), mu0, yrugos, yrugoro, &
358 guez 244 yu(:knon, 1), yv(:knon, 1), ycoefh(:knon, :), ycdragh(:knon), &
359 guez 236 yt, yq, yts(:knon), ypaprs, ypplay, ydelp, yrads(:knon), &
360     yalb(:knon), snow(:knon), yqsurf, yrain_f, ysnow_f, &
361     yfluxlat(:knon), pctsrf_new_sic, yagesno(:knon), y_d_t, y_d_q, &
362     y_d_ts(:knon), yz0_new, y_flux_t(:knon), y_flux_q(:knon), &
363     y_dflux_t(:knon), y_dflux_q(:knon), y_fqcalving, y_ffonte, &
364     y_run_off_lic_0)
365 guez 3
366 guez 62 ! calculer la longueur de rugosite sur ocean
367     yrugm = 0.
368     IF (nsrf == is_oce) THEN
369     DO j = 1, knon
370 guez 237 yrugm(j) = 0.018 * ycdragm(j) * (yu(j, 1)**2 + yv(j, 1)**2) &
371 guez 225 / rg + 0.11 * 14E-6 &
372 guez 237 / sqrt(ycdragm(j) * (yu(j, 1)**2 + yv(j, 1)**2))
373 guez 62 yrugm(j) = max(1.5E-05, yrugm(j))
374     END DO
375     END IF
376 guez 38 DO j = 1, knon
377 guez 225 y_dflux_t(j) = y_dflux_t(j) * ypct(j)
378     y_dflux_q(j) = y_dflux_q(j) * ypct(j)
379 guez 38 END DO
380 guez 3
381 guez 237 DO k = 1, klev
382     DO j = 1, knon
383     i = ni(j)
384 guez 225 y_d_t(j, k) = y_d_t(j, k) * ypct(j)
385     y_d_q(j, k) = y_d_q(j, k) * ypct(j)
386     y_d_u(j, k) = y_d_u(j, k) * ypct(j)
387     y_d_v(j, k) = y_d_v(j, k) * ypct(j)
388 guez 62 END DO
389 guez 38 END DO
390 guez 3
391 guez 214 flux_t(ni(:knon), nsrf) = y_flux_t(:knon)
392     flux_q(ni(:knon), nsrf) = y_flux_q(:knon)
393     flux_u(ni(:knon), nsrf) = y_flux_u(:knon)
394     flux_v(ni(:knon), nsrf) = y_flux_v(:knon)
395 guez 15
396 guez 206 evap(:, nsrf) = -flux_q(:, nsrf)
397    
398 guez 155 falbe(:, nsrf) = 0.
399 guez 215 fsnow(:, nsrf) = 0.
400 guez 62 qsurf(:, nsrf) = 0.
401 guez 222 frugs(:, nsrf) = 0.
402 guez 38 DO j = 1, knon
403     i = ni(j)
404 guez 62 d_ts(i, nsrf) = y_d_ts(j)
405 guez 155 falbe(i, nsrf) = yalb(j)
406 guez 215 fsnow(i, nsrf) = snow(j)
407 guez 62 qsurf(i, nsrf) = yqsurf(j)
408 guez 222 frugs(i, nsrf) = yz0_new(j)
409 guez 62 fluxlat(i, nsrf) = yfluxlat(j)
410     IF (nsrf == is_oce) THEN
411     rugmer(i) = yrugm(j)
412 guez 222 frugs(i, nsrf) = yrugm(j)
413 guez 62 END IF
414     agesno(i, nsrf) = yagesno(j)
415     fqcalving(i, nsrf) = y_fqcalving(j)
416     ffonte(i, nsrf) = y_ffonte(j)
417 guez 243 cdragh(i) = cdragh(i) + ycdragh(j) * ypct(j)
418     cdragm(i) = cdragm(i) + ycdragm(j) * ypct(j)
419 guez 62 dflux_t(i) = dflux_t(i) + y_dflux_t(j)
420     dflux_q(i) = dflux_q(i) + y_dflux_q(j)
421 guez 38 END DO
422 guez 62 IF (nsrf == is_ter) THEN
423 guez 99 qsol(ni(:knon)) = yqsol(:knon)
424     else IF (nsrf == is_lic) THEN
425 guez 62 DO j = 1, knon
426     i = ni(j)
427     run_off_lic_0(i) = y_run_off_lic_0(j)
428     END DO
429     END IF
430 guez 118
431 guez 62 ftsoil(:, :, nsrf) = 0.
432 guez 208 ftsoil(ni(:knon), :, nsrf) = ytsoil(:knon, :)
433 guez 62
434 guez 38 DO j = 1, knon
435     i = ni(j)
436 guez 62 DO k = 1, klev
437     d_t(i, k) = d_t(i, k) + y_d_t(j, k)
438     d_q(i, k) = d_q(i, k) + y_d_q(j, k)
439     d_u(i, k) = d_u(i, k) + y_d_u(j, k)
440     d_v(i, k) = d_v(i, k) + y_d_v(j, k)
441 guez 237 END DO
442     END DO
443 guez 62
444 guez 244 forall (k = 2:klev) coefh(ni(:knon), k) &
445     = coefh(ni(:knon), k) + ycoefh(:knon, k) * ypct(:knon)
446 guez 242
447 guez 99 ! diagnostic t, q a 2m et u, v a 10m
448 guez 62
449 guez 38 DO j = 1, knon
450     i = ni(j)
451 guez 227 u1(j) = yu(j, 1) + y_d_u(j, 1)
452     v1(j) = yv(j, 1) + y_d_v(j, 1)
453 guez 62 tair1(j) = yt(j, 1) + y_d_t(j, 1)
454     qair1(j) = yq(j, 1) + y_d_q(j, 1)
455 guez 225 zgeo1(j) = rd * tair1(j) / (0.5 * (ypaprs(j, 1) + ypplay(j, &
456     1))) * (ypaprs(j, 1)-ypplay(j, 1))
457 guez 62 tairsol(j) = yts(j) + y_d_ts(j)
458     rugo1(j) = yrugos(j)
459     IF (nsrf == is_oce) THEN
460 guez 222 rugo1(j) = frugs(i, nsrf)
461 guez 62 END IF
462     psfce(j) = ypaprs(j, 1)
463     patm(j) = ypplay(j, 1)
464 guez 15
465 guez 62 qairsol(j) = yqsurf(j)
466 guez 38 END DO
467 guez 15
468 guez 227 CALL stdlevvar(klon, knon, nsrf, u1(:knon), v1(:knon), tair1(:knon), &
469     qair1, zgeo1, tairsol, qairsol, rugo1, psfce, patm, yt2m, &
470 guez 246 yq2m, yt10m, yq10m, wind10m(:knon), ustar(:knon))
471 guez 3
472 guez 62 DO j = 1, knon
473     i = ni(j)
474     t2m(i, nsrf) = yt2m(j)
475     q2m(i, nsrf) = yq2m(j)
476 guez 3
477 guez 227 u10m_srf(i, nsrf) = (wind10m(j) * u1(j)) &
478     / sqrt(u1(j)**2 + v1(j)**2)
479     v10m_srf(i, nsrf) = (wind10m(j) * v1(j)) &
480     / sqrt(u1(j)**2 + v1(j)**2)
481 guez 62 END DO
482 guez 15
483 guez 227 CALL hbtm(ypaprs, ypplay, yt2m, yq2m, ustar(:knon), y_flux_t(:knon), &
484 guez 206 y_flux_q(:knon), yu, yv, yt, yq, ypblh(:knon), ycapcl, &
485     yoliqcl, ycteicl, ypblt, ytherm, ytrmb1, ytrmb2, ytrmb3, ylcl)
486 guez 15
487 guez 38 DO j = 1, knon
488     i = ni(j)
489 guez 62 pblh(i, nsrf) = ypblh(j)
490     plcl(i, nsrf) = ylcl(j)
491     capcl(i, nsrf) = ycapcl(j)
492     oliqcl(i, nsrf) = yoliqcl(j)
493     cteicl(i, nsrf) = ycteicl(j)
494     pblt(i, nsrf) = ypblt(j)
495     therm(i, nsrf) = ytherm(j)
496     trmb1(i, nsrf) = ytrmb1(j)
497     trmb2(i, nsrf) = ytrmb2(j)
498     trmb3(i, nsrf) = ytrmb3(j)
499 guez 38 END DO
500 guez 3
501 guez 38 DO j = 1, knon
502 guez 62 DO k = 1, klev + 1
503     i = ni(j)
504     q2(i, k, nsrf) = yq2(j, k)
505     END DO
506 guez 38 END DO
507 guez 215 else
508     fsnow(:, nsrf) = 0.
509 guez 62 end IF if_knon
510 guez 49 END DO loop_surface
511 guez 15
512 guez 38 ! On utilise les nouvelles surfaces
513 guez 222 frugs(:, is_oce) = rugmer
514 guez 202 pctsrf(:, is_oce) = pctsrf_new_oce
515     pctsrf(:, is_sic) = pctsrf_new_sic
516 guez 15
517 guez 202 firstcal = .false.
518    
519 guez 38 END SUBROUTINE clmain
520 guez 15
521 guez 38 end module clmain_m

  ViewVC Help
Powered by ViewVC 1.1.21