SURFEX  V8_0
Surfex V8_0 release
 All Classes Files Functions Variables
ch_aer_emission.F90
Go to the documentation of this file.
1 !SFX_LIC Copyright 1994-2014 CNRS, Meteo-France and Universite Paul Sabatier
2 !SFX_LIC This is part of the SURFEX software governed by the CeCILL-C licence
3 !SFX_LIC version 1. See LICENSE, CeCILL-C_V1-en.txt and CeCILL-C_V1-fr.txt
4 !SFX_LIC for details. version 1.
5 !! ############################################################
6  SUBROUTINE ch_aer_emission(PFLUX, PRHODREF, HSV, KSV_CHSBEG, PFCO)
7 !! ############################################################
8 !!
9 !! PURPOSE
10 !! -------
11 !! Transforme les emissions d'aérosol en masse kg.kg-1.m.s-1 en molecules.m-2.s-1 : flux du moment m3
12 !! Calcule les flux des moments m0 et m6 à partir de sigma et Rg (um)
13 !!
14 !! REFERENCE
15 !! ---------
16 !! none
17 !!
18 !! AUTHOR
19 !! ------
20 !! Pierre TULET (CNRM/GMEI)
21 !!
22 !! MODIFICATIONS
23 !! -------------
24 !! none
25 !!
26 !! EXTERNAL
27 !! --------
28 !! None
29 !!
31 USE modd_dst_surf, ONLY : xdensity_dst
32 USE modi_abor1_sfx
33 !!
34 USE yomhook ,ONLY : lhook, dr_hook
35 USE parkind1 ,ONLY : jprb
36 !
37 IMPLICIT NONE
38 !!
39 !-------------------------------------------------------------------------------
40 !
41 !* 0. DECLARATIONS
42 ! ------------
43 !
44 !* 0.1 declarations of arguments
45 !
46 REAL, DIMENSION(:,:), INTENT(INOUT) :: pflux
47 REAL, DIMENSION(:), INTENT(IN) :: prhodref
48 INTEGER, INTENT(IN) :: ksv_chsbeg
49  CHARACTER(LEN=*), DIMENSION(:), INTENT(IN) :: hsv ! name of chemical species
50 REAL, DIMENSION(:),OPTIONAL, INTENT(IN) :: pfco ! CO flux
51 
52 !
53 !
54 !* 0.2 declarations local variables
55 !
56 REAL :: zden2mol
57  ! ZDEN2MOL = 6.0221367E+23 * 1E-6 / 28.9644E-3
58  ! conversion factor density to mol/cm3
59  ! n_molec (moelc./cm3): M = 1E-6*RHO(kg/m3) * XAVOGADRO / XMD
60 REAL,DIMENSION(NSP+NCARB+NSOA) :: zfac, zrhoi, zmi
61 REAL,DIMENSION(SIZE(PFLUX,1),NSP+NCARB+NSOA,JPMODE) :: zfctota
62 REAL,DIMENSION(SIZE(PFLUX,1),JPIN) :: zfm
63 REAL,DIMENSION(SIZE(PFLUX,1)) :: zfco
64 REAL,DIMENSION(SIZE(PFLUX,1)) :: zconversion
65 !
66 INTEGER :: jj, jsv ! loop counter
67 REAL :: zemisradiusi, zemisradiusj
68 REAL :: zvalbc, zvaloc
69 INTEGER :: i_ch_m0i, i_ch_m0j, i_ch_m6i, i_ch_m6j, i_ch_h2oi, i_ch_h2oj,&
70  i_ch_so4i,i_ch_so4j, i_ch_no3i, i_ch_no3j, i_ch_nh3i, i_ch_nh3j,&
71  i_ch_oci, i_ch_ocj, i_ch_bci, i_ch_bcj , i_ch_dsti, i_ch_dstj
72 REAL(KIND=JPRB) :: zhook_handle
73 
74 !
75 !-------------------------------------------------------------------------------
76 !
77 !* 1. TRANSFER FROM GAS TO AEROSOL MODULE
78 ! ------------------------------------
79 ! 1.1 initialisation
80 !
81 IF (lhook) CALL dr_hook('CH_AER_EMISSION',0,zhook_handle)
82 
83 i_ch_m0i=-999
84 i_ch_m0j=-999
85 i_ch_m6i=-999
86 i_ch_m6j=-999
87 i_ch_h2oi=-999
88 i_ch_h2oj=-999
89 i_ch_so4i=-999
90 i_ch_so4j=-999
91 i_ch_no3i=-999
92 i_ch_no3j=-999
93 i_ch_nh3i=-999
94 i_ch_nh3j=-999
95 i_ch_oci=-999
96 i_ch_ocj=-999
97 i_ch_bci=-999
98 i_ch_bcj=-999
99 i_ch_dsti=-999
100 i_ch_dstj=-999
101 
102 DO jsv=1, size(hsv)
103  IF (trim(hsv(jsv)) == "M0I") i_ch_m0i=jsv-ksv_chsbeg+1
104  IF (trim(hsv(jsv)) == "M0J") i_ch_m0j=jsv-ksv_chsbeg+1
105  IF (trim(hsv(jsv)) == "M6I") i_ch_m6i=jsv-ksv_chsbeg+1
106  IF (trim(hsv(jsv)) == "M6J") i_ch_m6j=jsv-ksv_chsbeg+1
107  IF (trim(hsv(jsv)) == "H2OI") i_ch_h2oi=jsv-ksv_chsbeg+1
108  IF (trim(hsv(jsv)) == "H2OJ") i_ch_h2oj=jsv-ksv_chsbeg+1
109  IF (trim(hsv(jsv)) == "SO4I") i_ch_so4i=jsv-ksv_chsbeg+1
110  IF (trim(hsv(jsv)) == "SO4J") i_ch_so4j=jsv-ksv_chsbeg+1
111  IF (trim(hsv(jsv)) == "NO3I") i_ch_no3i=jsv-ksv_chsbeg+1
112  IF (trim(hsv(jsv)) == "NO3J") i_ch_no3j=jsv-ksv_chsbeg+1
113  IF (trim(hsv(jsv)) == "NH3I") i_ch_nh3i=jsv-ksv_chsbeg+1
114  IF (trim(hsv(jsv)) == "NH3J") i_ch_nh3j=jsv-ksv_chsbeg+1
115  IF (trim(hsv(jsv)) == "OCI") i_ch_oci=jsv-ksv_chsbeg+1
116  IF (trim(hsv(jsv)) == "OCJ") i_ch_ocj=jsv-ksv_chsbeg+1
117  IF (trim(hsv(jsv)) == "BCI") i_ch_bci=jsv-ksv_chsbeg+1
118  IF (trim(hsv(jsv)) == "BCJ") i_ch_bcj=jsv-ksv_chsbeg+1
119  IF (trim(hsv(jsv)) == "DSTI") i_ch_dsti=jsv-ksv_chsbeg+1
120  IF (trim(hsv(jsv)) == "DSTJ") i_ch_dstj=jsv-ksv_chsbeg+1
121 END DO
122 
123 IF (i_ch_m0i ==-999) CALL abor1_sfx('WRONG VALUE FOR I_CH_M0i ')
124 IF (i_ch_m0j ==-999) CALL abor1_sfx('WRONG VALUE FOR I_CH_M0j ')
125 IF (i_ch_m6i ==-999 .AND. lvarsigi) CALL abor1_sfx('WRONG VALUE FOR I_CH_M6i ')
126 IF (i_ch_m6j ==-999 .AND. lvarsigj) CALL abor1_sfx('WRONG VALUE FOR I_CH_M6j ')
127 IF (i_ch_h2oi==-999) CALL abor1_sfx('WRONG VALUE FOR I_CH_H2Oi')
128 IF (i_ch_h2oj==-999) CALL abor1_sfx('WRONG VALUE FOR I_CH_H2Oj')
129 IF (i_ch_so4i==-999) CALL abor1_sfx('WRONG VALUE FOR I_CH_SO4i')
130 IF (i_ch_so4j==-999) CALL abor1_sfx('WRONG VALUE FOR I_CH_SO4j')
131 IF (i_ch_no3i==-999) CALL abor1_sfx('WRONG VALUE FOR I_CH_NO3i')
132 IF (i_ch_no3j==-999) CALL abor1_sfx('WRONG VALUE FOR I_CH_NO3j')
133 IF (i_ch_nh3i==-999) CALL abor1_sfx('WRONG VALUE FOR I_CH_NH3i')
134 IF (i_ch_nh3j==-999) CALL abor1_sfx('WRONG VALUE FOR I_CH_NH3j')
135 IF (i_ch_oci ==-999) CALL abor1_sfx('WRONG VALUE FOR I_CH_OCi ')
136 IF (i_ch_ocj ==-999) CALL abor1_sfx('WRONG VALUE FOR I_CH_OCj ')
137 IF (i_ch_bci ==-999) CALL abor1_sfx('WRONG VALUE FOR I_CH_BCi ')
138 IF (i_ch_bcj ==-999) CALL abor1_sfx('WRONG VALUE FOR I_CH_BCj ')
139 IF (i_ch_dsti ==-999) CALL abor1_sfx('WRONG VALUE FOR I_CH_DSTi ')
140 IF (i_ch_dstj ==-999) CALL abor1_sfx('WRONG VALUE FOR I_CH_DSTj ')
141 
142 zmi(:) = 250.
143 zmi(jp_aer_so4) = 98.
144 zmi(jp_aer_no3) = 63.
145 zmi(jp_aer_nh3) = 17.
146 zmi(jp_aer_h2o) = 18.
147 zmi(jp_aer_dst) = 100.
148 
149 ! Aerosol Density
150 ! Cf Ackermann (all to black carbon except water)
151 zrhoi(:) = 1.8e3
152 zrhoi(jp_aer_h2o) = 1.0e3 ! water
153 zrhoi(jp_aer_dst) = xdensity_dst
154 
155 zden2mol = 1e-6 * xavogadro / xmd
156 
157 IF (crgunit=="MASS") THEN
158 zemisradiusi = xemisradiusi * exp(-3.*(log(xemissigi))**2)
159 zemisradiusj = xemisradiusj * exp(-3.*(log(xemissigj))**2)
160 ELSE
161 zemisradiusi = xemisradiusi
162 zemisradiusj = xemisradiusj
163 END IF
164 !
165 DO jj=1,nsp+ncarb+nsoa
166  zfac(jj) = (4./3.)*3.14292654*zrhoi(jj)*1.e-9
167 ENDDO
168 
169 zfm(:,:)=0.
170 zfctota(:,:,:)=0.
171 pflux(:,:) = max(pflux(:,:),0.)
172 !
173 !* 0 conversion into kg.kg-1.m.s-1 (due to PCONVERSION)
174 
175 zvalbc = 0.
176 zvaloc = 0.
177 zfco(:) = 0.
178 IF ((lco2pm).AND.(present(pfco))) THEN
179  !ZVALBC=2.748549E-02 ! CO / BC conversion factor
180  !ZVALOC=4.947248E-02 ! CO / POM conversion factor
181  zvalbc= 5.* 0.6e-10 / 0.4e-8 ! CO / BC conversion factor
182  zvaloc= 5.* 0.3e-10 / 0.4e-8 ! CO / POM conversion factor
183  zfco(:) = pfco(:)
184 END IF
185 
186 ! Initial aerosols fluxes have been transformed into molecu.m-2.s-1,
187 ! conversion into are in kg.kg-1.m.s-1
188 ! conversion in kg.kg-1.m.s-1
189 !
190 zconversion(:) = xavogadro * prhodref(:)
191 !
192 pflux(:,i_ch_so4i) = pflux(:,i_ch_so4i) / zconversion(:) * zmi(jp_aer_so4)*1e-3
193 pflux(:,i_ch_so4j) = pflux(:,i_ch_so4j) / zconversion(:) * zmi(jp_aer_so4)*1e-3
194 pflux(:,i_ch_no3i) = pflux(:,i_ch_no3i) / zconversion(:) * zmi(jp_aer_no3)*1e-3
195 pflux(:,i_ch_no3j) = pflux(:,i_ch_no3j) / zconversion(:) * zmi(jp_aer_no3)*1e-3
196 pflux(:,i_ch_nh3i) = pflux(:,i_ch_nh3i) / zconversion(:) * zmi(jp_aer_nh3)*1e-3
197 pflux(:,i_ch_nh3j) = pflux(:,i_ch_nh3j) / zconversion(:) * zmi(jp_aer_nh3)*1e-3
198 pflux(:,i_ch_h2oi) = pflux(:,i_ch_h2oi) / zconversion(:) * zmi(jp_aer_h2o)*1e-3
199 pflux(:,i_ch_h2oj) = pflux(:,i_ch_h2oj) / zconversion(:) * zmi(jp_aer_h2o)*1e-3
200 pflux(:,i_ch_oci) = (pflux(:,i_ch_oci) + zfco(:) * zvaloc / 2.) / zconversion(:) * zmi(jp_aer_oc)*1e-3
201 pflux(:,i_ch_ocj) = (pflux(:,i_ch_ocj) + zfco(:) * zvaloc ) / zconversion(:) * zmi(jp_aer_oc)*1e-3
202 pflux(:,i_ch_bci) = (pflux(:,i_ch_bci) + zfco(:) * zvalbc / 2.) / zconversion(:) * zmi(jp_aer_bc)*1e-3
203 pflux(:,i_ch_bcj) = (pflux(:,i_ch_bcj) + zfco(:) * zvalbc ) / zconversion(:) * zmi(jp_aer_bc)*1e-3
204 pflux(:,i_ch_dsti) = pflux(:,i_ch_dsti) / zconversion(:) * zmi(jp_aer_dst)*1e-3
205 pflux(:,i_ch_dstj) = pflux(:,i_ch_dstj) / zconversion(:) * zmi(jp_aer_dst)*1e-3
206 !
207 !* 1.0 transfer aerosol mass from gas to aerosol variables
208 ! (and conversion of kg.kg-1.m.s-1 --> microgram.m-2.s-1)
209 !
210 zfctota(:,jp_aer_so4,1) = pflux(:,i_ch_so4i) *1e+9 * prhodref(:)
211 zfctota(:,jp_aer_so4,2) = pflux(:,i_ch_so4j) *1e+9 * prhodref(:)
212 
213 zfctota(:,jp_aer_nh3,1) = pflux(:,i_ch_nh3i) *1e+9 * prhodref(:)
214 zfctota(:,jp_aer_nh3,2) = pflux(:,i_ch_nh3j) *1e+9 * prhodref(:)
215 
216 zfctota(:,jp_aer_no3,1) = pflux(:,i_ch_no3i) *1e+9 * prhodref(:)
217 zfctota(:,jp_aer_no3,2) = pflux(:,i_ch_no3j) *1e+9 * prhodref(:)
218 
219 zfctota(:,jp_aer_h2o,1) = pflux(:,i_ch_h2oi) *1e+9 * prhodref(:)
220 zfctota(:,jp_aer_h2o,2) = pflux(:,i_ch_h2oj) *1e+9 * prhodref(:)
221 
222 zfctota(:,jp_aer_oc,1) = pflux(:,i_ch_oci) *1e+9 * prhodref(:)
223 zfctota(:,jp_aer_oc,2) = pflux(:,i_ch_ocj) *1e+9 * prhodref(:)
224 
225 zfctota(:,jp_aer_bc,1) = pflux(:,i_ch_bci) *1e+9 * prhodref(:)
226 zfctota(:,jp_aer_bc,2) = pflux(:,i_ch_bcj) *1e+9 * prhodref(:)
227 
228 zfctota(:,jp_aer_dst,1) = pflux(:,i_ch_dsti) *1e+9 * prhodref(:)
229 zfctota(:,jp_aer_dst,2) = pflux(:,i_ch_dstj) *1e+9 * prhodref(:)
230 !
231 !* 1.1 calculate moment 3 flux from total aerosol mass
232 !
233 zfm(:,2) = 0.
234 zfm(:,5) = 0.
235 DO jj = 1,nsp+ncarb+nsoa
236  zfm(:,2) = zfm(:,2)+zfctota(:,jj,1)/zfac(jj)
237  zfm(:,5) = zfm(:,5)+zfctota(:,jj,2)/zfac(jj)
238 ENDDO
239 !
240 !* 1.2 calculate moment 0 flux from dispersion and mean radius Rg
241 !
242 zfm(:,1)= zfm(:,2) / ((zemisradiusi**3)*exp(4.5 * (log(xemissigi))**2))
243 !
244 zfm(:,4)= zfm(:,5) / ((zemisradiusj**3)*exp(4.5 * (log(xemissigj))**2))
245 !
246 !* 1.3 calculate moment 6 flux from dispersion and mean diameter
247 !
248 zfm(:,3) = zfm(:,1) * (zemisradiusi**6) *exp(18 *(log(xemissigi))**2)
249 !
250 zfm(:,6) = zfm(:,4) * (zemisradiusj**6) *exp(18 *(log(xemissigj))**2)
251 !
252 !* 1.4 conversion en ppp.m.s-1
253 !
254 ! conversion in atmospheric unit only for moments 0 and 6
255 pflux(:,i_ch_m0i) = zfm(:,1) * 1e-6 / (zden2mol * prhodref(:))
256 pflux(:,i_ch_m0j) = zfm(:,4) * 1e-6 / (zden2mol * prhodref(:))
257 !
258 IF (lvarsigi) pflux(:,i_ch_m6i) = zfm(:,3) / (zden2mol * prhodref(:))
259 IF (lvarsigj) pflux(:,i_ch_m6j) = zfm(:,6) / (zden2mol * prhodref(:))
260 !
261 ! aerosol phase conversion kg/kg.m.s-1 into ppp.m.s-1
262 pflux(:,i_ch_so4i) = pflux(:,i_ch_so4i) * xmd / (zmi(jp_aer_so4)*1e-3)
263 pflux(:,i_ch_so4j) = pflux(:,i_ch_so4j) * xmd / (zmi(jp_aer_so4)*1e-3)
264 pflux(:,i_ch_no3i) = pflux(:,i_ch_no3i) * xmd / (zmi(jp_aer_no3)*1e-3)
265 pflux(:,i_ch_no3j) = pflux(:,i_ch_no3j) * xmd / (zmi(jp_aer_no3)*1e-3)
266 pflux(:,i_ch_nh3i) = pflux(:,i_ch_nh3i) * xmd / (zmi(jp_aer_nh3)*1e-3)
267 pflux(:,i_ch_nh3j) = pflux(:,i_ch_nh3j) * xmd / (zmi(jp_aer_nh3)*1e-3)
268 pflux(:,i_ch_h2oi) = pflux(:,i_ch_h2oi) * xmd / (zmi(jp_aer_h2o)*1e-3)
269 pflux(:,i_ch_h2oj) = pflux(:,i_ch_h2oj) * xmd / (zmi(jp_aer_h2o)*1e-3)
270 !
271 pflux(:,i_ch_oci) = pflux(:,i_ch_oci) * xmd / (zmi(jp_aer_oc)*1e-3)
272 pflux(:,i_ch_ocj) = pflux(:,i_ch_ocj) * xmd / (zmi(jp_aer_oc)*1e-3)
273 pflux(:,i_ch_bci) = pflux(:,i_ch_bci) * xmd / (zmi(jp_aer_bc)*1e-3)
274 pflux(:,i_ch_bcj) = pflux(:,i_ch_bcj) * xmd / (zmi(jp_aer_bc)*1e-3)
275 pflux(:,i_ch_dsti) = pflux(:,i_ch_dsti) * xmd / (zmi(jp_aer_dst)*1e-3)
276 pflux(:,i_ch_dstj) = pflux(:,i_ch_dstj) * xmd / (zmi(jp_aer_dst)*1e-3)
277 !
278 ! then conversion in molecules.m-2.s-1
279 pflux(:,i_ch_m0i) = pflux(:,i_ch_m0i) * zconversion(:)
280 pflux(:,i_ch_m0j) = pflux(:,i_ch_m0j) * zconversion(:)
281 !
282 IF (lvarsigi) pflux(:,i_ch_m6i) = pflux(:,i_ch_m6i) * zconversion(:)
283 IF (lvarsigj) pflux(:,i_ch_m6j) = pflux(:,i_ch_m6j) * zconversion(:)
284 !
285 pflux(:,i_ch_so4i) = pflux(:,i_ch_so4i) * zconversion(:) / (zmi(jp_aer_so4)*1e-3)
286 pflux(:,i_ch_so4j) = pflux(:,i_ch_so4j) * zconversion(:) / (zmi(jp_aer_so4)*1e-3)
287 pflux(:,i_ch_no3i) = pflux(:,i_ch_no3i) * zconversion(:) / (zmi(jp_aer_no3)*1e-3)
288 pflux(:,i_ch_no3j) = pflux(:,i_ch_no3j) * zconversion(:) / (zmi(jp_aer_no3)*1e-3)
289 pflux(:,i_ch_nh3i) = pflux(:,i_ch_nh3i) * zconversion(:) / (zmi(jp_aer_nh3)*1e-3)
290 pflux(:,i_ch_nh3j) = pflux(:,i_ch_nh3j) * zconversion(:) / (zmi(jp_aer_nh3)*1e-3)
291 pflux(:,i_ch_h2oi) = pflux(:,i_ch_h2oi) * zconversion(:) / (zmi(jp_aer_h2o)*1e-3)
292 pflux(:,i_ch_h2oj) = pflux(:,i_ch_h2oj) * zconversion(:) / (zmi(jp_aer_h2o)*1e-3)
293 pflux(:,i_ch_oci) = pflux(:,i_ch_oci) * zconversion(:) / (zmi(jp_aer_oc)*1e-3)
294 pflux(:,i_ch_ocj) = pflux(:,i_ch_ocj) * zconversion(:) / (zmi(jp_aer_oc)*1e-3)
295 pflux(:,i_ch_bci) = pflux(:,i_ch_bci) * zconversion(:) / (zmi(jp_aer_bc)*1e-3)
296 pflux(:,i_ch_bcj) = pflux(:,i_ch_bcj) * zconversion(:) / (zmi(jp_aer_bc)*1e-3)
297 pflux(:,i_ch_dsti) = pflux(:,i_ch_dsti) * zconversion(:) / (zmi(jp_aer_dst)*1e-3)
298 pflux(:,i_ch_dstj) = pflux(:,i_ch_dstj) * zconversion(:) / (zmi(jp_aer_dst)*1e-3)
299 !
300 IF (lhook) CALL dr_hook('CH_AER_EMISSION',1,zhook_handle)
301 !
302 END SUBROUTINE ch_aer_emission
subroutine abor1_sfx(YTEXT)
Definition: abor1_sfx.F90:6
subroutine ch_aer_emission(PFLUX, PRHODREF, HSV, KSV_CHSBEG, PFCO)