11 REAL,
DIMENSION(:,:),
ALLOCATABLE,
SAVE :: masktr
13 REAL,
DIMENSION(:,:),
ALLOCATABLE,
SAVE :: fshtr
15 REAL,
DIMENSION(:),
ALLOCATABLE,
SAVE :: hsoltr
21 REAL,
DIMENSION(:),
ALLOCATABLE,
SAVE :: tautr
23 REAL,
DIMENSION(:),
ALLOCATABLE,
SAVE :: vdeptr
25 REAL,
DIMENSION(:),
ALLOCATABLE,
SAVE :: scavtr
27 REAL,
DIMENSION(:,:),
ALLOCATABLE,
SAVE :: srcbe
30 LOGICAL,
DIMENSION(:),
ALLOCATABLE,
SAVE :: radio
33 REAL,
DIMENSION(:,:),
ALLOCATABLE,
SAVE :: trs
36 INTEGER,
SAVE :: id_aga
38 INTEGER,
SAVE :: lev_1p5km
41 INTEGER,
SAVE :: id_rn, id_pb
47 INTEGER,
SAVE :: id_pcsat, id_pcocsat, id_pcq
49 INTEGER,
SAVE :: id_pcs0, id_pcos0, id_pcq0
58 LOGICAL,
SAVE :: rnpb=.FALSE.
72 REAL,
DIMENSION(klon,nbtr),
INTENT(IN) :: trs_in
78 ALLOCATE( trs(klon,nbtr), stat=ierr)
79 IF (ierr /= 0) CALL
abort_gcm(
'traclmdz_from_restart',
'pb in allocation 1',1)
82 trs(:,:) = trs_in(:,:)
87 SUBROUTINE traclmdz_init(pctsrf, xlat, xlon, ftsol, tr_seri, t_seri, pplay, sh, pdtphys, aerosol, lessivage)
94 USE carbon_cycle_mod, ONLY : carbon_cycle_init, carbon_cycle_tr, carbon_cycle_cpl
101 REAL,
DIMENSION(klon,nbsrf),
INTENT(IN) :: pctsrf
102 REAL,
DIMENSION(klon),
INTENT(IN) ::
xlat
103 REAL,
DIMENSION(klon),
INTENT(IN) ::
xlon
104 REAL,
DIMENSION(klon,nbsrf),
INTENT(IN) :: ftsol
105 REAL,
DIMENSION(klon,klev,nbtr),
INTENT(INOUT) :: tr_seri
106 REAL,
DIMENSION(klon,klev),
INTENT(IN) :: t_seri
107 REAL,
DIMENSION(klon,klev),
INTENT(IN) ::
pplay
108 REAL,
DIMENSION(klon,klev),
INTENT(IN) :: sh
112 LOGICAL,
DIMENSION(nbtr),
INTENT(OUT) :: aerosol
113 LOGICAL,
INTENT(OUT) :: lessivage
116 INTEGER :: ierr,
it, iiq,
i,
k
117 REAL,
DIMENSION(klon_glo,klev) :: varglo
118 REAL,
DIMENSION(klev) :: mintmp, maxtmp
124 real beryllium(klon,
klev)
129 real plomb(klon,
klev)
134 ALLOCATE( scavtr(nbtr), stat=ierr)
135 IF (ierr /= 0) CALL
abort_gcm(
'traclmdz_init',
'pb in allocation 9',1)
138 ALLOCATE( radio(nbtr), stat=ierr)
139 IF (ierr /= 0) CALL
abort_gcm(
'traclmdz_init',
'pb in allocation 11',1)
142 ALLOCATE( masktr(klon,nbtr), stat=ierr)
143 IF (ierr /= 0) CALL
abort_gcm(
'traclmdz_init',
'pb in allocation 2',1)
145 ALLOCATE( fshtr(klon,nbtr), stat=ierr)
146 IF (ierr /= 0) CALL
abort_gcm(
'traclmdz_init',
'pb in allocation 3',1)
148 ALLOCATE( hsoltr(nbtr), stat=ierr)
149 IF (ierr /= 0) CALL
abort_gcm(
'traclmdz_init',
'pb in allocation 4',1)
151 ALLOCATE( tautr(nbtr), stat=ierr)
152 IF (ierr /= 0) CALL
abort_gcm(
'traclmdz_init',
'pb in allocation 5',1)
155 ALLOCATE( vdeptr(nbtr), stat=ierr)
156 IF (ierr /= 0) CALL
abort_gcm(
'traclmdz_init',
'pb in allocation 6',1)
173 id_rn=0; id_pb=0; id_aga=0; id_be=0; id_o3=0
174 id_pcsat=0; id_pcocsat=0; id_pcq=0; id_pcs0=0; id_pcos0=0; id_pcq0=0
177 IF ( tname(iiq) ==
"RN" )
THEN
179 ELSE IF ( tname(iiq) ==
"PB")
THEN
182 open (ilesfil2,file=
'prof.pb210',status=
'old',iostat=irr2)
184 read(ilesfil2,*) kradio2
185 print*,
'number of levels for pb210 profile ',kradio2
187 read (ilesfil2,*) plomb(:,
k)
192 tr_seri(
i,
k,id_pb)=plomb(
i,
k)
197 print *,
'Prof.pb210 does not exist: use restart values'
200 ELSE IF ( tname(iiq) ==
"Aga" .OR. tname(iiq) ==
"AGA" )
THEN
203 radio(id_aga) = .false.
204 aerosol(id_aga) = .false.
210 ELSE IF (
klev>=10)
THEN
215 ELSE IF ( tname(iiq) ==
"BE" .OR. tname(iiq) ==
"Be" .OR. &
216 tname(iiq) ==
"BE7" .OR. tname(iiq) ==
"Be7" )
THEN
219 ALLOCATE( srcbe(klon,
klev) )
220 radio(id_be) = .true.
221 aerosol(id_be) = .true.
224 CALL
init_be(pctsrf,
pplay,masktr(:,id_be),tautr(id_be),vdeptr(id_be),scavtr(id_be),srcbe)
225 WRITE(
lunout,*)
'Initialisation srcBe: OK'
227 open (ilesfil,file=
'prof.be7',status=
'old',iostat=irr)
229 read(ilesfil,*) kradio
230 print*,
'number of levels for Be7 profile ',kradio
232 read (ilesfil,*) beryllium(:,
k)
237 tr_seri(
i,
k,id_be)=beryllium(
i,
k)
242 print *,
'Prof.Be7 does not exist: use restart values'
245 ELSE IF (tname(iiq)==
"O3" .OR. tname(iiq)==
"o3")
THEN
250 ELSE IF ( tname(iiq) ==
"pcsat" .OR. tname(iiq) ==
"Pcsat" )
THEN
252 ELSE IF ( tname(iiq) ==
"pcocsat" .OR. tname(iiq) ==
"Pcocsat" )
THEN
254 ELSE IF ( tname(iiq) ==
"pcq" .OR. tname(iiq) ==
"Pcq" )
THEN
256 ELSE IF ( tname(iiq) ==
"pcs0" .OR. tname(iiq) ==
"Pcs0" )
THEN
259 ELSE IF ( tname(iiq) ==
"pcos0" .OR. tname(iiq) ==
"Pcos0" )
THEN
262 ELSE IF ( tname(iiq) ==
"pcq0" .OR. tname(iiq) ==
"Pcq0" )
THEN
266 WRITE(
lunout,*)
'This is an unknown tracer in LMDZ : ', trim(tname(iiq))
273 IF ( id_rn/=0 .AND. id_pb/=0 )
THEN
279 aerosol(id_rn) = .false.
280 aerosol(id_pb) = .true.
282 CALL
initrrnpb(ftsol,pctsrf,masktr,fshtr,hsoltr,tautr,vdeptr,scavtr)
288 IF (carbon_cycle_tr .OR. carbon_cycle_cpl)
THEN
299 IF (is_mpi_root .AND. is_omp_root)
THEN
300 mintmp=minval(varglo,dim=1)
301 maxtmp=maxval(varglo,dim=1)
302 IF (minval(mintmp,dim=1)==0. .AND. maxval(maxtmp,dim=1)==0.)
THEN
316 WRITE(
lunout,*)
"The tracer ",trim(tname(iiq)),
" will be initialized"
317 IF (
it==id_pcsat .OR.
it==id_pcq .OR. &
318 it==id_pcs0 .OR.
it==id_pcq0)
THEN
319 tr_seri(:,:,
it) = 100.
320 ELSE IF (
it==id_pcocsat .OR.
it==id_pcos0)
THEN
322 IF ( pctsrf(
i, is_oce) == 0. )
THEN
325 tr_seri(
i,:,
it) = 100.
337 SUBROUTINE traclmdz(nstep, julien, gmtime, pdtphys, t_seri, paprs, pplay, &
338 cdragh, coefh, yu1, yv1, ftsol, pctsrf,
xlat,
xlon, couchelimite, sh, &
339 rh, pphi, ustar, zu10m, zv10m, &
341 tr_seri, source, solsym, d_tr_cl,d_tr_dec,
zmasse)
347 USE carbon_cycle_mod, ONLY : carbon_cycle, carbon_cycle_tr, carbon_cycle_cpl
349 include
"indicesol.h"
358 INTEGER,
INTENT(IN) :: nstep
359 INTEGER,
INTENT(IN) :: julien
360 REAL,
INTENT(IN) :: gmtime
362 REAL,
DIMENSION(klon),
INTENT(IN) ::
xlat
363 REAL,
INTENT(IN)::
xlon(:)
368 REAL,
DIMENSION(klon,klev),
INTENT(IN) :: t_seri
369 REAL,
DIMENSION(klon,klev+1),
INTENT(IN) :: paprs
370 REAL,
DIMENSION(klon,klev),
INTENT(IN) ::
pplay
371 REAL,
intent(in)::
zmasse (:, :)
377 REAL,
DIMENSION(klon),
INTENT(IN) :: cdragh
378 REAL,
DIMENSION(klon,klev),
INTENT(IN) :: coefh
379 REAL,
DIMENSION(klon),
INTENT(IN) :: yu1
380 REAL,
DIMENSION(klon),
INTENT(IN) :: yv1
381 LOGICAL,
INTENT(IN) :: couchelimite
382 REAL,
DIMENSION(klon,klev),
INTENT(IN) :: sh
383 REAL,
DIMENSION(klon,klev),
INTENT(IN) :: rh
384 REAL,
DIMENSION(klon,klev),
INTENT(IN) :: pphi
385 REAL,
DIMENSION(klon),
INTENT(IN) :: ustar
386 REAL,
DIMENSION(klon),
INTENT(IN) :: zu10m
387 REAL,
DIMENSION(klon),
INTENT(IN) :: zv10m
390 REAL,
DIMENSION(klon,nbsrf),
INTENT(IN) :: ftsol
391 REAL,
DIMENSION(klon,nbsrf),
INTENT(IN) :: pctsrf
394 REAL,
DIMENSION(klon,klev,nbtr),
INTENT(INOUT) :: tr_seri
397 CHARACTER(len=8),
DIMENSION(nbtr),
INTENT(OUT) :: solsym
398 REAL,
DIMENSION(klon,nbtr),
INTENT(OUT) :: source
399 REAL,
DIMENSION(klon,klev,nbtr),
INTENT(OUT) :: d_tr_cl
408 REAL,
DIMENSION(klon) :: d_trs
409 REAL,
DIMENSION(klon,klev) :: qsat
410 REAL,
DIMENSION(klon,klev,nbtr) :: d_tr_dec
418 IF ( id_be /= 0 )
THEN
424 WRITE(*,*)
'Ajout srcBe dans tr_seri: OK'
434 IF ( id_pcsat /= 0 )
THEN
437 IF (
pplay(
i,
k).GE.85000.)
THEN
438 tr_seri(
i,
k,id_pcsat) = qsat(
i,
k)
440 tr_seri(
i,
k,id_pcsat) = min(qsat(
i,
k), tr_seri(
i,
k,id_pcsat))
446 IF ( id_pcocsat /= 0 )
THEN
449 IF (
pplay(
i,
k).GE.85000.)
THEN
450 IF ( pctsrf(
i, is_oce) > 0. )
THEN
451 tr_seri(
i,
k,id_pcocsat) = qsat(
i,
k)
453 tr_seri(
i,
k,id_pcocsat) = 0.
456 tr_seri(
i,
k,id_pcocsat) = min(qsat(
i,
k), tr_seri(
i,
k,id_pcocsat))
462 IF ( id_pcq /= 0 )
THEN
465 IF (
pplay(
i,
k).GE.85000.)
THEN
466 tr_seri(
i,
k,id_pcq) = sh(
i,
k)
468 tr_seri(
i,
k,id_pcq) = min(qsat(
i,
k), tr_seri(
i,
k,id_pcq))
475 IF ( id_pcs0 /= 0 )
THEN
478 IF (
pplay(
i,
k).GE.85000.)
THEN
479 tr_seri(
i,
k,id_pcs0) = qsat(
i,
k)
481 tr_seri(
i,
k,id_pcs0) = min(qsat(
i,
k), tr_seri(
i,
k,id_pcs0))
488 IF ( id_pcos0 /= 0 )
THEN
491 IF (
pplay(
i,
k).GE.85000.)
THEN
492 IF ( pctsrf(
i, is_oce) > 0. )
THEN
493 tr_seri(
i,
k,id_pcos0) = qsat(
i,
k)
495 tr_seri(
i,
k,id_pcos0) = 0.
498 tr_seri(
i,
k,id_pcos0) = min(qsat(
i,
k), tr_seri(
i,
k,id_pcos0))
505 IF ( id_pcq0 /= 0 )
THEN
508 IF (
pplay(
i,
k).GE.85000.)
THEN
509 tr_seri(
i,
k,id_pcq0) = sh(
i,
k)
511 tr_seri(
i,
k,id_pcq0) = min(qsat(
i,
k), tr_seri(
i,
k,id_pcq0))
524 tr_seri(:,
k,id_aga) = 0.0
528 DO k = lev_1p5km+1,
klev-1
529 tr_seri(:,
k,id_aga) = tr_seri(:,
k,id_aga) +
pdtphys
533 tr_seri(:,
klev,id_aga) = tr_seri(:,
klev-1,id_aga)
541 IF (couchelimite)
THEN
546 zrho =
pplay(
i,1)/t_seri(
i,1)/rd
547 source(
i,id_be) = - vdeptr(id_be)*tr_seri(
i,1,id_be)*zrho
554 IF (couchelimite .AND. pbl_flg(
it) == 0 .AND. (
it==id_rn .OR.
it==id_pb))
THEN
557 cdragh, coefh,t_seri,ftsol,pctsrf, &
558 tr_seri(:,:,
it),trs(:,
it), &
560 masktr(:,
it),fshtr(:,
it),hsoltr(
it),&
561 tautr(
it),vdeptr(
it), &
562 xlat,d_tr_cl(:,:,
it),d_trs)
572 trs(
i,
it) = trs(
i,
it) + d_trs(
i)
584 WRITE(solsym(
it),
'(i2)')
it
594 CALL
minmaxqfi(tr_seri(:,:,
it),0.,1.e33,
'puits rn it='//solsym(
it))
604 IF (mod(nstep - 1, lmt_pas) == 0)
THEN
609 xlon, tr_seri(:, :, id_o3))
615 IF (carbon_cycle_tr .OR. carbon_cycle_cpl)
THEN
628 REAL,
DIMENSION(klon,nbtr),
INTENT(OUT) :: trs_out
631 IF (
ALLOCATED(trs) )
THEN
632 trs_out(:,:) = trs(:,:)