source: LMDZ5/trunk/libf/phylmd/StratAer/aer_sedimnt.F90 @ 2720

Last change on this file since 2720 was 2690, checked in by oboucher, 8 years ago

Adding a module for stratospheric aerosols with a bin scheme.
The module gets activated with -strataer true compiling option.
May not quite work yet, more testing needed, but should not affect
the rest of LMDz as everything is under a CPP_StratAer key.

File size: 5.0 KB
RevLine 
[2690]1SUBROUTINE AER_SEDIMNT(pdtphys, t_seri, pplay, paprs, tr_seri, dens_aer)
2
3!**** *AER_SEDIMNT* -  ROUTINE FOR PARAMETRIZATION OF AEROSOL SEDIMENTATION
4
5!      Christoph Kleinschmitt
6!      based on the sedimentation scheme of
7!      Olivier Boucher & Jean-Jacques Morcrette
8!      (following the ice sedimentation scheme of Adrian Tompkins)
9
10!**   INTERFACE.
11!     ----------
12!          *AER_SEDIMNT* IS CALLED FROM *traccoag_mod*.
13
14!-----------------------------------------------------------------------
15
16  USE phys_local_var_mod, ONLY: mdw, sfluxaer, DENSO4, f_r_wet, vsed_aer
17  USE dimphy, ONLY : klon,klev
18  USE infotrac
19  USE aerophys
20  USE YOMCST
21
22IMPLICIT NONE
23
24!-----------------------------------------------------------------------
25
26  ! transfer variables when calling this routine
27  REAL,INTENT(IN)                             :: pdtphys ! Pas d'integration pour la physique (seconde)
28  REAL,DIMENSION(klon,klev),INTENT(IN)        :: t_seri  ! Temperature
29  REAL,DIMENSION(klon,klev),INTENT(IN)        :: pplay   ! pression pour le mileu de chaque couche (en Pa)
30  REAL,DIMENSION(klon,klev+1),INTENT(IN)      :: paprs   ! pression pour chaque inter-couche (en Pa)
31  REAL,DIMENSION(klon,klev,nbtr),INTENT(INOUT):: tr_seri ! Concentration Traceur [U/KgA]
32  REAL,DIMENSION(klon,klev)                   :: dens_aer! density of aerosol particles [kg/m3 aerosol] with default H2SO4 mass
33
34  ! local variables in sedimentation routine
35  INTEGER :: JL,JK,nb   
36  REAL,DIMENSION(klon,klev)                   :: zvis     ! dynamic viscosity of air [kg/(m*s)]
37  REAL,DIMENSION(klon,klev)                   :: zlair    ! mean free path of air [m]
38  REAL                                        :: ZRHO     ! air density [kg/m^3]
39  REAL                                        :: ZGDP     ! =g/dp=1/(rho*dz)
40  REAL                                        :: ZDTGDP   ! =dt/(rho*dz)
41  REAL,DIMENSION(klon,nbtr_bin)               :: ZSEDFLX  ! sedimentation flux of tracer [U/(m^2*s)]
42  REAL,DIMENSION(nbtr_bin)                    :: ZAERONW  ! tracer concentration at current time step [U/KgA]
43  REAL,DIMENSION(klon,nbtr_bin)               :: ZAERONWM1! tracer concentration at preceding time step [U/KgA]
44  REAL,DIMENSION(klon,klev,nbtr_bin)          :: ZVAER    ! sedimentation velocity [m/s]
45  REAL,DIMENSION(nbtr_bin)                    :: ZSOLAERS ! sedimentation flux arriving from above [U/(m^2*s)]
46  REAL,DIMENSION(nbtr_bin)                    :: ZSOLAERB ! sedimentation flux leaving gridbox [U/(m^2*s)]
47  REAL,DIMENSION(klon,klev)                   :: m_sulf
48
49! dynamic viscosity of air (Pruppacher and Klett, 1978) [kg/(m*s)]
50WHERE (t_seri.GE.273.15)
51  zvis=(1.718 + 0.0049*(t_seri-273.15))*1.E-5
52  ELSEWHERE
53  zvis=(1.718 + 0.0049*(t_seri-273.15)-1.2E-05*(t_seri-273.15)**2)*1.E-5
54END WHERE
55
56! mean free path of air (Prupp. Klett) [m]
57zlair(:,:) = 0.066 *(1.01325E+5/pplay(:,:))*(t_seri(:,:)/293.15)*1.E-06
58
59!--initialisations of variables carried out from one layer to the next layer
60!--actually not needed if (JK>1) test is on
61DO JL=1,klon
62  DO nb=1,nbtr_bin
63    ZSEDFLX(JL,nb)=0.0
64    ZAERONWM1(JL,nb)=0.0
65  ENDDO
66ENDDO
67
68!--from top to bottom (!)
69DO JK=klev,1,-1
70  DO JL=1,klon
71    DO nb=1,nbtr_bin
72  !--initialisations
73      ZSOLAERS(nb)=0.0
74      ZSOLAERB(nb)=0.0
75      ZGDP=RG/(paprs(JL,JK)-paprs(JL,JK+1))
76      ZDTGDP=pdtphys*ZGDP
77
78  ! source from above
79      IF (JK<klev) THEN
80        ZSEDFLX(JL,nb)=ZSEDFLX(JL,nb)*ZAERONWM1(JL,nb) 
81        ZSOLAERS(nb)=ZSOLAERS(nb)+ZSEDFLX(JL,nb)*ZDTGDP
82      ENDIF
83
84  ! sink to next layer
85      ZRHO=pplay(JL,JK)/(RD*t_seri(JL,JK))
86
87      ! stokes-velocity with cunnigham slip- flow correction
88      ZVAER(JL,JK,nb) = 2./9.*(DENSO4(JL,JK)*1000.-ZRHO)*RG/zvis(JL,JK)*(f_r_wet(JL,JK)*mdw(nb)/2.)**2.* &
89         (1.+ 2.*zlair(JL,JK)/(f_r_wet(JL,JK)*mdw(nb))*(1.257+0.4*EXP(-0.55*f_r_wet(JL,JK)*mdw(nb)/zlair(JL,JK))))
90
91      ZSEDFLX(JL,nb)=ZVAER(JL,JK,nb)*ZRHO
92      ZSOLAERB(nb)=ZSOLAERB(nb)+ZDTGDP*ZSEDFLX(JL,nb)
93
94  !---implicit solver
95      ZAERONW(nb)=(tr_seri(JL,JK,nb+nbtr_sulgas)+ZSOLAERS(nb))/(1.0+ZSOLAERB(nb))
96
97  !---new time-step AER variable needed for next layer
98      ZAERONWM1(JL,nb)=ZAERONW(nb)
99
100      tr_seri(JL,JK,nb+nbtr_sulgas)=ZAERONWM1(JL,nb)
101    ENDDO
102  ENDDO
103ENDDO
104
105!---sedimentation flux to the surface
106!---ZAERONWM1 now contains the surface concentration at the new timestep
107!---PFLUXAER in unit of xx m-2 s-1
108sfluxaer(:)=0.0
109DO JL=1,klon
110  ZRHO=pplay(JL,1)/(RD*t_seri(JL,1))
111  DO nb=1,nbtr_bin
112    !compute sfluxaer as sum over bins in kg(S)/m2/s
113    sfluxaer(JL)=sfluxaer(JL)+ZRHO*ZAERONWM1(JL,nb)*ZVAER(JL,1,nb)*(mSatom/mH2SO4mol) &
114                & *dens_aer_dry*4./3.*RPI*(mdw(nb)/2.)**3
115  ENDDO
116ENDDO
117
118vsed_aer(:,:)=0.0
119m_sulf(:,:)=0.0
120
121DO nb=1,nbtr_bin
122  !compute mass-weighted mean of sedimentation velocity
123  vsed_aer(:,:)=vsed_aer(:,:)+ZVAER(:,:,nb)*(mdw(nb)/2.)**3*MAX(1.e-30, tr_seri(:,:,nb+nbtr_sulgas))
124  m_sulf(:,:)=m_sulf(:,:)+(mdw(nb)/2.)**3*MAX(1.e-30, tr_seri(:,:,nb+nbtr_sulgas))
125ENDDO
126
127!divide by total aerosol mass in grid cell
128vsed_aer(:,:)=vsed_aer(:,:)/m_sulf(:,:)
129
130END SUBROUTINE AER_SEDIMNT
Note: See TracBrowser for help on using the repository browser.