1 !WRF:MODEL_LAYER:PHYSICS
3 SUBROUTINE aerosols_driver (id,ktau,dtstep,ktauc,config_flags, &
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, &
11 ids,ide, jds,jde, kds,kde, &
12 ims,ime, jms,jme, kms,kme, &
13 its,ite, jts,jte, kts,kte )
15 !----------------------------------------------------------------------
17 USE module_state_description
18 USE module_model_constants
20 ! *** add new modules of schemes here
22 USE module_aerosols_sorgam
23 USE module_data_sorgam
24 USE module_mosaic_driver, only: mosaic_aerchem_driver
26 ! This driver calls subroutines for aerosols parameterizations.
31 !----------------------------------------------------------------------
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.
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.
46 ! kme - half level (no data at this level)
47 ! kme ----- full level
49 ! kme-1 ----- full level
54 ! kms+2 ----- full level
56 ! kms+1 ----- full level
58 ! kms ----- full level
60 !======================================================================
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
98 !======================================================================
100 TYPE(grid_config_rec_type), INTENT(IN ) :: config_flags
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, &
107 REAL, INTENT(IN ) :: dtstep,dtstepc
111 REAL, DIMENSION( ims:ime, kms:kme, jms:jme, num_moist ), &
114 ! all advected chemical species
116 REAL, DIMENSION( ims:ime, kms:kme, jms:jme, num_chem ), &
117 INTENT(INOUT ) :: chem
119 ! following are aerosol arrays that are not advected
121 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
123 h2oaj,h2oai,nu3,ac3,cor3,asulf,ahno3,anh3,cvaro1,cvaro2, &
124 cvalk1,cvole1,cvapi1,cvapi2,cvlim1,cvlim2
126 ! aerosol emissions arrays
128 ! REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
129 REAL, DIMENSION( ims:ime, kms:config_flags%kemit, jms:jme ), &
131 e_so4i,e_so4j,e_no3i,e_no3j, &
132 e_pm25i,e_pm25j,e_eci,e_ecj,e_orgi,e_orgj,e_pm10
134 ! arrays for aerosol/radiation feedback
136 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
140 ! aerosol/radm2 interaction
142 REAL, DIMENSION(ims:ime,kms:kme-0,jms:jme,ldrog), &
146 ! input from meteorology
147 REAL, DIMENSION( ims:ime , kms:kme , jms:jme ) , &
157 ! sulf concentration before modification by chemical mechanism
159 REAL, dimension (ims:ime,kms:kme-0,jms:jme), &
167 !-----------------------------------------------------------------
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
172 ! IF (config_flags%chem_opt .eq. 0) return
173 ! IF (config_flags%chem_opt .eq. 1) return
176 ! select which aerosol scheme to take
178 cps_select: SELECT CASE(config_flags%chem_opt)
180 CASE (RADM2SORG,RADM2SORG_KPP)
181 CALL wrf_debug(15,'aerosols_driver calling sorgam_driver')
185 if(chem(ii,kk,jj,p_nu0).lt.1.e07)then
186 chem(ii,kk,jj,p_nu0)=1.e7
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, &
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 )
203 CASE (RACMSORG,RACMSORG_KPP)
204 CALL wrf_debug(15,'aerosols_driver calling sorgam_driver')
208 if(chem(ii,kk,jj,p_nu0).lt.1.e07)then
209 chem(ii,kk,jj,p_nu0)=1.e7
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, &
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 )
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, &
232 ids,ide, jds,jde, kds,kde, &
233 ims,ime, jms,jme, kms,kme, &
234 its,ite, jts,jte, kts,kte )
238 END SELECT cps_select
240 END SUBROUTINE aerosols_driver
242 !-----------------------------------------------------------------------
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 )
252 USE module_aerosols_sorgam, only: sum_pm_sorgam
253 USE module_mosaic_driver, only: sum_pm_mosaic
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
261 REAL, DIMENSION( ims:ime, kms:kme, jms:jme, num_chem ), &
264 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
265 INTENT(IN ) :: alt,h2oaj,h2oai
267 REAL, DIMENSION( ims:ime, kms:kme, jms:jme ), &
268 INTENT(OUT) :: pm2_5_dry,pm2_5_water,pm2_5_dry_ec,pm10
270 TYPE(grid_config_rec_type), INTENT(IN ) :: config_flags
272 ! Select the active aerosol scheme and sum up pm2.5 and pm10 mass
273 ! for use in radiation and/or diagnostic purposes.
275 sum_pm_select: SELECT CASE(config_flags%chem_opt)
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 )
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 ( &
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 )
297 END SELECT sum_pm_select
299 END SUBROUTINE sum_pm_driver