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
72 REAL,
DIMENSION(klon,nbtr),
INTENT(IN) :: trs_in
79 IF (ierr /= 0)
CALL abort_physic(
'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)
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
109 REAL,
INTENT(IN) :: pdtphys
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
135 IF (ierr /= 0)
CALL abort_physic(
'traclmdz_init',
'pb in allocation 9',1)
139 IF (ierr /= 0)
CALL abort_physic(
'traclmdz_init',
'pb in allocation 11',1)
143 IF (ierr /= 0)
CALL abort_physic(
'traclmdz_init',
'pb in allocation 2',1)
146 IF (ierr /= 0)
CALL abort_physic(
'traclmdz_init',
'pb in allocation 3',1)
149 IF (ierr /= 0)
CALL abort_physic(
'traclmdz_init',
'pb in allocation 4',1)
152 IF (ierr /= 0)
CALL abort_physic(
'traclmdz_init',
'pb in allocation 5',1)
156 IF (ierr /= 0)
CALL abort_physic(
'traclmdz_init',
'pb in allocation 6',1)
178 IF (
tname(iiq) ==
"RN" )
THEN
180 ELSE IF (
tname(iiq) ==
"PB")
THEN
183 open (ilesfil2,file=
'prof.pb210',status=
'old',iostat=irr2)
185 read(ilesfil2,*) kradio2
186 print*,
'number of levels for pb210 profile ',kradio2
188 read (ilesfil2,*) plomb(:,k)
193 tr_seri(i,k,
id_pb)=plomb(i,k)
198 print *,
'Prof.pb210 does not exist: use restart values'
201 ELSE IF (
tname(iiq) ==
"Aga" .OR.
tname(iiq) ==
"AGA" )
THEN
211 ELSE IF (
klev>=10)
THEN
216 ELSE IF (
tname(iiq) ==
"BE" .OR.
tname(iiq) ==
"Be" .OR. &
217 tname(iiq) ==
"BE7" .OR.
tname(iiq) ==
"Be7" )
THEN
226 WRITE(
lunout,*)
'Initialisation srcBe: OK'
228 open (ilesfil,file=
'prof.be7',status=
'old',iostat=irr)
230 read(ilesfil,*) kradio
231 print*,
'number of levels for Be7 profile ',kradio
233 read (ilesfil,*) beryllium(:,k)
238 tr_seri(i,k,
id_be)=beryllium(i,k)
243 print *,
'Prof.Be7 does not exist: use restart values'
246 ELSE IF (
tname(iiq)==
"O3" .OR.
tname(iiq)==
"o3")
THEN
251 ELSE IF (
tname(iiq) ==
"pcsat" .OR.
tname(iiq) ==
"Pcsat" )
THEN
253 ELSE IF (
tname(iiq) ==
"pcocsat" .OR.
tname(iiq) ==
"Pcocsat" )
THEN
255 ELSE IF (
tname(iiq) ==
"pcq" .OR.
tname(iiq) ==
"Pcq" )
THEN
257 ELSE IF (
tname(iiq) ==
"pcs0" .OR.
tname(iiq) ==
"Pcs0" )
THEN
260 ELSE IF (
tname(iiq) ==
"pcos0" .OR.
tname(iiq) ==
"Pcos0" )
THEN
263 ELSE IF (
tname(iiq) ==
"pcq0" .OR.
tname(iiq) ==
"Pcq0" )
THEN
267 WRITE(
lunout,*)
'This is an unknown tracer in LMDZ : ', trim(
tname(iiq))
300 CALL gather(tr_seri(:,:,it),varglo)
301 IF (is_mpi_root .AND. is_omp_root)
THEN
302 mintmp=minval(varglo,dim=1)
303 maxtmp=maxval(varglo,dim=1)
304 IF (minval(mintmp,dim=1)==0. .AND. maxval(maxtmp,dim=1)==0.)
THEN
318 WRITE(
lunout,*)
"The tracer ",trim(
tname(iiq)),
" will be initialized"
321 tr_seri(:,:,it) = 100.
324 IF ( pctsrf(i,
is_oce) == 0. )
THEN
327 tr_seri(i,:,it) = 100.
339 SUBROUTINE traclmdz(nstep, julien, gmtime, pdtphys, t_seri, paprs, pplay, &
340 cdragh, coefh, yu1, yv1, ftsol, pctsrf, xlat, xlon, couchelimite, sh, &
341 rh, pphi, ustar, wstar, ale_bl, ale_wake, zu10m, zv10m, &
342 tr_seri, source, d_tr_cl,d_tr_dec,
zmasse)
360 INTEGER,
INTENT(IN) :: nstep
361 INTEGER,
INTENT(IN) :: julien
362 REAL,
INTENT(IN) :: gmtime
363 REAL,
INTENT(IN) :: pdtphys
364 REAL,
DIMENSION(klon),
INTENT(IN) :: xlat
365 REAL,
INTENT(IN):: xlon(:)
370 REAL,
DIMENSION(klon,klev),
INTENT(IN) :: t_seri
371 REAL,
DIMENSION(klon,klev+1),
INTENT(IN) :: paprs
372 REAL,
DIMENSION(klon,klev),
INTENT(IN) :: pplay
373 REAL,
intent(in):: zmasse (:, :)
379 REAL,
DIMENSION(klon),
INTENT(IN) :: cdragh
380 REAL,
DIMENSION(klon,klev),
INTENT(IN) :: coefh
381 REAL,
DIMENSION(klon),
INTENT(IN) :: yu1
382 REAL,
DIMENSION(klon),
INTENT(IN) :: yv1
383 LOGICAL,
INTENT(IN) :: couchelimite
384 REAL,
DIMENSION(klon,klev),
INTENT(IN) :: sh
385 REAL,
DIMENSION(klon,klev),
INTENT(IN) :: rh
386 REAL,
DIMENSION(klon,klev),
INTENT(IN) :: pphi
387 REAL,
DIMENSION(klon),
INTENT(IN) :: ustar
388 REAL,
DIMENSION(klon),
INTENT(IN) :: wstar,ale_bl,ale_wake
389 REAL,
DIMENSION(klon),
INTENT(IN) :: zu10m
390 REAL,
DIMENSION(klon),
INTENT(IN) :: zv10m
393 REAL,
DIMENSION(klon,nbsrf),
INTENT(IN) :: ftsol
394 REAL,
DIMENSION(klon,nbsrf),
INTENT(IN) :: pctsrf
397 REAL,
DIMENSION(klon,klev,nbtr),
INTENT(INOUT) :: tr_seri
400 REAL,
DIMENSION(klon,nbtr),
INTENT(OUT) :: source
401 REAL,
DIMENSION(klon,klev,nbtr),
INTENT(OUT) :: d_tr_cl
410 REAL,
DIMENSION(klon) :: d_trs
411 REAL,
DIMENSION(klon,klev) :: qsat
412 REAL,
DIMENSION(klon,klev,nbtr) :: d_tr_dec
420 IF (
id_be /= 0 )
THEN
426 WRITE(*,*)
'Ajout srcBe dans tr_seri: OK'
439 IF ( pplay(i,k).GE.85000.)
THEN
451 IF ( pplay(i,k).GE.85000.)
THEN
452 IF ( pctsrf(i,
is_oce) > 0. )
THEN
467 IF ( pplay(i,k).GE.85000.)
THEN
468 tr_seri(i,k,
id_pcq) = sh(i,k)
470 tr_seri(i,k,
id_pcq) = min(qsat(i,k), tr_seri(i,k,
id_pcq))
480 IF ( pplay(i,k).GE.85000.)
THEN
481 tr_seri(i,k,
id_pcs0) = qsat(i,k)
493 IF ( pplay(i,k).GE.85000.)
THEN
494 IF ( pctsrf(i,
is_oce) > 0. )
THEN
510 IF ( pplay(i,k).GE.85000.)
THEN
543 IF (couchelimite)
THEN
548 zrho = pplay(i,1)/t_seri(i,1)/rd
558 CALL cltracrn(it, pdtphys, yu1, yv1, &
559 cdragh, coefh,t_seri,ftsol,pctsrf, &
560 tr_seri(:,:,it),
trs(:,it), &
561 paprs, pplay, zmasse *
rg, &
564 xlat,d_tr_cl(:,:,it),d_trs)
568 tr_seri(i,k,it) = tr_seri(i,k,it) + d_tr_cl(i,k,it)
574 trs(i,it) =
trs(i,it) + d_trs(i)
586 WRITE(
solsym(it),
'(i2)') it
593 tr_seri(i,k,it) = tr_seri(i,k,it) + d_tr_dec(i,k,it)
605 lmt_pas = nint(86400./pdtphys)
606 IF (mod(nstep - 1, lmt_pas) == 0)
THEN
610 CALL o3_chem(julien, gmtime, t_seri, zmasse, pdtphys, xlat, &
611 xlon, tr_seri(:, :,
id_o3))
618 CALL carbon_cycle(nstep, pdtphys, pctsrf, tr_seri, source)
630 REAL,
DIMENSION(klon,nbtr),
INTENT(OUT) :: trs_out
633 IF (
ALLOCATED(
trs) )
THEN
634 trs_out(:,:) =
trs(:,:)
character(len=8), dimension(:), allocatable, save solsym
!IM Implemente en modes sequentiel et parallele CALL rlon_glo CALL bcast(rlon_glo)!$OMP MASTER if(is_mpi_root) then!zstophy
subroutine traclmdz_from_restart(trs_in)
subroutine traclmdz_init(pctsrf, xlat, xlon, ftsol, tr_seri, t_seri, pplay, sh, pdtphys, aerosol, lessivage)
!$Id ***************************************!ECRITURE DU pphis CALL zmasse
subroutine init_be(pctsrf, pplay, masktr, tautr, vdeptr, scavtr, srcbe)
logical, dimension(:), allocatable, save radio
real, dimension(:,:), allocatable, save fshtr
subroutine, public carbon_cycle(nstep, pdtphys, pctsrf, tr_seri, source)
subroutine, public carbon_cycle_init(tr_seri, pdtphys, aerosol, radio)
integer, dimension(:), allocatable, save conv_flg
real, dimension(:), allocatable, save hsoltr
integer, dimension(:), allocatable, save pbl_flg
subroutine traclmdz_to_restart(trs_out)
subroutine traclmdz(nstep, julien, gmtime, pdtphys, t_seri, paprs, pplay, cdragh, coefh, yu1, yv1, ftsol, pctsrf, xlat, xlon, couchelimite, sh, rh, pphi, ustar, wstar, ale_bl, ale_wake, zu10m, zv10m, tr_seri, source, d_tr_cl, d_tr_dec, zmasse)
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL false
integer, dimension(:), allocatable, save niadv
subroutine q_sat(np, temp, pres, qsat)
!IM Implemente en modes sequentiel et parallele CALL gather(rlat, rlat_glo) CALL bcast(rlat_glo) CALL gather(rlon
real, dimension(:,:), allocatable, save srcbe
subroutine regr_pr_comb_coefoz(julien, rlat, paprs, pplay)
subroutine cltracrn(itr, dtime, u1lay, v1lay, cdrag, coef, t, ftsol, pctsrf, tr, trs, paprs, pplay, delp, masktr, fshtr, hsoltr, tautr, vdeptr, lat, d_tr, d_trs)
real, dimension(:), allocatable, save scavtr
!$Header!integer nvarmx parameter(nfmx=10, imx=200, jmx=150, lmx=200, nvarmx=1000) real xd(imx
subroutine initrrnpb(ftsol, pctsrf, masktr, fshtr, hsoltr, tautr, vdeptr, scavtr)
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL ulevSTD CALL &zphi philevSTD CALL &zx_rh rhlevSTD!DO klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon du jour ou toutes les read_climoz CALL true
character(len=20), dimension(:), allocatable, save tname
logical, public carbon_cycle_tr
real, dimension(:), allocatable, save vdeptr
subroutine radio_decay(radio, rnpb, dtime, tautr, tr, d_tr)
subroutine minmaxqfi(zq, qmin, qmax, comment)
real, dimension(:), allocatable, save tautr
subroutine abort_physic(modname, message, ierr)
logical, public carbon_cycle_cpl
subroutine o3_chem(julien, gmtime, t_seri, zmasse, pdtphys, rlat, rlon, q)
real, dimension(:,:), allocatable, save trs
real, dimension(:,:), allocatable, save masktr
integer, parameter is_oce
!$Header!gestion des impressions de sorties et de débogage la sortie standard prt_level COMMON comprint lunout