source: LMDZ4/branches/LMDZ4_par_0/libf/phylmd/phytrac.F @ 633

Last change on this file since 633 was 633, checked in by (none), 19 years ago

This commit was manufactured by cvs2svn to create branch 'LMDZ4_par_0'.

  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 27.7 KB
Line 
1!
2! $Header$
3!
4c
5c
6      SUBROUTINE phytrac (iflag_con,
7     I                    rnpb,
8     I                    nstep,
9     I                    julien,
10     I                    gmtime,
11     I                    debutphy,
12     I                    lafin,
13     I                    nqmax,
14     I                    nlon,
15     I                    nlev,
16     I                    pdtphys,
17     I                    u,
18     I                    v,
19     I                    t_seri,
20     I                    paprs,
21     I                    pplay,
22     I                    pmfu,
23     I                    pmfd,
24     I                    pen_u,
25     I                    pde_u,
26     I                    pen_d,
27     I                    pde_d,
28     I                    coefh,
29     I                    fm_therm,
30     I                    entr_therm,
31     I                    yu1,
32     I                    yv1,
33     I                    ftsol,
34     I                    pctsrf,
35     I                    xlat,
36     I                    frac_impa,
37     I                    frac_nucl,
38     I                    xlon,
39     I                    presnivs,
40     I                    pphis,
41     I                    pphi,
42     I                    albsol,
43     I                    sh,
44     I                    rh,
45     I                    cldfra,
46     I                    rneb,
47     I                    diafra,
48     I                    cldliq,
49     I                    itop_con,
50     I                    ibas_con,
51     I                    pmflxr,
52     I                    pmflxs,
53     I                    prfl,
54     I                    psfl,
55     I                    da,
56     I                    phi,
57     I                    mp,
58     I                    upwd,
59     I                    dnwd,
60#ifdef INCA
61     I                    flxmass_w,
62#endif
63     O                    tr_seri)
64
65      USE ioipsl
66
67#ifdef INCA
68      USE sflx
69      USE chem_tracnm
70      USE species_names
71      USE chem_mods
72      USE pht_tables, ONLY : jrates
73      USE transport_controls, ONLY : conv_flg, pbl_flg
74      USE airplane_src, ONLY : ptrop
75      USE lightning, ONLY : prod_light
76#ifdef INCA_AER
77      USE AEROSOL_MOD, only : ntr,trmx,trnx
78      USE AEROSOL_DIAG,only : cla,las,tausum,angst,aload,cload,totaerh2o,tau,
79     $  emiss20,sconc,scavcoef_st,scavcoef_cv
80     $  ,cload05ss  ,cload05bc  ,cload05pom  ,cload05dust  ,cload05so4
81     $  ,cload125ss  ,cload125bc  ,cload125pom  ,cload125dust  ,cload125so4
82      USE AEROSOL_PROGNOS, ONLY : md,mdw
83      USE AEROSOL_METEO, only : airm
84#endif
85#ifdef INCA_NMHC
86      USE RESISTANCE_DIAGNOSE, ONLY : surf_alb, sol_irrad, surf_temp, surf_wind,
87     $                                aero_resist, lamin_resist, surf_resist
88#endif
89#endif
90      IMPLICIT none
91c======================================================================
92c Auteur(s) FH
93c Objet: Moniteur general des tendances traceurs
94c
95cAA Remarques en vrac:
96cAA--------------------
97cAA 1/ le call phytrac se fait avec nqmax-2 donc nous avons bien
98cAA les vrais traceurs (nbtr) dans phytrac (pas la vapeur ni eau liquide)
99cAA 2/ Le choix du radon et du pb se fait juste avec un data
100cAA    (peu propre). Peut-etre pourrait-on prevoir dans l'avenir
101cAA    une variable "type de traceur"
102c======================================================================
103#include "YOMCST.h"
104#include "dimensions.h"
105#include "dimphy.h"
106#include "indicesol.h"
107#include "temps.h"
108#include "paramet.h"
109#include "control.h"
110#include "comgeomphy.h"
111#include "advtrac.h"
112c======================================================================
113
114c Arguments:
115c
116c   EN ENTREE:
117c   ==========
118c
119c   divers:
120c   -------
121c
122      integer nlon  ! nombre de points horizontaux
123      integer nlev  ! nombre de couches verticales
124      integer nqmax ! nombre de traceurs auxquels on applique la physique
125      integer nstep  ! appel physique
126      integer julien !jour julien
127      integer itop_con(nlon)
128      integer ibas_con(nlon)
129      real gmtime
130      real pdtphys  ! pas d'integration pour la physique (seconde)
131      real t_seri(nlon,nlev) ! temperature
132      real tr_seri(nlon,nlev,nbtr) ! traceur 
133      real u(klon,klev)
134      real v(klon,klev)
135      real sh(nlon,nlev)     ! humidite specifique
136      real rh(nlon,nlev)     ! humidite relative
137      real cldliq(nlon,nlev) ! eau liquide nuageuse
138      real cldfra(nlon,nlev) ! fraction nuageuse (tous les nuages)
139      real diafra(nlon,nlev) ! fraction nuageuse (convection ou stratus artificiels)
140      real rneb(nlon,nlev)   ! fraction nuageuse (grande echelle)
141      real albsol(nlon)  ! albedo surface
142      real paprs(nlon,nlev+1)  ! pression pour chaque inter-couche (en Pa)
143      real ps(nlon)  ! pression surface
144      real pplay(nlon,nlev)  ! pression pour le mileu de chaque couche (en Pa)
145      real pphi(nlon,klev) ! geopotentiel
146      real pphis(klon)
147      REAL presnivs(klev)
148      logical debutphy       ! le flag de l'initialisation de la physique
149      logical lafin          ! le flag de la fin de la physique
150c Olivia     
151      integer isplit,nsplit
152      REAL pmflxr(klon,klev+1), pmflxs(klon,klev+1)   !--lessivage convection
153      REAL prfl(klon,klev+1),   psfl(klon,klev+1)     !--lessivage large-scale
154
155#ifdef INCA
156      REAL flxmass_w(klon,klev)
157#endif
158      integer iflag_con
159
160cAA Rem : nbtr : nombre de vrais traceurs est defini dans dimphy.h
161c
162c   convection:
163c   -----------
164c
165      REAL pmfu(nlon,nlev)  ! flux de masse dans le panache montant
166      REAL pmfd(nlon,nlev)  ! flux de masse dans le panache descendant
167      REAL pen_u(nlon,nlev) ! flux entraine dans le panache montant
168
169c
170c   thermiques:
171c   -----------
172c
173      real fm_therm(klon,klev+1),entr_therm(klon,klev)
174        real fm_therm1(klon,klev)
175c
176      REAL pde_u(nlon,nlev) ! flux detraine dans le panache montant
177      REAL pen_d(nlon,nlev) ! flux entraine dans le panache descendant
178      REAL pde_d(nlon,nlev) ! flux detraine dans le panache descendant
179c KE
180      real da(nlon,nlev),phi(nlon,nlev,nlev),mp(nlon,nlev)
181      REAL upwd(nlon,nlev)      ! saturated updraft mass flux
182      REAL dnwd(nlon,nlev)      ! saturated downdraft mass flux
183
184c
185c   Couche limite:
186c   --------------
187c
188      REAL coefh(nlon,nlev) ! coeff melange CL
189      REAL yu1(nlon)        ! vents au premier niveau
190      REAL yv1(nlon)        ! vents au premier niveau
191      REAL xlat(nlon)       ! latitudes pour chaque point
192      REAL xlon(nlon)       ! longitudes pour chaque point
193
194c
195c   Lessivage:
196c   ----------
197c
198c pour le ON-LINE
199c
200      REAL frac_impa(nlon,nlev)  ! fraction d'aerosols impactes
201      REAL frac_nucl(nlon,nlev)  ! fraction d'aerosols nuclees
202c
203cAA
204cAA Arguments necessaires pour les sources et puits de traceur:
205cAA ----------------
206cAA
207      real ftsol(nlon,nbsrf)  ! Temperature du sol (surf)(Kelvin)
208      real pctsrf(nlon,nbsrf) ! Pourcentage de sol f(nature du sol)
209c abder
210      real pftsol1(nlon),pftsol2(nlon),pftsol3(nlon),pftsol4(nlon)
211      real ppsrf1(nlon),ppsrf2(nlon),ppsrf3(nlon),ppsrf4(nlon)
212c fin
213cAA ----------------------------
214cAA  VARIABLES LOCALES TRACEURS
215cAA ----------------------------
216cAA
217cAA Sources et puits des traceurs:
218cAA ------------------------------
219cAA
220cAA Pour l'instant seuls les cas du rn et du pb ont ete envisages.
221
222      REAL source(klon)       ! a voir lorsque le flux est prescrit
223cAA
224cAA Pour la source de radon et son reservoir de sol
225cAA ................................................
226 
227      REAL trs(klon,nbtr)    ! Conc. radon ds le sol
228      SAVE trs
229
230      REAL masktr(klon,nbtr) ! Masque reservoir de sol traceur
231c                            Masque de l'echange avec la surface
232c                           (1 = reservoir) ou (possible => 1 )
233      SAVE masktr
234      REAL fshtr(klon,nbtr)  ! Flux surfacique dans le reservoir de sol
235      SAVE fshtr
236      REAL hsoltr(nbtr)      ! Epaisseur equivalente du reservoir de sol
237      SAVE hsoltr
238      REAL tautr(nbtr)       ! Constante de decroissance radioactive
239      SAVE tautr
240      REAL vdeptr(nbtr)      ! Vitesse de depot sec dans la couche Brownienne
241      SAVE vdeptr
242      REAL scavtr(nbtr)      ! Coefficient de lessivage
243      SAVE scavtr
244cAA
245      CHARACTER*2 itn
246C maf ioipsl
247      CHARACTER*2 str2
248      INTEGER nhori, nvert
249      REAL zsto, zout, zjulian
250      INTEGER nid_tra
251      SAVE nid_tra
252#ifdef INCA_AER
253      INTEGER nid_tra2,nid_tra3
254      SAVE nid_tra2,nid_tra3
255#endif
256c     REAL x(klon,klev,nbtr+2) ! traceurs
257      INTEGER ndex(1)
258      INTEGER ndex2d(iim*(jjm+1)),ndex3d(iim*(jjm+1)*klev)
259      REAL zx_tmp_2d(iim,jjm+1), zx_tmp_3d(iim,jjm+1,klev)
260      REAL zx_lon(iim,jjm+1), zx_lat(iim,jjm+1)
261c
262      integer itau_w   ! pas de temps ecriture = nstep + itau_phy
263c
264
265C
266C Variables liees a l'ecriture de la bande histoire : phytrac.nc
267c
268      INTEGER ecrit_tra
269      SAVE ecrit_tra   
270      logical ok_sync
271      parameter (ok_sync = .true.)
272C
273C nature du traceur
274c
275      logical aerosol(nbtr)  ! Nature du traceur
276c                            ! aerosol(it) = true  => aerosol
277c                            ! aerosol(it) = false => gaz
278c                            ! nat_trac(it) = 1. aerosol
279      logical clsol(nbtr)    ! clsol(it) = true => CL sol calculee
280      logical radio(nbtr)    ! radio(it)=true => decroisssance radioactive
281      save aerosol,clsol,radio
282C
283c======================================================================
284c
285c Declaration des procedures appelees
286c
287c--modif convection tiedtke
288      INTEGER i, k, it
289      INTEGER iq, iiq
290      REAL delp(klon,klev)
291c--end modif
292c
293c Variables liees a l'ecriture de la bande histoire physique
294c
295c Variables locales pour effectuer les appels en serie
296c----------------------------------------------------
297c
298      REAL d_tr(klon,klev), d_trs(klon) ! tendances de traceurs
299      REAL d_tr_cl(klon,klev,nbtr) ! tendance de traceurs  couche limite
300      REAL d_tr_cv(klon,klev,nbtr) ! tendance de traceurs  conv pour chq traceur
301      REAL d_tr_th(klon,klev,nbtr) ! la tendance des thermiques
302      REAL d_tr_dec(klon,klev,nbtr) ! la tendance de la decroissance
303c                                   ! radioactive du rn - > pb
304      REAL d_tr_lessi_impa(klon,klev,nbtr) ! la tendance du lessivage
305c                                          ! par impaction
306      REAL d_tr_lessi_nucl(klon,klev,nbtr) ! la tendance du lessivage
307c                                          ! par nucleation
308      REAL fluxrn(klon,klev)
309      REAL fluxpb(klon,klev)
310      REAL pbimpa(klon,klev)
311      REAL pbnucl(klon,klev)
312      REAL rn(klon,klev)
313      REAL pb(klon,klev)
314      REAL flestottr(klon,klev,nbtr) ! flux de lessivage
315c                                    ! dans chaque couche
316      real zmasse(klon,klev)
317      real ztra_th(klon,klev)
318
319C
320      character*20 modname
321      character*80 abort_message
322c
323c   Controles
324c-------------
325      logical first,couchelimite,convection,lessivage,sorties,
326     s        rnpb,inirnpb,thermiques
327      save first,couchelimite,convection,lessivage,thermiques,
328     s        sorties,inirnpb
329c      data first,couchelimite,convection,lessivage,sorties
330c     s     /.true.,.true.,.false.,.true.,.true./
331c Olivia
332       data first,couchelimite,convection,lessivage,
333     s      thermiques,sorties
334     s     /.true.,.true.,.true.,.true.,.true.,.true./
335
336
337#ifdef INCA
338      INTEGER           :: lastgas
339      INTEGER           :: ncsec
340
341      INTEGER           :: prt_flag_ts(nbtr)=(/1,1,1
342#ifdef INCA_CH4
343     .                                              ,0,0,1,1,1,1,1,
344     .                                         0,1,0,0,0,0,0,1,0,0,
345     .                                         0,1,1,1,1,0,1,1,1,0,
346     .                                         1,1,1,1,1,1,1,1,1,1,
347     .                                         1,0,0
348#ifdef INCA_AER
349     .                                         ,1,1,1,1,0,1,1,1
350#endif
351#endif
352#ifdef INCA_AER
353c aerosol tracers
354     .                                        ,1,0,1,1,1,1,1,1,0,1,
355     .                                         0,1,1,1,1,1,0,1,0,1,1,1
356#endif
357#ifdef INCA_NMHC
358     .                                                 , 1, 1, 1, 1, 1, 1, 1,
359     .                                          1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
360     .                                          1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
361     .                                          1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
362     .                                          1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
363     .                                          1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
364     .                                          1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
365     .                                          1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
366     .                                          1, 1, 1, 1, 1, 1, 1
367#endif
368     .                                         /)
369
370
371      REAL, PARAMETER   :: dry_mass = 28.966
372      REAL, POINTER     :: hbuf(:)
373      REAL, ALLOCATABLE :: obuf(:)
374      REAL              :: calday
375      REAL              :: pdel(klon,klev)
376      REAL              :: dummy(klon,klev) = 0.
377#endif
378#ifdef INCA_AER
379      integer la
380#endif
381c
382c======================================================================
383         modname='phytrac'
384
385         ps(:)=paprs(:,1)
386
387         if (debutphy) then
388
389          ecrit_tra = NINT(86400./pdtphys *ecritphy)
390          print*,'dans phytrac ',pdtphys,ecritphy,ecrit_tra
391
392         if(nbtr.lt.nqmax) then
393c           print*,'NQMAX=',nqmax
394c           print*,'NBTR=',nbtr
395           abort_message='See above'
396           call abort_gcm(modname,abort_message,1)
397         endif
398
399         inirnpb=rnpb
400         PRINT*, 'La frequence de sortie traceurs est  ', ecrit_tra
401C         
402c=============================================================
403c   Initialisation des sorties
404c=============================================================
405
406#ifdef CPP_IOIPSL
407#include "ini_histrac.h"
408#endif
409
410c======================================================================
411c   Initialisation de certaines variables pour le Rn et le Pb
412c======================================================================
413
414c Initialisation du traceur dans le sol (couche limite radonique)
415c
416c        print*,'valeur de debut dans phytrac :',debutphy
417         trs(:,:) = 0.
418
419         open (99,file='starttrac',status='old',
420     .         err=999,form='formatted')
421         read(99,*) (trs(i,1),i=1,klon)
422999      close(99)
423c         print*, 'apres starttrac'
424
425c Initialisation de la fraction d'aerosols lessivee
426c
427         d_tr_lessi_impa(:,:,:) = 0.
428         d_tr_lessi_nucl(:,:,:) = 0.
429c
430c Initialisation de la nature des traceurs
431c
432         DO it = 1, nqmax
433            aerosol(it) = .FALSE.  ! Tous les traceurs sont des gaz par defaut
434            radio(it) = .FALSE.    ! Par defaut pas de passage par radiornpb
435            clsol(it) = .FALSE.  ! Par defaut couche limite avec flux prescrit
436         ENDDO
437c
438      ENDIF  ! fin debutphy
439c Initialisation du traceur dans le sol (couche limite radonique)
440      if(inirnpb) THEN
441c
442         radio(1)= .true.
443         radio(2)= .true.
444         clsol(1)= .true.
445         clsol(2)= .true.
446         aerosol(2) = .TRUE. ! le Pb est un aerosol
447c
448         call initrrnpb (ftsol,pctsrf,masktr,fshtr,hsoltr,tautr
449     .                   ,vdeptr,scavtr)
450         inirnpb=.false.
451      endif
452#ifdef INCA
453!======================================================================
454!     Chimie
455!======================================================================
456
457        calday = FLOAT(julien) + gmtime
458        ncsec  = NINT (86400.*gmtime)
459
460        DO k = 1, nlev
461        pdel(:,k) = paprs(:,k) - paprs (:,k+1)
462        END DO
463
464#ifdef INCAINFO
465        PRINT *, 'CHEMMAIN @ ', calday, ' ... '
466        DO it = 1, nbtr
467        PRINT *, solsym(it), MINVAL(tr_seri(:,:,it)),
468     $                       MAXVAL(tr_seri(:,:,it))
469      END DO
470#endif
471
472
473#ifdef INCA_AER
474
475! Changement Anne 01/04/2005
476        CALL aerosolmain (tr_seri,
477     $                 pdtphys,
478     $                 pplay,
479     $                 pdel,
480     $                 prfl,
481     $                 pmflxr,
482     $                 psfl,
483     $                 pmflxs,
484     $                 pmfu,
485     $                 itop_con,
486     $                 ibas_con,
487     $                 pphi,
488     $                 airephy, ! paire,
489     $                 nstep,
490     $                 rneb,         ! for chimiaq
491     $                 t_seri,       ! for chimiaq
492     $                 rh)
493! fin changement anne
494
495#endif
496
497        CALL chemmain (tr_seri,    !mmr
498     $                 nas,        !nas
499     $                 nstep,      !nstep
500     $                 calday,     !calday
501     $                 julien,     !ncdate
502     $                 ncsec,      !ncsec
503     $                 1,          !lat
504     $                 pdtphys,    !delt
505     $                 paprs(1,1), !ps
506     $                 pplay,      !pmid
507     $                 pdel,       !pdel
508     $                 airephy,
509     $                 pctsrf(1,1),!oro
510     $                 ftsol,      !tsurf
511     $                 albsol,     !albs
512     $                 pphi,       !zma
513     $                 pphis,      !phis
514     $                 cldfra,     !cldfr
515     $                 rneb,       !cldfr_st
516     $                 diafra,     !cldfr_cv
517     $                 itop_con,   !cldtop
518     $                 ibas_con,   !cldbot
519     $                 cldliq,     !cwat
520     $                 prfl,       !flxrst
521     $                 pmflxr,     !flxrcv
522     $                 psfl,       !flxsst
523     $                 pmflxs,     !flxscv
524     $                 pmfu,       !flxupd
525     $                 flxmass_w,  !flxmass_w
526     $                 t_seri,     !tfld
527     $                 sh,         !sh
528     $                 rh,         !rh
529     $                 .false.,    !wrhstts
530     $                 hbuf,       !hbuf
531     $                 obuf,       !obuf
532     $                 iip1,       !nx
533     $                 jjp1)       !ny
534#ifdef INCAINFO
535      PRINT *, 'OK.'
536      DO it = 1, nbtr
537      PRINT *, solsym(it), MINVAL(tr_seri(:,:,it)),
538     $                     MAXVAL(tr_seri(:,:,it))
539      END DO
540#endif
541#else
542
543c Abder
544ctestmaf      if(nqmax.gt.2) aerosol(3)=.true.
545
546       do i=1,nlon
547          pftsol1(i) = ftsol(i,1)
548          pftsol2(i) = ftsol(i,2)
549          pftsol3(i) = ftsol(i,3)
550          pftsol4(i) = ftsol(i,4)
551
552          ppsrf1(i) = pctsrf(i,1)
553          ppsrf2(i) = pctsrf(i,2)
554          ppsrf3(i) = pctsrf(i,3)
555          ppsrf4(i) = pctsrf(i,4)
556
557      enddo
558c Abder
559#endif
560c======================================================================
561c   Calcul de l'effet de la convection
562c======================================================================
563c     print*,'Avant convection'
564c      do it=1,nqmax
565c         WRITE(itn,'(i2)') it
566c        call diagtracphy(tr_seri(:,:,it),paprs,'Avant conv'//itn)
567c      enddo
568
569      if (convection) then
570
571c      print*,'Pas de temps dans phytrac : ',pdtphys
572      DO it=1, nqmax
573#ifdef INCA
574      IF ( conv_flg(it) == 0 ) CYCLE
575#endif
576      if (iflag_con.eq.2) then
577c tiedke
578      CALL nflxtr(pdtphys, pmfu, pmfd, pen_u, pde_u, pen_d, pde_d,
579     .            pplay, paprs, tr_seri(1,1,it), d_tr_cv(1,1,it))
580      else if (iflag_con.eq.3) then
581c KE
582      call cvltr(pdtphys, da, phi, mp, paprs,pplay, tr_seri(1,1,it),
583     .           upwd,dnwd,d_tr_cv(1,1,it))
584      endif
585
586      DO k = 1, nlev
587      DO i = 1, klon
588         tr_seri(i,k,it) = tr_seri(i,k,it) + d_tr_cv(i,k,it)
589      ENDDO
590      ENDDO
591#ifdef INCA
592      CALL minmaxqfi(tr_seri(1,1,it),0.,1.e33,'convection it = '
593     .                              //solsym(it))
594#else
595      CALL minmaxqfi(tr_seri(1,1,it),0.,1.e33,'convection it = '//itn)
596#endif
597      ENDDO
598c      print*,'apres nflxtr'
599
600      endif ! convection
601c        print*,'Apres convection'
602c      do it=1,nqmax
603c         WRITE(itn,'(i1)') it
604c        call diagtracphy(tr_seri(:,:,it),paprs,'Avant conv'//itn)
605c      enddo
606
607
608c======================================================================
609c   Calcul de l'effet des thermiques
610c======================================================================
611
612      do k=1,klev
613         do i=1,klon
614            zmasse(i,k)=(paprs(i,k)-paprs(i,k+1))/rg
615         enddo
616      enddo
617
618c      print*,'masse dans ph ',zmasse
619      do it=1,nqmax
620         do k=1,klev
621            do i=1,klon
622               d_tr_th(i,k,it)=0.
623               tr_seri(i,k,it)=max(tr_seri(i,k,it),0.)
624               tr_seri(i,k,it)=min(tr_seri(i,k,it),1.e10)
625            enddo
626         enddo
627      enddo
628
629      if (thermiques) then
630        print*,'calcul de leffet des thermiques'
631        nsplit=10
632        DO it=1, nqmax
633c        WRITE(itn,'(i1)') it
634c        CALL minmaxqfi(tr_seri(1,1,it),1.e10,-1.e33,'conv it='//itn)
635c            print*,'avant dqthermiquesretro'
636c             call dump2d(iim,jjm-1,tr_seri(2,1,1),'TR_SERI      ')
637
638         do isplit=1,nsplit
639c  Abderr 25 11 02
640C Thermiques
641c       print*,'Avant dans phytrac',avant
642            call dqthermcell(klon,klev,pdtphys/nsplit
643     .       ,fm_therm,entr_therm,zmasse
644     .       ,tr_seri(1:klon,1:klev,it),d_tr,ztra_th)
645
646            do k=1,klev
647               do i=1,klon
648                  d_tr(i,k)=pdtphys*d_tr(i,k)/nsplit
649                  d_tr_th(i,k,it)=d_tr_th(i,k,it)+d_tr(i,k)
650                  tr_seri(i,k,it)=max(tr_seri(i,k,it)+d_tr(i,k),0.)
651               enddo
652            enddo
653          enddo ! nsplit
654          print*,'apres thermiques'
655c             call dump2d(iim,jjm-1,d_tr_th(1,1,1),'d_tr_th      ')
656c            do k=1,klev
657c       print*,'d_tr_th(',k,')=',tr_seri(280,k,1)
658c          enddo
659
660c        WRITE(itn,'(i1)') it
661c        CALL minmaxqfi(tr_seri(1,1,it),1.e10,-1.e33,'therm it='//itn)
662       ENDDO ! it
663       endif ! Thermiques
664c       print*,'ATTENTION: sdans thermniques'
665     
666c======================================================================
667c   Calcul de l'effet de la couche limite
668c======================================================================
669c       print *,'Avant couchelimite'
670c      do it=1,nqmax
671c         WRITE(itn,'(i1)') it
672c        call diagtracphy(tr_seri(:,:,it),paprs,'Avant CL  '//itn)
673c      enddo
674
675      if (couchelimite) then
676
677      DO k = 1, nlev
678      DO i = 1, klon
679         delp(i,k) = paprs(i,k)-paprs(i,k+1)
680      ENDDO
681      ENDDO
682
683C maf modif pour tenir compte du cas rnpb + traceur
684      DO it=1, nqmax
685#ifdef INCA
686      IF ( pbl_flg(it) == 0 ) CYCLE
687#endif
688c     print *,'it',it,clsol(it)
689      if (clsol(it)) then  ! couche limite avec quantite dans le sol calculee
690          CALL cltracrn(it, pdtphys, yu1, yv1,
691     e                    coefh,t_seri,ftsol,pctsrf,
692     e                    tr_seri(1,1,it),trs(1,it),
693     e                    paprs, pplay, delp,
694     e                    masktr(1,it),fshtr(1,it),hsoltr(it),
695     e                    tautr(it),vdeptr(it),
696     e                    xlat,
697     s                    d_tr_cl(1,1,it),d_trs)
698          DO k = 1, nlev
699            DO i = 1, klon
700              tr_seri(i,k,it) = tr_seri(i,k,it) + d_tr_cl(i,k,it)
701            ENDDO
702          ENDDO
703c
704c Traceur ds sol
705c
706          DO i = 1, klon
707            trs(i,it) = trs(i,it) + d_trs(i)
708          END DO
709C
710C maf provisoire suppression des prints
711C         WRITE(itn,'(i1)') it
712C         CALL minmaxqfi(tr_seri(1,1,it),0.,1.e33,'cltracrn it='//itn)
713      else ! couche limite avec flux prescrit
714#ifdef INCA
715        DO k =  1, klon
716          source(k) = eflux(k,it)-dflux(k,it)
717        END DO
718#else
719
720Cmaf provisoire source / traceur a creer
721        DO i=1, klon
722          source(i) = 0.0 ! pas de source, pour l'instant
723        ENDDO
724C
725#endif
726          CALL cltrac(pdtphys, coefh,t_seri,
727     s               tr_seri(1,1,it), source,
728     e               paprs, pplay, delp,
729     s               d_tr_cl(1,1,it))
730            DO k = 1, nlev
731               DO i = 1, klon
732                  tr_seri(i,k,it) = tr_seri(i,k,it) + d_tr_cl(i,k,it)
733               ENDDO
734            ENDDO
735Cmaf          WRITE(itn,'(i1)') it
736cmaf          CALL minmaxqfi(tr_seri(1,1,it),0.,1.e33,'cltracn it='//itn)
737      endif
738      ENDDO
739c
740      endif ! couche limite
741
742c      print*,'Apres couchelimite'
743c      do it=1,nqmax
744c         WRITE(itn,'(i1)') it
745c        call diagtracphy(tr_seri(:,:,it),paprs,'Avant CL  '//itn)
746c      enddo
747
748c======================================================================
749c   Calcul de l'effet du puits radioactif
750c======================================================================
751
752C MAF il faudrait faire une modification pour passer dans radiornpb
753c si radio=true mais pour l'instant radiornpb propre au cas rnpb
754      if(rnpb) then
755        print *, 'decroissance radiactive activee'
756        call radiornpb (tr_seri,pdtphys,tautr,d_tr_dec)
757C
758        DO it=1,nqmax
759            if(radio(it)) then
760            DO k = 1, nlev
761               DO i = 1, klon
762                  tr_seri(i,k,it) = tr_seri(i,k,it) + d_tr_dec(i,k,it)
763               ENDDO
764            ENDDO
765            WRITE(itn,'(i1)') it
766            CALL minmaxqfi(tr_seri(1,1,it),0.,1.e33,'puits rn it='//itn)
767            endif
768        ENDDO
769c
770      endif ! rnpb decroissance  radioactive
771C
772c======================================================================
773c   Calcul de l'effet de la precipitation
774c======================================================================
775
776c      print*,'LESSIVAGE =',lessivage
777      IF (lessivage) THEN
778
779c     print*,'avant lessivage'
780
781          d_tr_lessi_nucl(:,:,:) = 0.
782          d_tr_lessi_impa(:,:,:) = 0.
783          flestottr(:,:,:) = 0.
784c
785c tendance des aerosols nuclees et impactes
786c
787       DO it = 1, nqmax
788         IF (aerosol(it)) THEN
789           DO k = 1, nlev
790              DO i = 1, klon
791               d_tr_lessi_nucl(i,k,it) = d_tr_lessi_nucl(i,k,it) +
792     s                  ( 1 - frac_nucl(i,k) )*tr_seri(i,k,it)
793               d_tr_lessi_impa(i,k,it) = d_tr_lessi_impa(i,k,it) +
794     s                  ( 1 - frac_impa(i,k) )*tr_seri(i,k,it)
795              ENDDO
796           ENDDO
797         ENDIF
798       ENDDO
799c
800c Mises a jour des traceurs + calcul des flux de lessivage
801c Mise a jour due a l'impaction et a la nucleation
802c
803c      call dump2d(iim,jjm-1,frac_impa(2:klon-1,10),'FRACIMPA')
804c      call dump2d(iim,jjm-1,frac_nucl(2:klon-1,10),'FRACNUCL')
805c      call dump2d(iim,jjm-1,tr_seri(2:klon-1,10,3),'TRACEUR3')
806       DO it = 1, nqmax
807c         print*,'IT=',it,aerosol(it)
808         IF (aerosol(it)) THEN
809c           print*,'IT=',it,' On lessive'
810           DO k = 1, nlev
811              DO i = 1, klon
812               tr_seri(i,k,it)=tr_seri(i,k,it)
813     s         *frac_impa(i,k)*frac_nucl(i,k)
814              ENDDO
815           ENDDO
816         ENDIF
817       ENDDO
818c      call dump2d(iim,jjm-1,tr_seri(2:klon-1,10,3),'TRACEUR3B')
819c
820c Flux lessivage total
821c
822      DO it = 1, nqmax
823           DO k = 1, nlev
824            DO i = 1, klon
825               flestottr(i,k,it) = flestottr(i,k,it) -
826     s                   ( d_tr_lessi_nucl(i,k,it)   +
827     s                     d_tr_lessi_impa(i,k,it) ) *
828     s                   ( paprs(i,k)-paprs(i,k+1) ) /
829     s                   (RG * pdtphys)
830            ENDDO
831           ENDDO
832c
833Cmaf        WRITE(itn,'(i1)') it
834Cmaf    CALL minmaxqfi(tr_seri(1,1,it),0.,1.e33,'tr(lessi) it='//itn)
835      ENDDO
836c
837c     print*,'apres lessivage'
838      ENDIF
839Cc
840      DO k = 1, nlev
841         DO i = 1, klon
842            fluxrn(i,k) = flestottr(i,k,1)
843            fluxpb(i,k) = flestottr(i,k,2)
844            rn(i,k) = tr_seri(i,k,1)
845            pb(i,k) = tr_seri(i,k,2)
846            pbnucl(i,k)=d_tr_lessi_nucl(i,k,2)
847            pbimpa(i,k)=d_tr_lessi_impa(i,k,2)
848         ENDDO
849      ENDDO
850
851c=============================================================
852c   Ecriture des sorties
853c=============================================================
854
855#ifdef CPP_IOIPSL
856#include "write_histrac.h"
857#endif
858
859c=============================================================
860
861      if (lafin) then
862         print*, 'c est la fin de la physique'
863         open (99,file='restarttrac',  form='formatted')
864         do i=1,klon
865             write(99,*) trs(i,1)
866         enddo
867         PRINT*, 'Ecriture du fichier restarttrac'
868         close(99)
869      else
870         print*, 'physique pas fini'
871      endif
872
873
874      RETURN
875      END
Note: See TracBrowser for help on using the repository browser.