source: trunk/LMDZ.VENUS/libf/phyvenus/cloudvenus/new_cloud_sedim.F @ 3556

Last change on this file since 3556 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: 14.7 KB
Line 
1      subroutine new_cloud_sedim(nbr_mode, n_lon, n_lev, ptimestep,
2     $                           pmidlay, pbndlay, pt, pq,
3     $                           d_tr_chem, pdqsed,
4     $                           nq, F_sed)
5
6      USE ioipsl
7      USE dimphy
8      USE chemparam_mod
9      IMPLICIT NONE
10
11c-----------------------------------------------------------------------
12c   declarations:
13c   -------------
14#include "YOMCST.h"     
15c#include "dimphys.h"
16c#include "comcstfi.h"
17c#include "tracer.h"
18c#include "callkeys.h"
19c
20c   arguments:
21c   ----------
22
23      INTEGER n_lon                 ! number of horizontal grid points
24      INTEGER n_lev                 ! number of atmospheric layers
25      integer nbr_mode
26      REAL ptimestep                ! physics time step (s)
27      REAL pmidlay(n_lon,n_lev)     ! pressure at middle layers (Pa)
28      REAL pt(n_lon,n_lev)          ! temperature at mid-layer (l)
29      REAL pbndlay(n_lon,n_lev+1)   ! pressure at layer boundaries
30
31c    Traceurs :
32      integer nq                    ! number of tracers
33      real pq(n_lon,n_lev,nq)       ! tracers (kg/kg)
34      real pdqsed(n_lon,n_lev,2)    ! tendency due to sedimentation (kg/kg)
35      real d_tr_chem(n_lon,n_lev,nq)! tendency due to chemistry and clouds (kg/kg)
36     
37c   local:
38c   ------
39      integer imode
40      integer ig
41      integer iq
42      integer l
43
44      real zlev(n_lon,n_lev+1)      ! altitude at layer boundaries
45      real zlay(n_lon,n_lev)        ! altitude at the midlle layer
46      real zqi_wv(n_lon,n_lev)      ! to locally store H2O tracer
47      real zqi_sa(n_lon,n_lev)      ! to locally store H2SO4 tracer
48      real m_lay (n_lon,n_lev)      ! Layer Pressure over gravity (Dp/g == kg.m-2)
49      real wq(n_lon,n_lev+1)        ! displaced tracer mass (kg.m-2)
50
51c    Physical constant
52c    ~~~~~~~~~~~~~~~~~
53c     Gas molecular viscosity (N.s.m-2)
54c      real,parameter :: visc=1.e-5       ! CO2
55      REAL :: VISCOSITY_CO2
56c     Effective gas molecular radius (m)
57      real,parameter :: molrad=2.2e-10   ! CO2
58     
59      REAL :: qmass
60c       masse volumique du coeur (kg.m-3)
61c     ATTENTION ! DOIT ETRE COHERENT AVEC new_cloud_venus !
62      REAL, PARAMETER :: rho_core = 2500.0
63
64      REAL, DIMENSION(n_lon,n_lev+1) :: wgt_SA   ! Fraction of H2SO4 in droplet local
65
66c     Stokes speed and sedimentation flux variable
67c     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
68
69      REAL :: A1,A2,A3,A4,            ! coeff du DL du Flux de sedimentation
70     + D_stokes,                      ! coeff de la vitesse de Stokes
71     + Rp_DL,                         ! "Point" du DL
72     + l_mean,                        ! libre parcours moyen (m)
73     + a,b_exp,c                      ! coeff du calcul du Flux de sedimentation
74      REAL, DIMENSION(n_lon,n_lev+1) ::
75     + F_sed                          ! Flux de sedimentation (kg.m-2.s-1 puis en output kg.m-2)
76     
77      REAL :: R_mode0                 ! Rayon mode 0 (m), rayon le plus frequent
78
79!      PRINT*,'RHO_DROPLET new_cloud_sedim.F'
80!      PRINT*,'rho_droplet',rho_droplet(16,21)
81!      PRINT*,'T',pt(16,21),'WSA',WH2SO4(16,21)
82
83c-----------------------------------------------------------------------
84c    1. Initialization
85c    -----------------
86   
87!     update water vapour and sulfuric acid mixing ratios
88
89      zqi_wv(:,:) = pq(:,:,i_h2oliq) + d_tr_chem(:,:,i_h2oliq)*ptimestep
90      zqi_sa(:,:) = pq(:,:,i_h2so4liq)
91     $            + d_tr_chem(:,:,i_h2so4liq)*ptimestep
92
93      wgt_SA(:,1:n_lev) = wh2so4(:,:)
94
95c     Init F_sed
96      F_sed(:,:) = 0.0E+0
97
98c     Au niveau top+1 , tout égal a 0     
99      wgt_SA(:,n_lev+1) = 0.0E+0   
100
101c    Computing the different layer properties
102c    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
103c    m_lay (kg.m-2)
104c    Ici g=8.87, conflit pour g entre #include "YOMCST.h"
105c       et #include "comcstfi.h"
106
107      do  l=1,n_lev
108         do ig=1, n_lon
109         m_lay(ig,l)=(pbndlay(ig,l) - pbndlay(ig,l+1)) /8.87E+0
110            IF (m_lay(ig,l).LE.0.0) THEN
111            PRINT*,'!!!! STOP PROBLEME SEDIMENTATION!!!!'
112            PRINT*,'!!!!          m_lay <= 0        !!!!'
113            PRINT*,'!!!! STOP PROBLEME SEDIMENTATION!!!!'
114            ENDIF
115         end do
116      end do
117       
118c         Computing sedimentation for droplet "tracer"
119c         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
120c           pbndlay(:,51)=0 (en parallèle c'est sûr), ne pas l'utiliser pour Fse
121       
122c     Sedimentation pour une gouttelette mode 3 de type J. Cimino, 1982, Icarus
123c     c.a.d 97% radius due a solide 3% radius acide sulfurique 
124        DO imode=1, nbr_mode - 1
125         DO l = cloudmin, cloudmax
126            DO ig=1,n_lon
127
128c     RD=1000.*RNAVO*RKBOL/RMD avec RMD=43.44 Masse molaire atm venus en g.mol-1     
129           D_stokes=((rho_droplet(ig,l)-pmidlay(ig,l)/(RD*pt(ig,l))))
130     &  *(2./9.)*(RG/VISCOSITY_CO2(pt(ig,l)))
131     
132           l_mean=(pt(ig,l)/pmidlay(ig,l))*
133     &  (0.707*R/(4.*RPI* molrad*molrad * RNAVO))
134     
135           R_mode0=R_MEDIAN(ig,l,imode)*
136     &     EXP(-LOG(STDDEV(ig,l,imode))**2.)
137              IF ((l_mean/(R_mode0)).GT.10.) THEN
138              Rp_DL=R_MEDIAN(ig,l,imode)*
139     &        EXP(3.*LOG(STDDEV(ig,l,imode))**2.)
140              ELSE
141              Rp_DL=R_MEDIAN(ig,l,imode)*
142     &        EXP(4.*LOG(STDDEV(ig,l,imode))**2.)
143              ENDIF
144               
145           a=1.246*l_mean
146       
147           c=0.87/l_mean
148       
149           b_exp=0.42*l_mean*EXP(-c*Rp_DL)
150       
151           A1=a+b_exp*(1.+c*Rp_DL
152     &  +0.5*(Rp_DL*c)**2
153     &  +1./6.*(Rp_DL*c)**3)
154     
155           A2=1.-b_exp*(c
156     &  +Rp_DL*c**2
157     &  +0.5*(Rp_DL**2)*(c**3))
158       
159           A3=0.5*b_exp*(c**2+Rp_DL*c**3)
160       
161           A4=-b_exp*1./6.*c**3
162
163c     Addition des Flux de tous les modes presents     
164       F_sed(ig,l)=F_sed(ig,l)+(rho_droplet(ig,l)*4./3.*RPI*
165     &  NBRTOT(ig,l,imode)*1.0E6*D_stokes*(
166     &  A1*R_MEDIAN(ig,l,imode)**4
167     &  *EXP(8.0*LOG(STDDEV(ig,l,imode))**2.)
168     &  +A2*R_MEDIAN(ig,l,imode)**5
169     &  *EXP(12.5*LOG(STDDEV(ig,l,imode))**2.)
170     &  +A3*R_MEDIAN(ig,l,imode)**6
171     &  *EXP(18.0*LOG(STDDEV(ig,l,imode))**2.)
172     &  +A4*R_MEDIAN(ig,l,imode)**7
173     &  *EXP(24.5*LOG(STDDEV(ig,l,imode))**2.)))
174     
175c      PRINT*,' APRES dTime: F_sed=',F_sed(ig,l), ig, l
176     
177        IF (F_sed(ig,l).GT.m_lay(ig,l)) THEN
178        PRINT*,'==============================================='
179        PRINT*,'WARNING On a epuise la couche', ig, l
180        PRINT*,'On epuise pas une couche avec une espèce
181     &   minoritaire, c est pas bien maaaaaal'
182            PRINT*,'Water',zqi_wv(ig,l),'Sulfuric Acid',zqi_sa(ig,l)
183        PRINT*,'F_sed:',F_sed(ig,l),'m_lay:',m_lay(ig,l)
184        PRINT*,'F_sed/dtphy',F_sed(ig,l)/ptimestep
185        PRINT*,'Pbnd top',pbndlay(ig,l+1),'Temp',pt(ig,l),'Rho',
186     &  rho_droplet(ig,l)
187                PRINT*,'Ntot',NBRTOT(ig,l,:)
188                PRINT*,'StdDev',STDDEV(ig,l,:),'Rmed',R_MEDIAN(ig,l,:)
189                PRINT*,'K_MASS',K_MASS(ig,l,:)
190                PRINT*,'WSA',WH2SO4(ig,l),'RHO',rho_droplet(ig,l)
191               
192c               ELSE
193c               
194c               PRINT*,'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
195c       PRINT*,'WARNING On a PAS epuise la couche', ig, l
196c       PRINT*,'F_sed:',F_sed(ig,l),'m_lay:',m_lay(ig,l)
197c       PRINT*,'F_sed/dtphy',F_sed(ig,l)/ptimestep
198c       PRINT*,'Pbnd top',pbndlay(ig,l+1),'Temp',pt(ig,l),'Rho',
199c     &         rho_droplet(ig,l)(ig,l)
200c               PRINT*,'Ntot',NBRTOT(ig,l),'Ntot m3',NBRTOT(ig,l)*1.0e6
201c               PRINT*,'StdDev',STDDEV(ig,l),'Rmed',R_MEDIAN(ig,l)
202            STOP               
203              ENDIF
204       
205           IF (F_sed(ig,l).LT.0.0d0) THEN
206              PRINT*,"F_sed est négatif !!!"
207              PRINT*,'F_sed:',F_sed(ig,l),'m_lay:',m_lay(ig,l)
208        PRINT*,'F_sed/dtphy',F_sed(ig,l)/ptimestep
209        PRINT*,'Pbnd top',pbndlay(ig,l+1),'Pmid',pmidlay(ig,l)
210        PRINT*,'Temp',pt(ig,l),'Rho',
211     &  rho_droplet(ig,l)
212                PRINT*,'Ntot',NBRTOT(ig,l,imode),'Ntot m3',
213     &  NBRTOT(ig,l,imode)*1.0e6
214                PRINT*,'StdDev',STDDEV(ig,l,imode),'Rmed',
215     &          R_MEDIAN(ig,l,imode)
216                PRINT*,'A1',A1,'A2',A2
217                PRINT*,'A3',A1,'A4',A2
218                PRINT*,'D_stokes',D_stokes
219                STOP
220           ENDIF
221           
222              ENDDO
223             
224c           ELSE           
225c           F_sed(:,l)=0.0d0           
226c           ENDIF
227           
228         ENDDO
229      ENDDO
230
231c****************************************************************
232c        On calcule le F_sed du mode 3 + coeff*(Fsed1 + Fsed2)
233c****************************************************************
234         DO l = cloudmin, cloudmax
235            DO ig=1,n_lon
236
237c       calcul de qmass
238            qmass=(rho_core*qrad**3)/
239     &    (rho_core*qrad**3+rho_droplet(ig,l)*(1.-qrad**3))
240
241c     RD=1000.*RNAVO*RKBOL/RMD avec RMD=43.44 Masse molaire atm venus en g.mol-1   
242           D_stokes=(((qmass*rho_core+(1.-qmass)*rho_droplet(ig,l))
243     &      -pmidlay(ig,l)/(RD*pt(ig,l))))
244     &  *(2./9.)*(RG/VISCOSITY_CO2(pt(ig,l)))
245     
246           l_mean=(pt(ig,l)/pmidlay(ig,l))*
247     &  (0.707*R/(4.*RPI* molrad*molrad * RNAVO))
248     
249           R_mode0=R_MEDIAN(ig,l,3)*
250     &     EXP(-LOG(STDDEV(ig,l,3))**2.)
251              IF ((l_mean/(R_mode0)).GT.10.) THEN
252              Rp_DL=R_MEDIAN(ig,l,3)*
253     &        EXP(3.*LOG(STDDEV(ig,l,3))**2.)
254              ELSE
255              Rp_DL=R_MEDIAN(ig,l,3)*
256     &        EXP(4.*LOG(STDDEV(ig,l,3))**2.)
257              ENDIF
258               
259           a=1.246*l_mean
260       
261           c=0.87/l_mean
262       
263           b_exp=0.42*l_mean*EXP(-c*Rp_DL)
264       
265           A1=a+b_exp*(1.+c*Rp_DL
266     &  +0.5*(Rp_DL*c)**2
267     &  +1./6.*(Rp_DL*c)**3)
268     
269           A2=1.-b_exp*(c
270     &  +Rp_DL*c**2
271     &  +0.5*(Rp_DL**2)*(c**3))
272       
273           A3=0.5*b_exp*(c**2+Rp_DL*c**3)
274       
275           A4=-b_exp*1./6.*c**3
276
277c     Addition des Flux de tous les modes presents     
278       F_sed(ig,l)=F_sed(ig,l)
279     &  +((1.-qmass)/(1.-qmass*K_MASS(ig,l,3)))*(
280     &  (qmass*rho_core+(1.-qmass)*rho_droplet(ig,l))*4./3.*RPI*
281     &  NBRTOT(ig,l,3)*1.0E6*D_stokes*(
282     &  A1*R_MEDIAN(ig,l,3)**4
283     &  *EXP(8.0*LOG(STDDEV(ig,l,3))**2.)
284     &  +A2*R_MEDIAN(ig,l,3)**5
285     &  *EXP(12.5*LOG(STDDEV(ig,l,3))**2.)
286     &  +A3*R_MEDIAN(ig,l,3)**6
287     &  *EXP(18.0*LOG(STDDEV(ig,l,3))**2.)
288     &  +A4*R_MEDIAN(ig,l,3)**7
289     &  *EXP(24.5*LOG(STDDEV(ig,l,3))**2.)))
290     
291c      PRINT*,' APRES dTime: F_sed=',F_sed(ig,l), ig, l
292     
293        IF (F_sed(ig,l).GT.m_lay(ig,l)) THEN
294        PRINT*,'==============================================='
295        PRINT*,'WARNING On a epuise la couche', ig, l
296        PRINT*,'On epuise pas une couche avec une espèce
297     &   minoritaire, c est pas bien maaaaaal'
298            PRINT*,'Water',zqi_wv(ig,l),'Sulfuric Acid',zqi_sa(ig,l)
299        PRINT*,'F_sed:',F_sed(ig,l),'m_lay:',m_lay(ig,l)
300        PRINT*,'F_sed/dtphy',F_sed(ig,l)/ptimestep
301        PRINT*,'Pbnd top',pbndlay(ig,l+1),'Temp',pt(ig,l),'Rho',
302     &  rho_droplet(ig,l)
303                PRINT*,'Ntot',NBRTOT(ig,l,:)
304                PRINT*,'StdDev',STDDEV(ig,l,:),'Rmed',R_MEDIAN(ig,l,:)
305                PRINT*,'K_MASS',K_MASS(ig,l,:)
306                PRINT*,'WSA',WH2SO4(ig,l),'RHO',rho_droplet(ig,l)
307               
308c               ELSE
309c               
310c               PRINT*,'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~'
311c       PRINT*,'WARNING On a PAS epuise la couche', ig, l
312c       PRINT*,'F_sed:',F_sed(ig,l),'m_lay:',m_lay(ig,l)
313c       PRINT*,'F_sed/dtphy',F_sed(ig,l)/ptimestep
314c       PRINT*,'Pbnd top',pbndlay(ig,l+1),'Temp',pt(ig,l),'Rho',
315c     &         rho_droplet(ig,l)(ig,l)
316c               PRINT*,'Ntot',NBRTOT(ig,l),'Ntot m3',NBRTOT(ig,l)*1.0e6
317c               PRINT*,'StdDev',STDDEV(ig,l),'Rmed',R_MEDIAN(ig,l)
318            STOP               
319              ENDIF
320       
321           IF (F_sed(ig,l).LT.0.0d0) THEN
322              PRINT*,"F_sed est négatif !!!"
323              PRINT*,'F_sed:',F_sed(ig,l),'m_lay:',m_lay(ig,l)
324        PRINT*,'F_sed/dtphy',F_sed(ig,l)/ptimestep
325        PRINT*,'Pbnd top',pbndlay(ig,l+1),'Pmid',pmidlay(ig,l)
326        PRINT*,'Temp',pt(ig,l),'Rho',
327     &  rho_droplet(ig,l)
328                PRINT*,'Ntot',NBRTOT(ig,l,imode),'Ntot m3',
329     &  NBRTOT(ig,l,imode)*1.0e6
330                PRINT*,'StdDev',STDDEV(ig,l,imode),'Rmed',
331     &          R_MEDIAN(ig,l,imode)
332                PRINT*,'A1',A1,'A2',A2
333                PRINT*,'A3',A1,'A4',A2
334                PRINT*,'D_stokes',D_stokes
335                STOP
336           ENDIF
337           
338              ENDDO
339             
340c           ELSE           
341c           F_sed(:,l)=0.0d0           
342c           ENDIF
343           
344         ENDDO
345
346c     Passage du Flux au Flux pour un pas de temps (== kg.m-2)     
347
348      F_sed(:,:) = F_sed(:,:)*ptimestep
349
350!=========================================================
351!     compute tendency due to sedimentation
352!=========================================================
353
354!     h2so4
355
356      do l = 1,n_lev
357         do ig = 1,n_lon
358            zqi_sa(ig,l) = zqi_sa(ig,l)
359     $                   + (F_sed(ig,l+1)*wgt_SA(ig,l+1)
360     $                    - F_sed(ig,l)*wgt_SA(ig,l))/m_lay(ig,l)
361!           if (zqi_sa(ig,l) < 0.) THEN
362!              print*,'STOP sedim on epuise tout le H2SO4l present'
363!              print*,'point ',ig,'level ',l
364!              print*,'zqi_sa = ', zqi_sa(ig,l)
365!              STOP
366!              zqi_sa(ig,l) = 0.
367!           end if
368            zqi_sa(ig,l) = max(zqi_sa(ig,l), 0.)
369            pdqsed(ig,l,1) = zqi_sa(ig,l) - pq(ig,l,i_h2so4liq)
370         end do
371      end do
372
373!     h2o
374                     
375      do l = 1, n_lev
376         do ig=1,n_lon
377            zqi_wv(ig,l) = zqi_wv(ig,l)
378     $                   + (F_sed(ig,l+1)*(1. - wgt_SA(ig,l+1))
379     &                    - F_sed(ig,l)*(1. - wgt_SA(ig,l)))
380     &                    /m_lay(ig,l)
381!           if (zqi_wv(ig,l) < 0.) THEN
382!              print*,'STOP sedim on epuise tout le H2Ol present'
383!              print*,'point ',ig,'level ',l
384!              print*,'zqi_wv = ', zqi_wv(ig,l)
385!              STOP
386!              zqi_wv(ig,l) = 0.
387!           end if
388            zqi_wv(ig,l) = max(zqi_wv(ig,l), 0.)
389            pdqsed(ig,l,2) = zqi_wv(ig,l) - pq(ig,l,i_h2oliq)
390         end do
391      end do
392
393c               Save output file in 1D model
394c               ============================
395c      IF (n_lon .EQ. 1) THEN
396c      PRINT*,'Save output sedim'       
397c      DO l = 1, n_lev
398c       DO ig=1,n_lon
399c       WRITE(77,"(i4,','11(e15.8,','))") l,pdqsed(ig,l),zqi(ig,l),
400c     &         (WH2SO4(ig,l)*pq(ig,l,i_h2so4liq)+
401c     &         (1.-WH2SO4(ig,l))*pq(ig,l,i_h2oliq)),
402c     &         pq(ig,l,i_h2so4liq),pq(ig,l,i_h2oliq)
403c      ENDDO
404c       ENDDO
405c      ENDIF   
406
407      RETURN
408      END
409
410*******************************************************************************
411      REAL FUNCTION VISCOSITY_CO2(temp)
412c       Aurélien Stolzenbach 2015
413c       Calcul de la viscosité dynamique du CO2 80°K -> 300°K
414c       Viscosité dynamique en Pa.s
415c       Source: Johnston & Grilly (1942)
416
417c       température en °K
418        REAL, INTENT(IN) :: temp
419       
420        REAL :: denom, numer
421       
422c       Calcul de la viscosité dynamique grâce à la formule de Jones (Lennard-Jones (1924))
423       
424        numer = 200.**(2.27/4.27)-0.435
425        denom = temp**(2.27/4.27)-0.435
426       
427        VISCOSITY_CO2 = (numer/denom)*1015.*(temp/200.)**(3./2.)
428
429c       convertion de Poises*1e7 -> Pa.s       
430        VISCOSITY_CO2 = VISCOSITY_CO2*1.e-8     
431
432      END FUNCTION VISCOSITY_CO2
433*******************************************************************************
434
435
Note: See TracBrowser for help on using the repository browser.