aerosol_driver.F
References to this file elsewhere.
1 !WRF:MODEL_LAYER:PHYSICS
2 !
3 SUBROUTINE aerosols_driver (id,ktau,dtstep,ktauc,config_flags, &
4 dtstepc, &
5 alt,t_phy,moist,aerwrf,p8w,t8w,p_phy,chem,rho_phy,dz8w, &
6 z,z_at_w,h2oaj,h2oai,nu3,ac3,cor3,asulf,ahno3,anh3,cvaro1, &
7 cvaro2,cvalk1,cvole1,cvapi1,cvapi2,cvlim1,cvlim2,vcsulf_old,&
8 e_pm25i,e_pm25j,e_eci,e_ecj,e_orgi,e_orgj,e_pm10, &
9 e_so4i,e_so4j,e_no3i,e_no3j, &
10 vdrog3, &
11 ids,ide, jds,jde, kds,kde, &
12 ims,ime, jms,jme, kms,kme, &
13 its,ite, jts,jte, kts,kte )
14
15 !----------------------------------------------------------------------
16 USE module_configure
17 USE module_state_description
18 USE module_model_constants
19
20 ! *** add new modules of schemes here
21
22 USE module_aerosols_sorgam
23 USE module_data_sorgam
24 USE module_mosaic_driver, only: mosaic_aerchem_driver
25
26 ! This driver calls subroutines for aerosols parameterizations.
27 !
28 ! 1. MADE-SORGAM
29 ! 2. MOSAIC
30
31 !----------------------------------------------------------------------
32 IMPLICIT NONE
33 !======================================================================
34 ! Grid structure in physics part of WRF
35 !----------------------------------------------------------------------
36 ! The horizontal velocities used in the physics are unstaggered
37 ! relative to temperature/moisture variables. All predicted
38 ! variables are carried at half levels except w, which is at full
39 ! levels. Some arrays with names (*8w) are at w (full) levels.
40 !
41 !----------------------------------------------------------------------
42 ! In WRF, kms (smallest number) is the bottom level and kme (largest
43 ! number) is the top level. In your scheme, if 1 is at the top level,
44 ! then you have to reverse the order in the k direction.
45 !
46 ! kme - half level (no data at this level)
47 ! kme ----- full level
48 ! kme-1 - half level
49 ! kme-1 ----- full level
50 ! .
51 ! .
52 ! .
53 ! kms+2 - half level
54 ! kms+2 ----- full level
55 ! kms+1 - half level
56 ! kms+1 ----- full level
57 ! kms - half level
58 ! kms ----- full level
59 !
60 !======================================================================
61 ! Definitions
62 !-----------
63 !-- alt inverse density
64 !-- t_phy temperature (K)
65 !-- w vertical velocity (m/s)
66 !-- moist moisture array (4D - last index is species) (kg/kg)
67 !-- dz8w dz between full levels (m)
68 !-- p8w pressure at full levels (Pa)
69 !-- p_phy pressure (Pa)
70 ! points (dimensionless)
71 !-- z 3D height with lowest level being the terrain
72 !-- rho_phy density (kg/m^3)
73 !-- R_d gas constant for dry air ( 287. J/kg/K)
74 !-- R_v gas constant for water vapor (461 J/k/kg)
75 !-- Cp specific heat at constant pressure (1004 J/k/kg)
76 !-- rvovrd R_v divided by R_d (dimensionless)
77 !-- G acceleration due to gravity (m/s^2)
78 !-- ids start index for i in domain
79 !-- ide end index for i in domain
80 !-- jds start index for j in domain
81 !-- jde end index for j in domain
82 !-- kds start index for k in domain
83 !-- kde end index for k in domain
84 !-- ims start index for i in memory
85 !-- ime end index for i in memory
86 !-- jms start index for j in memory
87 !-- jme end index for j in memory
88 !-- kms start index for k in memory
89 !-- kme end index for k in memory
90 !-- its start index for i in tile
91 !-- ite end index for i in tile
92 !-- jts start index for j in tile
93 !-- jte end index for j in tile
94 !-- kts start index for k in tile
95 !-- kte end index for k in tile
96 !-- config_flags%kemit end index for k for emissions arrays
97 !
98 !======================================================================
99
100 TYPE(grid_config_rec_type), INTENT(IN ) :: config_flags
101
102 INTEGER, INTENT(IN ) :: &
103 ids,ide, jds,jde, kds,kde, &
104 ims,ime, jms,jme, kms,kme, &
105 its,ite, jts,jte, kts,kte, &
106 id,ktau,ktauc
107 REAL, INTENT(IN ) :: dtstep,dtstepc
108 !
109 ! moisture variables
110 !
111 REAL, DIMENSION( ims:ime, kms:kme, jms:jme, num_moist ), &
112 INTENT(IN ) :: moist
113 !
114 ! all advected chemical species
115 !
116 REAL, DIMENSION( ims:ime, kms:kme, jms:jme, num_chem ), &
117 INTENT(INOUT ) :: chem
118 !
119 ! following are aerosol arrays that are not advected
120 !
121 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
122 INTENT(INOUT ) :: &
123 h2oaj,h2oai,nu3,ac3,cor3,asulf,ahno3,anh3,cvaro1,cvaro2, &
124 cvalk1,cvole1,cvapi1,cvapi2,cvlim1,cvlim2
125 !
126 ! aerosol emissions arrays
127 !
128 ! REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
129 REAL, DIMENSION( ims:ime, kms:config_flags%kemit, jms:jme ), &
130 INTENT(INOUT ) :: &
131 e_so4i,e_so4j,e_no3i,e_no3j, &
132 e_pm25i,e_pm25j,e_eci,e_ecj,e_orgi,e_orgj,e_pm10
133 !
134 ! arrays for aerosol/radiation feedback
135 !
136 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
137 INTENT(INOUT ) :: &
138 aerwrf
139 !
140 ! aerosol/radm2 interaction
141 !
142 REAL, DIMENSION(ims:ime,kms:kme-0,jms:jme,ldrog), &
143 INTENT(IN ) :: &
144 VDROG3
145 !
146 ! input from meteorology
147 REAL, DIMENSION( ims:ime , kms:kme , jms:jme ) , &
148 INTENT(IN ) :: &
149 alt, &
150 t_phy, &
151 p_phy, &
152 dz8w, &
153 z , &
154 t8w,p8w,z_at_w , &
155 rho_phy
156 !
157 ! sulf concentration before modification by chemical mechanism
158 !
159 REAL, dimension (ims:ime,kms:kme-0,jms:jme), &
160 INTENT(INOUT) :: &
161 vcsulf_old
162
163 ! LOCAL VAR
164 integer :: ii,jj,kk
165
166
167 !-----------------------------------------------------------------
168
169 ! These are unneeded, since the default behavior is to do nothing.
170 ! If the default changes, then lines need to be added for CBMZ and
171 ! CBMZ_BB.
172 ! IF (config_flags%chem_opt .eq. 0) return
173 ! IF (config_flags%chem_opt .eq. 1) return
174
175 !
176 ! select which aerosol scheme to take
177 !
178 cps_select: SELECT CASE(config_flags%chem_opt)
179
180 CASE (RADM2SORG,RADM2SORG_KPP)
181 CALL wrf_debug(15,'aerosols_driver calling sorgam_driver')
182 do ii=its,ite
183 do kk=kts,kte
184 do jj=jts,jte
185 if(chem(ii,kk,jj,p_nu0).lt.1.e07)then
186 chem(ii,kk,jj,p_nu0)=1.e7
187 endif
188 enddo
189 enddo
190 enddo
191 call sorgam_driver (id,ktauc,dtstepc,t_phy,moist,aerwrf,p8w,t8w, &
192 alt,p_phy,chem,rho_phy,dz8w,z,z_at_w, &
193 h2oaj,h2oai,nu3,ac3,cor3,asulf,ahno3,anh3,cvaro1,cvaro2, &
194 cvalk1,cvole1,cvapi1,cvapi2,cvlim1,cvlim2,vcsulf_old, &
195 e_pm25i,e_pm25j,e_eci,e_ecj,e_orgi,e_orgj,e_pm10, &
196 e_so4i,e_so4j,e_no3i,e_no3j, &
197 vdrog3, &
198 config_flags%kemit, &
199 ids,ide, jds,jde, kds,kde, &
200 ims,ime, jms,jme, kms,kme, &
201 its,ite, jts,jte, kts,kte )
202
203 CASE (RACMSORG,RACMSORG_KPP)
204 CALL wrf_debug(15,'aerosols_driver calling sorgam_driver')
205 do ii=its,ite
206 do kk=kts,kte
207 do jj=jts,jte
208 if(chem(ii,kk,jj,p_nu0).lt.1.e07)then
209 chem(ii,kk,jj,p_nu0)=1.e7
210 endif
211 enddo
212 enddo
213 enddo
214 call sorgam_driver (id,ktauc,dtstepc,t_phy,moist,aerwrf,p8w,t8w, &
215 alt,p_phy,chem,rho_phy,dz8w,z,z_at_w, &
216 h2oaj,h2oai,nu3,ac3,cor3,asulf,ahno3,anh3,cvaro1,cvaro2, &
217 cvalk1,cvole1,cvapi1,cvapi2,cvlim1,cvlim2,vcsulf_old, &
218 e_pm25i,e_pm25j,e_eci,e_ecj,e_orgi,e_orgj,e_pm10, &
219 e_so4i,e_so4j,e_no3i,e_no3j, &
220 vdrog3, &
221 config_flags%kemit, &
222 ids,ide, jds,jde, kds,kde, &
223 ims,ime, jms,jme, kms,kme, &
224 its,ite, jts,jte, kts,kte )
225
226 CASE (CBMZ_MOSAIC_4BIN, CBMZ_MOSAIC_8BIN, CBMZ_MOSAIC_4BIN_AQ, CBMZ_MOSAIC_8BIN_AQ)
227 CALL wrf_debug(15,'aerosols_driver calling mosaic_aerchem_driver')
228 CALL mosaic_aerchem_driver( &
229 id, ktau, dtstep, ktauc, dtstepc, config_flags, &
230 t_phy, rho_phy, p_phy, &
231 moist, chem, &
232 ids,ide, jds,jde, kds,kde, &
233 ims,ime, jms,jme, kms,kme, &
234 its,ite, jts,jte, kts,kte )
235
236 CASE DEFAULT
237
238 END SELECT cps_select
239
240 END SUBROUTINE aerosols_driver
241
242 !-----------------------------------------------------------------------
243
244 SUBROUTINE sum_pm_driver ( config_flags, &
245 alt, chem, h2oaj, h2oai, &
246 pm2_5_dry, pm2_5_water, pm2_5_dry_ec, pm10, &
247 ids,ide, jds,jde, kds,kde, &
248 ims,ime, jms,jme, kms,kme, &
249 its,ite, jts,jte, kts,kte )
250
251 USE module_configure
252 USE module_aerosols_sorgam, only: sum_pm_sorgam
253 USE module_mosaic_driver, only: sum_pm_mosaic
254 IMPLICIT NONE
255
256 INTEGER, INTENT(IN ) :: &
257 ids,ide, jds,jde, kds,kde, &
258 ims,ime, jms,jme, kms,kme, &
259 its,ite, jts,jte, kts,kte
260
261 REAL, DIMENSION( ims:ime, kms:kme, jms:jme, num_chem ), &
262 INTENT(IN ) :: chem
263
264 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
265 INTENT(IN ) :: alt,h2oaj,h2oai
266
267 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
268 INTENT(OUT) :: pm2_5_dry,pm2_5_water,pm2_5_dry_ec,pm10
269
270 TYPE(grid_config_rec_type), INTENT(IN ) :: config_flags
271 !
272 ! Select the active aerosol scheme and sum up pm2.5 and pm10 mass
273 ! for use in radiation and/or diagnostic purposes.
274 !
275 sum_pm_select: SELECT CASE(config_flags%chem_opt)
276
277 CASE (RADM2SORG, RACMSORG,RADM2SORG_KPP,RACMSORG_KPP)
278 CALL wrf_debug(15,'sum_pm_driver: calling sum_pm_sorgam')
279 CALL sum_pm_sorgam ( &
280 alt, chem, h2oaj, h2oai, &
281 pm2_5_dry, pm2_5_water, pm2_5_dry_ec, pm10, &
282 ids,ide, jds,jde, kds,kde, &
283 ims,ime, jms,jme, kms,kme, &
284 its,ite, jts,jte, kts,kte )
285
286 CASE (CBMZ_MOSAIC_4BIN, CBMZ_MOSAIC_8BIN, CBMZ_MOSAIC_4BIN_AQ, CBMZ_MOSAIC_8BIN_AQ)
287 CALL wrf_debug(15,'sum_pm_driver: calling sum_pm_mosaic')
288 call sum_pm_mosaic ( &
289 alt, chem, &
290 pm2_5_dry, pm2_5_water, pm2_5_dry_ec, pm10, &
291 ids,ide, jds,jde, kds,kde, &
292 ims,ime, jms,jme, kms,kme, &
293 its,ite, jts,jte, kts,kte )
294
295 CASE DEFAULT
296
297 END SELECT sum_pm_select
298
299 END SUBROUTINE sum_pm_driver