module_data_mosaic_asect.F

References to this file elsewhere.
1 !**********************************************************************************  
2 ! This computer software was prepared by Battelle Memorial Institute, hereinafter
3 ! the Contractor, under Contract No. DE-AC05-76RL0 1830 with the Department of 
4 ! Energy (DOE). NEITHER THE GOVERNMENT NOR THE CONTRACTOR MAKES ANY WARRANTY,
5 ! EXPRESS OR IMPLIED, OR ASSUMES ANY LIABILITY FOR THE USE OF THIS SOFTWARE.
6 !
7 ! MOSAIC module: see module_mosaic_driver.F for information and terms of use
8 !**********************************************************************************  
9 	module module_data_mosaic_asect
10 
11 
12 	implicit none
13 
14 
15 !-----------------------------------------------------------------------
16 !
17 !   The variables in this module provide a means of organizing and accessing
18 !   aerosol species in the "chem" array by their chemical component, 
19 !   size bin (or mode), "type", and "phase"
20 !
21 !   Their purpose is to allow flexible coding of process modules, 
22 !   compared to "hard-coding" using the chem array p_xxx indices
23 !   (e.g., p_so4_a01, p_so4_a02, ...; p_num_a01, ...)
24 !
25 !-----------------------------------------------------------------------
26 !
27 !   rce & sg 2004-dec-03 - added phase and type capability,
28 !	which changed this module almost completely
29 !
30 !-----------------------------------------------------------------------
31 !
32 !   maxd_atype = maximum allowable number of aerosol types
33 !   maxd_asize = maximum allowable number of aerosol size bins
34 !   maxd_acomp = maximum allowable number of chemical components
35 !	in each aerosol size bin
36 !   maxd_aphase = maximum allowable number of aerosol phases 
37 !	(gas, cloud, ice, rain, ...)
38 !
39 !   ntype_aer = number of aerosol types
40 !	The aerosol type will allow treatment of an externally mixed 
41 !	aerosol.  The current MOSAIC code has only 1 type, with the implicit
42 !	assumption of internal mixing.  Eventually, multiple types 
43 !	could treat fresh primary BC/OC, fresh SO4 from nucleation, 
44 !	aged BC/OC/SO4/... mixture, soil dust, sea salt, ... 
45 !
46 !   nphase_aer = number of aerosol phases
47 !
48 !   ai_phase = phase (p) index for interstitial (unactivated) aerosol particles
49 !   cw_phase = phase (p) index for aerosol particles in cloud water
50 !   ci_phase = phase (p) index for aerosol particles in cloud ice
51 !   rn_phase = phase (p) index for aerosol particles in rain
52 !   sn_phase = phase (p) index for aerosol particles in snow
53 !   gr_phase = phase (p) index for aerosol particles in graupel
54 !   [Note:  the value of "xx_phase" will be between 1 and nphase_aer 
55 !	for phases that are active in a simulation.  The others
56 !	will have non-positive values.]
57 !
58 !   nsize_aer(t) = number of aerosol size bins for aerosol type t
59 !
60 !   ncomp_aer(t) = number of "regular" chemical components for aerosol type t
61 !   ncomp_plustracer_aer(t) = number of "regular" plus "tracer"
62 !	chemical components for aerosol type t
63 !   [Note:  only "regular" components are used for calculating
64 !	aerosol physical (mass, volume) and chemical properties.
65 !	"Tracer" components are optional, and can be used to track source 
66 !	regions, source mechanisms, etc.]
67 !   [Note:  for aerosol type t, all phases have the same number of size
68 !	bins, and all size bins have the same number of 
69 !	both regular and tracer components.]
70 !
71 !   ntot_mastercomp_aer = number of aerosol chemical components defined
72 !	in the "master component list".
73 !   [Note:  each aerosol type will use some but not necessarily all
74 !	of the components in the "master component list".]
75 !
76 !   mastercompptr_aer(c,t) = the position/index/i.d. in the 
77 !       "master component list" for chemical component c of aerosol type t.
78 !	(1=sulfate, others to be defined by user.)
79 !
80 !   massptr_aer(c,s,t,p) = the position/index in the chem array for mixing- 
81 !	ratio for chemical component c, size bin s, type t, and phase p.
82 !
83 !   lptr_so4_aer(s,t,p) = the position/index in the chem array for mixing-
84 !	ratio for sulfate for aerosol size bin s, type t, and phase p
85 !   (similar lptr's are defined for no3, cl, msa, co3, 
86 !	nh4, na, ca, oin, oc, bc, ...)
87 !   [Note:  the massptr_aer allow you to loop over all species of 
88 !	an aerosol type.  The lptr_so4_aer, etc., allow you to access
89 !	a specific chemical component.]
90 !
91 !   waterptr_aer(s,t) = the position/index in the chem array for mixing-
92 !	ratio of aerosol water content for size bin s, type t.
93 !	[Note:  water content is only carried for the interstitial aerosol
94 !	phase, so there is no p dimension.]
95 !
96 !   hyswptr_aer(s,t) = the position/index in the chem array for mixing-
97 !	ratio of aerosol "hysteresis water" content for size bin s, type t.
98 !	This is used to determine if aerosol is in the dry or wet state, when
99 !	the ambient RH is between the crystallization and deliquescence RH.
100 !	[Note:  hysteresis water content is only carried for the 
101 !	interstitial aerosol phase, so there is no p dimension.]
102 !
103 !   numptr_aer(s,t,p) = the position/index in the chem array for mixing- 
104 !	ratio of particle number for size bin s, type t, and phase p.
105 !
106 !   mprognum_aer(s,t,p) - if positive, number mixing-ratio for size s, type t,
107 !       and phase p will be prognosed.  Otherwise, it is diagnosed using
108 !	mass mixing-ratio add assumed/prescribed size.
109 !
110 !	mixing ratio (moles-water/mole-air) for water
111 !       associated with aerosol size bin s and type t
112 !
113 !
114 !   mastercompindx_so4_aer = the position/index in the 
115 !       "master component list" for sulfate.  
116 !   (similar lptr's are defined for no3, cl, msa, co3, 
117 !	nh4, na, ca, oin, oc, bc, ...)
118 !   [Note:  the mastercompindx_xxx_aer are used primarily in 
119 !	initialization routines, and generally aren't needed elsewhere.]
120 !
121 !-----------------------------------------------------------------------
122 !
123 !   dens_mastercomp_aer(mc) = dry density (g/cm^3) of component mc 
124 !	of the master component list.
125 !   dens_aer(c,t) = dry density (g/cm^3) of aerosol chemical component 
126 !	c of type t
127 !   [Note:  dens_aer(c,t) == dens_mastercomp_aer(mastercompptr_aer(c,t))
128 !	The dens_mastercomp_aer is used in some initialization routines.
129 !	The dens_aer is used in most other places because of convenience.]
130 !
131 !   mw_mastercomp_aer(mc) = molecular weight (g/mole) of component mc 
132 !	of the master component list.
133 !   mw_aer(c,t) = molecular weight (g/mole) of aerosol chemical component 
134 !	c of type t
135 !   [Note:  mw_aer(c,t) == mw_mastercomp_aer(mastercompptr_aer(c,t)) ]
136 !
137 !   name_mastercomp_aer(mc) = name of component mc of the 
138 !	master component list (e.g., "sulfate", "nitrate", ...).
139 !   name_aer(c,t) = molecular weight (g/mole) of aerosol chemical component 
140 !	c of type t
141 !   [Note:  name_aer(c,t) == name_mastercomp_aer(mastercompptr_aer(c,t)) ]
142 !
143 !   hygro_mastercomp_aer(mc) = bulk hygroscopicity (--) at dilute conditions
144 !	(RH near 100%) of component mc of the master component list.
145 !   hygro_aer(c,t) = bulk hygroscopicity (--) at dilute conditions 
146 !	(RH near 100%) of aerosol chemical component c of type t
147 !   [For definition of bulk hygroscopicity, 
148 !	see Abdul-Razzak and Ghan, 2004, J Geophys Res, V105, p. 6837-6844.]
149 !   [Note:  hygro_aer(c,t) == hygro_mastercomp_aer(mastercompptr_aer(c,t)) ]
150 !
151 !-----------------------------------------------------------------------
152 !
153 !   volumlo_sect(s,t) = 1-particle volume (cm^3) at lower boundary of section m
154 !   volumhi_sect(s,t) = 1-particle volume (cm^3) at upper boundary of section m
155 !   volumcen_sect(s,t)= 1-particle volume (cm^3) at "center" of section m
156 !
157 !   dlo_sect(s,t) = 1-particle diameter (cm) at lower boundary of section m
158 !   dhi_sect(s,t) = 1-particle diameter (cm) at upper boundary of section m
159 !   dcen_sect(s,t) = 1-particle diameter (cm) at "center" section m
160 !
161 !   [Note:  the "center" values are defined as follows:
162 !       volumcen_sect == 0.5*(volumlo_sect + volumhi_sect)
163 !                     == (pi/6) * (dcen_sect**3) ]
164 !
165 !-----------------------------------------------------------------------
166 !
167 !   msectional - if positive, each aerosol size bin is a section.
168 !   if equals 10, use jacobson moving center
169 !   if equals 20, use tzivion mass-number advection 
170 !	if zero/negative, each size bin is a mode (aitken, accumulation, ...)
171 !
172 !   maerosolincw - if positive, both unactivated/interstitial and activated
173 !       aerosol species are simulated.  if zero/negative, only the
174 !       unactivated are simulated.  [maerosolincw>0 only when cw_phase>0]
175 !
176 !   maerocoag - if positive, aerosol coagulation is done.
177 !	If zero/negative, it is skipped.
178 !	(This is not yet implemented in WRF-Chem.)
179 !
180 !   maerchem - if positive, aerosol gas-particle condensation/evaporation
181 !	of inorganic species is done.  If zero/negative, it is skipped.
182 !	(This is not yet implemented in WRF-Chem.)
183 !
184 !   maerchem_boxtest_output - if positive, "boxtest" output is done from
185 !	the aerchemistry routine.  If zero/negative, it is skipped.
186 !	(This is not yet implemented in WRF-Chem.)
187 !
188 !   maeroptical - if positive, aerosol optical properties are calculated. 
189 !	If zero/negative, it is skipped.
190 !	(This is not yet implemented in WRF-Chem.)
191 !
192 !-----------------------------------------------------------------------
193 
194 	integer, parameter :: maxd_atype = 1
195 	integer, parameter :: maxd_asize = 8
196 	integer, parameter :: maxd_acomp = 12
197 	integer, parameter :: maxd_aphase = 2
198 
199 	integer, save :: ai_phase = -999888777
200 	integer, save :: cw_phase = -999888777
201 	integer, save :: ci_phase = -999888777
202 	integer, save :: rn_phase = -999888777
203 	integer, save :: sn_phase = -999888777
204 	integer, save :: gr_phase = -999888777
205 
206 	integer, save :: ntype_aer = 0 ! number of types
207 	integer, save :: ntot_mastercomp_aer = 0 ! number of master components
208 	integer, save :: nphase_aer = 0 ! number of phases
209 
210 	integer, save ::   &
211       	  nsize_aer( maxd_atype ),   & ! number of size bins
212       	  ncomp_aer( maxd_atype ),   & ! number of chemical components
213       	  ncomp_plustracer_aer( maxd_atype ),   &
214           mastercompptr_aer(maxd_acomp, maxd_atype), &   !  mastercomp index
215       	  massptr_aer( maxd_acomp, maxd_asize, maxd_atype, maxd_aphase ), & 
216 		! index for mixing ratio
217       	  waterptr_aer( maxd_asize, maxd_atype ), & ! index for aerosol water
218       	  hyswptr_aer( maxd_asize, maxd_atype ), &
219       	  numptr_aer( maxd_asize, maxd_atype, maxd_aphase ), & 
220 		! index for the number mixing ratio
221           mprognum_aer(maxd_asize,maxd_atype,maxd_aphase)
222 
223 
224 !   these indices give the location in the "mastercomp list" of
225 !   the different aerosol chemical (or tracer) components
226 	integer, save :: mastercompindx_so4_aer = -999888777
227 	integer, save :: mastercompindx_no3_aer = -999888777
228 	integer, save :: mastercompindx_cl_aer  = -999888777
229 	integer, save :: mastercompindx_msa_aer = -999888777
230 	integer, save :: mastercompindx_co3_aer = -999888777
231 	integer, save :: mastercompindx_nh4_aer = -999888777
232 	integer, save :: mastercompindx_na_aer  = -999888777
233 	integer, save :: mastercompindx_ca_aer  = -999888777
234 	integer, save :: mastercompindx_oin_aer = -999888777
235 	integer, save :: mastercompindx_oc_aer  = -999888777
236 	integer, save :: mastercompindx_bc_aer  = -999888777
237 
238 
239 	real, save ::   &
240           dens_aer( maxd_acomp, maxd_atype ),   &
241           dens_mastercomp_aer( maxd_acomp ),   &
242       	  mw_mastercomp_aer( maxd_acomp ),   &
243       	  mw_aer( maxd_acomp, maxd_atype ),   &
244       	  hygro_mastercomp_aer( maxd_acomp ),   &
245       	  hygro_aer( maxd_acomp, maxd_atype )
246 
247 !  added by Yang Zhang
248 	real, save ::   &
249           volumcen_sect( maxd_asize, maxd_atype ),   &
250           volumlo_sect( maxd_asize, maxd_atype ),   &
251           volumhi_sect( maxd_asize, maxd_atype ),   &
252           dcen_sect( maxd_asize, maxd_atype ),   &
253           dlo_sect( maxd_asize, maxd_atype ),   &
254           dhi_sect( maxd_asize, maxd_atype ),   &
255 	  sigmag_aer(maxd_asize, maxd_atype)
256 
257 	character*10, save ::   &
258       	  name_mastercomp_aer( maxd_acomp ),  &
259       	  name_aer( maxd_acomp, maxd_atype )
260 
261 	integer, save ::                     &
262       	  lptr_so4_aer(maxd_asize, maxd_atype, maxd_aphase),      &
263       	  lptr_msa_aer(maxd_asize, maxd_atype, maxd_aphase),      &
264       	  lptr_no3_aer(maxd_asize, maxd_atype, maxd_aphase),      &
265       	  lptr_cl_aer(maxd_asize, maxd_atype, maxd_aphase),       &
266           lptr_co3_aer(maxd_asize, maxd_atype, maxd_aphase),      &
267       	  lptr_nh4_aer(maxd_asize, maxd_atype, maxd_aphase),      &
268       	  lptr_na_aer(maxd_asize, maxd_atype, maxd_aphase),       &
269       	  lptr_ca_aer(maxd_asize, maxd_atype, maxd_aphase),       &
270       	  lptr_oin_aer(maxd_asize, maxd_atype, maxd_aphase),      &
271       	  lptr_oc_aer(maxd_asize, maxd_atype, maxd_aphase),       &
272       	  lptr_bc_aer(maxd_asize, maxd_atype, maxd_aphase)
273 
274 ! rce 11-sep-2004 - eliminated all of the "..._wrfch" pointers
275 !    so now there is only one set of pointers ("..._amode")
276 ! sg/rce nov-2004 - totally new pointer system  - "..._aer"
277 
278 
279 !   molecular weights (g/mol)
280 	real, parameter :: mw_so4_aer = 96.066
281 	real, parameter :: mw_no3_aer = 62.007
282 	real, parameter :: mw_cl_aer  = 35.450
283 	real, parameter :: mw_msa_aer = 96.109
284 	real, parameter :: mw_co3_aer = 60.007
285 	real, parameter :: mw_nh4_aer = 18.042
286 	real, parameter :: mw_na_aer  = 22.990
287 	real, parameter :: mw_ca_aer  = 40.080
288 	real, parameter :: mw_oin_aer = 1.0
289 	real, parameter :: mw_oc_aer  = 1.0
290 	real, parameter :: mw_bc_aer  = 1.0
291 	real, parameter :: mw_water_aer  = 18.016
292 	
293 !   dry densities (g/cm3)
294 	real, parameter :: dens_so4_aer = 1.80
295 	real, parameter :: dens_no3_aer = 1.80
296 	real, parameter :: dens_cl_aer  = 2.20
297 	real, parameter :: dens_msa_aer = 1.80
298 	real, parameter :: dens_co3_aer = 2.60
299 	real, parameter :: dens_nh4_aer = 1.80
300 	real, parameter :: dens_na_aer  = 2.20
301 	real, parameter :: dens_ca_aer  = 2.60
302 	real, parameter :: dens_oin_aer = 2.60
303 	real, parameter :: dens_oc_aer  = 1.00
304 	real, parameter :: dens_bc_aer  = 1.70
305 
306 !   water density (g/cm3)
307 !	real, parameter :: dens_water_asize  = 1.0
308 	real, parameter :: dens_water_aer  = 1.0
309 
310 !   hygroscopicities (dimensionless)
311 	real, parameter :: hygro_so4_aer = 0.5
312 	real, parameter :: hygro_no3_aer = 0.5
313 	real, parameter :: hygro_ca_aer  = 0.1
314 	real, parameter :: hygro_co3_aer = 0.1
315 	real, parameter :: hygro_nh4_aer = 0.5
316 	real, parameter :: hygro_msa_aer = 0.58
317 	real, parameter :: hygro_cl_aer  = 1.16
318 	real, parameter :: hygro_na_aer  = 1.16
319 	real, parameter :: hygro_oin_aer = 0.14
320 	real, parameter :: hygro_oc_aer  = 0.14
321 	real, parameter :: hygro_bc_aer  = 1.e-6
322 
323 
324 	integer, save ::   &
325       	  msectional, maerosolincw,   &
326       	  maerocoag, maerchem, maeroptical, maerchem_boxtest_output
327 
328 
329 !-----------------------------------------------------------------------
330 !   the following arrays are used during "column calculations" within
331 !	mosaic modules
332 !
333 !   aqvoldry_sub(n,k,m) = dry-volume (cm^3-aerosol/mole-air) for mode n,
334 !			layer k, subarea m
335 !   aqmassdry_sub(n,k,m) = dry-mass (g-aerosol/mole-air) for mode n, ...
336 !   adrydens_sub(n,k,m) = dry-density (g-aerosol/cm^3-aerosol) for mode n, ...
337 !			== amassdry_sub/avoldry_sub
338 !   awetdens_sub(n,k,m) = wet-density (g-aerosol/cm^3-aerosol) for mode n, ...
339 !
340 !   admeandry_sub(n,k,m) = current mean dry-diameter (cm) 
341 !	for unactivated aerosol in mode n, layer k, subarea m.  
342 !	(Used in sectional code)
343 !   admeanwet_sub(n,k,m) = current mean wet-diameter (cm) 
344 !	for unactivated aerosol in mode n, layer k, subarea m.  
345 !	(Used in sectional code)
346 !
347 !   awetdens_sfc(n,i,j) = wet-density for mode n and k=1.  This value is 
348 !	saved after the second pass thru subr. aerosol_wetsize 
349 !	for use in subr. bounds
350 !   admeanwet_sfc(n,i,j) = mean wet-diameter for mode n and k=1.  
351 !	This value is saved after the second pass thru 
352 !	subr. aerosol_wetsize for use in subr. bounds
353 !
354 !
355 !   following are used in aerosol growth routine and are locally
356 !   defined for the current layer (k) and subarea (m)
357 !	drymass_pregrow(n) = dry-mass (g/mole-air) for section n
358 !			before the aerosol growth
359 !	drymass_aftgrow(n) = dry-mass (g/mole-air) for section n
360 !			after the growth but before inter-section transfer
361 !	drydens_pregrow(n) = dry-density (g/cm3) for section n
362 !			before the aerosol growth
363 !	drydens_aftgrow(n) = dry-density (g/cm3) for section n
364 !			after the growth but before inter-section transfer
365 !
366 !-----------------------------------------------------------------------
367 
368 !	integer, parameter :: imaxd_asize = 78
369 !	integer, parameter :: jmaxd_asize = 28
370 	integer, parameter :: kmaxd_asize = 100
371 	integer, parameter :: nsubareamaxd_asize = 5
372 
373 ! rce 22-jul-2006 - added maxd_atype dimension to following 6 arrays
374 !    and changed avoldry_sub,amassdry_sub to aqvoldry_sub,aqmassdry_sub
375 	real, save :: aqvoldry_sub( maxd_asize,maxd_atype,kmaxd_asize,nsubareamaxd_asize)
376 	real, save :: aqmassdry_sub(maxd_asize,maxd_atype,kmaxd_asize,nsubareamaxd_asize)
377 	real, save :: adrydens_sub( maxd_asize,maxd_atype,kmaxd_asize,nsubareamaxd_asize)
378 	real, save :: awetdens_sub( maxd_asize,maxd_atype,kmaxd_asize,nsubareamaxd_asize)
379 	real, save :: admeandry_sub(maxd_asize,maxd_atype,kmaxd_asize,nsubareamaxd_asize)
380 	real, save :: admeanwet_sub(maxd_asize,maxd_atype,kmaxd_asize,nsubareamaxd_asize)
381 
382 !	real, save :: awetdens_sfc(maxd_asize,imaxd_asize,jmaxd_asize)
383 !	real, save :: admeanwet_sfc(maxd_asize,imaxd_asize,jmaxd_asize)
384 
385 	real, save :: drymass_pregrow(maxd_asize,maxd_atype)
386 	real, save :: drydens_pregrow(maxd_asize,maxd_atype)
387 	real, save :: drymass_aftgrow(maxd_asize,maxd_atype)
388 	real, save :: drydens_aftgrow(maxd_asize,maxd_atype)
389 
390 ! table lookup of aerosol impaction/interception
391 ! scavenging rates
392 	real dlndg_nimptblgrow
393 	integer nimptblgrow_mind, nimptblgrow_maxd
394 	parameter (nimptblgrow_mind=-7, nimptblgrow_maxd=12)
395      	real scavimptblnum(4, nimptblgrow_mind:nimptblgrow_maxd, maxd_asize, maxd_atype), &
396      	     scavimptblvol(4, nimptblgrow_mind:nimptblgrow_maxd, maxd_asize, maxd_atype)
397 
398 
399 	end module module_data_mosaic_asect