source: trunk/LMDZ.TITAN.old/libf/phytitan/phytrac.F @ 3303

Last change on this file since 3303 was 1621, checked in by emillour, 8 years ago

Further work on full dynamics/physics separation.

LMDZ.COMMON:

  • added phy_common/vertical_layers_mod.F90 to store information on vertical grid. This is where routines in the physics should get the information.
  • The contents of vertical_layers_mod intialized via dynphy_lonlat/inigeomphy_mod.F90.

LMDZ.MARS:

  • physics now completely decoupled from dynamics; the physics package may now be compiled as a library (-libphy option of makelmdz_fcm).
  • created an "ini_tracer_mod" routine in module "tracer_mod" for a cleaner initialization of the later.
  • removed some purely dynamics-related outputs (etot0, zoom parameters, etc.) from diagfi.nc and stats.nc outputs as these informations are not available in the physics.

LMDZ.GENERIC:

  • physics now completely decoupled from dynamics; the physics package may now be compiled as a library (-libphy option of makelmdz_fcm).
  • added nqtot to tracer_h.F90.
  • removed some purely dynamics-related outputs (etot0, zoom parameters, etc.) from diagfi.nc and stats.nc outputs as these informations are not available in the physics.

LMDZ.VENUS:

  • physics now completely decoupled from dynamics; the physics package may now be compiled as a library (-libphy option of makelmdz_fcm).
  • added infotrac_phy.F90 to store information on tracers in the physics. Initialized via iniphysiq.
  • added cpdet_phy_mod.F90 to store t2tpot etc. functions to be used in the physics. Initialized via iniphysiq. IMPORTANT: there are some hard-coded constants! These should match what is in cpdet_mod.F90 in the dynamics.
  • got rid of references to moyzon_mod module within the physics. The required variables (tmoy, plevmoy) are passed to the physics as arguments to physiq.

LMDZ.TITAN:

  • added infotrac_phy.F90 to store information on tracers in the physics. Initialized via iniphysiq.
  • added cpdet_phy_mod.F90 to store t2tpot etc. functions to be used in the physics.
  • Extra work required to completely decouple physics and dynamics: moyzon_mod should be cleaned up and information passed from dynamics to physics as as arguments. Likewise moyzon_ch and moyzon_mu should not be queried from logic_mod (which is in the dynamics).

EM

File size: 25.7 KB
Line 
1      SUBROUTINE phytrac (firstcall,lastcall,
2     .                   nqmax,nmicro,ptimestep,appkim,dtkim,
3     .                   pplev,pplay,delp,ptemp,pmu0,pfract,pdecli,
4     .                   lonsol,
5     .                   pu,pv,pzlev,pzlay,ftsol,
6     .                   tr_seri,qaer,d_tr_mph,d_tr_kim,
7     .                   fclat,reservoir)
8
9c======================================================================
10c    S. Lebonnois, mai 2008
11c
12c  Arguments:
13c
14c firstcall----input-L-variable logique indiquant le premier passage
15c lastcall-----input-L-variable logique indiquant le dernier passage
16c nqmax--------input-I-nombre de traceurs (total)
17c nmicro-------input-I-nombre de traceurs microphysiques !! doivent etre toujours en premiers!!
18c ptimestep----input-R-pas d integration pour la physique (seconde)
19c appkim-------input-I-appel a la chimie
20c dtkim--------input-R-pas de temps chimique (seconde)
21c pplev--------input-R-pression pour chaque inter-couche (en Pa)
22c pplay--------input-R-pression pour chaque couche (en Pa)
23c delp---------input-R-epaisseur d'une couche (en Pa)
24c ptemp--------input-R-temperature (K)
25c pmu0---------input-R-cos angle zenithal
26c pfract-------input-R-fractional day
27c pdecli-------input-R-declinaison en radian
28c lonsol-------input-R-longitude solaire en radian
29c pu-----------input-R-vitesse dans la direction X (de O a E) en m/s (1ere couche)
30c pv-----------input-R-vitesse Y (de S a N) en m/s                   (1ere couche)
31c pzlev--------input-R-altitude pour chaque inter-couche (en m)
32c pzlay--------input-R-altitude pour chaque couche (en m)
33c ftsol--------input-R-temperature au sol (en K)
34c tr_seri------input-R-mass mixing ratio traceurs (kg/kg)
35c d_tr_mph----output-R-tendance microphysique de "qx" (kg/kg/s)
36c d_tr_kim----output-R-tendance chimique de "qx" (kg/kg/s)
37c fclat--------output-R-flux de chaleur latente d'evaporation du reservoir CH4 (J/m2/s)
38c reservoir----outpur-R-un reservoir de surface !!! (m)
39c======================================================================
40      USE infotrac_phy, ONLY: tname
41      use dimphy
42      USE common_mod, only: rmcbar,xfbar,ncount,
43     &      flxesp_i,tau_drop,tau_aer,solesp,precip,
44     &      evapch4,occcld_m,occcld,satch4,satc2h6,satc2h2,rmcloud
45      USE moyzon_mod
46      USE write_field_phy
47      USE logic_mod, ONLY: moyzon_ch,moyzon_mu
48      IMPLICIT none
49#include "dimensions.h"
50#include "clesphys.h"
51#include "YOMCST.h"
52#include "microtab.h"
53#include "varmuphy.h"
54#include "itemps.h"
55
56c======================================================================
57c Variables argument:
58c
59      LOGICAL firstcall,lastcall
60      INTEGER nqmax,nmicro,nlat,appkim
61      REAL ptimestep,dtkim
62      REAL pplev(klon,klev+1),pplay(klon,klev+1),delp(klon,klev)
63      REAL ptemp(klon,klev)
64      REAL pmu0(klon), pfract(klon), pdecli, lonsol
65      REAL pu(klon),pv(klon)
66      REAL pzlev(klon,klev+1),pzlay(klon,klev)
67      REAL ftsol(klon)
68      REAL tr_seri(klon,klev,nqmax)
69      REAL qaer(klon,klev,nqmax)
70      REAL d_tr_mph(klon,klev,nqmax),d_tr_kim(klon,klev,nqmax)
71      REAL fclat(klon)
72      REAL reservoir(klon)
73
74c======================================================================
75c Local variables
76      REAL qaer0(klon,klev,nqmax)
77      REAL prec(klon,5)
78
79      REAL rcloud(klon,klev,nrad),xfrac(klon,klev,4)
80
81      REAL vcl,nuc,xgsn,xmsn,xesn,xasn
82
83
84      ReAL gaz1(klon,klev),gaz2(klon,klev),gaz3(klon,klev)
85
86      REAL socccld
87
88c grandeurs en moyennes zonales
89      REAL zplev(klon,klev+1),zplay(klon,klev)
90      REAL zzlev(klon,klev+1),zzlay(klon,klev)
91      REAL ztemp(klon,klev), delpbar(klon,klev)
92      real temp_eq(klev),press_eq(klev)
93      REAL qaer0bar(klon,klev,nqmax)   ! et non nmicro... Permet nmicro=0.
94      REAL zdqmufi(klon,klev,nqmax)
95      REAL ychim(klon,klev,nqmax-nmicro)
96c La saturation n est calculee qu une seule fois: sauvegarde qysat
97c La chimie n est pas calculee tous les pas, il faut donc
98c                      sauvegarder les sorties de la chimie
99      REAL,save,allocatable :: qysat(:,:),pdyfi(:,:,:)
100     
101      character*10 nomqy(nqmax-nmicro+1)
102      integer      i,j,k,l,iq,ig0
103     
104c    indice des esp chimiques utilisees dans la microfi 
105      integer icldch4,icldc2h6,icldc2h2
106      save icldch4,icldc2h6,icldc2h2
107     
108      real fte,ftm,Lvch4
109
110      REAL tmp,ex,kmin,kmax,dqsq
111      REAL dqch4
112
113c======================================================================
114c======================================================================
115
116      if (firstcall) then
117       allocate(qysat(klev,nqmax-nmicro),pdyfi(klon,klev,nqmax-nmicro))
118
119c  -------- Quelques verifications au demarrage sur les tailles des tableaux.
120         IF (microfi.ge.1) then
121c        Faire de la microphysique sans traceurs... bon courage !
122           if (nmicro.le.0) then
123             print*,"aLeRtE cRiTiQuE !!!"
124             print*,"Vous faites de la microphysique sans traceurs"
125             print*,"microphysique..."
126             print*,"Je m'arrete et vous laisse reflechir !"
127             stop
128           endif
129c        Nombre de traceurs incompatibles avec la microphysique.
130           if ((nmicro.ne.ntype*nrad).and.(clouds.eq.1)) then
131             print*,"aLeRtE cRiTiQuE !!!"
132             print*,"Nb trac imcompatible avec la microphysique."
133             print*,nmicro,ntype*nrad
134             stop
135           endif
136           if ((nmicro.ne.nrad).and.(clouds.eq.0)) then
137             print*,"aLeRtE cRiTiQuE !!!"
138             print*,"Nb trac imcompatible avec la microphysique."
139             print*,nmicro,nrad
140             stop
141           endif
142         ENDIF
143
144      endif  ! firstcall
145
146c RAZ des sorties : les moyennes se font directement dans IOIPSL :
147c
148          flxesp_i(:,:,:) = 0.
149          tau_drop(:,:)   = 0.
150          tau_aer(:,:,:)  = 0.
151          solesp(:,:,:)   = 0.
152          precip(:,:)     = 0.   ! c'est uniquement une sortie en um/s
153c
154          prec(:,:)       = 0.   ! c'est la variable temporaire des precipitions de la microfi
155                                 ! prec est en m (metre precipitable)
156
157c-----------------------------------------------------------------------
158c   convertion moyennes zonales et changement d unites pour microphy
159c   ---------------------------------
160
161c     print*,'CONVERSION 2D ET CHANGEMENT UNITES (PHYTRAC)'
162
163c   -------------------
164c   Gestion de la temperature et de la pression :
165c   Utilisation des moyennes zonales:
166
167c   soit la chimie est active, soit la microphysique se fait en 2D.
168      IF (chimi.or.microfi.eq.1) THEN
169        zplev(:,:) = zplevbar(:,:)
170        zplay(:,:) = zplaybar(:,:)
171        zzlev(:,:) = zzlevbar(:,:)
172        zzlay(:,:) = zzlaybar(:,:)
173        ztemp(:,:) = ztfibar(:,:)
174        ychim = 0.0
175      ENDIF
176
177c  Si la microphysique est faite en 2D:
178      IF (microfi.eq.1) THEN
179        DO l=1,llm
180          DO i = 1, klon
181            delpbar(i,l) = zplevbar(i,l) - zplevbar(i,l+1)
182          ENDDO
183        ENDDO
184c   Traceurs microphysiques: passage en extensif: n/kg --> n/m^2
185        DO iq=1,nmicro
186         qaer(:,:,iq) = zqfibar(:,:,iq)*delpbar(:,:)/RG
187        DO l=1,klev
188          DO i = 1, klon
189              if (qaer(i,l,iq).lt.0.) then
190        print*,"NEGS ICI ICI !!!!",qaer(i,l,iq),i,l,iq
191                qaer(i,l,iq)=0.
192c          stop
193              endif
194              if (delpbar(i,l).lt.0.) then
195        print*,"NEGS DELP ICI !!!!",i,l,iq,delpbar(i,l)
196           stop
197              endif
198          ENDDO
199        ENDDO
200         qaer0(:,:,iq)= tr_seri(:,:,iq)*delp(:,:)/RG
201         qaer0bar(:,:,iq) = qaer(:,:,iq)
202        ENDDO
203      ENDIF
204
205c  Si la microphysique est faite en 3D:
206      IF (microfi.eq.2) THEN
207        zplev(:,:) = pplev(:,:)
208        zplay(:,:) = pplay(:,:)
209        zzlev(:,:) = pzlev(:,:)
210        zzlay(:,:) = pzlay(:,:)
211        ztemp(:,:) = ptemp(:,:)   
212c   Traceurs microphysiques: passage en extensif: n/kg --> n/m^2
213        DO iq=1,nmicro
214         qaer(:,:,iq) = tr_seri(:,:,iq)*delp(:,:)/RG
215         qaer0(:,:,iq)= tr_seri(:,:,iq)*delp(:,:)/RG
216        ENDDO
217      ENDIF
218
219      do l=1,llm
220         temp_eq  = tmoy
221         press_eq = playmoy/100. ! en mbar
222      enddo
223
224c   -------------------
225c    Extraction des gaz pour les nuages
226      IF ((microfi.ge.1).and.(clouds.eq.1)) THEN
227
228c     recuperation des indices des gaz qui nous interesse       
229      if (firstcall) then
230          icldch4=-1
231          icldc2h6=-1
232          icldc2h2=-1
233          do i=1,nqmax
234            if (tname(i).eq."CH4") then
235              icldch4=i
236c              ich4=i
237            elseif (tname(i).eq."C2H6") then
238              icldc2h6=i
239            elseif (tname(i).eq."C2H2") then
240              icldc2h2=i
241            endif
242          enddo
243          if (icldch4 .eq.-1 .or.
244     &        icldc2h6.eq.-1 .or.
245     &        icldc2h2.eq.-1 ) then
246            print*, "Sacrebleu !!!"
247            print*, "Vous voulez faire des nuages sans gaz."
248            print*, "Mais vous etes inconscient. Je vais m'arreter la"
249            print*, "pour vous laisser reflechir au probleme"
250            STOP
251          endif
252      endif      ! firstcall
253
254c     Saturation et fraction molaire CLOUD
255c     Calcul des saturations pour les esp chimique de la muphy des nuages.
256c     On le fait ici pour les sortir dans physiq.F sans avoir a surcharger la routine.
257c     Elles passent ensuite dans un common pour passer dans les I/O.
258
259        DO l=1,llm
260          DO i = 1, klon
261            call ch4sat(ptemp(i,l),pplay(i,l),tmp) !tmp en kg/kg !
262            satch4(i,l) = tr_seri(i,l,icldch4)/(tmp*28./16.)
263
264            call c2h6sat(ptemp(i,l),pplay(i,l),tmp)
265            satc2h6(i,l) =tr_seri(i,l,icldc2h6)/(tmp*28./30.)
266
267            call c2h2sat(ptemp(i,l),pplay(i,l),tmp)
268            satc2h2(i,l) =tr_seri(i,l,icldc2h2)/(tmp*28./26.)
269          ENDDO
270        ENDDO
271
272c   Copie des gaz (en 3D)  <== UNIQUEMENT SI ON FAIT DES NUAGES
273        if (moyzon_mu) then
274         gaz1(:,:) = zqfibar(:,:,icldch4)
275         gaz2(:,:) = zqfibar(:,:,icldc2h6)
276         gaz3(:,:) = zqfibar(:,:,icldc2h2)
277        else
278         gaz1(:,:) = tr_seri(:,:,icldch4)
279         gaz2(:,:) = tr_seri(:,:,icldc2h6)
280         gaz3(:,:) = tr_seri(:,:,icldc2h2)
281        endif
282       
283      endif      ! microfi.ge.1 + clouds.eq.1
284c   -------------------
285
286c AUTRES TRACEURS
287     
288      if (nqmax.gt.nmicro) then
289       do iq=nmicro+1,nqmax
290        if (moyzon_ch) then
291          ychim(:,:,iq-nmicro) = zqfibar(:,:,iq)
292        else
293          ychim(:,:,iq-nmicro) = tr_seri(:,:,iq)
294        endif
295        nomqy(iq-nmicro) = tname(iq)
296c        print*,iq-nmicro,nomqy(iq-nmicro)
297       enddo
298       nomqy(nqmax-nmicro+1) = "HV"
299      endif
300
301c-----------------------------------------------------------------------
302c   initialisation des qysat au premier appel:
303c   ---------------------------------
304
305c!! ATTENTION, qysat pris uniquement a l'equateur
306c!!  justifie puisque dans cette region, les var de t et p sont faibles...
307
308      if (firstcall .and. chimi .and.(nqmax.gt.nmicro)) then
309           call inicondens(nqmax-nmicro,press_eq,temp_eq,nomqy,qysat)
310      endif
311
312c-----------------------------------------------------------------------
313c     Appel de la microphysique   en 2D/3D !!!!!!
314c    --------------------------
315
316       IF(firstcall) THEN
317        print*,'MICROPHYSIQUE ',MICROFI
318       ENDIF
319
320c       call begintime(tt0)
321       IF (MICROFI.eq.0) THEN
322c        PAS DE MICROPHYSIQUE :
323         IF (firstcall) THEN
324          print*,'MICROPHYSIQUE OFF-LINE',MICROFI
325         ENDIF
326       ELSE
327         zdqmufi = 0.  ! ne sert que pour chimi pour condensation
328         call muphys(klon,
329     &        zplev,zplay,zzlev,zzlay,
330     &        ztemp,qaer,gaz1,gaz2,gaz3,
331     &        nmicro,ptimestep,
332     &        pmu0,pfract,
333c -------- sorties diagnostiques
334     &        flxesp_i,
335     &        tau_drop,tau_aer,
336     &        solesp,prec)
337
338c    NOTES :
339c    Ici toutes nos sorties sont des champs 3D...(meme les diagnostiques)
340c    On a rien a faire mis a part copier les dq dans les d_tr
341
342       ENDIF
343c       call endtime(tt0,tt1)
344c       ttmuphys=ttmuphys+tt1
345       
346c-----------------------------------------------------------------------
347c     Gestion des sources
348c    -------------
349c
350       IF (clouds.eq.1) THEN
351        IF (microfi.eq.1) THEN
352c        On repasse les gaz en 3D si on a fait de la microphysique en 2D
353         gaz1(:,:)=gaz1(:,:)*tr_seri(:,:,icldch4)/zqfibar(:,:,icldch4)
354         gaz2(:,:)=gaz2(:,:)*tr_seri(:,:,icldc2h6)/zqfibar(:,:,icldc2h6)
355         gaz3(:,:)=gaz3(:,:)*tr_seri(:,:,icldc2h2)/zqfibar(:,:,icldc2h2)
356        ENDIF
357c       Mise a jour du reservoir de CH4 (ie : seul le CH4 remplit le reservoir)
358        DO i=1,klon
359          reservoir(i) = reservoir(i)+prec(i,1)
360        ENDDO
361
362        CALL sources(klon,klev,ptimestep,z0,
363     &                pu,pv,pplev,pzlay,pzlev,
364     &                gaz1,gaz2,gaz3,
365     &                ftsol,evapch4,reservoir)
366 
367       ENDIF
368c-----------------------------------------------------------------------
369c     Condensation
370c    -------------
371
372      IF ((chimi).and.(nqmax.gt.nmicro)) then
373
374c   tendance (en /s) passee sur zdqmufi(nmicro+1 a nqmax)
375c        print*,'Condensation'
376
377        do iq=1,nqmax-nmicro
378           do l=1,llm
379              do j=1,klon
380                 if (ychim(j,l,iq).gt.qysat(l,iq)) then
381           zdqmufi(j,l,nmicro+iq)= (-ychim(j,l,iq)+qysat(l,iq)) !delta y
382     .                             / ptimestep                  ! / dt
383                 endif
384              enddo
385           enddo
386        enddo
387
388      ENDIF
389
390c!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
391c eventuellement, modif initiale de la compo
392c
393c   tendance (en /s) passee sur zdqmufi(nmicro+1 a nqmax)
394c
395c     if (firstcall .and. chimi .and.(nqmax.gt.nmicro)) then
396c!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
397c!!!remise de CH4 a 1.5%!!!!!!!!!!!!!!!!!!!!!!
398c!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
399c       do iq=1,nqmax-nmicro
400c         if (nomqy(iq).eq."CH4") then
401c          do l=1,llm
402c             do j=1,klon
403c                if (ychim(j,l,iq).le.0.015) then
404c          zdqmufi(j,l,nmicro+iq)= (-ychim(j,l,iq)+0.015) !delta y
405c    .                            / ptimestep                  ! / dt
406c                endif
407c             enddo
408c          enddo
409c         endif
410c       enddo
411c!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
412c         
413c!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
414c!!!remise de C2H2 a 1.e-5 max !!!!!!!!!!!!!
415c!!!remise de C2H6 a 3.e-5 max !!!!!!!!!!!!!
416c!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
417c       do iq=1,nqmax-nmicro
418c         if (nomqy(iq).eq."C2H2") then
419c          do l=1,llm
420c             do j=1,klon
421c                if (ychim(j,l,iq).gt.1.e-5) then
422c          zdqmufi(j,l,nmicro+iq)= (-ychim(j,l,iq)+1.e-5) !delta y
423c    .                            / ptimestep                  ! / dt
424c                endif
425c             enddo
426c          enddo
427c         endif
428c         if (nomqy(iq).eq."C2H6") then
429c          do l=1,llm
430c             do j=1,klon
431c                if (ychim(j,l,iq).gt.3.e-5) then
432c          zdqmufi(j,l,nmicro+iq)= (-ychim(j,l,iq)+3.e-5) !delta y
433c    .                            / ptimestep                  ! / dt
434c                endif
435c             enddo
436c          enddo
437c         endif
438c       enddo
439c!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
440c     endif
441c!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
442         
443c ----- commentaire de fin (mise a jour des profil de fraction molaire)
444         
445c-----------------------------------------------------------------------
446c     Appel de la chimie
447c    --------------------------
448
449      if((appkim.eq.1).and.(chimi)) then
450        print*,'On passe dans la CHIMIE'
451
452c       do iq=1,nqmax-nmicro
453c         if (nomqy(iq).eq."C2H2") then
454c           print*,"C2H2top=",ychim(:,klev,iq)
455c         endif
456c       enddo
457
458c Appel Chimie
459c ------------
460       CALL calchim(klon,nqmax-nmicro,ychim,nomqy,pdecli,lonsol,dtkim,
461     .              ztemp,zplay,zplev,zzlay,zzlev,
462     .              pdyfi)   
463c ychim ne doit pas etre modifie, pdyfi en /s
464         
465      endif
466     
467c-----------------------------------------------------------------------
468c   retour des tendances vers 3D
469c   ---------------------------------
470
471c     call WriteField_phy('phytrac_qaer01',qaer(:,:,1),klev)
472
473c===============================
474c TRACEURS MICROPHYSIQUES
475c                                       
476c===============================
477c ---> pas de microphysique
478       IF (microfi.eq.0) THEN
479         DO iq=1,nmicro
480           d_tr_mph(:,:,iq)=0.
481         ENDDO
482       ENDIF
483c===============================
484c ---> microphysique 2D
485c     IF (microfi.eq.1) THEN
486c        DO iq=1,nmicro
487c          DO l=1,llm
488c            DO i=1,klon
489c  on repasse le champ de traceurs en 3D (pas les tendances)
490c qaer est ce qui entre dans muphy, donc la moyenne zonale
491c qaer0 est la valeur initiale du champ
492c qaer0bar est la moyenne zonale initiale
493c la variation relative pour une bande de latitude est donc (qaer/qaer0bar)
494c la nouvelle valeur en un point (3D) est donc qaer0*(qaer/qaer0bar)
495c et la tendance: qaer0*(qaer/qaer0bar)-qaer0
496c    un petit patch :
497c    Si la moyenne zonale au depart est "nulle" :
498c    On a quand meme le droit de produire des traceurs dans la cellule.
499c    On considere donc que la valeur de sortie 3D correspond a la valeur de sortie 2D.
500c    Cela permet aussi entre autre d eviter les NaN pour les traceurs des nuages !
501c    (au dessus de la tropo pas de nuages donc qaer(nrad+1:ntype*nrad) = 0 !!!)
502c              IF (qaer0bar(i,l,iq).gt.1e-100) THEN
503c                  qaer(i,l,iq) = qaer0(i,l,iq) *
504c    &             qaer(i,l,iq)/qaer0bar(i,l,iq)
505c              ENDIF
506c        La tendance correspond a (qaer-qaer0)/ptimestep
507c              d_tr_mph(i,l,iq) = (qaer(i,l,iq)-qaer0(i,l,iq))/
508c    &                            ptimestep
509c            ENDDO
510c          ENDDO
511c        ENDDO
512c ---> microphysique 3D
513c      ELSEIF(microfi.gt.1) THEN
514c        DO iq=1,nmicro
515c          d_tr_mph(:,:,iq)=(qaer(:,:,iq)-qaer0(:,:,iq))/ptimestep
516c        ENDDO
517c      ENDIF   ! microfi
518
519c      DO iq=1,nmicro
520c  Traceurs microphysiques: passage en intensif: n/m^2 --> n/kg
521c        d_tr_mph(:,:,iq) = d_tr_mph(:,:,iq)*RG/delp(:,:)
522c      ENDDO
523
524c===============================
525c TOUT CE QUI EST AU-DESSUS NE MARCHE PAS: PLEIN DE NEGS...
526c CA MARCHE EN 3D, MAIS PAS EN MOY ZON...
527c===============================
528
529c ---> microphysique 2D
530      IF (microfi.eq.1) THEN
531         DO iq=1,nmicro
532           DO l=1,llm
533             DO i=1,klon
534c ici, qaer correspond a la moy zonale modifiee par la microphys.
535c  Traceurs microphysiques: passage en intensif: n/m^2 --> n/kg
536c en mettant ceci:
537               d_tr_mph(i,l,iq) = (qaer(i,l,iq)*RG/delpbar(i,l)
538     &                            -qaer0(i,l,iq)*RG/delp(i,l))/
539     &                            ptimestep
540c on remplace le champ 3D initial par la valeur modifiee de sa moyenne zonale
541c => on remet un champ uniforme en zonal...
542             ENDDO
543           ENDDO
544         ENDDO
545c ---> microphysique 3D
546       ELSEIF(microfi.gt.1) THEN
547         DO iq=1,nmicro
548           d_tr_mph(:,:,iq)=(qaer(:,:,iq)-qaer0(:,:,iq))/ptimestep
549c  Traceurs microphysiques: passage en intensif: n/m^2 --> n/kg
550           d_tr_mph(:,:,iq) = d_tr_mph(:,:,iq)*RG/delp(:,:)
551         ENDDO
552       ENDIF   ! microfi
553
554c===============================
555
556c AUTRES TRACEURS
557
558      if ((chimi).and.(nqmax.gt.nmicro)) then
559c on passe de pdyfi (tendance chimique en /s calculee quand chimie appelee)
560c          a  d_tr_kim (tendance chimique 3D en /s, passee a physiq)
561c  et de zdqmufi a d_tr_mph (tendance condensation 3D en /s passee a physiq)
562
563      DO iq=nmicro+1,nqmax
564         d_tr_kim(:,:,iq) = pdyfi(:,:,iq-nmicro)
565     &             *tr_seri(:,:,iq)/ychim(:,:,iq-nmicro)
566         d_tr_mph(:,:,iq) = zdqmufi(:,:,iq)
567     &             *tr_seri(:,:,iq)/ychim(:,:,iq-nmicro)
568      ENDDO
569
570      endif   ! chimi
571
572c--------------------------------------------------
573c  CONDENSATION VIA MICROFI
574c----------------------
575c La microphysique avec nuages doit se faire obligatoirement en 3D.  (FAUX ACTUELLEMENT)
576c Rien n empeche de faire la chimie en 2D. Cependant pour prendre en compte la
577c condensation due a la microfi (en 3D) on recalcule la tendance finale pour
578c les especes concernees (CH4, C2H6 pour le moment).
579       IF (microfi.ge.1.and.clouds.eq.1) THEN
580c     condensation CH4
581          d_tr_mph(:,:,icldch4) =(gaz1(:,:)-tr_seri(:,:,icldch4))
582     &                            /ptimestep
583c     condensation C2H6
584          d_tr_mph(:,:,icldc2h6)=(gaz2(:,:)-tr_seri(:,:,icldc2h6))
585     &                            /ptimestep
586c     condensation C2H2
587          d_tr_mph(:,:,icldc2h2)=(gaz3(:,:)-tr_seri(:,:,icldc2h2))
588     &                            /ptimestep
589       ENDIF
590
591c--------------------------------------------------
592c  MISE A JOUR CH4 : (pour refixer la fraction
593c                     molaire)
594c--------------------------------------------------
595c       IF (firstcall) THEN
596c         do i=1,klon
597c           do j=1,llm
598c             call ch4sat(ptemp(i,j),pplay(i,j),tmp) !tmp en kg/kg !
599c             tmp=0.95*0.85*tmp*28./16.
600c             if (pplay(i,j).lt.20000.) then
601c               dqch4 = 1.4e-2         
602c             else
603c               dqch4 = tmp
604c             endif
605c             d_tr_mph(i,j,icldch4)=(-tr_seri(i,j,icldch4)+dqch4)/
606c     &       ptimestep
607c           enddo
608c         enddo
609c         
610c       ENDIF
611
612c--------------------------------------------------
613c  CONVERSION PRECIPITATION :
614c  en microns/secondes
615c--------------------------------------------------
616        precip = prec * 1.e6 / ptimestep
617
618
619c--------------------------------------------------
620c CALCUL DU FLUX DE CHALEUR LATENTE D EVAPORATION
621c DU METHANE
622c--------------------------------------------------
623       IF (clouds.eq.1) THEN
624         DO i=1,klon
625           fte= (1.-ftsol(i)/305.5)
626           ftm= (1.-ftsol(i)/190.5)
627           if(ftm.le.1.e-3) ftm=1.e-3
628           if(fte.le.1.e-3) fte=1.e-3
629           Lvch4 =8.314*190.4*
630     &     (7.08*ftm**0.354+10.95*1.1e-2*ftm**0.456)
631     &     /mch4
632           ! evapch4 en m3/m2 {ok}
633           ! 425 en kg/m3
634           ! Lv en J/kg       {ok}
635           ! ptimestep en s   {ok}
636           fclat(i)=(evapch4(i)*Lvch4*rhoi_ch4)   ! en J/m2/s
637         ENDDO
638       ENDIF
639
640c--------------------------------------------------
641c  GESTION DES RAYONS DE GOUTTES POUR TR
642c--------------------------------------------------
643       IF (clouds.eq.1) THEN
644
645c Calcul du rayon des gouttes par bin ...
646c----------------------------------------
647         DO i=1,klon
648           DO j=1,klev
649             DO iq=1,nrad
650*      Rayon minimum selon la quantite de noyaux
651               IF (qaer(i,j,iq+nrad) .le. 1.e-5) THEN
652                 rcloud(i,j,iq) = 1.e-10
653               ELSE
654                 rcloud(i,j,iq)=
655     &           ((qaer(i,j,iq+2*nrad)/qaer(i,j,iq+nrad)+
656     &           qaer(i,j,iq+3*nrad)/qaer(i,j,iq+nrad) +
657     &           v_e(iq))*0.75/RPI)**(1./3.)
658               ENDIF
659             ENDDO
660           ENDDO
661         ENDDO
662
663c .... et de leur rayon moyen total (tt bins confondu)
664c------------------------------------------------------
665         DO i=1,klon
666           socccld=0.
667           DO j=klev,1,-1    !de haut en bas pour le calcul des opacites
668             vcl=0.
669             nuc=0.
670             xgsn=0.
671             xmsn=0.
672             xesn=0.
673             xasn=0.
674             DO iq=1,nrad
675               vcl=vcl+qaer(i,j,iq+2*nrad)+
676     &         qaer(i,j,iq+3*nrad)+
677     &         qaer(i,j,iq+4*nrad)+
678     &         v_e(iq)*qaer(i,j,iq+nrad)            ! volume des gouttes
679               nuc=nuc+qaer(i,j,iq+nrad)            ! nombre de noyaux
680               xgsn=xgsn+qaer(i,j,iq+nrad)*v_e(iq)  ! volume de noyaux
681               xmsn=xmsn+qaer(i,j,iq+2*nrad)        ! volume de methane
682               xesn=xesn+qaer(i,j,iq+3*nrad)        ! volume d' ethane
683               xasn=xasn+qaer(i,j,iq+4*nrad)        ! volume d' acethylene
684             ENDDO
685             IF (nuc .le.  1.e-5) THEN
686               rmcloud(i,j)=1.0e-10
687               xfrac(i,j,:)=0.
688             ELSE
689               IF(xgsn/vcl.lt.0.  .or. xgsn/vcl.gt.1.001)
690     &         print*, 'PB AVEC XFRAC:', i,j,xgsn,vcl
691               rmcloud(i,j)=          ! rayon moyen des gouttes
692     &         (vcl/nuc*0.75/RPI)**(1./3.)
693               xfrac(i,j,1)=xgsn/vcl         ! fraction volumique noyau/goutte
694               xfrac(i,j,2)=xmsn/vcl         ! fraction volumique CH4/goutte
695               xfrac(i,j,3)=xesn/vcl         ! fraction volumique C2H6/goutte
696               xfrac(i,j,4)=xasn/vcl         ! fraction volumique C2H2/goutte
697c              calcul du rayon moyen (moyenne temporelle)
698               rmcbar(i,j)=rmcbar(i,j)+rmcloud(i,j)
699               xfbar(i,j,:)=xfbar(i,j,:)+xfrac(i,j,:)
700               ncount(i,j) = ncount(i,j)+1
701             ENDIF
702             socccld=socccld+RPI*(rmcloud(i,j)**2.)*nuc
703             occcld(i,j)=socccld
704           ENDDO
705         ENDDO
706c
707c      OCCCLD
708c      Calcul le nombre d occurence d un nuage
709c      d opacite comprise en kmin et kmax
710c          k        kmin            kmax
711c          1   0.0000000      0.10000000   
712c          2  0.10000000      0.17782794   
713c          3  0.17782794      0.31622776   
714c          4  0.31622776      0.56234139   
715c          5  0.56234139       1.0000000   
716c          6   1.0000000       1.7782795   
717c          7   1.7782795       3.1622777   
718c          8   3.1622777       5.6234136   
719c          9   5.6234136       10.000000   
720c         10   10.000000       17.782795   
721c         11   17.782795       31.622778   
722c         12   31.622778       100000.00
723c
724c        mise a zero de occld_m
725         occcld_m=0.
726         DO i=1,klon
727           DO j=1,klev
728             DO k=1,12
729               ex=10.**(0.25)
730               kmin=0.
731               kmax=1.e5
732               if(k.ne.1)  kmin=0.1*ex**(k-2)
733               if(k.ne.12) kmax=0.1*ex**(k-1)
734               if(occcld(i,j).ge.kmin .and. occcld(i,j).lt.kmax)
735     &         occcld_m(i,j,k)=1.
736             ENDDO
737           ENDDO
738         ENDDO
739       ENDIF  ! fin condition clouds => pas besoin de calculer des rayons
740
741      RETURN
742      END
743
Note: See TracBrowser for help on using the repository browser.