Merge branch 'master' into jm2/perimeter
[wrffire.git] / wrfv2_fire / chem / module_gocart_so2so4.F
blobf88a9baf955597fd3c9979e161a0df42ba88806f
1 MODULE module_gocart_so2so4
3 CONTAINS
5   subroutine so2so4(chem,p_so2,p_sulf,p_h2o2,p_QC,T_PHY,MOIST,gd,          &
6           gd_cldfr,NUM_CHEM,NUM_MOIST,                                              &
7          ids,ide, jds,jde, kds,kde,                                        &
8          ims,ime, jms,jme, kms,kme,                                        &
9          its,ite, jts,jte, kts,kte                                         )
10    INTEGER,      INTENT(IN   ) :: num_chem,num_moist,                      &
11                           p_so2,p_sulf,p_h2o2,p_QC,                        &
12                                   ids,ide, jds,jde, kds,kde,               &
13                                   ims,ime, jms,jme, kms,kme,               &
14                                   its,ite, jts,jte, kts,kte
15     REAL, DIMENSION( ims:ime, kms:kme, jms:jme, num_moist ),                &
16          INTENT(IN ) ::                                   moist
17    REAL, DIMENSION( ims:ime, kms:kme, jms:jme, num_chem ),                 &
18          INTENT(INOUT ) ::                                   chem
19    REAL,  DIMENSION( ims:ime , kms:kme , jms:jme ),                        &
20           INTENT(IN   ) ::                     t_phy,gd
21    REAL,  DIMENSION( ims:ime , kms:kme , jms:jme ),                        &
22           OPTIONAL,                                                        &
23           INTENT(IN   ) ::                     gd_cldfr
25    integer :: i,k,j
26    real :: tc2,tc3,h2o2,cldf
27           do j=jts,jte
28           do k=kts,kte
29           do i=its,ite
30           cldf=0.
31 !         if(p_qc.gt.1)then
32 !            if(moist(i,k,j,p_qc).gt.0 )cldf=1.
33 !         endif
34           if(present(gd_cldfr) ) then
35             cldf=gd_cldfr(i,k,j)
36           elseif(p_qc.gt.1)then
37                if(moist(i,k,j,p_qc).gt.0 )cldf=1.
38           endif
39           tc2=chem(i,k,j,p_so2)
40           IF (cldf > 0.0 .AND. tc2 > 0.0 .AND. t_phy(i,k,j) > 258.0) THEN
41              tc3=chem(i,k,j,p_sulf)
42              h2o2=chem(i,k,j,p_h2o2)
43 !            write(0,*)'1,so2,sulf,h2o2 = ',tc2,tc3,h2o2
44           
46 ! ****************************************************************************
47 ! *  Update SO2 concentration after cloud chemistry.                         *
48 ! *  SO2 chemical loss rate  = SO4 production rate (MixingRatio/timestep).   *
49 ! ****************************************************************************
51            ! Cloud chemistry (above 258K): 
53               IF (tc2 > h2o2) THEN
54                  cldf = cldf * (h2o2/tc2)
55                  h2o2 = h2o2 * (1.0 - cldf)
56               ELSE
57                  h2o2 = h2o2 * (1.0 - cldf*tc2/h2o2)
58               END IF
59               chem(i,k,j,p_so2) = max(1.e-16,tc2 * (1.0 - cldf) )
60               chem(i,k,j,p_sulf) = max(1.e-16,(tc3 + tc2*cldf))
61               chem(i,k,j,p_h2o2)=max(1.e-16,h2o2)
62 !             write(0,*)'2,so2,sulf,h2o2 = ',chem(i,k,j,p_so2),chem(i,k,j,p_sulf),chem(i,k,j,p_h2o2)
63            END IF
64            enddo
65            enddo
66            enddo
68 ! ****************************************************************************
70 END  subroutine so2so4
71 END MODULE module_gocart_so2so4