LMDZ
lsc_scav.F90
Go to the documentation of this file.
1 !$Id $
2 
3 SUBROUTINE lsc_scav(pdtime,it,iflag_lscav, &
4 !jyg<
5  aerosol, &
7  oliq,flxr,flxs,rneb,beta_fisrt, &
8  beta_v1,pplay,paprs,t,tr_seri,d_tr_insc, &
9  d_tr_bcscav,d_tr_evap,qprls)
10  USE ioipsl
11  USE dimphy
14  USE traclmdz_mod
15  USE infotrac_phy,ONLY : nbtr
16  USE iophy
17  IMPLICIT NONE
18 !=====================================================================
19 ! Objet : depot humide (lessivage et evaporation) de traceurs
20 ! Inspired by routines of Olivier Boucher (mars 1998)
21 ! author R. Pilon 10 octobre 2012
22 ! last modification 16/01/2013 (reformulation partie evaporation)
23 !=====================================================================
24 
25  include "chem.h"
26  include "YOMCST.h"
27  include "YOECUMF.h"
28 
29  REAL,INTENT(IN) :: pdtime ! time step (s)
30  INTEGER,INTENT(IN) :: it ! tracer number
31  INTEGER,INTENT(IN) :: iflag_lscav ! LS scavenging param:
32 ! 3=Reddy_Boucher2004, 4=3+RPilon.
33  REAL,DIMENSION(klon,klev+1),INTENT(IN) :: flxr ! flux precipitant de pluie
34  REAL,DIMENSION(klon,klev+1),INTENT(IN) :: flxs ! flux precipitant de neige
35  REAL,INTENT(IN) :: oliq ! contenu en eau liquide dans le nuage (kg/kg)
36  REAL,DIMENSION(klon,klev),INTENT(IN) :: rneb
37  REAL,DIMENSION(klon,klev),INTENT(IN) :: pplay ! pression
38  REAL,DIMENSION(klon,klev+1),INTENT(IN) :: paprs ! pression
39  REAL,DIMENSION(klon,klev),INTENT(IN) :: t ! temperature
40 ! tracers
41  LOGICAL,DIMENSION(nbtr), INTENT(IN) :: aerosol
42  REAL,DIMENSION(klon,klev,nbtr),INTENT(IN) :: tr_seri ! q de traceur
43  REAL,DIMENSION(klon,klev),INTENT(IN) :: beta_fisrt ! taux de conversion de l'eau cond
44  REAL,DIMENSION(klon,klev),INTENT(OUT) :: beta_v1 ! -- (originale version)
45  REAL,DIMENSION(klon) :: his_dh ! tendance de traceur integre verticalement
46  REAL,DIMENSION(klon,klev,nbtr),INTENT(OUT) :: d_tr_insc ! tendance du traceur
47  REAL,DIMENSION(klon,klev,nbtr),INTENT(OUT) :: d_tr_bcscav ! tendance de traceur
48  REAL,DIMENSION(klon,klev,nbtr),INTENT(OUT) :: d_tr_evap
49  REAL,DIMENSION(klon,nbtr),INTENT(OUT) :: qPrls !jyg: concentration tra dans pluie LS a la surf.
50  REAL :: dxin,dxev ! tendance temporaire de traceur incloud
51  REAL,DIMENSION(klon,klev) :: dxbc ! tendance temporaire de traceur bc
52 
53 
54 ! variables locales
55  LOGICAL,SAVE :: debut=.true.
56 !$OMP THREADPRIVATE(debut)
57 !
58  REAL,PARAMETER :: henry=1.4 ! constante de Henry en mol/l/atm ~1.4 for gases
59  REAL :: henry_t ! constante de Henry a T t (mol/l/atm)
60  REAL,PARAMETER :: kk=2900. ! coefficient de dependence en T (K)
61  REAL :: f_a ! rapport de la phase aqueuse a la phase gazeuse
62  REAL :: beta ! taux de conversion de l'eau en pluie
63 
64  INTEGER :: i, k
65  REAL,DIMENSION(klon,klev) :: scav ! water liquid content / fraction aqueuse du constituant
66  REAL,DIMENSION(klon,klev) :: zrho
67  REAL,DIMENSION(klon,klev) :: zdz
68  REAL,DIMENSION(klon,klev) :: zmass ! layer mass
69 
70  REAL :: frac_ev ! cste pour la reevaporation : dropplet shrinking
71 ! frac_ev = frac_gas ou frac_aer
72  REAL,PARAMETER :: frac_gas=1.0 ! cste pour la reevaporation pour les gaz
73  REAL :: frac_aer ! cste pour la reevaporation pour les particules
74  REAL,DIMENSION(klon,klev) :: deltaP ! P(i+1)-P(i)
75  REAL,DIMENSION(klon,klev) :: beta_ev ! dP/P(i+1)
76 
77 ! 101.325 m3/l x Pa/atm
78 ! R Pa.m3/mol/K
79 ! cste de dissolution pour le depot humide
80  REAL,SAVE :: frac_fine_scav
81  REAL,SAVE :: frac_coar_scav
82 !$OMP THREADPRIVATE(frac_fine_scav, frac_coar_scav)
83 
84 ! below-cloud scav variables
85 ! aerosol : alpha_r=0.001, gas 0.001 (Pruppacher & Klett 1967)
86  REAL,SAVE :: alpha_r ! coefficient d'impaction pour la pluie
87  REAL,SAVE :: alpha_s ! coefficient d'impaction pour la neige
88  REAL,SAVE :: R_r ! mean raindrop radius (m)
89  REAL,SAVE :: R_s ! mean snow crystal radius (m)
90 !$OMP THREADPRIVATE(alpha_r, alpha_s, R_r, R_s)
91  REAL :: pr, ps, ice, water
92  real :: conserv
93 !
94 !!!!!!!!!!!!!!!!!!!! choix lessivage !!!!!!!!!!!!!!!!!!!!!!!!
95 !! logical,save :: inscav_fisrt
96 !!! $OMP THREADPRIVATE(inscav_first)
97 !
98 !!!!!!!!!!!!!!!!!!!!!!!!!!!
99  IF (debut) THEN
100 !
101 ! inscav_fisrt=.true.
102 ! call getin('inscav_fisrt',inscav_fisrt)
103 ! if(inscav_fisrt) then
104 ! print*,'beta from fisrtilp.F90, beta = (z_cond - z_oliq)/z_cond, inscav_fisrt=',inscav_fisrt
105 ! else
106 ! print*,'beta from Reddy and Bocuher 2004 (original version), inscav_fisrt=',inscav_fisrt
107 ! endif
108 !
109  alpha_r=0.001 ! coefficient d'impaction pour la pluie
110  alpha_s=0.01 ! coefficient d'impaction pour la neige
111  r_r=0.001 ! mean raindrop radius (m)
112  r_s=0.001 ! mean snow crystal radius (m)
113  frac_fine_scav=0.7
114  frac_coar_scav=0.7
115 ! frac_aer=0.5 ~ droplet size shrinks by evap
116  frac_aer=0.5
117 !
118  OPEN(99,file='lsc_scav_param.data',status='old', &
119  form='formatted',err=9999)
120  READ(99,*,end=9998) alpha_r
121  READ(99,*,end=9998) alpha_s
122  READ(99,*,end=9998) r_r
123  READ(99,*,end=9998) r_s
124  READ(99,*,end=9998) frac_fine_scav
125  READ(99,*,end=9998) frac_coar_scav
126  READ(99,*,end=9998) frac_aer
127 9998 Continue
128  CLOSE(99)
129 9999 Continue
130 
131  print*,'alpha_r',alpha_r
132  print*,'alpha_s',alpha_s
133  print*,'R_r',r_r
134  print*,'R_s',r_s
135  print*,'frac_fine_scav',frac_fine_scav
136  print*,'frac_coar_scav',frac_coar_scav
137  print*,'frac_aer ev',frac_aer
138 
139 !
140  ENDIF !(debut)
141 !!!!!!!!!!!!!!!!!!!!!!!!!!!
142 !
143 ! initialization
144  dxin=0.
145  dxev=0.
146  beta_ev=0.
147 
148  DO i=1,klon
149  his_dh(i)=0.
150  ENDDO
151 
152  DO k=1,klev
153  DO i=1, klon
154  dxbc(i,k)=0.
155  beta_v1(i,k)=0.
156  deltap(i,k)=0.
157  ENDDO
158  ENDDO
159 
160  DO k=1,klev
161  DO i=1, klon
162  d_tr_insc(i,k,it)=0.
163  d_tr_bcscav(i,k,it)=0.
164  d_tr_evap(i,k,it)=0.
165  ENDDO
166  ENDDO
167 
168 ! pressure and size of the layer
169  DO k=klev-1, 1, -1
170  DO i=1, klon
171  zrho(i,k)=pplay(i,k)/t(i,k)/rd
172  zdz(i,k)=(paprs(i,k)-paprs(i,k+1))/zrho(i,k)/rg
173  zmass(i,k)=(paprs(i,k)-paprs(i,k+1))/rg
174  ENDDO
175  ENDDO
176 
177 !jyg<
178 !! IF (it.gt.1) THEN ! aerosol
179 !! Temporary correction: all non-aerosol tracers are dealt with in the same way.
180 !! Should be updated once it has been decided how gases should be dealt with.
181  IF (aerosol(it)) THEN
183  frac_ev=frac_aer
184  ELSE ! gas
185  frac_ev=frac_gas
186  ENDIF
187 
188 !jyg<
189 !! IF (it.gt.1) THEN ! aerosol
190  IF (aerosol(it)) THEN
192  DO k=1, klev
193  DO i=1, klon
194  scav(i,k)=frac_fine_scav
195  ENDDO
196  ENDDO
197  ELSE ! gas
198  DO k=1, klev
199  DO i=1, klon
200  henry_t=henry*exp(-kk*(1./298.-1./t(i,k))) ! mol/l/atm
201  f_a=henry_t/101.325*r*t(i,k)*oliq*zrho(i,k)/rho_water
202  scav(i,k)=f_a/(1.+f_a)
203  ENDDO
204  ENDDO
205  ENDIF
206 
207  DO k=klev-1, 1, -1
208  DO i=1, klon
209 ! incloud scavenging
210 ! if(inscav_fisrt) then
211  if (iflag_lscav .eq. 4) then
212  beta=beta_fisrt(i,k)*rneb(i,k)
213  else
214  beta=flxr(i,k)-flxr(i,k+1)+flxs(i,k)-flxs(i,k+1)
215 ! beta=beta/zdz(i,k)/oliq/zrho(i,k)
216  beta=beta/zmass(i,k)/oliq
217  beta=max(0.,beta)
218  endif ! (iflag_lscav .eq. 4)
219  beta_v1(i,k)=beta !! for output
220 !
221  dxin=tr_seri(i,k,it)*(exp(-scav(i,k)*beta*pdtime)-1.)
222 ! his_dh(i)=his_dh(i)-dxin*zrho(i,k)*zdz(i,k)/pdtime ! kg/m2/s
223  his_dh(i)=his_dh(i)-dxin*zmass(i,k)/pdtime ! kg/m2/s
224  d_tr_insc(i,k,it)=dxin
225 
226 ! below-cloud impaction
227 !jyg<
228 !! IF (it.eq.1) THEN
229  IF (.NOT.aerosol(it)) THEN
231  d_tr_bcscav(i,k,it)=0.
232  ELSE
233  pr=0.5*(flxr(i,k)+flxr(i,k+1))
234  ps=0.5*(flxs(i,k)+flxs(i,k+1))
235  water=pr*alpha_r/r_r/rho_water
236  ice=ps*alpha_s/r_s/rho_ice
237  dxbc(i,k)=-3./4.*tr_seri(i,k,it)*pdtime*(water+ice)
238 ! add tracers from below cloud scav in his_dh
239  his_dh(i)=his_dh(i)-dxbc(i,k)*zmass(i,k)/pdtime ! kg/m2/s
240  d_tr_bcscav(i,k,it)=dxbc(i,k)
241  ENDIF
242 
243 ! reevaporation
244  deltap(i,k)=flxr(i,k+1)+flxs(i,k+1)-flxr(i,k)-flxs(i,k)
245  deltap(i,k)=max(deltap(i,k),0.)
246 
247  if(flxr(i,k+1)+flxs(i,k+1).gt.1.e-16) then
248  beta_ev(i,k)=deltap(i,k)/(flxr(i,k+1)+flxs(i,k+1))
249  else
250  beta_ev(i,k)=0.
251  endif
252 
253  beta_ev(i,k)=max(min(1.,beta_ev(i,k)),0.)
254 
255 !jyg
256 
257  if(abs(1-(1-frac_ev)*beta_ev(i,k)).gt.1.e-16) then
258 ! remove tracers from precipitation owing to release by evaporation in his_dh
259 ! dxev=frac_ev*beta_ev(i,k)*his_dh(i) *pdtime/(zrho(i,k)*zdz(i,k)) &
260  dxev=frac_ev*beta_ev(i,k)*his_dh(i) *pdtime/(zmass(i,k)) &
261  /(1 -(1-frac_ev)*beta_ev(i,k))
262  his_dh(i)=his_dh(i)*(1 - frac_ev*beta_ev(i,k) / (1 -(1-frac_ev)*beta_ev(i,k)))
263  else
264 ! dxev=his_dh(i) *pdtime/(zrho(i,k)*zdz(i,k))
265  dxev=his_dh(i) *pdtime/(zmass(i,k))
266  his_dh(i)=0.
267  endif
268 ! print*, k, 'beta_ev',beta_ev
269 ! remove tracers from precipitation owing to release by evaporation in his_dh
270 !! dxev=frac_ev*deltaP(i,k)*pdtime * his_dh(i) /(zrho(i,k)*zdz(i,k))
271 !rplmd
272 !! dxev=frac_ev*deltaP(i,k)*his_dh(i) *pdtime/(zrho(i,k)*zdz(i,k)) &
273 !! /max(flxr(i,k)+flxs(i,k),1.e-16)
274 
275 
276  d_tr_evap(i,k,it)=dxev
277 !! tendency is further added in phytrac x = x + dx
278  ENDDO !! do i
279  ENDDO !! do k
280 
281 !jyg (20130114)
282  DO i = 1,klon
283  qprls(i,it) = his_dh(i)/max(flxr(i,1)+flxs(i,1),1.e-16)
284  ENDDO
285 !jyg end
286 
287 
288 ! test de conservation
289  conserv=0.
290 ! DO k= klev,1,-1
291 ! DO i=1, klon
292 ! conserv=conserv+d_tr_insc(i,k,it)*(paprs(i,k)-paprs(i,k+1))/RG &
293 ! +d_tr_bcscav(i,k,it)*(paprs(i,k)-paprs(i,k+1))/RG &
294 ! +d_tr_evap(i,k,it)*(paprs(i,k)-paprs(i,k+1))/RG
295 ! if(it.eq.3) write(*,'(I2,2X,a,e20.12,2X,a,e20.12,2X,a,e20.12,2X,a,e20.12)'),&
296 ! k,'lsc conserv ',conserv,'insc',d_tr_insc(i,k,it),'bc',d_tr_bcscav(i,k,it),'ev',d_tr_evap(i,k,it)
297 ! ENDDO
298 ! ENDDO
299 
300 END SUBROUTINE lsc_scav
subroutine lsc_scav(pdtime, it, iflag_lscav,
Definition: lsc_scav.F90:5
integer, save nbtr
!$Id mode_top_bound COMMON comconstr r
Definition: comconst.h:7
integer, save klon
Definition: dimphy.F90:3
!$Id!INTEGER ih2o2 REAL rho_water
Definition: chem.h:4
integer, save klev
Definition: dimphy.F90:7
subroutine err(ierr, typ, nam)
Definition: dynetat0.f90:189
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL pplay
Definition: calcul_STDlev.h:26
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL ulevSTD CALL &zphi philevSTD CALL &zx_rh rhlevSTD!DO klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon du jour ou toutes les read_climoz CALL &zphi geo500!IM on interpole a chaque pas de temps le paprs
!$Id itapm1 ENDIF!IM on interpole les champs sur les niveaux STD de pression!IM a chaque pas de temps de la physique c!positionnement de l argument logique a false c!pour ne pas recalculer deux fois la meme chose!c!a cet effet un appel a plevel_new a ete deplace c!a la fin de la serie d appels c!la boucle DO nlevSTD a ete internalisee c!dans d ou la creation de cette routine c c!CALL ulevSTD CALL &zphi philevSTD CALL &zx_rh rhlevSTD!DO klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon klev DO klon du jour ou toutes les read_climoz CALL true
Definition: dimphy.F90:1
Definition: iophy.F90:4
real rg
Definition: comcstphy.h:1