source: LMDZ4/branches/pre_V3/libf/phylmd/phytrac.F @ 4289

Last change on this file since 4289 was 682, checked in by lmdzadmin, 19 years ago

Ajout de bilans pour INCA - AC
MAF

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