added README_changes.txt
[wrffire.git] / wrfv2_fire / chem / aerosol_driver.F
blob231c60d984477eb7f75541e09a800ce0bc666d63
1 !WRF:MODEL_LAYER:PHYSICS
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                                   )
15 !----------------------------------------------------------------------
16    USE module_configure
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.
27    !
28    !  1. MADE-SORGAM
29    !  2. MOSAIC
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.
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
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
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
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,    &
106                                       id,ktau,ktauc
107       REAL,      INTENT(IN   ) :: dtstep,dtstepc
109 ! moisture variables
111    REAL, DIMENSION( ims:ime, kms:kme, jms:jme, num_moist ),         &
112          INTENT(IN ) ::                                   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 ),                    &
122          INTENT(INOUT ) ::                                          &
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 ),     &
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
134 ! arrays for aerosol/radiation feedback
136    REAL, DIMENSION( ims:ime, kms:kme, jms:jme ),                    &
137          INTENT(INOUT ) ::                                          &
138                aerwrf
140 ! aerosol/radm2 interaction
142    REAL,  DIMENSION(ims:ime,kms:kme-0,jms:jme,ldrog),               &
143                INTENT(IN   ) ::                                     &
144                                                      VDROG3
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
157 ! sulf concentration before modification by chemical mechanism
159      REAL, dimension (ims:ime,kms:kme-0,jms:jme),                   &
160                INTENT(INOUT) ::                                     &
161                                vcsulf_old
163 ! LOCAL  VAR
164      integer :: ii,jj,kk
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
171 ! CBMZ_BB.
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')
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                                )
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                                )
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                                   )
236    CASE DEFAULT 
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                                  )
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
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 ),             &
262          INTENT(IN ) :: 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 (                                            &
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                                  )
295    CASE DEFAULT 
297    END SELECT sum_pm_select
299    END SUBROUTINE sum_pm_driver