/[lmdze]/trunk/phylmd/pbl_surface.f
ViewVC logotype

Annotation of /trunk/phylmd/pbl_surface.f

Parent Directory Parent Directory | Revision Log Revision Log


Revision 248 - (hide annotations)
Fri Jan 5 16:40:13 2018 UTC (6 years, 4 months ago) by guez
Original Path: trunk/Sources/phylmd/clmain.f
File size: 20629 byte(s)
Move the call to clcdrag up from coefkz to clmain (folllowing
LMDZ). As both clcdrag and coefkz need zgeop, also move the
computation of zgeop from coefkz to clmain.

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

  ViewVC Help
Powered by ViewVC 1.1.21