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

Last change on this file since 1704 was 1687, checked in by slebonnois, 8 years ago

SL: bugs corrections outputs/clouds_AStol/upper_atmosphere/start2archive

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