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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 221 - (hide annotations)
Thu Apr 20 14:44:47 2017 UTC (7 years ago) by guez
File size: 20804 byte(s)
clcdrag is no longer used in LMDZ. Replaced by cdrag in LMDZ. In cdrag
in LMDZ, zxli is a symbolic constant, false. So removed case zxli true
in LMDZE.

read_sst is called zero (if no ocean point on the whole planet) time or
once per call of physiq. If mod(itap - 1, lmt_pas) == 0 then we have
advanced in time of lmt_pas and deja_lu is necessarily false.

qsat[sl] and dqsat[sl] were never called.

Added output of qsurf in histins, following LMDZ.

Last dummy argument dtime of phystokenc is always the same as first
dummy argument pdtphys, removed dtime.

Removed make rules for nag_xref95, since it does not exist any longer.

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 215 cdhmax, ksta, ksta_ter, ok_kzmin, ftsoil, qsol, paprs, pplay, fsnow, &
9 guez 202 qsurf, evap, falbe, fluxlat, rain_fall, snow_f, solsw, sollw, fder, &
10 guez 209 rugos, agesno, rugoro, d_t, d_q, d_u, d_v, d_ts, flux_t, flux_q, &
11 guez 202 flux_u, flux_v, cdragh, cdragm, q2, dflux_t, dflux_q, ycoefh, zu1, &
12     zv1, t2m, q2m, u10m, v10m, pblh, capcl, oliqcl, cteicl, pblt, therm, &
13     trmb1, trmb2, trmb3, plcl, fqcalving, 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 145 ! Pour pouvoir extraire les coefficients d'\'echanges et le vent
25     ! dans la premi\`ere couche, trois champs ont \'et\'e cr\'e\'es : "ycoefh",
26     ! "zu1" et "zv1". Nous avons moyenn\'e les valeurs de ces trois
27     ! champs sur les quatre sous-surfaces du mod\`ele.
28 guez 3
29 guez 49 use clqh_m, only: clqh
30 guez 62 use clvent_m, only: clvent
31 guez 47 use coefkz_m, only: coefkz
32     use coefkzmin_m, only: coefkzmin
33 guez 202 USE conf_gcm_m, ONLY: prt_level, lmt_pas
34 guez 62 USE conf_phys_m, ONLY: iflag_pbl
35     USE dimphy, ONLY: klev, klon, zmasq
36     USE dimsoil, ONLY: nsoilmx
37 guez 47 use hbtm_m, only: hbtm
38 guez 62 USE indicesol, ONLY: epsfra, is_lic, is_oce, is_sic, is_ter, nbsrf
39 guez 202 USE interfoce_lim_m, ONLY: interfoce_lim
40 guez 104 use stdlevvar_m, only: stdlevvar
41 guez 62 USE suphec_m, ONLY: rd, rg, rkappa
42 guez 202 use time_phylmdz, only: itap
43 guez 62 use ustarhb_m, only: ustarhb
44     use vdif_kcay_m, only: vdif_kcay
45 guez 47 use yamada4_m, only: yamada4
46 guez 15
47 guez 62 REAL, INTENT(IN):: dtime ! interval du temps (secondes)
48 guez 202
49 guez 62 REAL, INTENT(inout):: pctsrf(klon, nbsrf)
50 guez 202 ! tableau des pourcentages de surface de chaque maille
51 guez 62
52     REAL, INTENT(IN):: t(klon, klev) ! temperature (K)
53     REAL, INTENT(IN):: q(klon, klev) ! vapeur d'eau (kg/kg)
54     REAL, INTENT(IN):: u(klon, klev), v(klon, klev) ! vitesse
55 guez 221 INTEGER, INTENT(IN):: julien ! jour de l'annee en cours
56 guez 213 REAL, intent(in):: mu0(klon) ! cosinus de l'angle solaire zenithal
57 guez 208 REAL, INTENT(IN):: ftsol(klon, nbsrf) ! temp\'erature du sol (en K)
58 guez 71 REAL, INTENT(IN):: cdmmax, cdhmax ! seuils cdrm, cdrh
59 guez 99 REAL, INTENT(IN):: ksta, ksta_ter
60     LOGICAL, INTENT(IN):: ok_kzmin
61 guez 101
62 guez 118 REAL, INTENT(inout):: ftsoil(klon, nsoilmx, nbsrf)
63     ! soil temperature of surface fraction
64    
65 guez 99 REAL, INTENT(inout):: qsol(klon)
66 guez 101 ! column-density of water in soil, in kg m-2
67    
68 guez 62 REAL, INTENT(IN):: paprs(klon, klev+1) ! pression a intercouche (Pa)
69     REAL, INTENT(IN):: pplay(klon, klev) ! pression au milieu de couche (Pa)
70 guez 215 REAL, INTENT(inout):: fsnow(:, :) ! (klon, nbsrf) \'epaisseur neigeuse
71 guez 70 REAL qsurf(klon, nbsrf)
72     REAL evap(klon, nbsrf)
73 guez 155 REAL, intent(inout):: falbe(klon, nbsrf)
74 guez 214 REAL, intent(out):: fluxlat(:, :) ! (klon, nbsrf)
75 guez 70
76 guez 101 REAL, intent(in):: rain_fall(klon)
77     ! liquid water mass flux (kg/m2/s), positive down
78    
79     REAL, intent(in):: snow_f(klon)
80     ! solid water mass flux (kg/m2/s), positive down
81    
82 guez 72 REAL, INTENT(IN):: solsw(klon, nbsrf), sollw(klon, nbsrf)
83 guez 154 REAL, intent(in):: fder(klon)
84 guez 191 REAL, intent(inout):: rugos(klon, nbsrf) ! longueur de rugosit\'e (en m)
85 guez 70 real agesno(klon, nbsrf)
86     REAL, INTENT(IN):: rugoro(klon)
87    
88 guez 38 REAL d_t(klon, klev), d_q(klon, klev)
89 guez 49 ! d_t------output-R- le changement pour "t"
90     ! d_q------output-R- le changement pour "q"
91 guez 62
92     REAL, intent(out):: d_u(klon, klev), d_v(klon, klev)
93     ! changement pour "u" et "v"
94    
95 guez 221 REAL, intent(out):: d_ts(:, :) ! (klon, nbsrf) variation of ftsol
96 guez 70
97 guez 206 REAL, intent(out):: flux_t(klon, nbsrf)
98     ! flux de chaleur sensible (Cp T) (W/m2) (orientation positive vers
99     ! le bas) à la surface
100 guez 70
101 guez 206 REAL, intent(out):: flux_q(klon, nbsrf)
102     ! flux de vapeur d'eau (kg/m2/s) à la surface
103 guez 70
104 guez 206 REAL, intent(out):: flux_u(klon, nbsrf), flux_v(klon, nbsrf)
105     ! tension du vent à la surface, en Pa
106    
107 guez 70 REAL, INTENT(out):: cdragh(klon), cdragm(klon)
108     real q2(klon, klev+1, nbsrf)
109    
110 guez 99 REAL, INTENT(out):: dflux_t(klon), dflux_q(klon)
111 guez 49 ! dflux_t derive du flux sensible
112     ! dflux_q derive du flux latent
113 guez 191 ! IM "slab" ocean
114 guez 70
115     REAL, intent(out):: ycoefh(klon, klev)
116     REAL, intent(out):: zu1(klon)
117     REAL zv1(klon)
118 guez 221 REAL, INTENT(inout):: t2m(klon, nbsrf), q2m(klon, nbsrf)
119 guez 70 REAL u10m(klon, nbsrf), v10m(klon, nbsrf)
120    
121 guez 191 ! Ionela Musat cf. Anne Mathieu : planetary boundary layer, hbtm
122     ! (Comme les autres diagnostics on cumule dans physiq ce qui
123     ! permet de sortir les grandeurs par sous-surface)
124     REAL pblh(klon, nbsrf) ! height of planetary boundary layer
125 guez 70 REAL capcl(klon, nbsrf)
126     REAL oliqcl(klon, nbsrf)
127     REAL cteicl(klon, nbsrf)
128 guez 221 REAL, INTENT(inout):: pblt(klon, nbsrf) ! T au nveau HCL
129 guez 70 REAL therm(klon, nbsrf)
130     REAL trmb1(klon, nbsrf)
131     ! trmb1-------deep_cape
132     REAL trmb2(klon, nbsrf)
133     ! trmb2--------inhibition
134     REAL trmb3(klon, nbsrf)
135     ! trmb3-------Point Omega
136     REAL plcl(klon, nbsrf)
137     REAL fqcalving(klon, nbsrf), ffonte(klon, nbsrf)
138     ! ffonte----Flux thermique utilise pour fondre la neige
139     ! fqcalving-Flux d'eau "perdue" par la surface et necessaire pour limiter la
140     ! hauteur de neige, en kg/m2/s
141     REAL run_off_lic_0(klon)
142    
143     ! Local:
144 guez 15
145 guez 202 LOGICAL:: firstcal = .true.
146    
147     ! la nouvelle repartition des surfaces sortie de l'interface
148     REAL, save:: pctsrf_new_oce(klon)
149     REAL, save:: pctsrf_new_sic(klon)
150    
151 guez 70 REAL y_fqcalving(klon), y_ffonte(klon)
152     real y_run_off_lic_0(klon)
153     REAL rugmer(klon)
154 guez 38 REAL ytsoil(klon, nsoilmx)
155     REAL yts(klon), yrugos(klon), ypct(klon), yz0_new(klon)
156     REAL yalb(klon)
157 guez 215
158 guez 38 REAL yu1(klon), yv1(klon)
159 guez 215 ! On ajoute en output yu1 et yv1 qui sont les vents dans
160     ! la premi\`ere couche.
161    
162     REAL snow(klon), yqsurf(klon), yagesno(klon)
163 guez 101
164     real yqsol(klon)
165     ! column-density of water in soil, in kg m-2
166    
167     REAL yrain_f(klon)
168     ! liquid water mass flux (kg/m2/s), positive down
169    
170     REAL ysnow_f(klon)
171     ! solid water mass flux (kg/m2/s), positive down
172    
173 guez 99 REAL yfder(klon)
174 guez 38 REAL yrugm(klon), yrads(klon), yrugoro(klon)
175     REAL yfluxlat(klon)
176     REAL y_d_ts(klon)
177     REAL y_d_t(klon, klev), y_d_q(klon, klev)
178     REAL y_d_u(klon, klev), y_d_v(klon, klev)
179 guez 206 REAL y_flux_t(klon), y_flux_q(klon)
180     REAL y_flux_u(klon), y_flux_v(klon)
181 guez 38 REAL y_dflux_t(klon), y_dflux_q(klon)
182 guez 62 REAL coefh(klon, klev), coefm(klon, klev)
183 guez 38 REAL yu(klon, klev), yv(klon, klev)
184     REAL yt(klon, klev), yq(klon, klev)
185     REAL ypaprs(klon, klev+1), ypplay(klon, klev), ydelp(klon, klev)
186 guez 15
187 guez 38 REAL ycoefm0(klon, klev), ycoefh0(klon, klev)
188 guez 15
189 guez 38 REAL yzlay(klon, klev), yzlev(klon, klev+1), yteta(klon, klev)
190     REAL ykmm(klon, klev+1), ykmn(klon, klev+1)
191     REAL ykmq(klon, klev+1)
192 guez 70 REAL yq2(klon, klev+1)
193 guez 38 REAL q2diag(klon, klev+1)
194 guez 15
195 guez 38 REAL u1lay(klon), v1lay(klon)
196     REAL delp(klon, klev)
197     INTEGER i, k, nsrf
198 guez 15
199 guez 38 INTEGER ni(klon), knon, j
200 guez 40
201 guez 38 REAL pctsrf_pot(klon, nbsrf)
202 guez 145 ! "pourcentage potentiel" pour tenir compte des \'eventuelles
203 guez 40 ! apparitions ou disparitions de la glace de mer
204 guez 15
205 guez 191 REAL zx_alf1, zx_alf2 ! valeur ambiante par extrapolation
206 guez 15
207 guez 38 REAL yt2m(klon), yq2m(klon), yu10m(klon)
208     REAL yustar(klon)
209 guez 15
210 guez 38 REAL yt10m(klon), yq10m(klon)
211     REAL ypblh(klon)
212     REAL ylcl(klon)
213     REAL ycapcl(klon)
214     REAL yoliqcl(klon)
215     REAL ycteicl(klon)
216     REAL ypblt(klon)
217     REAL ytherm(klon)
218     REAL ytrmb1(klon)
219     REAL ytrmb2(klon)
220     REAL ytrmb3(klon)
221     REAL uzon(klon), vmer(klon)
222     REAL tair1(klon), qair1(klon), tairsol(klon)
223     REAL psfce(klon), patm(klon)
224 guez 15
225 guez 38 REAL qairsol(klon), zgeo1(klon)
226     REAL rugo1(klon)
227 guez 15
228 guez 38 ! utiliser un jeu de fonctions simples
229     LOGICAL zxli
230     PARAMETER (zxli=.FALSE.)
231 guez 15
232 guez 38 !------------------------------------------------------------
233 guez 15
234 guez 38 ytherm = 0.
235 guez 15
236 guez 38 DO k = 1, klev ! epaisseur de couche
237     DO i = 1, klon
238     delp(i, k) = paprs(i, k) - paprs(i, k+1)
239     END DO
240     END DO
241     DO i = 1, klon ! vent de la premiere couche
242     zx_alf1 = 1.0
243     zx_alf2 = 1.0 - zx_alf1
244     u1lay(i) = u(i, 1)*zx_alf1 + u(i, 2)*zx_alf2
245     v1lay(i) = v(i, 1)*zx_alf1 + v(i, 2)*zx_alf2
246     END DO
247 guez 15
248 guez 40 ! Initialization:
249     rugmer = 0.
250     cdragh = 0.
251     cdragm = 0.
252     dflux_t = 0.
253     dflux_q = 0.
254     zu1 = 0.
255     zv1 = 0.
256     ypct = 0.
257     yqsurf = 0.
258     yrain_f = 0.
259     ysnow_f = 0.
260     yfder = 0.
261     yrugos = 0.
262     yu1 = 0.
263     yv1 = 0.
264     yrads = 0.
265     ypaprs = 0.
266     ypplay = 0.
267     ydelp = 0.
268     yu = 0.
269     yv = 0.
270     yt = 0.
271     yq = 0.
272     y_dflux_t = 0.
273     y_dflux_q = 0.
274 guez 38 yrugoro = 0.
275 guez 40 d_ts = 0.
276 guez 38 flux_t = 0.
277     flux_q = 0.
278     flux_u = 0.
279     flux_v = 0.
280 guez 214 fluxlat = 0.
281 guez 40 d_t = 0.
282     d_q = 0.
283     d_u = 0.
284     d_v = 0.
285 guez 70 ycoefh = 0.
286 guez 15
287 guez 145 ! Initialisation des "pourcentages potentiels". On consid\`ere ici qu'on
288     ! peut avoir potentiellement de la glace sur tout le domaine oc\'eanique
289     ! (\`a affiner)
290 guez 15
291 guez 202 pctsrf_pot(:, is_ter) = pctsrf(:, is_ter)
292     pctsrf_pot(:, is_lic) = pctsrf(:, is_lic)
293 guez 38 pctsrf_pot(:, is_oce) = 1. - zmasq
294     pctsrf_pot(:, is_sic) = 1. - zmasq
295 guez 15
296 guez 202 ! Tester si c'est le moment de lire le fichier:
297     if (mod(itap - 1, lmt_pas) == 0) then
298 guez 221 CALL interfoce_lim(julien, pctsrf_new_oce, pctsrf_new_sic)
299 guez 202 endif
300    
301 guez 99 ! Boucler sur toutes les sous-fractions du sol:
302    
303 guez 49 loop_surface: DO nsrf = 1, nbsrf
304     ! Chercher les indices :
305 guez 38 ni = 0
306     knon = 0
307     DO i = 1, klon
308 guez 145 ! Pour d\'eterminer le domaine \`a traiter, on utilise les surfaces
309 guez 38 ! "potentielles"
310     IF (pctsrf_pot(i, nsrf) > epsfra) THEN
311     knon = knon + 1
312     ni(knon) = i
313     END IF
314     END DO
315 guez 15
316 guez 62 if_knon: IF (knon /= 0) then
317 guez 38 DO j = 1, knon
318     i = ni(j)
319 guez 62 ypct(j) = pctsrf(i, nsrf)
320 guez 207 yts(j) = ftsol(i, nsrf)
321 guez 215 snow(j) = fsnow(i, nsrf)
322 guez 62 yqsurf(j) = qsurf(i, nsrf)
323 guez 155 yalb(j) = falbe(i, nsrf)
324 guez 62 yrain_f(j) = rain_fall(i)
325     ysnow_f(j) = snow_f(i)
326     yagesno(j) = agesno(i, nsrf)
327     yfder(j) = fder(i)
328     yrugos(j) = rugos(i, nsrf)
329     yrugoro(j) = rugoro(i)
330     yu1(j) = u1lay(i)
331     yv1(j) = v1lay(i)
332 guez 175 yrads(j) = solsw(i, nsrf) + sollw(i, nsrf)
333 guez 62 ypaprs(j, klev+1) = paprs(i, klev+1)
334     y_run_off_lic_0(j) = run_off_lic_0(i)
335 guez 38 END DO
336 guez 3
337 guez 99 ! For continent, copy soil water content
338     IF (nsrf == is_ter) THEN
339     yqsol(:knon) = qsol(ni(:knon))
340 guez 62 ELSE
341     yqsol = 0.
342     END IF
343 guez 3
344 guez 208 ytsoil(:knon, :) = ftsoil(ni(:knon), :, nsrf)
345 guez 3
346 guez 38 DO k = 1, klev
347     DO j = 1, knon
348     i = ni(j)
349 guez 62 ypaprs(j, k) = paprs(i, k)
350     ypplay(j, k) = pplay(i, k)
351     ydelp(j, k) = delp(i, k)
352     yu(j, k) = u(i, k)
353     yv(j, k) = v(i, k)
354     yt(j, k) = t(i, k)
355     yq(j, k) = q(i, k)
356 guez 38 END DO
357     END DO
358 guez 3
359 guez 62 ! calculer Cdrag et les coefficients d'echange
360 guez 221 CALL coefkz(nsrf, ypaprs, ypplay, ksta, ksta_ter, yts(:knon), &
361     yrugos, yu, yv, yt, yq, yqsurf(:knon), coefm(:knon, :), &
362     coefh(:knon, :))
363 guez 62 IF (iflag_pbl == 1) THEN
364     CALL coefkz2(nsrf, knon, ypaprs, ypplay, yt, ycoefm0, ycoefh0)
365     coefm(:knon, :) = max(coefm(:knon, :), ycoefm0(:knon, :))
366     coefh(:knon, :) = max(coefh(:knon, :), ycoefh0(:knon, :))
367     END IF
368 guez 3
369 guez 70 ! on met un seuil pour coefm et coefh
370 guez 62 IF (nsrf == is_oce) THEN
371     coefm(:knon, 1) = min(coefm(:knon, 1), cdmmax)
372     coefh(:knon, 1) = min(coefh(:knon, 1), cdhmax)
373 guez 38 END IF
374 guez 3
375 guez 62 IF (ok_kzmin) THEN
376     ! Calcul d'une diffusion minimale pour les conditions tres stables
377     CALL coefkzmin(knon, ypaprs, ypplay, yu, yv, yt, yq, &
378 guez 70 coefm(:knon, 1), ycoefm0, ycoefh0)
379 guez 62 coefm(:knon, :) = max(coefm(:knon, :), ycoefm0(:knon, :))
380     coefh(:knon, :) = max(coefh(:knon, :), ycoefh0(:knon, :))
381 guez 98 END IF
382 guez 3
383 guez 62 IF (iflag_pbl >= 3) THEN
384 guez 145 ! Mellor et Yamada adapt\'e \`a Mars, Richard Fournier et
385     ! Fr\'ed\'eric Hourdin
386 guez 62 yzlay(:knon, 1) = rd * yt(:knon, 1) / (0.5 * (ypaprs(:knon, 1) &
387     + ypplay(:knon, 1))) &
388     * (ypaprs(:knon, 1) - ypplay(:knon, 1)) / rg
389     DO k = 2, klev
390     yzlay(1:knon, k) = yzlay(1:knon, k-1) &
391     + rd * 0.5 * (yt(1:knon, k-1) + yt(1:knon, k)) &
392     / ypaprs(1:knon, k) &
393     * (ypplay(1:knon, k-1) - ypplay(1:knon, k)) / rg
394     END DO
395     DO k = 1, klev
396     yteta(1:knon, k) = yt(1:knon, k)*(ypaprs(1:knon, 1) &
397     / ypplay(1:knon, k))**rkappa * (1.+0.61*yq(1:knon, k))
398     END DO
399     yzlev(1:knon, 1) = 0.
400     yzlev(:knon, klev+1) = 2. * yzlay(:knon, klev) &
401     - yzlay(:knon, klev - 1)
402     DO k = 2, klev
403     yzlev(1:knon, k) = 0.5*(yzlay(1:knon, k)+yzlay(1:knon, k-1))
404     END DO
405     DO k = 1, klev + 1
406     DO j = 1, knon
407     i = ni(j)
408     yq2(j, k) = q2(i, k, nsrf)
409     END DO
410     END DO
411    
412     CALL ustarhb(knon, yu, yv, coefm(:knon, 1), yustar)
413 guez 99 IF (prt_level > 9) PRINT *, 'USTAR = ', yustar
414 guez 62
415 guez 145 ! iflag_pbl peut \^etre utilis\'e comme longueur de m\'elange
416 guez 62
417     IF (iflag_pbl >= 11) THEN
418 guez 145 CALL vdif_kcay(knon, dtime, rg, ypaprs, yzlev, yzlay, yu, yv, &
419     yteta, coefm(:knon, 1), yq2, q2diag, ykmm, ykmn, yustar, &
420     iflag_pbl)
421 guez 62 ELSE
422     CALL yamada4(knon, dtime, rg, yzlev, yzlay, yu, yv, yteta, &
423     coefm(:knon, 1), yq2, ykmm, ykmn, ykmq, yustar, iflag_pbl)
424     END IF
425    
426     coefm(:knon, 2:) = ykmm(:knon, 2:klev)
427     coefh(:knon, 2:) = ykmn(:knon, 2:klev)
428 guez 38 END IF
429 guez 3
430 guez 62 ! calculer la diffusion des vitesses "u" et "v"
431 guez 70 CALL clvent(knon, dtime, yu1, yv1, coefm(:knon, :), yt, yu, ypaprs, &
432 guez 206 ypplay, ydelp, y_d_u, y_flux_u(:knon))
433 guez 70 CALL clvent(knon, dtime, yu1, yv1, coefm(:knon, :), yt, yv, ypaprs, &
434 guez 206 ypplay, ydelp, y_d_v, y_flux_v(:knon))
435 guez 3
436 guez 62 ! calculer la diffusion de "q" et de "h"
437 guez 221 CALL clqh(dtime, julien, firstcal, nsrf, ni(:knon), &
438     ytsoil(:knon, :), yqsol, mu0, yrugos, yrugoro, yu1, yv1, &
439     coefh(:knon, :), yt, yq, yts(:knon), ypaprs, ypplay, ydelp, &
440     yrads, yalb(:knon), snow(:knon), yqsurf, yrain_f, ysnow_f, &
441     yfder, yfluxlat(:knon), pctsrf_new_sic, yagesno(:knon), y_d_t, &
442     y_d_q, y_d_ts(:knon), yz0_new, y_flux_t(:knon), &
443     y_flux_q(:knon), y_dflux_t, y_dflux_q, y_fqcalving, y_ffonte, &
444     y_run_off_lic_0)
445 guez 3
446 guez 62 ! calculer la longueur de rugosite sur ocean
447     yrugm = 0.
448     IF (nsrf == is_oce) THEN
449     DO j = 1, knon
450     yrugm(j) = 0.018*coefm(j, 1)*(yu1(j)**2+yv1(j)**2)/rg + &
451     0.11*14E-6/sqrt(coefm(j, 1)*(yu1(j)**2+yv1(j)**2))
452     yrugm(j) = max(1.5E-05, yrugm(j))
453     END DO
454     END IF
455 guez 38 DO j = 1, knon
456 guez 62 y_dflux_t(j) = y_dflux_t(j)*ypct(j)
457     y_dflux_q(j) = y_dflux_q(j)*ypct(j)
458     yu1(j) = yu1(j)*ypct(j)
459     yv1(j) = yv1(j)*ypct(j)
460 guez 38 END DO
461 guez 3
462 guez 62 DO k = 1, klev
463     DO j = 1, knon
464     i = ni(j)
465     coefh(j, k) = coefh(j, k)*ypct(j)
466     coefm(j, k) = coefm(j, k)*ypct(j)
467     y_d_t(j, k) = y_d_t(j, k)*ypct(j)
468     y_d_q(j, k) = y_d_q(j, k)*ypct(j)
469     y_d_u(j, k) = y_d_u(j, k)*ypct(j)
470     y_d_v(j, k) = y_d_v(j, k)*ypct(j)
471     END DO
472 guez 38 END DO
473 guez 3
474 guez 214 flux_t(ni(:knon), nsrf) = y_flux_t(:knon)
475     flux_q(ni(:knon), nsrf) = y_flux_q(:knon)
476     flux_u(ni(:knon), nsrf) = y_flux_u(:knon)
477     flux_v(ni(:knon), nsrf) = y_flux_v(:knon)
478 guez 15
479 guez 206 evap(:, nsrf) = -flux_q(:, nsrf)
480    
481 guez 155 falbe(:, nsrf) = 0.
482 guez 215 fsnow(:, nsrf) = 0.
483 guez 62 qsurf(:, nsrf) = 0.
484     rugos(:, nsrf) = 0.
485 guez 38 DO j = 1, knon
486     i = ni(j)
487 guez 62 d_ts(i, nsrf) = y_d_ts(j)
488 guez 155 falbe(i, nsrf) = yalb(j)
489 guez 215 fsnow(i, nsrf) = snow(j)
490 guez 62 qsurf(i, nsrf) = yqsurf(j)
491     rugos(i, nsrf) = yz0_new(j)
492     fluxlat(i, nsrf) = yfluxlat(j)
493     IF (nsrf == is_oce) THEN
494     rugmer(i) = yrugm(j)
495     rugos(i, nsrf) = yrugm(j)
496     END IF
497     agesno(i, nsrf) = yagesno(j)
498     fqcalving(i, nsrf) = y_fqcalving(j)
499     ffonte(i, nsrf) = y_ffonte(j)
500     cdragh(i) = cdragh(i) + coefh(j, 1)
501     cdragm(i) = cdragm(i) + coefm(j, 1)
502     dflux_t(i) = dflux_t(i) + y_dflux_t(j)
503     dflux_q(i) = dflux_q(i) + y_dflux_q(j)
504     zu1(i) = zu1(i) + yu1(j)
505     zv1(i) = zv1(i) + yv1(j)
506 guez 38 END DO
507 guez 62 IF (nsrf == is_ter) THEN
508 guez 99 qsol(ni(:knon)) = yqsol(:knon)
509     else IF (nsrf == is_lic) THEN
510 guez 62 DO j = 1, knon
511     i = ni(j)
512     run_off_lic_0(i) = y_run_off_lic_0(j)
513     END DO
514     END IF
515 guez 118
516 guez 62 ftsoil(:, :, nsrf) = 0.
517 guez 208 ftsoil(ni(:knon), :, nsrf) = ytsoil(:knon, :)
518 guez 62
519 guez 38 DO j = 1, knon
520     i = ni(j)
521 guez 62 DO k = 1, klev
522     d_t(i, k) = d_t(i, k) + y_d_t(j, k)
523     d_q(i, k) = d_q(i, k) + y_d_q(j, k)
524     d_u(i, k) = d_u(i, k) + y_d_u(j, k)
525     d_v(i, k) = d_v(i, k) + y_d_v(j, k)
526 guez 70 ycoefh(i, k) = ycoefh(i, k) + coefh(j, k)
527 guez 62 END DO
528 guez 38 END DO
529 guez 62
530 guez 99 ! diagnostic t, q a 2m et u, v a 10m
531 guez 62
532 guez 38 DO j = 1, knon
533     i = ni(j)
534 guez 62 uzon(j) = yu(j, 1) + y_d_u(j, 1)
535     vmer(j) = yv(j, 1) + y_d_v(j, 1)
536     tair1(j) = yt(j, 1) + y_d_t(j, 1)
537     qair1(j) = yq(j, 1) + y_d_q(j, 1)
538     zgeo1(j) = rd*tair1(j)/(0.5*(ypaprs(j, 1)+ypplay(j, &
539     1)))*(ypaprs(j, 1)-ypplay(j, 1))
540     tairsol(j) = yts(j) + y_d_ts(j)
541     rugo1(j) = yrugos(j)
542     IF (nsrf == is_oce) THEN
543     rugo1(j) = rugos(i, nsrf)
544     END IF
545     psfce(j) = ypaprs(j, 1)
546     patm(j) = ypplay(j, 1)
547 guez 15
548 guez 62 qairsol(j) = yqsurf(j)
549 guez 38 END DO
550 guez 15
551 guez 62 CALL stdlevvar(klon, knon, nsrf, zxli, uzon, vmer, tair1, qair1, &
552     zgeo1, tairsol, qairsol, rugo1, psfce, patm, yt2m, yq2m, &
553     yt10m, yq10m, yu10m, yustar)
554 guez 3
555 guez 62 DO j = 1, knon
556     i = ni(j)
557     t2m(i, nsrf) = yt2m(j)
558     q2m(i, nsrf) = yq2m(j)
559 guez 3
560 guez 62 ! u10m, v10m : composantes du vent a 10m sans spirale de Ekman
561     u10m(i, nsrf) = (yu10m(j)*uzon(j))/sqrt(uzon(j)**2+vmer(j)**2)
562     v10m(i, nsrf) = (yu10m(j)*vmer(j))/sqrt(uzon(j)**2+vmer(j)**2)
563     END DO
564 guez 15
565 guez 206 CALL hbtm(ypaprs, ypplay, yt2m, yq2m, yustar, y_flux_t(:knon), &
566     y_flux_q(:knon), yu, yv, yt, yq, ypblh(:knon), ycapcl, &
567     yoliqcl, ycteicl, ypblt, ytherm, ytrmb1, ytrmb2, ytrmb3, ylcl)
568 guez 15
569 guez 38 DO j = 1, knon
570     i = ni(j)
571 guez 62 pblh(i, nsrf) = ypblh(j)
572     plcl(i, nsrf) = ylcl(j)
573     capcl(i, nsrf) = ycapcl(j)
574     oliqcl(i, nsrf) = yoliqcl(j)
575     cteicl(i, nsrf) = ycteicl(j)
576     pblt(i, nsrf) = ypblt(j)
577     therm(i, nsrf) = ytherm(j)
578     trmb1(i, nsrf) = ytrmb1(j)
579     trmb2(i, nsrf) = ytrmb2(j)
580     trmb3(i, nsrf) = ytrmb3(j)
581 guez 38 END DO
582 guez 3
583 guez 38 DO j = 1, knon
584 guez 62 DO k = 1, klev + 1
585     i = ni(j)
586     q2(i, k, nsrf) = yq2(j, k)
587     END DO
588 guez 38 END DO
589 guez 215 else
590     fsnow(:, nsrf) = 0.
591 guez 62 end IF if_knon
592 guez 49 END DO loop_surface
593 guez 15
594 guez 38 ! On utilise les nouvelles surfaces
595     rugos(:, is_oce) = rugmer
596 guez 202 pctsrf(:, is_oce) = pctsrf_new_oce
597     pctsrf(:, is_sic) = pctsrf_new_sic
598 guez 15
599 guez 202 firstcal = .false.
600    
601 guez 38 END SUBROUTINE clmain
602 guez 15
603 guez 38 end module clmain_m

  ViewVC Help
Powered by ViewVC 1.1.21