30 REAL,
ALLOCATABLE,
DIMENSION(:),
PRIVATE,
SAVE :: qsol
32 REAL,
ALLOCATABLE,
DIMENSION(:),
PRIVATE,
SAVE :: fder
34 REAL,
ALLOCATABLE,
DIMENSION(:,:),
PRIVATE,
SAVE :: snow
36 REAL,
ALLOCATABLE,
DIMENSION(:,:),
PRIVATE,
SAVE :: qsurf
38 REAL,
ALLOCATABLE,
DIMENSION(:,:),
PRIVATE,
SAVE :: evap
40 REAL,
ALLOCATABLE,
DIMENSION(:,:),
PRIVATE,
SAVE :: rugos
42 REAL,
ALLOCATABLE,
DIMENSION(:,:),
PRIVATE,
SAVE :: agesno
44 REAL,
ALLOCATABLE,
DIMENSION(:,:,:),
PRIVATE,
SAVE :: ftsoil
52 evap_rst, rugos_rst, agesno_rst, ftsoil_rst)
64 REAL,
DIMENSION(klon),
INTENT(IN) :: qsol_rst
65 REAL,
DIMENSION(klon),
INTENT(IN) :: fder_rst
66 REAL,
DIMENSION(klon, nbsrf),
INTENT(IN) :: snow_rst
67 REAL,
DIMENSION(klon, nbsrf),
INTENT(IN) :: qsurf_rst
68 REAL,
DIMENSION(klon, nbsrf),
INTENT(IN) :: evap_rst
69 REAL,
DIMENSION(klon, nbsrf),
INTENT(IN) :: rugos_rst
70 REAL,
DIMENSION(klon, nbsrf),
INTENT(IN) :: agesno_rst
71 REAL,
DIMENSION(klon, nsoilmx, nbsrf),
INTENT(IN) :: ftsoil_rst
77 CHARACTER(len=80) :: abort_message
78 CHARACTER(len = 20) :: modname =
'pbl_surface_init'
85 ALLOCATE(qsol(klon), stat=ierr)
86 IF (ierr /= 0) CALL
abort_gcm(
'pbl_surface_init',
'pb in allocation',1)
88 ALLOCATE(fder(klon), stat=ierr)
89 IF (ierr /= 0) CALL
abort_gcm(
'pbl_surface_init',
'pb in allocation',1)
91 ALLOCATE(snow(klon,nbsrf), stat=ierr)
92 IF (ierr /= 0) CALL
abort_gcm(
'pbl_surface_init',
'pb in allocation',1)
94 ALLOCATE(qsurf(klon,nbsrf), stat=ierr)
95 IF (ierr /= 0) CALL
abort_gcm(
'pbl_surface_init',
'pb in allocation',1)
97 ALLOCATE(evap(klon,nbsrf), stat=ierr)
98 IF (ierr /= 0) CALL
abort_gcm(
'pbl_surface_init',
'pb in allocation',1)
100 ALLOCATE(rugos(klon,nbsrf), stat=ierr)
101 IF (ierr /= 0) CALL
abort_gcm(
'pbl_surface_init',
'pb in allocation',1)
103 ALLOCATE(agesno(klon,nbsrf), stat=ierr)
104 IF (ierr /= 0) CALL
abort_gcm(
'pbl_surface_init',
'pb in allocation',1)
106 ALLOCATE(ftsoil(klon,nsoilmx,nbsrf), stat=ierr)
107 IF (ierr /= 0) CALL
abort_gcm(
'pbl_surface_init',
'pb in allocation',1)
110 qsol(:) = qsol_rst(:)
111 fder(:) = fder_rst(:)
112 snow(:,:) = snow_rst(:,:)
113 qsurf(:,:) = qsurf_rst(:,:)
114 evap(:,:) = evap_rst(:,:)
115 rugos(:,:) = rugos_rst(:,:)
116 agesno(:,:) = agesno_rst(:,:)
117 ftsoil(:,:,:) = ftsoil_rst(:,:,:)
124 IF (is_ter /= 1)
THEN
125 WRITE(
lunout,*)
" *** Warning ***"
126 WRITE(
lunout,*)
" is_ter n'est pas le premier surface, is_ter = ",is_ter
127 WRITE(
lunout,*)
"or on doit commencer par les surfaces continentales"
128 abort_message=
"voir ci-dessus"
132 IF ( is_oce > is_sic )
THEN
133 WRITE(
lunout,*)
' *** Warning ***'
134 WRITE(
lunout,*)
' Pour des raisons de sequencement dans le code'
135 WRITE(
lunout,*)
' l''ocean doit etre traite avant la banquise'
136 WRITE(
lunout,*)
' or is_oce = ',is_oce,
'> is_sic = ',is_sic
137 abort_message=
'voir ci-dessus'
141 IF ( is_lic > is_sic )
THEN
142 WRITE(
lunout,*)
' *** Warning ***'
143 WRITE(
lunout,*)
' Pour des raisons de sequencement dans le code'
144 WRITE(
lunout,*)
' la glace contineltalle doit etre traite avant la glace de mer'
145 WRITE(
lunout,*)
' or is_lic = ',is_lic,
'> is_sic = ',is_sic
146 abort_message=
'voir ci-dessus'
155 IF (type_ocean /=
'slab ' .AND. type_ocean /=
'force ' .AND. type_ocean /=
'couple')
THEN
156 WRITE(
lunout,*)
' *** Warning ***'
157 WRITE(
lunout,*)
'Option couplage pour l''ocean = ', type_ocean
158 abort_message=
'option pour l''ocean non valable'
168 dtime, date0, itap, jour, &
171 rain_f, snow_f, solsw_m, sollw_m, &
173 pplay, paprs, pctsrf, &
174 ts, alb1, alb2,ustar, u10m, v10m, &
175 lwdown_m, cdragh, cdragm, zu1, zv1, &
176 alb1_m, alb2_m, zxsens, zxevap, &
177 zxtsol, zxfluxlat, zt2m, qsat2m, &
178 d_t, d_q, d_u, d_v, d_t_diss, &
179 zcoefh, zcoefm, slab_wfbils, &
180 qsol_d, zq2m, s_pblh, s_plcl, &
181 s_capcl, s_oliqcl, s_cteicl, s_pblt, &
182 s_therm, s_trmb1, s_trmb2, s_trmb3, &
183 zxrugs,zustar,zu10m, zv10m, fder_print, &
184 zxqsurf, rh2m, zxfluxu, zxfluxv, &
185 rugos_d, agesno_d, sollw, solsw, &
186 d_ts, evap_d, fluxlat, t2m, &
187 wfbils, wfbilo, flux_t, flux_u, flux_v,&
188 dflux_t, dflux_q, zxsnow, &
189 zxfluxt, zxfluxq, q2m, flux_q, tke )
251 include
"indicesol.h"
258 include
"dimensions.h"
265 REAL,
INTENT(IN) ::
dtime
266 REAL,
INTENT(IN) :: date0
267 INTEGER,
INTENT(IN) :: itap
268 INTEGER,
INTENT(IN) :: jour
269 LOGICAL,
INTENT(IN) :: debut
270 LOGICAL,
INTENT(IN) :: lafin
271 REAL,
DIMENSION(klon),
INTENT(IN) ::
rlon
272 REAL,
DIMENSION(klon),
INTENT(IN) ::
rlat
273 REAL,
DIMENSION(klon),
INTENT(IN) :: rugoro
274 REAL,
DIMENSION(klon),
INTENT(IN) :: rmu0
275 REAL,
DIMENSION(klon),
INTENT(IN) :: rain_f
276 REAL,
DIMENSION(klon),
INTENT(IN) :: snow_f
277 REAL,
DIMENSION(klon),
INTENT(IN) :: solsw_m
278 REAL,
DIMENSION(klon),
INTENT(IN) :: sollw_m
279 REAL,
DIMENSION(klon,klev),
INTENT(IN) :: t
280 REAL,
DIMENSION(klon,klev),
INTENT(IN) ::
q
281 REAL,
DIMENSION(klon,klev),
INTENT(IN) ::
u
282 REAL,
DIMENSION(klon,klev),
INTENT(IN) ::
v
283 REAL,
DIMENSION(klon,klev),
INTENT(IN) ::
pplay
284 REAL,
DIMENSION(klon,klev+1),
INTENT(IN) :: paprs
285 REAL,
DIMENSION(klon, nbsrf),
INTENT(IN) :: pctsrf
289 REAL,
DIMENSION(klon, nbsrf),
INTENT(INOUT) :: ts
290 REAL,
DIMENSION(klon, nbsrf),
INTENT(INOUT) :: alb1
291 REAL,
DIMENSION(klon, nbsrf),
INTENT(INOUT) :: alb2
292 REAL,
DIMENSION(klon, nbsrf),
INTENT(INOUT) :: ustar
293 REAL,
DIMENSION(klon, nbsrf),
INTENT(INOUT) :: u10m
294 REAL,
DIMENSION(klon, nbsrf),
INTENT(INOUT) :: v10m
295 REAL,
DIMENSION(klon, klev+1, nbsrf+1),
INTENT(INOUT) :: tke
299 REAL,
DIMENSION(klon),
INTENT(OUT) :: lwdown_m
300 REAL,
DIMENSION(klon),
INTENT(OUT) :: cdragh
301 REAL,
DIMENSION(klon),
INTENT(OUT) :: cdragm
302 REAL,
DIMENSION(klon),
INTENT(OUT) :: zu1
303 REAL,
DIMENSION(klon),
INTENT(OUT) :: zv1
304 REAL,
DIMENSION(klon),
INTENT(OUT) :: alb1_m
305 REAL,
DIMENSION(klon),
INTENT(OUT) :: alb2_m
306 REAL,
DIMENSION(klon),
INTENT(OUT) :: zxsens
308 REAL,
DIMENSION(klon),
INTENT(OUT) :: zxevap
309 REAL,
DIMENSION(klon),
INTENT(OUT) :: zxtsol
310 REAL,
DIMENSION(klon),
INTENT(OUT) :: zxfluxlat
311 REAL,
DIMENSION(klon),
INTENT(OUT) :: zt2m
312 REAL,
DIMENSION(klon),
INTENT(OUT) :: qsat2m
313 REAL,
DIMENSION(klon, klev),
INTENT(OUT) :: d_t
314 REAL,
DIMENSION(klon, klev),
INTENT(OUT) :: d_t_diss
315 REAL,
DIMENSION(klon, klev),
INTENT(OUT) :: d_q
316 REAL,
DIMENSION(klon, klev),
INTENT(OUT) :: d_u
317 REAL,
DIMENSION(klon, klev),
INTENT(OUT) :: d_v
318 REAL,
DIMENSION(klon, klev,nbsrf+1),
INTENT(OUT) :: zcoefh
319 REAL,
DIMENSION(klon, klev,nbsrf+1),
INTENT(OUT) :: zcoefm
322 REAL,
DIMENSION(klon),
INTENT(OUT) :: slab_wfbils
323 REAL,
DIMENSION(klon),
INTENT(OUT) :: qsol_d
324 REAL,
DIMENSION(klon),
INTENT(OUT) :: zq2m
325 REAL,
DIMENSION(klon),
INTENT(OUT) :: s_pblh
326 REAL,
DIMENSION(klon),
INTENT(OUT) :: s_plcl
327 REAL,
DIMENSION(klon),
INTENT(OUT) :: s_capcl
328 REAL,
DIMENSION(klon),
INTENT(OUT) :: s_oliqcl
329 REAL,
DIMENSION(klon),
INTENT(OUT) :: s_cteicl
330 REAL,
DIMENSION(klon),
INTENT(OUT) :: s_pblt
331 REAL,
DIMENSION(klon),
INTENT(OUT) :: s_therm
332 REAL,
DIMENSION(klon),
INTENT(OUT) :: s_trmb1
333 REAL,
DIMENSION(klon),
INTENT(OUT) :: s_trmb2
334 REAL,
DIMENSION(klon),
INTENT(OUT) :: s_trmb3
335 REAL,
DIMENSION(klon),
INTENT(OUT) :: zxrugs
336 REAL,
DIMENSION(klon),
INTENT(OUT) :: zustar
337 REAL,
DIMENSION(klon),
INTENT(OUT) :: zu10m
338 REAL,
DIMENSION(klon),
INTENT(OUT) :: zv10m
339 REAL,
DIMENSION(klon),
INTENT(OUT) :: fder_print
340 REAL,
DIMENSION(klon),
INTENT(OUT) :: zxqsurf
341 REAL,
DIMENSION(klon),
INTENT(OUT) :: rh2m
342 REAL,
DIMENSION(klon, klev),
INTENT(OUT) :: zxfluxu
343 REAL,
DIMENSION(klon, klev),
INTENT(OUT) :: zxfluxv
344 REAL,
DIMENSION(klon, nbsrf),
INTENT(OUT) :: rugos_d
345 REAL,
DIMENSION(klon, nbsrf),
INTENT(OUT) :: agesno_d
346 REAL,
DIMENSION(klon, nbsrf),
INTENT(OUT) :: solsw
347 REAL,
DIMENSION(klon, nbsrf),
INTENT(OUT) :: sollw
348 REAL,
DIMENSION(klon, nbsrf),
INTENT(OUT) :: d_ts
349 REAL,
DIMENSION(klon, nbsrf),
INTENT(OUT) :: evap_d
350 REAL,
DIMENSION(klon, nbsrf),
INTENT(OUT) :: fluxlat
351 REAL,
DIMENSION(klon, nbsrf),
INTENT(OUT) :: t2m
352 REAL,
DIMENSION(klon, nbsrf),
INTENT(OUT) :: wfbils
353 REAL,
DIMENSION(klon, nbsrf),
INTENT(OUT) :: wfbilo
354 REAL,
DIMENSION(klon, klev, nbsrf),
INTENT(OUT) :: flux_t
356 REAL,
DIMENSION(klon, klev, nbsrf),
INTENT(OUT) :: flux_u
357 REAL,
DIMENSION(klon, klev, nbsrf),
INTENT(OUT) :: flux_v
360 REAL,
DIMENSION(klon),
INTENT(OUT) :: dflux_t
361 REAL,
DIMENSION(klon),
INTENT(OUT) :: dflux_q
362 REAL,
DIMENSION(klon),
INTENT(OUT) :: zxsnow
363 REAL,
DIMENSION(klon, klev),
INTENT(OUT) :: zxfluxt
364 REAL,
DIMENSION(klon, klev),
INTENT(OUT) :: zxfluxq
365 REAL,
DIMENSION(klon, nbsrf),
INTENT(OUT) :: q2m
366 REAL,
DIMENSION(klon, klev, nbsrf),
INTENT(OUT) :: flux_q
371 INTEGER,
SAVE :: nhoridbg, nidbg
373 LOGICAL,
SAVE :: debugindex=.
false.
375 LOGICAL,
SAVE :: first_call=.true.
377 CHARACTER(len=8),
DIMENSION(nbsrf),
SAVE :: cl_surf
385 INTEGER ,
DIMENSION(klon) :: ni
386 REAL :: zx_alf1, zx_alf2
389 REAL,
DIMENSION(klon) :: r_co2_ppm
390 REAL,
DIMENSION(klon) :: yts, yrugos, ypct, yz0_new
391 REAL,
DIMENSION(klon) :: yalb, yalb1, yalb2
392 REAL,
DIMENSION(klon) :: yu1, yv1,ytoto
393 REAL,
DIMENSION(klon) :: ysnow, yqsurf, yagesno, yqsol
394 REAL,
DIMENSION(klon) :: yrain_f, ysnow_f
395 REAL,
DIMENSION(klon) :: ysolsw, ysollw
396 REAL,
DIMENSION(klon) :: yfder
397 REAL,
DIMENSION(klon) :: yrugoro
398 REAL,
DIMENSION(klon) :: yfluxlat
399 REAL,
DIMENSION(klon) :: y_d_ts
400 REAL,
DIMENSION(klon) :: y_flux_t1, y_flux_q1
401 REAL,
DIMENSION(klon) :: y_dflux_t, y_dflux_q
402 REAL,
DIMENSION(klon) :: y_flux_u1, y_flux_v1
403 REAL,
DIMENSION(klon) :: yt2m, yq2m, yu10m
404 REAL,
DIMENSION(klon) :: yustar
405 REAL,
DIMENSION(klon) :: ywindsp
406 REAL,
DIMENSION(klon) :: yt10m, yq10m
407 REAL,
DIMENSION(klon) :: ypblh
408 REAL,
DIMENSION(klon) :: ylcl
409 REAL,
DIMENSION(klon) :: ycapcl
410 REAL,
DIMENSION(klon) :: yoliqcl
411 REAL,
DIMENSION(klon) :: ycteicl
412 REAL,
DIMENSION(klon) :: ypblt
413 REAL,
DIMENSION(klon) :: ytherm
414 REAL,
DIMENSION(klon) :: ytrmb1
415 REAL,
DIMENSION(klon) :: ytrmb2
416 REAL,
DIMENSION(klon) :: ytrmb3
417 REAL,
DIMENSION(klon) :: uzon, vmer
418 REAL,
DIMENSION(klon) :: tair1, qair1, tairsol
419 REAL,
DIMENSION(klon) :: psfce, patm
420 REAL,
DIMENSION(klon) :: qairsol, zgeo1
421 REAL,
DIMENSION(klon) :: rugo1
422 REAL,
DIMENSION(klon) :: yfluxsens
423 REAL,
DIMENSION(klon) :: acoefh, acoefq, bcoefh, bcoefq
424 REAL,
DIMENSION(klon) :: acoefu, acoefv, bcoefu, bcoefv
425 REAL,
DIMENSION(klon) :: ypsref
426 REAL,
DIMENSION(klon) :: yevap, ytsurf_new, yalb1_new, yalb2_new
427 REAL,
DIMENSION(klon) :: ztsol
428 REAL,
DIMENSION(klon) :: alb_m
429 REAL,
DIMENSION(klon,klev) :: y_d_t, y_d_q, y_d_t_diss
430 REAL,
DIMENSION(klon,klev) :: y_d_u, y_d_v
431 REAL,
DIMENSION(klon,klev) :: y_flux_t, y_flux_q
432 REAL,
DIMENSION(klon,klev) :: y_flux_u, y_flux_v
433 REAL,
DIMENSION(klon,klev) :: ycoefh, ycoefm,ycoefq
434 REAL,
DIMENSION(klon) :: ycdragh, ycdragm
435 REAL,
DIMENSION(klon,klev) :: yu, yv
436 REAL,
DIMENSION(klon,klev) :: yt, yq
437 REAL,
DIMENSION(klon,klev) :: ypplay, ydelp
438 REAL,
DIMENSION(klon,klev) :: delp
439 REAL,
DIMENSION(klon,klev+1) :: ypaprs
440 REAL,
DIMENSION(klon,klev+1) :: ytke
441 REAL,
DIMENSION(klon,nsoilmx) :: ytsoil
442 CHARACTER(len=80) :: abort_message
443 CHARACTER(len=20) :: modname =
'pbl_surface'
444 LOGICAL,
PARAMETER :: zxli=.
false.
445 LOGICAL,
PARAMETER :: check=.
false.
446 REAL,
DIMENSION(klon) :: kech_h
449 INTEGER,
DIMENSION(iim*(jjm+1)) :: ndexbg
451 REAL,
DIMENSION(klon) :: tabindx
453 REAL,
DIMENSION(iim,jjm+1) :: debugtab
456 REAL,
DIMENSION(klon,nbsrf) :: pblh
457 REAL,
DIMENSION(klon,nbsrf) :: plcl
458 REAL,
DIMENSION(klon,nbsrf) :: capcl
459 REAL,
DIMENSION(klon,nbsrf) :: oliqcl
460 REAL,
DIMENSION(klon,nbsrf) :: cteicl
461 REAL,
DIMENSION(klon,nbsrf) :: pblt
462 REAL,
DIMENSION(klon,nbsrf) :: therm
463 REAL,
DIMENSION(klon,nbsrf) :: trmb1
464 REAL,
DIMENSION(klon,nbsrf) :: trmb2
465 REAL,
DIMENSION(klon,nbsrf) :: trmb3
466 REAL,
DIMENSION(klon,nbsrf) :: zx_rh2m, zx_qsat2m
467 REAL,
DIMENSION(klon,nbsrf) :: zx_t1
468 REAL,
DIMENSION(klon, nbsrf) :: alb
469 REAL,
DIMENSION(klon) :: ylwdown
471 REAL :: zx_qs1, zcor1, zdelta1
477 LOGICAL :: ok_flux_surf
478 COMMON /flux_arp/fsens,
flat,ok_flux_surf
493 if (klon>1) ok_flux_surf=.
false.
496 IF (debugindex .AND. mpi_size==1)
THEN
516 jjm+1,nhoridbg, 1, 1, 1, -99, 32,
"inst",
dtime,
dtime)
530 print*,
'WARNING : On impose qsol=',qsol0
540 cdragh = 0.0 ; cdragm = 0.0 ; dflux_t = 0.0 ; dflux_q = 0.0
541 ypct = 0.0 ; yts = 0.0 ; ysnow = 0.0
542 zv1 = 0.0 ; yqsurf = 0.0 ; yalb1 = 0.0 ; yalb2 = 0.0
543 yrain_f = 0.0 ; ysnow_f = 0.0 ; yfder = 0.0 ; ysolsw = 0.0
544 ysollw = 0.0 ; yrugos = 0.0 ; yu1 = 0.0
545 yv1 = 0.0 ; ypaprs = 0.0 ; ypplay = 0.0
546 ydelp = 0.0 ; yu = 0.0 ; yv = 0.0 ; yt = 0.0
547 yq = 0.0 ; y_dflux_t = 0.0 ; y_dflux_q = 0.0
548 yrugoro = 0.0 ; ywindsp = 0.0
549 d_ts = 0.0 ; yfluxlat=0.0 ; flux_t = 0.0 ; flux_q = 0.0
550 flux_u = 0.0 ; flux_v = 0.0 ; d_t = 0.0 ; d_q = 0.0
551 d_t_diss= 0.0 ;d_u = 0.0 ; d_v = 0.0 ; yqsol = 0.0
552 ytherm = 0.0 ; ytke=0.
555 IF (iflag_pbl<20.or.iflag_pbl>=30)
THEN
557 zcoefh(:,1,:) = 999999.
559 zcoefm(:,1,:) = 999999.
561 zcoefm(:,:,is_ave)=0.
562 zcoefh(:,:,is_ave)=0.
576 delp(
i,
k) = paprs(
i,
k)-paprs(
i,
k+1)
626 alb_m(
i) = f1*alb1_m(
i) + (1-f1)*alb2_m(
i)
640 sollw(
i,
nsrf) = sollw_m(
i) + 4.0*rsigma*ztsol(
i)**3 * (ztsol(
i)-ts(
i,
nsrf))
641 solsw(
i,
nsrf) = solsw_m(
i) * (1.-alb(
i,
nsrf)) / (1.-alb_m(
i))
649 lwdown_m(
i) = sollw_m(
i) + rsigma*ztsol(
i)**4
659 loop_nbsrf:
DO nsrf = 1, nbsrf
665 IF (pctsrf(
i,
nsrf) > 0.)
THEN
672 IF (debugindex .AND. mpi_size==1)
THEN
679 CALL
gath2cpl(tabindx,debugtab,knon,ni)
680 CALL histwrite(nidbg,cl_surf(
nsrf),itap,debugtab,
iim*(jjm+1), ndexbg)
697 yrain_f(
j) = rain_f(
i)
698 ysnow_f(
j) = snow_f(
i)
699 yagesno(
j) = agesno(
i,
nsrf)
704 yrugoro(
j) = rugoro(
i)
708 ywindsp(
j) = sqrt(u10m(
i,
nsrf)**2 + v10m(
i,
nsrf)**2 )
714 ypaprs(
j,
k) = paprs(
i,
k)
716 ydelp(
j,
k) = delp(
i,
k)
733 IF (
nsrf .EQ. is_ter .AND. .NOT. ok_veget )
THEN
746 yu(:,1), yv(:,1), yt(:,1), yq(:,1), &
747 yts, yqsurf, yrugos, &
756 ypaprs, ypplay, yu, yv, yq, yt, yts, yrugos, yqsurf, ycdragm, &
757 ycoefm, ycoefh, ytke)
759 IF (iflag_pbl>=20.AND.iflag_pbl<30)
THEN
782 ydelp, yt, yq,
dtime, &
783 acoefh, acoefq, bcoefh, bcoefq)
787 acoefu, acoefv, bcoefu, bcoefv)
796 ypsref(:) = ypaprs(:,1)
800 IF (carbon_cycle_cpl)
THEN
802 r_co2_ppm(
i) = co2_send(ni(
i))
814 IF (
nsrf == is_ter)
THEN
817 zgeo1(
i) = rd * yt(
i,1) / (0.5*(ypaprs(
i,1)+ypplay(
i,1))) &
818 * (ypaprs(
i,1)-ypplay(
i,1))
822 CALL
stdlevvar(klon, knon, is_ter, zxli, &
823 yu(:,1), yv(:,1), yt(:,1), yq(:,1), zgeo1, &
824 yts, yqsurf, yrugos, ypaprs(:,1), ypplay(:,1), &
825 yt2m, yq2m, yt10m, yq10m, yu10m, yustar)
842 ylwdown(
i)=lwdown_m(ni(
i))
846 debut, lafin, ydelp(:,1), r_co2_ppm, ysolsw, ysollw, yalb, &
847 yts, ypplay(:,1), ycdragh, ycdragm, yrain_f, ysnow_f, yt(:,1), yq(:,1),&
848 acoefh, acoefq, bcoefh, bcoefq, &
849 acoefu, acoefv, bcoefu, bcoefv, &
850 ypsref, yu1, yv1, yrugoro, pctsrf, &
851 ylwdown, yq2m, yt2m, &
852 ysnow, yqsol, yagesno, ytsoil, &
853 yz0_new, yalb1_new, yalb2_new, yevap, yfluxsens, yfluxlat, &
854 yqsurf, ytsurf_new, y_dflux_t, y_dflux_q, &
855 y_flux_u1, y_flux_v1 )
860 ysolsw, ysollw, yts, ypplay(:,1), &
861 ycdragh, ycdragm, yrain_f, ysnow_f, yt(:,1), yq(:,1),&
862 acoefh, acoefq, bcoefh, bcoefq, &
863 acoefu, acoefv, bcoefu, bcoefv, &
864 ypsref, yu1, yv1, yrugoro, pctsrf, &
865 ysnow, yqsurf, yqsol, yagesno, &
866 ytsoil, yz0_new, yalb1_new, yalb2_new, yevap, yfluxsens, yfluxlat, &
867 ytsurf_new, y_dflux_t, y_dflux_q, &
868 y_flux_u1, y_flux_v1)
872 yrugos, ywindsp, rmu0, yfder, yts, &
873 itap,
dtime, jour, knon, ni, &
874 ypplay(:,1), ycdragh, ycdragm, yrain_f, ysnow_f, yt(:,1), yq(:,1),&
875 acoefh, acoefq, bcoefh, bcoefq, &
876 acoefu, acoefv, bcoefu, bcoefv, &
877 ypsref, yu1, yv1, yrugoro, pctsrf, &
878 ysnow, yqsurf, yagesno, &
879 yz0_new, yalb1_new, yalb2_new, yevap, yfluxsens, yfluxlat, &
880 ytsurf_new, y_dflux_t, y_dflux_q, slab_wfbils, &
881 y_flux_u1, y_flux_v1)
885 rlon,
rlat, ysolsw, ysollw, yalb1, yfder, &
886 itap,
dtime, jour, knon, ni, &
888 yts, ypplay(:,1), ycdragh, ycdragm, yrain_f, ysnow_f, yt(:,1), yq(:,1),&
889 acoefh, acoefq, bcoefh, bcoefq, &
890 acoefu, acoefv, bcoefu, bcoefv, &
891 ypsref, yu1, yv1, yrugoro, pctsrf, &
892 ysnow, yqsurf, yqsol, yagesno, ytsoil, &
893 yz0_new, yalb1_new, yalb2_new, yevap, yfluxsens, yfluxlat, &
894 ytsurf_new, y_dflux_t, y_dflux_q, &
895 y_flux_u1, y_flux_v1)
900 abort_message =
'Surface index not valid'
909 y_d_ts(1:knon) = ytsurf_new(1:knon) - yts(1:knon)
920 IF (ok_flux_surf)
THEN
921 print *,
'pbl_surface: fsens flat RLVTT=',fsens,
flat,rlvtt
923 y_flux_q1(:) =
flat/rlvtt
926 kech_h(:) = ycdragh(:) * (1.0+sqrt(yu(:,1)**2+yv(:,1)**2)) * &
927 ypplay(:,1)/(rd*yt(:,1))
928 ytoto(:)=(1./rcpd)*(acoefh(:)+bcoefh(:)*y_flux_t1(:)*
dtime)
929 ytsurf_new(:)=ytoto(:)-y_flux_t1(:)/(kech_h(:)*rcpd)
930 y_d_ts(:) = ytsurf_new(:) - yts(:)
933 y_flux_t1(:) = yfluxsens(:)
934 y_flux_q1(:) = -yevap(:)
938 y_flux_q1, y_flux_t1, ypaprs, ypplay, &
939 y_flux_q(:,:), y_flux_t(:,:), y_d_q(:,:), y_d_t(:,:))
943 y_flux_u, y_flux_v, y_d_u, y_d_v)
947 IF (iflag_pbl>=20 .and. iflag_pbl<30)
THEN
949 & ,yu,yv,yt,y_d_u,y_d_v,y_d_t,ycdragm,ytke,ycoefm,ycoefh,ycoefq,y_d_t_diss,yustar &
955 y_dflux_t(
j) = y_dflux_t(
j) * ypct(
j)
956 y_dflux_q(
j) = y_dflux_q(
j) * ypct(
j)
970 y_d_t_diss(
j,
k) = y_d_t_diss(
j,
k) * ypct(
j)
971 y_d_t(
j,
k) = y_d_t(
j,
k) * ypct(
j)
972 y_d_q(
j,
k) = y_d_q(
j,
k) * ypct(
j)
973 y_d_u(
j,
k) = y_d_u(
j,
k) * ypct(
j)
974 y_d_v(
j,
k) = y_d_v(
j,
k) * ypct(
j)
998 alb1(
i,
nsrf) = yalb1_new(
j)
999 alb2(
i,
nsrf) = yalb2_new(
j)
1001 qsurf(
i,
nsrf) = yqsurf(
j)
1002 rugos(
i,
nsrf) = yz0_new(
j)
1003 fluxlat(
i,
nsrf) = yfluxlat(
j)
1004 agesno(
i,
nsrf) = yagesno(
j)
1005 cdragh(
i) = cdragh(
i) + ycdragh(
j)*ypct(
j)
1006 cdragm(
i) = cdragm(
i) + ycdragm(
j)*ypct(
j)
1007 dflux_t(
i) = dflux_t(
i) + y_dflux_t(
j)
1008 dflux_q(
i) = dflux_q(
i) + y_dflux_q(
j)
1019 tke(
i,
k,is_ave) = tke(
i,
k,is_ave) + ytke(
j,
k)*ypct(
j)
1020 zcoefh(
i,
k,is_ave) = zcoefh(
i,
k,is_ave) + ycoefh(
j,
k)*ypct(
j)
1021 zcoefm(
i,
k,is_ave) = zcoefm(
i,
k,is_ave) + ycoefm(
j,
k)*ypct(
j)
1027 IF (
nsrf .EQ. is_ter )
THEN
1034 ftsoil(:,:,
nsrf) = 0.
1046 d_t_diss(
i,
k) = d_t_diss(
i,
k) + y_d_t_diss(
j,
k)
1047 d_t(
i,
k) = d_t(
i,
k) + y_d_t(
j,
k)
1048 d_q(
i,
k) = d_q(
i,
k) + y_d_q(
j,
k)
1049 d_u(
i,
k) = d_u(
i,
k) + y_d_u(
j,
k)
1050 d_v(
i,
k) = d_v(
i,
k) + y_d_v(
j,
k)
1087 uzon(
j) = yu(
j,1) + y_d_u(
j,1)
1088 vmer(
j) = yv(
j,1) + y_d_v(
j,1)
1089 tair1(
j) = yt(
j,1) + y_d_t(
j,1) + y_d_t_diss(
j,1)
1090 qair1(
j) = yq(
j,1) + y_d_q(
j,1)
1091 zgeo1(
j) = rd * tair1(
j) / (0.5*(ypaprs(
j,1)+ypplay(
j,1))) &
1092 * (ypaprs(
j,1)-ypplay(
j,1))
1093 tairsol(
j) = yts(
j) + y_d_ts(
j)
1094 rugo1(
j) = yrugos(
j)
1095 IF(
nsrf.EQ.is_oce)
THEN
1098 psfce(
j)=ypaprs(
j,1)
1100 qairsol(
j) = yqsurf(
j)
1109 uzon, vmer, tair1, qair1, zgeo1, &
1110 tairsol, qairsol, rugo1, psfce, patm, &
1111 yt2m, yq2m, yt10m, yq10m, yu10m, yustar)
1121 u10m(
i,
nsrf)=(yu10m(
j) * uzon(
j))/sqrt(uzon(
j)**2+vmer(
j)**2)
1122 v10m(
i,
nsrf)=(yu10m(
j) * vmer(
j))/sqrt(uzon(
j)**2+vmer(
j)**2)
1132 zdelta1 = max(0.,sign(1., rtt-yt2m(
j) ))
1133 zx_qs1 = r2es * foeew(yt2m(
j),zdelta1)/paprs(
i,1)
1134 zx_qs1 = min(0.5,zx_qs1)
1135 zcor1 = 1./(1.-retv*zx_qs1)
1136 zx_qs1 = zx_qs1*zcor1
1138 rh2m(
i) = rh2m(
i) + yq2m(
j)/zx_qs1 * pctsrf(
i,
nsrf)
1139 qsat2m(
i) = qsat2m(
i) + zx_qs1 * pctsrf(
i,
nsrf)
1144 CALL
hbtm(knon, ypaprs, ypplay, &
1145 yt2m,yt10m,yq2m,yq10m,yustar, &
1146 y_flux_t,y_flux_q,yu,yv,yt,yq, &
1147 ypblh,ycapcl,yoliqcl,ycteicl,ypblt, &
1148 ytherm,ytrmb1,ytrmb2,ytrmb3,ylcl)
1154 capcl(
i,
nsrf) = ycapcl(
j)
1155 oliqcl(
i,
nsrf) = yoliqcl(
j)
1156 cteicl(
i,
nsrf) = ycteicl(
j)
1158 therm(
i,
nsrf) = ytherm(
j)
1159 trmb1(
i,
nsrf) = ytrmb1(
j)
1160 trmb2(
i,
nsrf) = ytrmb2(
j)
1161 trmb3(
i,
nsrf) = ytrmb3(
j)
1168 print*,
' Warning !!! No T2m calculation. Output is set to zero.'
1183 zxfluxt(:,:) = 0.0 ; zxfluxq(:,:) = 0.0
1184 zxfluxu(:,:) = 0.0 ; zxfluxv(:,:) = 0.0
1198 zxsens(
i) = - zxfluxt(
i,1)
1199 zxevap(
i) = - zxfluxq(
i,1)
1200 fder_print(
i) = fder(
i) + dflux_t(
i) + dflux_q(
i)
1206 zxtsol(:) = 0.0 ; zxfluxlat(:) = 0.0
1207 zt2m(:) = 0.0 ; zq2m(:) = 0.0
1208 zustar(:)=0.0 ; zu10m(:) = 0.0 ; zv10m(:) = 0.0
1209 s_pblh(:) = 0.0 ; s_plcl(:) = 0.0
1210 s_capcl(:) = 0.0 ; s_oliqcl(:) = 0.0
1211 s_cteicl(:) = 0.0; s_pblt(:) = 0.0
1212 s_therm(:) = 0.0 ; s_trmb1(:) = 0.0
1213 s_trmb2(:) = 0.0 ; s_trmb3(:) = 0.0
1223 wfbilo(
i,
nsrf) = (evap(
i,
nsrf) - (rain_f(
i) + snow_f(
i))) * &
1227 zxfluxlat(
i) = zxfluxlat(
i) + fluxlat(
i,
nsrf) * pctsrf(
i,
nsrf)
1237 s_capcl(
i) = s_capcl(
i) + capcl(
i,
nsrf) * pctsrf(
i,
nsrf)
1238 s_oliqcl(
i) = s_oliqcl(
i) + oliqcl(
i,
nsrf)* pctsrf(
i,
nsrf)
1239 s_cteicl(
i) = s_cteicl(
i) + cteicl(
i,
nsrf)* pctsrf(
i,
nsrf)
1241 s_therm(
i) = s_therm(
i) + therm(
i,
nsrf) * pctsrf(
i,
nsrf)
1242 s_trmb1(
i) = s_trmb1(
i) + trmb1(
i,
nsrf) * pctsrf(
i,
nsrf)
1243 s_trmb2(
i) = s_trmb2(
i) + trmb2(
i,
nsrf) * pctsrf(
i,
nsrf)
1244 s_trmb3(
i) = s_trmb3(
i) + trmb3(
i,
nsrf) * pctsrf(
i,
nsrf)
1250 amn=min(ts(1,is_ter),1000.)
1251 amx=max(ts(1,is_ter),-1000.)
1253 amn=min(ts(
i,is_ter),amn)
1254 amx=max(ts(
i,is_ter),amx)
1256 print*,
' debut apres d_ts min max ftsol(ts)',itap,amn,amx
1290 fder(
i) = - 4.0*rsigma*zxtsol(
i)**3
1297 zxqsurf(
i) = zxqsurf(
i) + qsurf(
i,
nsrf) * pctsrf(
i,
nsrf)
1308 evap_d(:,:) = evap(:,:)
1309 rugos_d(:,:) = rugos(:,:)
1310 agesno_d(:,:) = agesno(:,:)
1318 evap_rst, rugos_rst, agesno_rst, ftsoil_rst)
1320 include
"indicesol.h"
1325 REAL,
DIMENSION(klon),
INTENT(OUT) :: qsol_rst
1326 REAL,
DIMENSION(klon),
INTENT(OUT) :: fder_rst
1327 REAL,
DIMENSION(klon, nbsrf),
INTENT(OUT) :: snow_rst
1328 REAL,
DIMENSION(klon, nbsrf),
INTENT(OUT) :: qsurf_rst
1329 REAL,
DIMENSION(klon, nbsrf),
INTENT(OUT) :: evap_rst
1330 REAL,
DIMENSION(klon, nbsrf),
INTENT(OUT) :: rugos_rst
1331 REAL,
DIMENSION(klon, nbsrf),
INTENT(OUT) :: agesno_rst
1332 REAL,
DIMENSION(klon, nsoilmx, nbsrf),
INTENT(OUT) :: ftsoil_rst
1339 qsol_rst(:) = qsol(:)
1340 fder_rst(:) = fder(:)
1341 snow_rst(:,:) = snow(:,:)
1342 qsurf_rst(:,:) = qsurf(:,:)
1343 evap_rst(:,:) = evap(:,:)
1344 rugos_rst(:,:) = rugos(:,:)
1345 agesno_rst(:,:) = agesno(:,:)
1346 ftsoil_rst(:,:,:) = ftsoil(:,:,:)
1353 IF (
ALLOCATED(qsol))
DEALLOCATE(qsol)
1354 IF (
ALLOCATED(fder))
DEALLOCATE(fder)
1355 IF (
ALLOCATED(snow))
DEALLOCATE(snow)
1356 IF (
ALLOCATED(qsurf))
DEALLOCATE(qsurf)
1357 IF (
ALLOCATED(evap))
DEALLOCATE(evap)
1358 IF (
ALLOCATED(rugos))
DEALLOCATE(rugos)
1359 IF (
ALLOCATED(agesno))
DEALLOCATE(agesno)
1360 IF (
ALLOCATED(ftsoil))
DEALLOCATE(ftsoil)
1370 include
"indicesol.h"
1372 include
"clesphys.h"
1377 INTEGER,
INTENT(IN) ::
itime
1378 REAL,
DIMENSION(klon,nbsrf),
INTENT(IN) :: pctsrf_new, pctsrf_old
1382 REAL,
DIMENSION(klon,nbsrf),
INTENT(INOUT) ::
tsurf
1383 REAL,
DIMENSION(klon,nbsrf),
INTENT(INOUT) :: alb1, alb2
1384 REAL,
DIMENSION(klon,nbsrf),
INTENT(INOUT) :: ustar,u10m, v10m
1385 REAL,
DIMENSION(klon,klev+1,nbsrf),
INTENT(INOUT) :: tke
1389 INTEGER ::
nsrf, nsrf_comp1, nsrf_comp2, nsrf_comp3,
i
1390 CHARACTER(len=80) :: abort_message
1391 CHARACTER(len=20) :: modname =
'pbl_surface_newfrac'
1392 INTEGER,
DIMENSION(nbsrf) :: nfois=0, mfois=0, pfois=0
1420 IF (pctsrf_new(
i,
nsrf) > 0. .AND. pctsrf_old(
i,
nsrf) == 0.)
THEN
1422 IF (pctsrf_old(
i,nsrf_comp1) > 0.)
THEN
1424 qsurf(
i,
nsrf) = qsurf(
i,nsrf_comp1)
1425 evap(
i,
nsrf) = evap(
i,nsrf_comp1)
1426 rugos(
i,
nsrf) = rugos(
i,nsrf_comp1)
1428 alb1(
i,
nsrf) = alb1(
i,nsrf_comp1)
1429 alb2(
i,
nsrf) = alb2(
i,nsrf_comp1)
1430 ustar(
i,
nsrf) = ustar(
i,nsrf_comp1)
1431 u10m(
i,
nsrf) = u10m(
i,nsrf_comp1)
1432 v10m(
i,
nsrf) = v10m(
i,nsrf_comp1)
1433 if (iflag_pbl > 1)
then
1434 tke(
i,:,
nsrf) = tke(
i,:,nsrf_comp1)
1439 qsurf(
i,
nsrf) = qsurf(
i,nsrf_comp2)*pctsrf_old(
i,nsrf_comp2) + qsurf(
i,nsrf_comp3)*pctsrf_old(
i,nsrf_comp3)
1440 evap(
i,
nsrf) = evap(
i,nsrf_comp2) *pctsrf_old(
i,nsrf_comp2) + evap(
i,nsrf_comp3) *pctsrf_old(
i,nsrf_comp3)
1441 rugos(
i,
nsrf) = rugos(
i,nsrf_comp2)*pctsrf_old(
i,nsrf_comp2) + rugos(
i,nsrf_comp3)*pctsrf_old(
i,nsrf_comp3)
1443 alb1(
i,
nsrf) = alb1(
i,nsrf_comp2) *pctsrf_old(
i,nsrf_comp2) + alb1(
i,nsrf_comp3) *pctsrf_old(
i,nsrf_comp3)
1444 alb2(
i,
nsrf) = alb2(
i,nsrf_comp2) *pctsrf_old(
i,nsrf_comp2) + alb2(
i,nsrf_comp3) *pctsrf_old(
i,nsrf_comp3)
1445 ustar(
i,
nsrf) = ustar(
i,nsrf_comp2) *pctsrf_old(
i,nsrf_comp2) + ustar(
i,nsrf_comp3) *pctsrf_old(
i,nsrf_comp3)
1446 u10m(
i,
nsrf) = u10m(
i,nsrf_comp2) *pctsrf_old(
i,nsrf_comp2) + u10m(
i,nsrf_comp3) *pctsrf_old(
i,nsrf_comp3)
1447 v10m(
i,
nsrf) = v10m(
i,nsrf_comp2) *pctsrf_old(
i,nsrf_comp2) + v10m(
i,nsrf_comp3) *pctsrf_old(
i,nsrf_comp3)
1448 if (iflag_pbl > 1)
then
1449 tke(
i,:,
nsrf) = tke(
i,:,nsrf_comp2)*pctsrf_old(
i,nsrf_comp2) + tke(
i,:,nsrf_comp3)*pctsrf_old(
i,nsrf_comp3)