Merge remote-tracking branch 'origin/release-v4.6.1'
[WRF.git] / chem / module_hetn2o5.F
blob8589d8f04b1f49abcefece11a5c93987c784da70
1 MODULE module_hetn2o5
4 !temporary:
5 ! from dentener and crutzen for 5S, 160E on 100mb levels startin at 1000mb
6     REAL, PARAMETER, DIMENSION(10) :: &
7         kheti = (/4.2e-5, 3.8e-5, 1.e-5,3.e-6,4.e-6, 2.e-6,3.e-6,5.e-6,1.3e-5,1.8e-5/)
9     !kheta:  on aerosol
10    REAL, SAVE, DIMENSION(120) :: kheta
12    LOGICAL :: do_aerosol=.TRUE.
15 ! sticking coefficients for cloud water and cloud ice
17    REAL    , PARAMETER, PRIVATE :: gammacldw = 0.05,   &
18                                    gammacldi = 0.03  !cms check !
19                            
20    REAL     , PARAMETER, PRIVATE ::     rhograul = 400. ,&
21                                         rhoice   = 917.                       
23    REAL, PARAMETER, PRIVATE :: pi = 3.1415926
26     ! D_g: diffusivity of species in gas phase in m^2/s      
27        REAL, PARAMETER, PRIVATE ::  D_g = 0.1E-6 
28                              !in Match this is 1.e-5 (Schwartz ?!)
29      
33     ! abar_c:  mass mean radius for cloud drops in m
34        REAL, PARAMETER, PRIVATE :: abar_c = 10.E-6 
38     ! RSTAR2 : universal gas constant in J/(kmol K)
39        REAL, PARAMETER, PRIVATE  :: RSTAR2 = 8314.
42     ! parameters from Lin scheme
43        REAL    , PARAMETER, PRIVATE ::     xnor = 8.0e6
44        REAL    , PARAMETER, PRIVATE ::     xnos = 3.0e6
45        REAL    , PARAMETER, PRIVATE ::     xnog = 4.0e6
49  CONTAINS
50   SUBROUTINE hetn2o5calc(hetn2o5, rho, T, QC, QR, QI, QS, QG, &
51                        rhowater, rhosnow, M_n2o5,             &
52                        P_QI,P_QS,P_QG,                        &
53                        ids,ide, jds,jde, kds,kde,             &
54                        ims,ime, jms,jme, kms,kme,             & 
55                        its,ite, jts,jte, kts,kte              )
59       IMPLICIT NONE
63   INTEGER,      INTENT(IN   )    ::   ids,ide, jds,jde, kds,kde , & 
64                                       ims,ime, jms,jme, kms,kme , &
65                                       its,ite, jts,jte, kts,kte , &
66                                       P_QI,P_QS,P_QG
69    REAL, DIMENSION( its:ite , kts:kte , jts:jte),        &
70          INTENT(INOUT )                               :: hetn2o5
74   REAL, INTENT(IN   ) ::                                rhosnow,  &
75                                                         rhowater, &
76                                                         M_n2o5
79   REAL, DIMENSION( ims:ime , kms:kme , jms:jme ),                 &
80         INTENT(IN   ) ::                                          &
81                                                               QC, &
82                                                               QR, &
83                                                               QI, &
84                                                               QS, &
85                                                               QG, &
86                                                              rho, &
87                                                                T
90 !local vars
92     REAL :: orho, tmp1
95   ! mass mean radii of the different hydrometeors
96     REAL ::                &
97                                  abar_r, abar_i, abar_s, abar_g
100   ! nu_th: thermal velocity of species in m/s 
101     REAL :: nu_th
103     ! tau_Dg: gas diffusion timescale 
104     ! tau_i : timescale for mass transfer across interface of hydrometeor
105        REAL :: tau_i, tau_Dg
108     !  L : water contents in cloud drops, rain drops, hail stones,...
109     !  in (cm^3 H_2O / cm^3 air)
110        REAL :: L
113     ! loss rates:
114        REAL :: kc, kr, ki, ks, kg
117       INTEGER :: i,j,k
120 !----
122    j_loop:  DO j = jts, jte
123    i_loop:  DO i = its, ite
125      DO k = kts, kte
126            orho = 1./rho(i,k,j)
130          kc = 0.
131          kr = 0.
132          ki = 0.
133          ks = 0.
134          kg = 0.
138             !! abar_c
141           IF(QR(i,k,j) .GT. 1.e-12) THEN
142             tmp1=sqrt(pi*rhowater*xnor*orho/QR(i,k,j)) 
143             !!xlambdar1Dr(k)=sqrt(tmp1)
144             abar_r =  2./MAX(sqrt(tmp1), 1.E-8 ) !if abar is large, kt becomes small
145           ENDIF
148 !!$           IF(QI(i,k,j) .GT. 1.e-8) THEN
149 !!$            tmp1=sqrt(pi*rhoice*xnoi*orho/QI(i,k,j))
150 !!$            !!xlambdar1Di(k)=sqrt(tmp1)
151 !!$            abar_i = 2./MAX(sqrt(tmp1), 1.E-8 )
152 !!$           ENDIF
155              abar_i =  abar_c
157            IF(QS(i,k,j) .GT. 1.e-12) THEN
158             tmp1=sqrt(pi*rhosnow*xnos*orho/QS(i,k,j))
159             !!xlambdar1Ds(k)=sqrt(tmp1)
160              abar_s =  2./MAX(sqrt(tmp1), 1.E-8 )
161            ENDIF
165            IF(QG(i,k,j) .GT. 1.e-12) THEN
166             tmp1=sqrt(pi*rhograul*xnog*orho/QG(i,k,j))
167             !!xlambdar1Dg(k)=sqrt(tmp1)
168             abar_g = 2./MAX(sqrt(tmp1), 1.E-8 )  
169            ENDIF
174 ! calculate thermal velocity of species
175         nu_th = SQRT(8*RSTAR2*T(i,k,j)/(pi*M_n2o5))
176        
179 ! calculate timescales
180   !cloud droplets
181     IF(QC(i,k,j) .GT. 1.e-12) THEN
182       tau_i = (4.*abar_c) / (3.* nu_th * gammacldw)
183       tau_Dg = (abar_c**2) / (3.* D_g)
185       L  = (rho(i,k,j) / rhowater) * QC(i,k,j)
186       kc = L/(tau_i +  tau_Dg)
187     ENDIF
189   !rain
190     IF(QR(i,k,j) .GT. 1.e-12) THEN
191       tau_i = (4.*abar_r) / (3.* nu_th * gammacldw)
192       tau_Dg = (abar_r**2) / (3.* D_g)
194       L  = (rho(i,k,j) / rhowater) * QR(i,k,j)
195       kr = L/(tau_i +  tau_Dg)
196     ENDIF
198   !cloud ice
199     IF(QI(i,k,j) .GT. 1.e-12) THEN
200       tau_i = (4.*abar_i) / (3.* nu_th * gammacldi)
201       tau_Dg = (abar_i**2) / (3.* D_g)
203       L  = (rho(i,k,j) / rhowater) * QI(i,k,j)
204       ki = L/(tau_i +  tau_Dg)
205     ENDIF
207   !snow
208      IF(QS(i,k,j).GT. 1.e-12) THEN
209       tau_i = (4.*abar_s) / (3.* nu_th * gammacldi)
210       tau_Dg = (abar_s**2) / (3.* D_g)
212       L  = (rho(i,k,j) / rhowater) * QS(i,k,j)
213       ks = L/(tau_i +  tau_Dg)
214      ENDIF
216   !graupel
217      IF(QG(i,k,j).GT. 1.e-12) THEN
218       tau_i = (4.*abar_g) / (3.* nu_th * gammacldi)
219       tau_Dg = (abar_g**2) / (3.* D_g)
221       L  = (rho(i,k,j) / rhowater) * QG(i,k,j)
222       kg = L/(tau_i +  tau_Dg)
223      ENDIF
227 !!HERE THE VENTILATION COEFF SHOULD BE INCLUDED AND IT PROBABLY DOES NOT HAPPEN ON ICE!!
229 !!    hetn2o5(i,k,j) = kc + kr + ki + ks + kg
230      
235      hetn2o5(i,k,j) =  kc + kr + kheta(k)  !!+ kg
236      !hetn2o5(i,k,j) = 0. !n2o5_test
239      ENDDO
241    ENDDO i_loop
242    ENDDO j_loop
244   END SUBROUTINE hetn2o5calc
250 !-----------------------------------------------------------------
252  SUBROUTINE hetn2o5_ini(      pb, pp, z,                     &
253                                ids, ide, jds, jde, kds, kde, &
254                                ims, ime, jms, jme, kms, kme, &
255                                its, ite, jts, jte, kts, kte)
257 #ifdef DM_PARALLEL
258    USE module_dm
259 #endif
261     IMPLICIT NONE
264     INTEGER, INTENT(IN    )  :: ids, ide, jds, jde, kds, kde, &
265                                 ims, ime, jms, jme, kms, kme, &
266                                 its, ite, jts, jte, kts, kte
269     REAL, DIMENSION( ims:ime, kms:kme, jms:jme),  &
270               INTENT(IN    )  ::                      z, pb, pp
272      REAL, DIMENSION(10) :: pin !moguntia
275   LOGICAL , EXTERNAL      :: wrf_dm_on_monitor
278 !local
280      REAL, DIMENSION(kms:kme) :: zloc, ploc
282       INTEGER :: k, kk, l_low, l_up
283       REAL :: m, b, dp
286 #define DM_BCAST_MACRO(A) CALL wrf_dm_bcast_bytes ( A , size ( A ) * RWORDSIZE )
287   IF (.NOT. do_aerosol) RETURN
289 !currently not really necessary 
290 dm_on_monitor: IF ( wrf_dm_on_monitor() ) THEN
292   kheta(:) = 0.
296    pin(kms)=1000.
297  DO k=2,10
298    pin(k)=pin(k-1)-100.
299  ENDDO
302  DO k=kms,kme
304   zloc(k) = z(its,k,jts)
305   ploc(k) = pb(its,k,jts) + pp(its,k,jts) 
307    IF ( zloc(k) .GT. 1.e6 .OR. zloc(k) .LT. 0. ) THEN
308       CALL wrf_error_fatal ("STOP: hetn2o5_ini")
309    ENDIF
311  ENDDO
313  DO k=kms,kme
314    IF ( ploc(k) .GT. 1.e5 ) THEN
315       kheta(k) = kheti(1)
316    ELSE
318     l_low = 11.-CEILING(ploc(k)/1.e4)
319     l_up=l_low+1
322      dp=ploc(k)/100. - pin(l_up)
323      m=(kheti(l_low)-kheti(l_up))/100.
324      kheta(k)=kheti(l_up) +  m*dp
326     
328    !print *,l_low
329    !print *, ploc(k), pin(l_low), pin(l_up)
330    !print *,  "  ", kheti(l_low),kheti(l_up), kheta(k)
334    END IF
337  ENDDO
342 ENDIF dm_on_monitor
344   DM_BCAST_MACRO( kheta )
346    
348  END SUBROUTINE hetn2o5_ini
351 END MODULE module_hetn2o5