source: trunk/LMDZ.VENUS/libf/phyvenus/cloudvenus/new_cloud_venus.F @ 3567

Last change on this file since 3567 was 3323, checked in by flefevre, 8 months ago

1) revised cloud microphysical parameters (this changes the results)
2) the number of modes is passed as an argument to cloud routines (this does not change the results)
3) some cosmetics to chemparam_mod.F90 (this does not change the results)

  • Property svn:executable set to *
File size: 13.7 KB
RevLine 
[1305]1!******************************************************************************
2!*     venus_SAS_composition SUBROUTINE
3!*     modified from
4!*     PROGRAM PSC_MODEL_E
[1442]5!*     by A. Määttänen
[1305]6!*     subroutine for LMDZ+photochemistry VENUS
7!*     by A. Stolzenbach
8!*
9!*     Input/Output files:
10!*     -------------------
11!*
12!----------------------------------------------------------------------------
[3323]13      SUBROUTINE new_cloud_venus(nbr_mode,
[1442]14     + nblev, nblon,
15     + TT,PP,
[1305]16     + mrt_wv,mrt_sa,
[1442]17     + mr_wv,mr_sa)
[1305]18
19      USE chemparam_mod
20      IMPLICIT NONE
[1639]21
22#include "YOMCST.h"
23
[3323]24      integer :: nbr_mode
[1442]25      INTEGER, INTENT(IN) :: nblon  ! nombre de points horizontaux
26      INTEGER, INTENT(IN) :: nblev  ! nombre de couches verticales
[1639]27
[1305]28!----------------------------------------------------------------------------
29!     Ambient air state variables:
[1442]30      REAL, INTENT(IN), DIMENSION(nblon,nblev) :: mrt_wv,mrt_sa,
31     +                                            TT,PP
32      REAL, INTENT(INOUT), DIMENSION(nblon,nblev) :: mr_wv,mr_sa
[1305]33!----------------------------------------------------------------------------
[1442]34      INTEGER :: ilon, ilev, imode
35!----------------------------------------------------------------------------
[1305]36!     Thermodynamic functions:
[1661]37      REAL :: ROSAS
[1442]38!----------------------------------------------------------------------------
39!     Auxilary variables:
40      REAL :: NH2SO4,NH2O
41      REAL :: H2SO4_liq,H2O_liq
42      REAL :: CONCM
43      REAL :: MCONDTOT
44      REAL :: RMODE
45      REAL :: WSAFLAG
46      REAL :: K_SAV
47!----------------------------------------------------------------------------
48!     Ridder's Method variables:
49      REAL :: WVMIN, WVMAX, WVACC
[1639]50
[1442]51      INTEGER :: NBROOT
[1639]52
[1442]53      INTEGER :: MAXITE
54      PARAMETER(MAXITE=20)
55
56      INTEGER :: NBRAC
[1639]57      PARAMETER(NBRAC=5)
58
[1442]59      INTEGER :: FLAG
[3323]60     
[1639]61      REAL :: qmass
62c       masse volumique du coeur (kg.m-3)
[1687]63c     ATTENTION ! DOIT ETRE COHERENT AVEC new_cloud_sedim !
[1639]64      REAL, PARAMETER :: rho_core = 2500.0
[1305]65!----------------------------------------------------------------------------
[1442]66!     External functions needed:
67      REAL :: IRFRMWV
[1639]68!----------------------------------------------------------------------------
[1305]69
[1639]70
[1305]71! >>> Program starts here:
72
73!AM Venus
[1442]74! These aerosols will then be given an equilibrium composition for the given size distribution
[1305]75
[1639]76  ! Hanna Vehkamäki and Markku Kulmala and Ismo Napari
[1305]77  ! and Kari E. J. Lehtinen and Claudia Timmreck and Madis Noppel and Ari Laaksonen, 2002,
[1639]78  ! An improved parameterization for sulfuric acid/water nucleation rates for tropospheric
[1442]79  !and stratospheric conditions, () J. Geophys. Res., 107, PP. 4622-4631
[1305]80
[1442]81!===========================================
82!     Debut boucle sur niveau et lat,lon
83!===========================================
84!     Init, tous les points=0, cela met les niveaux > cloudmax et < cloudmin a 0
85      NBRTOT(:,:,:)=0.0E+0
86      WH2SO4(:,:)=0.0E+0
87      rho_droplet(:,:)=0.0E+0
[1639]88
[1442]89      DO ilev=cloudmin, cloudmax
[1639]90      DO ilon=1, nblon
91
[1442]92!       Boucle sur les modes
93        RMODE=0.0E+0
94        K_SAV = 0.0
[1639]95
[1442]96        DO imode=1, nbr_mode
97          IF (K_MASS(ilon,ilev,imode).GT.K_SAV) THEN
98!       RMODE est le rayon modal de la distribution en volume du mode le plus
99!       representatif pour la Mtot
100            RMODE=R_MEDIAN(ilon,ilev,imode)*
101     &      EXP(2.*(DLOG(STDDEV(ilon,ilev,imode))**2.))
102            K_SAV=K_MASS(ilon,ilev,imode)
103          ENDIF
104        ENDDO ! FIN boucle imode
[1305]105
[1442]106!       Initialisation des bornes pour WV
107        WVMIN=1.E-90
108        WVMAX=mrt_wv(ilon,ilev)
[1305]109
[1442]110!       Accuracy de WVeq
111        WVACC=WVMAX*1.0E-3
[1639]112
[1442]113!       BRACWV borne la fonction f(WV) - WV = 0
114!       de WV=0 à WV=WVtot on cherche l'intervalle où f(WV) - WV = 0
[1639]115!       avec précisément f(WVliq de WSA<=WVinput) + WVinput - WVtot = 0
[1442]116!       Elle fait appel à la fct/ssrtine ITERWV()
[1639]117
[1667]118        CALL BRACWV(TT(ilon,ilev),PP(ilon,ilev),WVMIN,WVMAX,NBRAC,
119     &  RMODE,mrt_wv(ilon,ilev),mrt_sa(ilon,ilev),FLAG,WSAFLAG,NBROOT)
[1639]120
[1442]121        SELECT CASE(FLAG)
[1639]122
123        CASE(1)
124!         Cas NROOT=1 ou NROOT>1 mais dans un intervalle restreint WVTOT (cas courant)
125!       IRFRMWV Ridder's method pour trouver, sur [WVmin,WVmax], WVo tel que f(WVo) - WVo = 0
[1442]126!       Elle fait appel ˆ la fct/ssrtine ITERWV()
[1639]127
[1667]128          WH2SO4(ilon,ilev)=IRFRMWV(TT(ilon,ilev),PP(ilon,ilev),
129     &    WVMIN,WVMAX,WVACC,MAXITE,RMODE,
[1639]130     &    mrt_wv(ilon,ilev),mrt_sa(ilon,ilev),NBROOT)
[1305]131
[1661]132          rho_droplet(ilon,ilev)=ROSAS(TT(ilon,ilev),WH2SO4(ilon,ilev))
[1305]133
[1442]134!          IF (rho_droplet(ilon,ilev).LT.1100.) THEN
135!            PRINT*,'PROBLEM RHO_DROPLET'
136!            PRINT*,'rho_droplet',rho_droplet(ilon,ilev)
137!            PRINT*,'T',TT(ilon,ilev),'WSA',WH2SO4(ilon,ilev)
[1661]138!            PRINT*,'RHODROPLET',ROSAS(TT(ilon,ilev),WH2SO4(ilon,ilev))
[1442]139!            PRINT*,'FLAG',FLAG,'NROOT',NBROOT
140!            STOP
141!          ENDIF
[1639]142
[1442]143          CONCM= PP(ilon,ilev)/(1.3806488E-23*TT(ilon,ilev)) !air number density, molec/m3
[1305]144
[1639]145              NH2SO4=mrt_sa(ilon,ilev)*CONCM
146              NH2O=mrt_wv(ilon,ilev)*CONCM
[1305]147
[1442]148          CALL CALCM_SAT(NH2SO4,NH2O,WH2SO4(ilon,ilev),
149     &       rho_droplet(ilon,ilev),TT(ilon,ilev),
150     &       H2SO4_liq,H2O_liq,MCONDTOT)
[1305]151
[1442]152!       Boucle sur les modes
[1639]153! *********************************************
154!       AVEC MODE 3 type J. Cimino 1982, Icarus
155! *********************************************
156!       Mode 1 et 2 avec les Kmass modifies
157          DO imode=1, nbr_mode-1
158!           calcul qmass
159              qmass = (rho_core*qrad**3)/
160     &      (rho_core*qrad**3 + rho_droplet(ilon,ilev)*(1.-qrad**3))
161
162            IF (K_MASS(ilon,ilev,imode).GT.0.) THEN
[1442]163              NBRTOT(ilon,ilev,imode)= 1.E-6*3./(4.*RPI)*
[1639]164     &        K_MASS(ilon,ilev,imode)/(1.-qmass*K_MASS(ilon,ilev,3))*
165     &        MCONDTOT*EXP(-4.5*DLOG(STDDEV(ilon,ilev,imode))**2.)/
[1442]166     &        (R_MEDIAN(ilon,ilev,imode)**3.)
167            ELSE
168              NBRTOT(ilon,ilev,imode)=0.0E+0
[1639]169            ENDIF
170          ENDDO
171!       Mode 3 reste identique car on veut le N correspondant aux mesures de Knollenberg
172          IF (K_MASS(ilon,ilev,3).GT.0.) THEN
173            NBRTOT(ilon,ilev,3)= 1.E-6*3./(4.*RPI)*
174     &      K_MASS(ilon,ilev,3)*MCONDTOT*
175     &      EXP(-4.5*DLOG(STDDEV(ilon,ilev,3))**2.)/
176     &      (R_MEDIAN(ilon,ilev,3)**3.)
177          ELSE
178              NBRTOT(ilon,ilev,3)=0.0E+0
179          ENDIF
[1305]180
[1442]181!       Passage de #/m3 en VMR
182          H2O_liq=H2O_liq/CONCM
183          H2SO4_liq=H2SO4_liq/CONCM
184
185          mr_wv(ilon,ilev)=mrt_wv(ilon,ilev)-H2O_liq
186          mr_sa(ilon,ilev)=mrt_sa(ilon,ilev)-H2SO4_liq
[1639]187
[1442]188!          Problemes quand on a condense tout, on peut obtenir des -1e-24
189!               aprs la soustraction et conversion de ND ˆ VMR
[1639]190          IF (mr_wv(ilon,ilev).LE.0.0) mr_wv(ilon,ilev)=1.0E-30
[1442]191          IF (mr_sa(ilon,ilev).LE.0.0) mr_sa(ilon,ilev)=1.0E-30
192
193
194
195        CASE(2)
[1639]196!       Cas NROOT=0 mais proche de 0
[1442]197
198          WH2SO4(ilon,ilev)=WSAFLAG
[1639]199
[1661]200          rho_droplet(ilon,ilev)=ROSAS(TT(ilon,ilev),WH2SO4(ilon,ilev))
[1442]201
202!     ATTENTION ce IF ne sert a rien en fait, juste a retenir une situation
203!     ubuesque dans mon code ou sans ce IF les valeurs de rho_droplets sont
[1639]204!     incoherentes avec TT et WH2SO4 (a priori lorsque NTOT=0)
[1442]205!     Juste le fait de METTRE un IF fait que rho_droplet a la bonne valeur
[1661]206!     donne par ROSAS (cf test externe en Python), sinon, la valeur est trop
[1639]207!     basse (de l'ordre de 1000 kg/m3) et correspond parfois a la valeur avec
208!     WSA=0.1 (pas totalement sur)
[1442]209!     En tous cas, incoherent avec ce qui est attendue pour le WSA et T donneeŽ
[1639]210!     La version avec le IF (rho<1100 & WSA>0.1) est CORRECTE, rho_droplet a
[1442]211!     la bonne valeur (tests externes Python confirment)
[1639]212
[1442]213          IF ((rho_droplet(ilon,ilev).LT.1100.).AND.
214     &      (WH2SO4(ilon,ilev).GT.0.1))THEN
215            PRINT*,'PROBLEM RHO_DROPLET'
216            PRINT*,'rho_droplet',rho_droplet(ilon,ilev)
217            PRINT*,'T',TT(ilon,ilev),'WSA',WH2SO4(ilon,ilev)
[1661]218            PRINT*,'RHODROPLET',ROSAS(TT(ilon,ilev),WH2SO4(ilon,ilev))
[1442]219            PRINT*,'FLAG',FLAG,'NROOT',NBROOT
220            STOP
[1639]221          ENDIF
222
223
[1442]224          CONCM= PP(ilon,ilev)/(1.3806488E-23*TT(ilon,ilev)) !air number density, molec/m3
225
226            NH2SO4=mrt_sa(ilon,ilev)*CONCM
227            NH2O=mrt_wv(ilon,ilev)*CONCM
228
229          CALL CALCM_SAT(NH2SO4,NH2O,WH2SO4(ilon,ilev),
230     &       rho_droplet(ilon,ilev),TT(ilon,ilev),
231     &       H2SO4_liq,H2O_liq,MCONDTOT)
232
233!       Boucle sur les modes
[1639]234! *********************************************
235!       AVEC MODE 3 type J. Cimino 1982, Icarus
236! *********************************************
237!       Mode 1 et 2 avec alcul coeff*Kmass
238          DO imode=1, nbr_mode-1
239!           calcul qmass
240              qmass = (rho_core*qrad**3)/
241     &      (rho_core*qrad**3 + rho_droplet(ilon,ilev)*(1.-qrad**3))
242
243            IF (K_MASS(ilon,ilev,imode).GT.0.) THEN
[1442]244              NBRTOT(ilon,ilev,imode)= 1.E-6*3./(4.*RPI)*
[1639]245     &        K_MASS(ilon,ilev,imode)/(1.-qmass*K_MASS(ilon,ilev,3))*
246     &        MCONDTOT*EXP(-4.5*DLOG(STDDEV(ilon,ilev,imode))**2.)/
[1442]247     &        (R_MEDIAN(ilon,ilev,imode)**3.)
248            ELSE
249              NBRTOT(ilon,ilev,imode)=0.0E+0
[1639]250            ENDIF
251          ENDDO
252!       Mode 3 reste identique car on veut le N correspondant aux mesures de Knollenberg
253          IF (K_MASS(ilon,ilev,3).GT.0.) THEN
254            NBRTOT(ilon,ilev,3)= 1.E-6*3./(4.*RPI)*
255     &      K_MASS(ilon,ilev,3)*MCONDTOT*
256     &      EXP(-4.5*DLOG(STDDEV(ilon,ilev,3))**2.)/
257     &      (R_MEDIAN(ilon,ilev,3)**3.)
258          ELSE
259              NBRTOT(ilon,ilev,3)=0.0E+0
260          ENDIF
[1442]261
[1639]262
[1442]263!       Passage de #/m3 en VMR
264          H2O_liq=H2O_liq/CONCM
265          H2SO4_liq=H2SO4_liq/CONCM
266
267          mr_wv(ilon,ilev)=mrt_wv(ilon,ilev)-H2O_liq
268          mr_sa(ilon,ilev)=mrt_sa(ilon,ilev)-H2SO4_liq
[1639]269
[1442]270!          Problmes quand on a condense tout, on peut obtenir des -1e-24
271!               aprs la soustraction et conversion de ND ˆ VMR
[1639]272          IF (mr_wv(ilon,ilev).LE.0.0) mr_wv(ilon,ilev)=1.0E-30
[1442]273          IF (mr_sa(ilon,ilev).LE.0.0) mr_sa(ilon,ilev)=1.0E-30
[1639]274
[1442]275        CASE(3)
[1639]276!         Cas 0 NROOT
[1442]277            mr_wv(ilon,ilev)=mrt_wv(ilon,ilev)
278            mr_sa(ilon,ilev)=mrt_sa(ilon,ilev)
279            rho_droplet(ilon,ilev)=0.0E+0
280            WH2SO4(ilon,ilev)=0.0E+0
281            DO imode=1, nbr_mode
[1639]282              NBRTOT(ilon,ilev,imode)=0.0E+0
283            ENDDO
[1442]284
[1639]285        END SELECT
286      ENDDO   !FIN boucle ilon
287      ENDDO   !FIN boucle ilev
288
[1442]289      END SUBROUTINE new_cloud_venus
[1639]290
291
[1305]292!******************************************************************
[1442]293      SUBROUTINE CALCM_SAT(H2SO4,H2O,WSA,DENSO4,
294     + T,H2SO4COND,H2OCOND,RMTOT)
[1305]295
[1639]296!     DERIVE NO (TOTAL NUMBER OF AEROSOL PARTICLES CONCENTRATION)
297!     FROM TOTAL H2SO4 AND RMOD/SIGMA OF AEROSOL LOG-NORMAL
[1305]298!                                       SIZE DISTRIBTUION
[1442]299!     ASSUMING ALL THE H2SO4 ABOVE MIXTURE SAT PRESSURE modified by H2SO4 activity IS CONDENSED
[1305]300!    ---------------------------------------------------------------
301!     INPUT:
[1442]302!     H2SO4: #/m3 of total H2SO4
303!       H2O  : #/m3 of total H2O
304!     WSA: aerosol H2SO4 weight fraction (fraction)
305!     DENSO4: aerosol volumic mass (kg/m3 = aerosol mass/aerosol volume)
306!       for total mass, almost same result with ro=1.67 gr/cm3
[1305]307!     RSTDEV: standard deviation of aerosol distribution (no unit)
[1442]308!     RADIUS: MEDIAN radius (m)
[1305]309!     T: temperature (K)
310!
[1639]311!     OUTPUT:
[1442]312!     RMTOT: Total condensed "Mass" (M_tot_distrib / rho_droplet), sans dimension
[1639]313!            mais rho_droplet et M_tot_distrib doivent etre de meme dimension
[1305]314!       H2OCOND
315!       H2SO4COND
316
[1442]317
[1639]318
[1305]319      IMPLICIT NONE
320
[1442]321      REAL, INTENT(IN) :: H2SO4, H2O, WSA
322      REAL, INTENT(IN) :: DENSO4, T
323      REAL, INTENT(OUT) :: H2OCOND, H2SO4COND, RMTOT
[1305]324!     working variables
[1442]325      REAL :: RMH2S4
326      REAL :: DND2,pstand,lpar,acidps
327      REAL :: x1, satpacid
[1305]328      REAL , DIMENSION(2):: act
329!
[1442]330!     masse of an H2SO4 molecule (kg)
331      RMH2S4=98.078/(6.02214129E+26)
[1639]332
[1442]333      pstand=1.01325E+5 !Pa  1 atm pressure
[1305]334
[1442]335        x1=(WSA/98.08)/(WSA/98.08 + ((1.-WSA)/18.0153))
[1305]336
337        call zeleznik(x1,t,act)
338
339!pure acid satur vapor pressure
340        lpar= -11.695+DLOG(pstand) ! Zeleznik
341        acidps=1/360.15-1.0/t+0.38/545.
342     + *(1.0+DLOG(360.15/t)-360.15/t)
343        acidps = 10156.0*acidps +lpar
344        acidps = DEXP(acidps)    !Pa
345
[1442]346!acid sat.vap.PP over mixture (flat surface):
[1639]347        satpacid=act(2)*acidps ! Pa
[1305]348
349!       Conversion from Pa to N.D #/m3
[1442]350        DND2=satpacid/(1.3806488E-23*T)
[1305]351!       Conversion from N.D #/m3 TO #/cm3
[1442]352!        DND2=DND2*1.d-6
[1639]353
[1442]354!       H2SO4COND N.D #/m3 condensee ssi H2SO4>H2SO4sat
[1305]355        IF (H2SO4.GE.DND2) THEN
356        H2SO4COND=H2SO4-DND2
357!       calcul de H2O cond correspondant a H2SO4 cond
[1442]358        H2OCOND=H2SO4COND*98.078*(1.0-WSA)/(18.0153*WSA)
[1305]359
[1639]360!     RMTOT: = Mass of H2SO4 satur per m3 of air/ Mass of sulfuric acid part of droplet solution per m3
361!     RMTOT = Mtot/rho_droplet
[1305]362!       RMTOT=M_distrib/rho_droplet
[1639]363
[1442]364        RMTOT=H2SO4COND*RMH2S4/(DENSO4*WSA)
[1305]365
366!       Si on a H2SO4<H2SO4sat on ne condense rien et NDTOT=0
367        ELSE
[1442]368        H2SO4COND=0.0E+0
369        H2OCOND=0.0E+0
370        RMTOT=0.0E+0
[1305]371        END IF
[1639]372
[1305]373!       Test si H2O en defaut H2Ocond>H2O dispo
[1442]374        IF ((H2OCOND.GT.H2O).AND.(H2SO4.GE.DND2)) THEN
375
376!     Si H2O en dŽfaut, on as pas le bon WSA!
377!     En effet, normalement, on a exactement le WSA correspondant a
378!     WVg + WVl = WVtot
379!     Dans les cas o WVtot, SAtot sont trs faibles (Upper Haze) ou
380!     quand T est grand (Lower Haze), le modle reprŽsente mal le WSA
381!     cf carte NCL, avec des max erreur absolue de 0.1 sur le WSA
382
383!      PRINT*,'PROBLEM H2O EN DEFAUT'
384!      PRINT*,'H2OCOND',H2OCOND,'H2O',H2O
385!      PRINT*,'WSA',WSA,'RHO',DENSO4
386!      STOP
[1639]387
388
[1305]389!       On peut alors condenser tout le H2O dispo
390        H2OCOND=H2O
391!       On met alors egalement a jour le H2SO4 cond correspondant au H2O cond
[1442]392        H2SO4COND=H2OCOND*18.0153*WSA/(98.078*(1.0-WSA))
[1639]393
394!     RMTOT: = Mass of H2SO4 satur per m3 of air/ Mass of sulfuric acid part of droplet solution per m3
395!       RMTOT=Volume of aerosol m3 /m3 of air
396!       Volume of aerosol/m3 air
397
[1442]398        RMTOT=H2SO4COND*RMH2S4/(DENSO4*WSA)
[1639]399
[1305]400      END IF
[1639]401
[1442]402      END SUBROUTINE CALCM_SAT
[1305]403
Note: See TracBrowser for help on using the repository browser.