1 #if( BUILD_SBM_FAST != 1)
2 MODULE module_mp_fast_sbm
7 END SUBROUTINE SBM_fast
8 END MODULE module_mp_fast_sbm
10 ! +-----------------------------------------------------------------------------+
11 ! +-----------------------------------------------------------------------------+
13 ! This is the spectral-bin microphysics scheme based on the Hebrew University
14 ! Cloud Model (HUCM), originally formulated and coded by Alexander Khain
15 ! (email: Alexander.Khain@mail.huji.ac.il);
16 ! The WRF bin microphysics scheme (Fast SBM or FSBM) solves equations for four
17 ! size distribution functions: aerosols, drop (including rain drops), snow and
18 ! graupel/hail (from which mass mixing ratio qna, qc, qr, qs, qg/qh and
19 ! their number concentrations are calculated).
21 ! The scheme is generally written in CGS units. In the updated scheme (FSBM-2)
22 ! the users can choose either graupel or hail to describe dense particles
23 ! (see the 'hail_opt' switch). By default, the 'hail_opt = 1' is used.
24 ! Hail particles have larger terminal velocity than graupel per mass bin.
25 ! 'hail_opt' is recommended to be used in simulations of continental cloud
26 ! systems. The Graupel option may lead to better results in simulations of
27 ! maritime convection.
29 ! The aerosol spectrum in FSBM-2 is approximated by 3-lognormal size distribution
30 ! representing smallest aerosols (nucleation mode), intermediate-size
31 ! (accumulation mode) and largest aerosols (coarse mode). The BC/IC for aerosols
32 ! ,as well as aerosols vertical distribution profile -- are set from within the
33 ! FSBM scheme (see the 'DX_BOUND' parameter). The flag to enable the lognormal
34 ! aerosols is (ILogNormal_modes_Aerosol = 1, manadatory flag). The modes parameters
35 ! (concentration, mean radius and model width) are defined inside the routine
36 ! "LogNormal_modes_Aerosol".
37 ! **NOTE**: In order to set aerosol BC for the outer-most domain, set the threshold
38 ! 'DX_BOUND' = 'MY_DX_OUTER_DOMAIN'-1. For example, if the outermost domain
39 ! resolutionis is 4km 'DX_BOUND' = 3999.
42 ! The user can set the liquid water content threshold (LWC) in which rimed snow
43 ! is being transferred to hail/graupel (see 'ALCR' parameter).
44 ! The default value is ALCR = 0.5 [g/m3]. Increasing this value will result
45 ! in an increase of snow mass content, and a decrease in hail/graupel mass
48 ! We thank and acknowledge contribution from Jiwen Fan (PNNL), Alexander Rhyzkov
49 ! (CIMMS/NSSL), Jeffery Snyder (CIMMS/NSSL), Jimy Dudhia (NCAR) and Dave Gill
52 ! The previous WRF FSBM version (FSBM-1) was coded by Barry Lynn (email:
53 ! Barry.H.Lynn@gmail.com); This updated WRF SBM version (FSBM-2) was coded and
54 ! is maintained by Jacob Shpund (email: kobby.shpund@mail.huji.ac.il).
55 ! Please feel free to reachout with questions about the scheme.
59 ! Khain, A. P., and I. Sednev, 1996: Simulation of precipitation formation in
60 ! the Eastern Mediterranean coastal zone using a spectral microphysics cloud
61 ! ensemble model. Atmospheric Research, 43: 77-110;
62 ! Khain, A. P., A. Pokrovsky and M. Pinsky, A. Seifert, and V. Phillips, 2004:
63 ! Effects of atmospheric aerosols on deep convective clouds as seen from
64 ! simulations using a spectral microphysics mixed-phase cumulus cloud model
65 ! Part 1: Model description. J. Atmos. Sci 61, 2963-2982);
66 ! Khain A. P. and M. Pinsky, 2018: Physical Processes in Clouds and Cloud
67 ! modeling. Cambridge University Press. 642 pp
68 ! Shpund, J., A. Khain, and D. Rosenfeld, 2019: Effects of Sea Spray on the
69 ! Dynamics and Microphysics of an Idealized Tropical Cyclone. J. Atmos. Sci., 0,
70 ! https://doi.org/10.1175/JAS-D-18-0270.1 (A preliminary description of the
71 ! updated FSBM-2 scheme)
73 ! When using the FSBM-2 version please cite:
74 ! -------------------------------------------
75 ! Shpund, J., Khain, A., Lynn, B., Fan, J., Han, B., Ryzhkov, A., Snyder, J.,
76 ! Dudhia, J. and Gill, D., 2019. Simulating a Mesoscale Convective System Using WRF
77 ! With a New Spectral Bin Microphysics: 1: Hail vs Graupel.
78 ! Journal of Geophysical Research: Atmospheres.
80 ! +---------------------------------------------------------------------------- +
81 ! +-----------------------------------------------------------------------------+
82 module module_mp_SBM_BreakUp
85 public Spont_Rain_BreakUp,Spontanous_Init,BreakUp_Snow,KR_SNOW_MIN,KR_SNOW_MAX
88 INTEGER, PARAMETER, PRIVATE:: R8SIZE = 8
89 INTEGER, PARAMETER, PRIVATE:: R4SIZE = 4
91 ! ... Spontanous Rain BreakUp
92 INTEGER,PARAMETER :: JBreak_Spontanous = 28, &
94 DOUBLE PRECISION,PARAMETER :: COL = 0.23105
96 INTEGER,PARAMETER :: KR_SNOW_MAX = 35
97 INTEGER,PARAMETER :: KR_SNOW_MIN = 34
98 ! ... Snow breakup probability
99 DOUBLE PRECISION,PARAMETER :: BREAK_SNOW_KRMAX_0 = 0.02D0
100 DOUBLE PRECISION,PARAMETER :: BREAK_SNOW_KRMAX_1 = 0.012D0
101 !DOUBLE PRECISION,PARAMETER :: BREAK_SNOW_KRMAX_2 = 0.08D0
102 !DOUBLE PRECISION,PARAMETER :: BREAK_SNOW_KRMAX_3 = 0.04D0
105 ! +--------------------------------------------------------------------------+
106 subroutine Spontanous_Init(DTwrf, XL, DROPRADII, Prob, Gain_Var_New, NND, NKR, &
111 integer,intent(in):: NKR
112 real(kind=r4size),intent(in) :: DTwrf,XL(:),DROPRADII(:)
113 real(kind=r8size),intent(out) :: Prob(:), Gain_Var_New(:,:), NND(:,:)
116 real(kind=r8size) :: diameter(nkr), ratio_new, q_m, gain_var(nkr,nkr), dtime_spon_break, &
117 DROPRADII_dp(nkr),XL_dp(nkr)
118 integer :: kr,i,j, ikr_spon_break
119 real(kind=r8size),parameter :: gamma = 0.453d0
120 character*256 :: wrf_err_message
123 !dtime_spon_break = DTwrf
124 DROPRADII_dp = DROPRADII
127 diameter(:) = DROPRADII_dp(:)*2.0d0*10.0d0
131 IF (DROPRADII(kr)>=0.3) exit
134 WRITE( wrf_err_message , * ) 'IKR_Spon_Break=',ikr_spon_break
135 CALL wrf_message ( TRIM ( wrf_err_message ) )
137 if (i_break_method==1) then
139 prob(kr)=2.94d-7*dexp(34.0d0*DROPRADII(kr))
141 else if (i_break_method==2) then
143 prob(kr)=0.155d-3*dexp(1.466d0*10.0d0*DROPRADII(kr))
148 ! prob(kr)=2.94d-7*dexp(34.0d0*DROPRADII_dp(kr))*dtime_spon_break
149 ! IF (prob(kr)>=1.0d0) exit
152 DO j=ikr_spon_break,nkr
154 gain_var(j,i)=(145.37d0/xl_dp(i))*(dropradii_dp(i)/dropradii_dp(j))*dexp(-7.0d0*dropradii_dp(i)/dropradii_dp(j))
155 !gain_var_new(j,i)=gain_var(j,i)*xl(j)/(gain_var(j,i)*xl(i)**2.0d0)
156 nnd(j,i)=gamma*dexp(-gamma*diameter(i))/(1-dexp(-gamma*diameter(j)))
159 ! Calculation the ratio that leads to mass conservation
161 DO i=1,ikr_spon_break-1
162 !nnd_m = nnd_m+nnd(ikr_spon_break,i)*m(i);
163 q_m = q_m + gain_var(ikr_spon_break,i)*xl_dp(i)**2;
165 ratio_new = q_m/xl_dp(ikr_spon_break)
166 ! print*, 'ikr_spon_break,q_m,xl(ikr_spon_break),ratio_new'
167 ! print*, ikr_spon_break,q_m,xl(ikr_spon_break),ratio_new
168 DO j=ikr_spon_break,nkr
170 gain_var_new(j,i) = gain_var(j,i)/ratio_new
175 End Subroutine Spontanous_Init
176 ! +-----------------------------------------------------------------------------+
177 ! i_break_method=1: Spontaneous breakup according to Srivastava1971_JAS -
178 ! Size distribution od raindrops generated by their breakup and coalescence
179 ! i_break_method=2: Spontaneous breakup according to Kamra et al 1991 JGR -
180 ! SPONTANEOUS BREAKUP OF CHARGED AND UNCHARGED WATER DROPS FREELY SUSPENDED IN A WIND TUNNEL
181 ! Eyal's new changes (29/3/15) (start)
182 ! Description of variables (start)
183 ! FF1R(KR), 1/g/cm3 - non conservative drop size distribution
184 ! XL(kr), g - Mass of liquid drops
185 ! prob, dimensionless - probability for breakup
186 ! dropconc_bf(kr), cm^-3 - drops concentration before breakup
187 ! dropconc_af(kr), cm^-3 - drops concentration before breakup
188 ! drops_break(kr), cm^-3 - concentration of breaking drops
189 ! Description of variables (end)
191 SUBROUTINE Spont_Rain_BreakUp (DTwrf, FF1R, XL, Prob, Gain_Var_New, NND, NKR, ikr_spon_break)
195 integer,intent(in) :: NKR, IKR_Spon_Break
196 real(kind=r8size),intent(INOUT) :: FF1R(:)
197 real(kind=r8size),intent(IN) ::XL(:),Prob(:),Gain_Var_New(:,:),NND(:,:)
198 real(kind=r4size),intent(in) :: DTwrf
201 real(kind=r8size) :: dm, deg01, tmp_1, tmp_2, tmp_3
202 real(kind=r8size),dimension(nkr) :: dropconc_bf, dropconc_af, drops_break, psi1, dropradii
203 integer :: kr,i,imax,j
204 real(kind=r4size) :: start_time, end_time, dtime_spon_break
207 dtime_spon_break = DTwrf
211 DROPRADII(KR)=(3.*XL(KR)/4./3.141593/1.)**DEG01
214 if(SUM(FF1R) <= nkr*1.D-30) return
219 if (FF1R(i) > 0.0D0) exit
222 if (imax<ikr_spon_break) return
224 ! Initialization (start)
229 ! b) Calculation of concentration of raindrops in all bins
232 dropconc_bf(kr)=dropconc_bf(kr)+dm*psi1(kr)
234 dropconc_af(:)=dropconc_bf(:)
236 ! c+d) Calculation of number of breaking drops and the concentration of drops remaining in particular bin
238 do kr=imax,ikr_spon_break,-1
239 !dropconc_af(kr)=dropconc_bf(kr)/(1+prob(kr)*dtime_spon_break)
240 tmp_1 = prob(kr)*dtime_spon_break ! [KS, 18thJan18] >> the time was added here and not in the initialization
242 tmp_3 = dropconc_bf(kr)
243 dropconc_af(kr) = tmp_2*tmp_3
244 !dropconc_af(kr) = dexp(-dtime_spon_break*prob(kr))*dropconc_bf(kr)
245 drops_break(kr) = dropconc_bf(kr)-dropconc_af(kr)
246 !if (dropconc_af(kr)<0.0d0) stop 'Spontaneous breakup'
249 ! e) Recalculation of DSD in bin j using new concentration
250 ! do kr=ikr_spon_break,imax
251 ! dm=3.0D0*col*xl(kr)
252 ! psi1(kr)=psi1(kr)-drops_break(kr)/dm
255 ! f+g) Redistributing and calculations drops concentration over smaller (i<j) bins
257 select case (i_break_method)
259 do j=ikr_spon_break,imax
261 dropconc_af(i)=dropconc_af(i)+drops_break(j)*gain_var_new(j,i)*xl(i)
266 do j=ikr_spon_break,imax
268 dropconc_af(i)=dropconc_af(i)+drops_break(j)*gain_var_new(j,i)*xl(i)
269 !dropconc_af(i)=dropconc_af(i)+drops_break(j)*nnd(j,i)
274 ! h) recalculation of DSD in bins kr using new concentrations
278 psi1(kr)=dropconc_af(kr)/dm
282 ! 200 FORMAT(1X,I2,2X,5D13.5)
283 ! Eyal's new changes (29/3/15) (end)
286 END SUBROUTINE Spont_Rain_BreakUp
287 ! +-------------------------------------------+
288 SUBROUTINE BreakUp_Snow (Tin,F,FL,X,RF,NKR)
292 INTEGER,INTENT(in) :: NKR
293 real(kind=r8size),INTENT(inout) :: F(:),FL(:),RF(:)
294 real(kind=r8size),INTENT(in) :: X(:)
295 real(kind=r4size),INTENT(in) :: Tin
298 real(kind=r8size) :: G(NKR),GLW(NKR),GRM(NKR),DEL_GLW(NKR),DEL_GRM(NKR), BREAK_SNOW(NKR), &
299 A,GLW_MAX, FLW_MAX, GRM_MAX, FRM_MAX, GMAX
300 INTEGER :: KR,K,KMAX,KMIN
307 if (KR_SNOW_MAX <=NKR) BREAK_SNOW(KR_SNOW_MAX) = BREAK_SNOW_KRMAX_0
308 if (KR_SNOW_MAX-1<=NKR) BREAK_SNOW(KR_SNOW_MAX-1) = BREAK_SNOW_KRMAX_1
309 !if (KR_SNOW_MAX-2<=NKR) BREAK_SNOW(KR_SNOW_MAX-2) = BREAK_SNOW_KRMAX_2
310 !if (KR_SNOW_MAX-3<=NKR) BREAK_SNOW(KR_SNOW_MAX-3) = BREAK_SNOW_KRMAX_3
328 GLW_MAX=GLW_MAX+X(K)*X(K)*F(K)*FL(K)
331 GLW_MAX=GLW_MAX+A*F(KMAX)*FL(KMAX)
338 GRM_MAX=GRM_MAX+X(K)*X(K)*F(K)*(1.0D0-FL(K))*RF(K)
341 GRM_MAX=GRM_MAX+A*F(KMAX)*(1.0D0-FL(KMAX))*RF(KMAX)
348 GMAX=GMAX+X(K)*X(K)*F(K)
355 !FL(KMAX)=FLW_MAX/F(KMAX)
357 IF (F(KMAX) .lt. 1.0E-20)then
368 FL(KMAX) = FLW_MAX/F(KMAX)
371 RF(KMAX) = FRM_MAX/F(KMAX)/(1.0D0-FL(KMAX))
386 G(KMAX)=3.0D0*F(KMAX)*A
387 DO K=KMAX-1,KMIN-1,-1
388 G(K)=F(K)*3.0D0*X(K)*X(K)
390 GRM(K)=G(K)*(1.0D0-FL(K))*RF(K)
394 DEL_GLW(K) = G(K)*BREAK_SNOW(K)*FL(K)
395 GLW(K-1) = GLW(K-1)+DEL_GLW(K)
396 DEL_GRM(K) = G(K)*(1.0D0-FL(K))*RF(K)*BREAK_SNOW(K)
397 GRM(K-1) = GRM(K-1)+DEL_GRM(K)
398 G(K-1) = G(K-1)+G(K)*BREAK_SNOW(K)
399 F(K-1) = G(K-1)/3.0D0/X(K-1)/X(K-1)
401 if (G(k-1) < 1.0d-20) then
411 FL(k-1) = GLW(k-1)/G(k-1)
415 !print*,'SnowBr',GRM(k-1),G(k-1),FL(k-1)
416 RF(k-1) = GRM(k-1)/G(k-1)/(1.0D0-FL(k-1))
420 ! FL(K-1)=GLW(K-1)/G(K-1)
421 ! RF(K-1)=GRM(K-1)/G(K-1)/(1.0D0-FL(K-1))
423 G(K) = G(K)*(1.0D0-BREAK_SNOW(K))
424 F(K) = G(K)/3.0D0/X(K)/X(K)
428 END SUBROUTINE BreakUp_Snow
429 ! +------------------------------+
430 end module module_mp_SBM_BreakUp
431 ! +-----------------------------------------------------------------------------+
432 ! +-----------------------------------------------------------------------------+
433 module module_mp_SBM_Collision
436 public coll_xyy_lwf, coll_xyx_lwf, coll_xxx_lwf, &
437 coll_xyz_lwf, coll_xxy_lwf, &
438 modkrn_KS, coll_breakup_KS, courant_bott_KS
441 INTEGER, PARAMETER, PRIVATE:: R8SIZE = 8
442 INTEGER, PARAMETER, PRIVATE:: R4SIZE = 4
443 integer,parameter :: kp_flux_max = 44
444 real(kind=r8size), parameter :: G_LIM = 1.0D-16 ! [g/cm^3]
445 integer,parameter :: kr_sgs_max = 20 ! rg(20)=218.88 mkm
448 ! +------------------------------------------------+
449 subroutine coll_xyy_lwf (gx,gy,flx,fly,ckxy,x,y, &
450 c,ima,prdkrn,nkr,indc)
453 integer,intent(in) :: nkr
454 real(kind=r8size),intent(inout) :: gy(:),gx(:),fly(:),flx(:)
455 real(kind=r8size),intent(in) :: ckxy(:,:),x(:),y(:),c(:,:)
456 integer,intent(in) :: ima(:,:)
457 real(kind=r8size),intent(in) :: prdkrn
460 real(kind=r8size) :: gmin,ckxy_ji,x01,x02,x03,gsi,gsj,gsk,gsi_w,gsj_w,gsk_w,gk,gk_w,&
461 fl_gk,fl_gsk,flux,x1,flux_w,gy_k_w,gy_kp_old,gy_kp_w
462 integer :: j,jx0,jx1,i,iy0,iy1,jmin,indc,k,kp
467 ! jx0 - lower limit of integration by j
470 if(gx(j).gt.gmin) goto 2000
473 if(jx0.eq.nkr-1) return
475 ! jx1 - upper limit of integration by j
478 if(gx(j).gt.gmin) goto 2010
482 ! iy0 - lower limit of integration by i
485 if(gy(i).gt.gmin) goto 2001
488 if(iy0.eq.nkr-1) return
490 ! iy1 - upper limit of integration by i
493 if(gy(i).gt.gmin) goto 2011
499 if(gy(i).le.gmin) goto 2020
501 if(jmin.eq.nkr-1) return
502 if(i.lt.jx0) jmin=jx0-indc
504 if(gx(j).le.gmin) goto 2021
508 x01=ckxy_ji*gy(i)*gx(j)*prdkrn
509 x02=dmin1(x01,gy(i)*x(j))
510 x03=dmin1(x02,gx(j)*y(i))
514 if(gsk.le.gmin) goto 2021
518 gsk_w=dmin1(gsk_w,gsk)
520 gy(i)=dmax1(gy(i),0.0d0)
522 gx(j)=dmax1(gx(j),0.0d0)
524 if(gk.le.gmin) goto 2021
525 gk_w=gy(k)*fly(k)+gsk_w
533 x1=dlog(gy(kp)/gk+1.d-15)
534 flux=gsk/x1*(dexp(0.5d0*x1)-dexp(x1*(0.5d0-c(i,j))))
538 if(kp.gt.kp_flux_max) flux=0.5d0*flux
540 flux_w=dmin1(flux_w,gsk_w)
541 flux_w=dmin1(flux_w,gk_w)
544 gy(k)=dmax1(gy(k),gmin)
545 gy_k_w=gk*fl_gk-flux_w
546 gy_k_w=dmin1(gy_k_w,gy(k))
547 gy_k_w=dmax1(gy_k_w,0.0d0)
551 gy(kp)=dmax1(gy(kp),gmin)
552 gy_kp_w=gy_kp_old*fly(kp)+flux_w
553 gy_kp_w=dmin1(gy_kp_w,gy(kp))
554 fly(kp)=gy_kp_w/gy(kp)
556 if(fly(k).gt.1.0d0.and.fly(k).le.1.0001d0) &
558 if(fly(kp).gt.1.0d0.and.fly(kp).le.1.0001d0) &
560 if(fly(k).gt.1.0001d0.or.fly(kp).gt.1.0001d0 &
561 .or.fly(k).lt.0.0d0.or.fly(kp).lt.0.0d0) then
563 print*, 'in subroutine coll_xyy_lwf'
565 if(fly(k).gt.1.0001d0) print*, 'fly(k).gt.1.0001d0'
566 if(fly(kp).gt.1.0001d0) print*, 'fly(kp).gt.1.0001d0'
568 if(fly(k).lt.0.0d0) print*, 'fly(k).lt.0.0d0'
569 if(fly(kp).lt.0.0d0) print*, 'fly(kp).lt.0.0d0'
574 print*, 'jx0,jx1,iy0,iy1'
575 print*, jx0,jx1,iy0,iy1
577 print*, 'ckxy(j,i),x01,x02,x03'
578 print 204, ckxy(j,i),x01,x02,x03
580 print*, 'gsi,gsj,gsk'
581 print 203, gsi,gsj,gsk
583 print*, 'gsi_w,gsj_w,gsk_w'
584 print 203, gsi_w,gsj_w,gsk_w
589 print*, 'fl_gk,fl_gsk'
590 print 202, fl_gk,fl_gsk
607 if(fly(k).lt.0.0d0) print*, &
608 'stop 2022: in subroutine coll_xyy_lwf, fly(k) < 0'
610 if(fly(kp).lt.0.0d0) print*, &
611 'stop 2022: in subroutine coll_xyy_lwf, fly(kp) < 0'
613 if(fly(k).gt.1.0001d0) print*, &
614 'stop 2022: in sub. coll_xyy_lwf, fly(k) > 1.0001'
616 if(fly(kp).gt.1.0001d0) print*, &
617 'stop 2022: in sub. coll_xyy_lwf, fly(kp) > 1.0001'
619 call wrf_error_fatal("in coal_bott coll_xyy_lwf, model stop")
620 ! in case fly(k).gt.1.0001d0.or.fly(kp).gt.1.0001d0
621 ! .or.fly(k).lt.0.0d0.or.fly(kp).lt.0.0d0
631 202 format(1x,2d13.5)
632 203 format(1x,3d13.5)
633 204 format(1x,4d13.5)
636 end subroutine coll_xyy_lwf
637 ! +-----------------------------------------------------+
638 subroutine coll_xxx_lwf(g,fl,ckxx,x,c,ima,prdkrn,nkr)
642 integer,intent(in) :: nkr
643 real(kind=r8size),intent(inout) :: g(:),fl(:)
644 real(kind=r8size),intent(in) :: ckxx(:,:),x(:), c(:,:)
645 integer,intent(in) :: ima(:,:)
646 real(kind=r8size),intent(in) :: prdkrn
649 real(kind=r8size):: gmin,x01,x02,x03,gsi,gsj,gsk,gsi_w,gsj_w,gsk_w,gk, &
650 gk_w,fl_gk,fl_gsk,flux,x1,flux_w,g_k_w,g_kp_old,g_kp_w
651 integer :: i,ix0,ix1,j,k,kp
656 ! ix0 - lower limit of integration by i
660 if(g(i).gt.gmin) goto 2000
663 if(ix0.eq.nkr-1) return
665 ! ix1 - upper limit of integration by i
668 if(g(i).gt.gmin) goto 2010
674 if(g(i).le.gmin) goto 2020
676 if(g(j).le.gmin) goto 2021
679 x01=ckxx(i,j)*g(i)*g(j)*prdkrn
680 x02=dmin1(x01,g(i)*x(j))
681 if(j.ne.k) x03=dmin1(x02,g(j)*x(i))
686 if(gsk.le.gmin) goto 2021
690 gsk_w=dmin1(gsk_w,gsk)
692 g(i)=dmax1(g(i),0.0d0)
694 ! new change of 23.01.11 (start)
695 if(j.ne.k) g(j)=dmax1(g(j),0.0d0)
696 ! new change of 23.01.11 (end)
699 if(g(j).lt.0.d0.and.gk.le.gmin) then
705 if(gk.le.gmin) goto 2021
707 gk_w=g(k)*fl(k)+gsk_w
713 x1=dlog(g(kp)/gk+1.d-15)
714 flux=gsk/x1*(dexp(0.5d0*x1)-dexp(x1*(0.5d0-c(i,j))))
717 if(kp.gt.kp_flux_max) flux=0.5d0*flux
719 flux_w=dmin1(flux_w,gsk_w)
720 flux_w=dmin1(flux_w,gk_w)
722 g(k)=dmax1(g(k),gmin)
724 g_k_w=dmin1(g_k_w,g(k))
725 g_k_w=dmax1(g_k_w,0.0d0)
729 g(kp)=dmax1(g(kp),gmin)
730 g_kp_w=g_kp_old*fl(kp)+flux_w
731 g_kp_w=dmin1(g_kp_w,g(kp))
734 if(fl(k).gt.1.0d0.and.fl(k).le.1.0001d0) &
737 if(fl(kp).gt.1.0d0.and.fl(kp).le.1.0001d0) &
740 if(fl(k).gt.1.0001d0.or.fl(kp).gt.1.0001d0 &
741 .or.fl(k).lt.0.0d0.or.fl(kp).lt.0.0d0) then
743 print*, 'in subroutine coll_xxx_lwf'
744 print*, 'snow - snow = snow'
746 if(fl(k).gt.1.0001d0) print*, 'fl(k).gt.1.0001d0'
747 if(fl(kp).gt.1.0001d0) print*, 'fl(kp).gt.1.0001d0'
749 if(fl(k).lt.0.0d0) print*, 'fl(k).lt.0.0d0'
750 if(fl(kp).lt.0.0d0) print*, 'fl(kp).lt.0.0d0'
757 print*, 'ckxx(i,j),x01,x02,x03'
758 print 204, ckxx(i,j),x01,x02,x03
760 print*, 'gsi,gsj,gsk'
761 print 203, gsi,gsj,gsk
763 print*, 'gsi_w,gsj_w,gsk_w'
764 print 203, gsi_w,gsj_w,gsk_w
769 print*, 'fl_gk,fl_gsk'
770 print 202, fl_gk,fl_gsk
787 if(fl(k).lt.0.0d0) print*, &
788 'stop 2022: in subroutine coll_xxx_lwf, fl(k) < 0'
790 if(fl(kp).lt.0.0d0) print*, &
791 'stop 2022: in subroutine coll_xxx_lwf, fl(kp) < 0'
793 if(fl(k).gt.1.0001d0) print*, &
794 'stop 2022: in sub. coll_xxx_lwf, fl(k) > 1.0001'
796 if(fl(kp).gt.1.0001d0) print*, &
797 'stop 2022: in sub. coll_xxx_lwf, fl(kp) > 1.0001'
798 call wrf_error_fatal("in coal_bott sub. coll_xxx_lwf, model stop")
808 202 format(1x,2d13.5)
809 203 format(1x,3d13.5)
810 204 format(1x,4d13.5)
813 end subroutine coll_xxx_lwf
814 ! +----------------------------------------------------+
815 subroutine coll_xyx_lwf (gx,gy,flx,fly,ckxy,x,y, &
816 c,ima,prdkrn,nkr,indc,dm_rime)
819 integer,intent(in) :: nkr
820 real(kind=r8size),intent(inout) :: gy(:),gx(:),fly(:),flx(:),dm_rime(:)
821 real(kind=r8size),intent(in) :: ckxy(:,:),x(:),y(:),c(:,:),prdkrn
822 integer,intent(in) :: ima(:,:)
825 real(kind=r8size) :: gmin,x01,x02,x03,gsi,gsj,gsk,gk,flux,x1,gsi_w,gsj_w,gsk_w, &
826 gk_w,fl_gk,fl_gsk,flux_w,gx_k_w,gx_kp_old,gx_kp_w,frac_split
827 integer :: j, jx0, jx1, i, iy0, iy1, jmin, indc, k, kp
832 ! jx0 - lower limit of integration by j
835 if(gx(j).gt.gmin) goto 2000
838 if(jx0.eq.nkr-1) return
839 ! jx1 - upper limit of integration by j
842 if(gx(j).gt.gmin) goto 2010
845 ! iy0 - lower limit of integration by i
848 if(gy(i).gt.gmin) goto 2001
851 if(iy0.eq.nkr-1) return
852 ! iy1 - upper limit of integration by i
855 if(gy(i).gt.gmin) goto 2011
865 if(gy(i).le.gmin) goto 2020
867 if(jmin.eq.nkr-1) return
868 if(i.lt.jx0) jmin=jx0-indc
870 if(gx(j).le.gmin) goto 2021
873 x01=ckxy(j,i)*gy(i)*gx(j)*prdkrn
874 x02=dmin1(x01,gy(i)*x(j))
875 ! new change of 20.01.11 (start)
876 if(j.ne.k) x03=dmin1(x02,gx(j)*y(i))
878 ! new change of 20.01.11 (end)
882 if(gsk.le.gmin) goto 2021
886 gsk_w=dmin1(gsk_w,gsk)
888 gy(i)=dmax1(gy(i),0.0d0)
890 ! new change of 20.01.11 (start)
891 if(j.ne.k) gx(j)=dmax1(gx(j),0.0d0)
892 ! new change of 20.01.11 (end)
894 if(gk.le.gmin) goto 2021
895 gk_w=gx(k)*flx(k)+gsk_w
900 x1=dlog(gx(kp)/gk+1.d-15)
901 flux=gsk/x1*(dexp(0.5d0*x1)-dexp(x1*(0.5d0-c(i,j))))
905 if(kp.gt.kp_flux_max) flux=0.5d0*flux
907 flux_w=dmin1(flux_w,gsk_w)
908 flux_w=dmin1(flux_w,gk_w)
909 frac_split = flux/gsk
910 if(frac_split < 0.) frac_split = 0.
911 if(frac_split > 1.) frac_split = 1.
912 dm_rime(k)=dm_rime(k)+gsi*(1.-frac_split)
913 dm_rime(kp)=dm_rime(kp)+gsi*frac_split
915 gx(k)=dmax1(gx(k),gmin)
918 gx_k_w=dmin1(gx_k_w,gx(k))
919 gx_k_w=dmax1(gx_k_w,0.0d0)
923 gx(kp)=dmax1(gx(kp),gmin)
925 gx_kp_w=gx_kp_old*flx(kp)+flux_w
926 gx_kp_w=dmin1(gx_kp_w,gx(kp))
928 flx(kp)=gx_kp_w/gx(kp)
930 if(flx(k).gt.1.0d0.and.flx(k).le.1.0001d0) &
933 if(flx(kp).gt.1.0d0.and.flx(kp).le.1.0001d0) &
936 if(flx(k).gt.1.0001d0.or.flx(kp).gt.1.0001d0 &
937 .or.flx(k).lt.0.0d0.or.flx(kp).lt.0.0d0) then
939 print*, 'in subroutine coll_xyx_lwf'
941 if(flx(k).gt.1.0001d0) &
942 print*, 'flx(k).gt.1.0001d0'
944 if(flx(kp).gt.1.0001d0) &
945 print*, 'flx(kp).gt.1.0001d0'
947 if(flx(k).lt.0.0d0) print*, 'flx(k).lt.0.0d0'
948 if(flx(kp).lt.0.0d0) print*, 'flx(kp).lt.0.0d0'
953 print*, 'jx0,jx1,iy0,iy1'
954 print*, jx0,jx1,iy0,iy1
959 print*, 'ckxy(j,i),x01,x02,x03'
960 print 204, ckxy(j,i),x01,x02,x03
962 print*, 'gsi,gsj,gsk'
963 print 203, gsi,gsj,gsk
965 print*, 'gsi_w,gsj_w,gsk_w'
966 print 203, gsi_w,gsj_w,gsk_w
971 print*, 'fl_gk,fl_gsk'
972 print 202, fl_gk,fl_gsk
989 if(flx(k).lt.0.0d0) print*, &
990 'stop 2022: in subroutine coll_xyx_lwf, flx(k) < 0'
992 if(flx(kp).lt.0.0d0) print*, &
993 'stop 2022: in subroutine coll_xyx_lwf, flx(kp) < 0'
995 if(flx(k).gt.1.0001d0) print*, &
996 'stop 2022: in sub. coll_xyx_lwf, flx(k) > 1.0001'
998 if(flx(kp).gt.1.0001d0) print*, &
999 'stop 2022: in sub. coll_xyx_lwf, flx(kp) > 1.0001'
1000 call wrf_error_fatal("fatal error in module_mp_fast_sbm in coll_xyx_lwf (stop 2022), model stop")
1010 201 format(1x,d13.5)
1011 202 format(1x,2d13.5)
1012 203 format(1x,3d13.5)
1013 204 format(1x,4d13.5)
1016 end subroutine coll_xyx_lwf
1017 ! -------------------------------------------------------+
1018 subroutine coll_xyz_lwf(gx,gy,gz,flx,fly,flz,ckxy,x,y, &
1019 c,ima,prdkrn,nkr,indc)
1023 integer,intent(in) :: nkr
1024 real(kind=r8size),intent(inout) :: gx(:),gy(:),gz(:),flx(:),fly(:),flz(:)
1025 real(kind=r8size),intent(in) :: ckxy(:,:),x(:),y(:),c(:,:)
1026 integer,intent(in) :: ima(:,:)
1027 real(kind=r8size),intent(in) :: prdkrn
1030 real(kind=r8size) :: gmin,ckxy_ji,x01,x02,x03,gsi,gsj,gsk,gsi_w,gsj_w,gsk_w,gk, &
1031 gk_w,fl_gk,fl_gsk,flux,x1,flux_w,gz_k_w,gz_kp_old,gz_kp_w
1032 integer :: j,jx0,jx1,i,iy0,iy1,jmin,indc,k,kp
1037 ! jx0 - lower limit of integration by j
1040 if(gx(j).gt.gmin) goto 2000
1043 if(jx0.eq.nkr-1) return
1045 ! jx1 - upper limit of integration by j
1048 if(gx(j).gt.gmin) goto 2010
1052 ! iy0 - lower limit of integration by i
1055 if(gy(i).gt.gmin) goto 2001
1058 if(iy0.eq.nkr-1) return
1060 ! iy1 - upper limit of integration by i
1063 if(gy(i).gt.gmin) goto 2011
1070 if(gy(i).le.gmin) goto 2020
1072 if(jmin.eq.nkr-1) return
1073 if(i.lt.jx0) jmin=jx0-indc
1075 if(gx(j).le.gmin) goto 2021
1079 x01=ckxy_ji*gy(i)*gx(j)*prdkrn
1080 x02=dmin1(x01,gy(i)*x(j))
1081 x03=dmin1(x02,gx(j)*y(i))
1085 if(gsk.le.gmin) goto 2021
1089 gsk_w=dmin1(gsk_w,gsk)
1091 gy(i)=dmax1(gy(i),0.0d0)
1094 gx(j)=dmax1(gx(j),0.0d0)
1098 if(gk.le.gmin) goto 2021
1100 gk_w=gz(k)*flz(k)+gsk_w
1109 x1=dlog(gz(kp)/gk+1.d-15)
1111 flux=gsk/x1*(dexp(0.5d0*x1)-dexp(x1*(0.5d0-c(i,j))))
1112 flux=dmin1(flux,gsk)
1115 if(kp.gt.kp_flux_max) flux=0.5d0*flux
1118 flux_w=dmin1(flux_w,gsk_w)
1119 flux_w=dmin1(flux_w,gk_w)
1122 gz(k)=dmax1(gz(k),gmin)
1124 gz_k_w=gk*fl_gk-flux_w
1125 gz_k_w=dmin1(gz_k_w,gz(k))
1126 gz_k_w=dmax1(gz_k_w,0.0d0)
1133 gz(kp)=dmax1(gz(kp),gmin)
1135 gz_kp_w=gz_kp_old*flz(kp)+flux_w
1136 gz_kp_w=dmin1(gz_kp_w,gz(kp))
1138 flz(kp)=gz_kp_w/gz(kp)
1140 if(flz(k).gt.1.0d0.and.flz(k).le.1.0001d0) &
1143 if(flz(kp).gt.1.0d0.and.flz(kp).le.1.0001d0) &
1146 if(flz(k).gt.1.0001d0.or.flz(kp).gt.1.0001d0 &
1147 .or.flz(k).lt.0.0d0.or.flz(kp).lt.0.0d0) then
1149 print*, 'in subroutine coll_xyz_lwf'
1151 if(flz(k).gt.1.0001d0) print*, 'flz(k).gt.1.0001d0'
1152 if(flz(kp).gt.1.0001d0) print*, 'flz(kp).gt.1.0001d0'
1154 if(flz(k).lt.0.0d0) print*, 'flz(k).lt.0.0d0'
1155 if(flz(kp).lt.0.0d0) print*, 'flz(kp).lt.0.0d0'
1160 print*, 'jx0,jx1,iy0,iy1'
1161 print*, jx0,jx1,iy0,iy1
1164 print 201, gz_kp_old
1166 print*, 'x01,x02,x03'
1167 print 203, x01,x02,x03
1169 print*, 'gsi,gsj,gsk'
1170 print 203, gsi,gsj,gsk
1172 print*, 'gsi_w,gsj_w,gsk_w'
1173 print 203, gsi_w,gsj_w,gsk_w
1178 print*, 'fl_gk,fl_gsk'
1179 print 202, fl_gk,fl_gsk
1182 print 202, x1,c(i,j)
1196 if(flz(k).lt.0.0d0) print*, &
1197 'stop 2022: in subroutine coll_xyz_lwf, flz(k) < 0'
1199 if(flz(kp).lt.0.0d0) print*, &
1200 'stop 2022: in subroutine coll_xyz_lwf, flz(kp) < 0'
1202 if(flz(k).gt.1.0001d0) print*, &
1203 'stop 2022: in sub. coll_xyz_lwf, flz(k) > 1.0001'
1205 if(flz(kp).gt.1.0001d0) print*, &
1206 'stop 2022: in sub. coll_xyz_lwf, flz(kp) > 1.0001'
1207 call wrf_error_fatal("fatal error: in sub. coll_xyz_lwf,model stop")
1216 201 format(1x,d13.5)
1217 202 format(1x,2d13.5)
1218 203 format(1x,3d13.5)
1219 204 format(1x,4d13.5)
1222 end subroutine coll_xyz_lwf
1223 ! -----------------------------------------------+
1224 subroutine coll_xxy_lwf(gx,gy,flx,fly,ckxx,x, &
1229 integer,intent(in) :: nkr
1230 real(kind=r8size),intent(inout):: gx(nkr),gy(nkr),flx(nkr),fly(nkr)
1231 real(kind=r8size),intent(in) :: x(nkr),ckxx(nkr,nkr),c(nkr,nkr)
1232 real(kind=r8size),intent(in) :: prdkrn
1233 integer,intent(in) :: ima(nkr,nkr)
1236 real(kind=r8size) :: gmin,ckxx_ij,x01,x02,x03,gsi,gsj,gsk,gsi_w,gsj_w,gsk_w, &
1237 gk,gk_w,flux,flux_w,fl_gk,fl_gsk,x1,gy_k_w,gy_kp_w, &
1239 integer::i,ix0,ix1,j,k,kp
1245 ! ix0 - lower limit of integration by i
1248 if(gx(i).gt.gmin) goto 2000
1251 if(ix0.eq.nkr-1) return
1253 ! ix1 - upper limit of integration by i
1256 if(gx(i).gt.gmin) goto 2010
1262 if(gx(i).le.gmin) goto 2020
1264 if(gx(j).le.gmin) goto 2021
1268 x01=ckxx_ij*gx(i)*gx(j)*prdkrn
1269 x02=dmin1(x01,gx(i)*x(j))
1270 x03=dmin1(x02,gx(j)*x(i))
1275 if(gsk.le.gmin) goto 2021
1280 gsk_w=dmin1(gsk_w,gsk)
1283 gx(i)=dmax1(gx(i),0.0d0)
1286 gx(j)=dmax1(gx(j),0.0d0)
1290 if(gk.le.gmin) goto 2021
1292 gk_w=gy(k)*fly(k)+gsk_w
1299 x1=dlog(gy(kp)/gk+1.d-15)
1300 ! print *,'nir1',gy(kp),gk,kp,i,j
1301 flux=gsk/x1*(dexp(0.5d0*x1)-dexp(x1*(0.5d0-c(i,j))))
1302 flux=dmin1(flux,gsk)
1305 if(kp.gt.kp_flux_max) flux=0.5d0*flux
1308 flux_w=dmin1(flux_w,gk_w)
1309 flux_w=dmin1(flux_w,gsk_w)
1310 flux_w=dmax1(flux_w,0.0d0)
1313 gy_k_w=gk*fl_gk-flux_w
1314 gy_k_w=dmin1(gy_k_w,gy(k))
1315 gy_k_w=dmax1(gy_k_w,0.0d0)
1316 ! print *,'nirxxylwf4',k,gy(k),gy_k_w,x1,flux
1317 if (gy(k)/=0.0) then
1324 gy_kp_w=gy_kp_old*fly(kp)+flux_w
1325 gy_kp_w=dmin1(gy_kp_w,gy(kp))
1326 if (gy(kp)/=0.0) then
1327 fly(kp)=gy_kp_w/gy(kp)
1333 if(fly(k).gt.1.0d0.and.fly(k).le.1.0001d0) &
1336 if(fly(kp).gt.1.0d0.and.fly(kp).le.1.0001d0) &
1346 end subroutine coll_xxy_lwf
1347 ! +-------------------------------------------+
1348 SUBROUTINE INTERPOL_SE (NH, H_TAB, X_TAB, H, X)
1353 real(kind=r4size) :: H_TAB(NH), X_TAB(NH)
1354 real(kind=r8size) :: H, X
1358 IF(H > H_TAB(1)) THEN
1363 IF(H < H_TAB(NH)) THEN
1369 IF(H > H_TAB(I)) THEN
1371 X = X_TAB(J)+(X_TAB(I)-X_TAB(J))/ &
1372 (H_TAB(I)-H_TAB(J))*(H-H_TAB(J))
1379 END SUBROUTINE INTERPOL_SE
1380 ! +-------------------------------------------------------------------------------+
1381 subroutine modkrn_KS (tt,qq,pp,rho,factor_t,ttcoal,ICase,Icondition, &
1386 real(kind=r8size),intent(in) :: tt, pp
1387 real(kind=r8size),intent(inout) :: qq
1388 real(kind=r4size),intent(in) :: ttcoal, rho
1389 real(kind=r8size),intent(out) :: factor_t
1390 integer :: ICase, Iin, Jin, Kin, Icondition
1392 real(kind=r8size) :: satq2, temp, epsf, tc, ttt1, ttt, qs2, qq1, dele, tc_min, &
1393 tc_max, factor_max, factor_min, f, t, a, b, c, p, d
1394 real(kind=r8size) :: at, bt, ct, dt
1395 real(kind=r8size) :: AA,BB,CC,DD,Es,Ew,AA1_MY,BB1_MY
1396 real(kind=r4size) :: tt_r, T_tab(7), SE_tab(7)
1398 satq2(t,p) = 3.80d3*(10**(9.76421d0-2667.1d0/t))/p
1399 temp(a,b,c,d,t) = d*t*t*t+c*t*t+b*t+a
1403 if (tc > 0.0) return
1409 !satq2(t,p) = 3.80d3*(10**(9.76421d0-2667.1d0/t))/p
1410 !temp(a,b,c,d,t) = d*t*t*t+c*t*t+b*t+a
1412 data at, bt, ct, dt /0.88333d0, 0.0931878d0, 0.0034793d0, 4.5185186d-05/
1414 if(qq.le.0.0) qq = 1.0e-15
1418 ttt1 =temp(at,bt,ct,dt,tc)
1421 qq1 =qq*(0.622d0+0.378d0*qs2)/(0.622d0+0.378d0*qq)/qs2
1424 if(tc.ge.-6.0d0) then
1426 if(factor_t.lt.epsf) factor_t = epsf
1427 if(factor_t.gt.1.0d0) factor_t = 1.0d0
1430 if (Icondition == 0) then
1431 if(tc.ge.-12.5d0 .and. tc.lt.-6.0d0) factor_t = 0.5D0 ! 0.5d0 !### (KS-ICE-SNOW)
1432 if(tc.ge.-17.0d0 .and. tc.lt.-12.5d0) factor_t = 1.0
1433 if(tc.ge.-20.0d0 .and. tc.lt.-17.0d0) factor_t = 0.4d0
1435 if(tc.ge.-12.5d0 .and. tc.lt.-6.0d0) factor_t = 0.3D0 ! 0.5d0 !### (KS-ICE-SNOW)
1436 if(tc.ge.-17.0d0 .and. tc.lt.-12.5d0) factor_t = 0.1d0
1437 if(tc.ge.-20.0d0 .and. tc.lt.-17.0d0) factor_t = 0.05d0
1440 if(tc.lt.-20.0d0) then
1441 tc_min = ttcoal-273.15d0
1443 if(Icondition == 0)then
1451 f = factor_min + (tc-tc_min)*(factor_max-factor_min)/ &
1454 ! in case tc.lt.-20.0d0
1457 if(tc.lt.-40.0d0) then
1461 if (factor_t > 1.0) factor_t = 1.0
1463 if(tc.ge.0.0d0) then
1469 ! ... Dashed-dotted (linear)
1470 T_tab = [0.0, -0.813, -5.26, -10.13, -14.63, -20.02, -40.0 ]
1471 SE_tab = [10.0**(-0.693), 10.0**(-0.72), 10.0**(-0.877), 10.0**(-1.050), 10.0**(-1.212), 10.0**(-1.401), 10.0**(-2.082) ]
1474 CALL INTERPOL_SE (size(SE_tab), T_TAB, SE_TAB, TC, factor_t)
1476 if(tc < -40.0d0) then
1480 if (factor_t > 1.0) factor_t = 1.0
1489 end subroutine modkrn_KS
1490 ! +-----------------------------------------------------------+
1491 subroutine coll_breakup_KS (gt_mg, xt_mg, jmax, dt, jbreak, &
1492 PKIJ, QKJ, NKRinput, NKR)
1496 integer,intent(in) :: jmax, jbreak, NKRInput, NKR
1497 real(kind=r8size),intent(in) :: xt_mg(:), dt
1498 real(kind=r4size),intent(in) :: pkij(:,:,:),qkj(:,:)
1499 real(kind=r8size),intent(inout) :: gt_mg(:)
1504 integer,parameter :: ia=1, ja=1, ka=1
1505 integer :: ie, je, ke, nkrdiff, jdiff, k, i, j
1506 real(kind=r8size),parameter :: eps = 1.0d-20
1507 real(kind=r8size) :: gt(jmax), xt(jmax+1), ft(jmax), fa(jmax), dg(jmax), df(jmax), dbreak(jbreak) &
1508 ,amweight(jbreak), gain, aloss
1517 ! gt_mg : mass distribution function of Bott
1518 ! xt_mg : mass of bin in mg
1519 ! jmax : number of bins
1520 ! dt : timestep in s
1524 nkrdiff = nkrinput-nkr
1528 ft(j)=gt(j)/xt(j)/xt(j)
1531 !shift between coagulation and breakup grid
1535 !shift to breakup grid
1538 fa(k)=ft(k+jdiff+nkrdiff)
1541 !breakup: bleck's first order method
1542 !pkij: gain coefficients
1543 !qkj : loss coefficients
1545 xt(jmax+1)=xt(jmax)*2.0d0
1553 gain=gain+fa(i)*fa(j)*pkij(k,i,j)
1558 aloss=aloss+fa(j)*qkj(k,j)
1560 j=jmax-jbreak+k+nkrdiff
1561 amweight(k)=2.0/(xt(j+1)**2.0-xt(j)**2.0)
1562 dbreak(k)=amweight(k)*(gain-fa(k)*aloss)
1564 if(dbreak(k) .ne. dbreak(k)) then
1565 print*,dbreak(k),amweight(k),gain,fa(k),aloss
1571 print*,j,jmax,jbreak,k,nkrdiff
1578 call wrf_error_fatal(" inside coll_breakup, NaN, model stop")
1582 !shift rate to coagulation grid
1584 do j=1,jdiff+nkrdiff
1589 df(j+jdiff)=dbreak(j)
1592 !transformation to mass distribution function g(ln x)
1594 dg(j)=df(j)*xt(j)*xt(j)
1600 gt(j)=gt(j)+dg(j)*dt
1601 ! if(gt(j)<0.0) then
1602 !print*, 'gt(j) < 0'
1605 !print*, 'dg(j),dt,gt(j)'
1606 !print*, dg(j),dt,gt(j)
1607 !hlp=dmin1(gt(j),hlp)
1612 ! print*,'gt_mg',gt_mg
1613 !stop "in coll_breakup_ks gt(kr) < 0.0 "
1620 end subroutine coll_breakup_KS
1621 ! +----------------------------------------------------+
1622 subroutine courant_bott_KS(xl, nkr, chucm, ima, scal)
1626 integer,intent(in) :: nkr
1627 real,intent(in) :: xl(:)
1628 real(kind=r8size),intent(inout) :: chucm(:,:)
1629 integer,intent(inout) :: ima(:,:)
1630 real(kind=r8size),intent(in) :: scal
1633 integer :: k, kk, j, i
1634 real(kind=r8size) :: x0, xl_mg(nkr), dlnr
1637 ! ima(i,j) - k-category number,
1638 ! chucm(i,j) - courant number :
1639 ! logarithmic grid distance(dlnr) :
1641 !xl_mg(0)=xl_mg(1)/2
1642 xl_mg(1:nkr) = xl(1:nkr)*1.0D3
1644 dlnr=dlog(2.0d0)/(3.0d0*scal)
1648 x0 = xl_mg(i) + xl_mg(j)
1650 !if(k == 1) goto 1000 ! ### (KS)
1652 if(k == 1) goto 1000
1653 if(xl_mg(k) >= x0 .and. xl_mg(k-1) < x0) then
1654 chucm(i,j) = dlog(x0/xl_mg(k-1))/(3.d0*dlnr)
1655 if(chucm(i,j) > 1.0d0-1.d-08) then
1659 ima(i,j) = min(nkr-1,kk-1)
1660 !if (ima(i,j) == 0) then
1668 !if(i.eq.nkr.or.j.eq.nkr) ima(i,j)=nkr
1669 chucm(j,i) = chucm(i,j)
1675 end subroutine courant_bott_KS
1676 ! +----------------------------------+
1677 end module module_mp_SBM_Collision
1678 ! +-----------------------------------------------------------------------------+
1679 ! +-----------------------------------------------------------------------------+
1680 module module_mp_SBM_Auxiliary
1683 public :: POLYSVP, JERRATE_KS, JERTIMESC_KS, JERSUPSAT_KS, &
1684 JERDFUN_KS, JERDFUN_NEW_KS, Relaxation_Time
1687 INTEGER, PARAMETER, PRIVATE:: R8SIZE = 8
1688 INTEGER, PARAMETER, PRIVATE:: R4SIZE = 4
1690 INTEGER,PARAMETER :: ISIGN_KO_1 = 0, ISIGN_KO_2 = 0, ISIGN_3POINT = 1, &
1691 IDebug_Print_DebugModule = 1
1692 DOUBLE PRECISION,PARAMETER::COEFF_REMAPING = 0.0066667D0
1693 DOUBLE PRECISION,PARAMETER::VENTPL_MAX = 5.0D0
1695 DOUBLE PRECISION,PARAMETER::RW_PW_MIN = 1.0D-10
1696 DOUBLE PRECISION,PARAMETER::RI_PI_MIN = 1.0D-10
1697 DOUBLE PRECISION,PARAMETER::RW_PW_RI_PI_MIN = 1.0D-10
1698 DOUBLE PRECISION,PARAMETER::RATIO_ICEW_MIN = 1.0D-4
1701 ! +----------------------------------------------------------+
1702 double precision FUNCTION POLYSVP (TT,ITYPE)
1706 real,intent(in) :: TT
1707 integer,intent(in) :: ITYPE
1709 real(4),parameter :: C1 = -9.09718E0, C2 = -3.56654E0, C3 = 0.876793E0, C4 = 0.78583503E0, &
1710 AA1_MY = 2.53E12, BB1_MY = 5.42E3, AA2_MY = 3.41E13, BB2_MY = 6.13E3
1711 real(4) :: ES1N, ES2N
1713 method_select: SELECT CASE(ITYPE)
1717 ES1N = AA1_MY*EXP(-BB1_MY/TT)
1718 POLYSVP = ES1N ! [dyn/cm2] to [mb]
1722 ES2N = AA2_MY*EXP(-BB2_MY/TT)
1723 POLYSVP = ES2N ! [dyn/cm2] to [mb]
1725 END SELECT method_select
1728 end function POLYSVP
1729 ! + -------------------------------------------------------- +
1730 SUBROUTINE JERRATE_KS (xlS, &
1734 ID,IN,fl1,NKR,ICEMAX)
1738 INTEGER,INTENT(IN) :: ID, IN, NKR, ICEMAX
1739 REAL(KIND=r4size),INTENT(IN) :: RO1BL(NKR,ID),RIEC(NKR,ID),FL1(NKR)
1740 REAL(KIND=r4size),INTENT(INOUT) :: B11_MY(NKR,ID)
1741 REAL(KIND=r8size),INTENT(IN) :: PP, TP, xlS(NKR,ID),Vxl(NKR,ID)
1744 INTEGER :: KR, nskin(nkr), ICE
1745 REAL(KIND=r4size) :: VENTPLM(NKR), FD1(NKR,ICEMAX),FK1(NKR,ICEMAX), xl_MY1(NKR,ICEMAX), &
1746 AL1_MY(2),ESAT1(2), TPreal
1747 REAL(KIND=r8size) :: PZERO, TZERO, CONST, D_MY, COEFF_VISCOUS, SHMIDT_NUMBER, &
1748 A, B, RVT, SHMIDT_NUMBER03, XLS_KR_ICE, RO1BL_KR_ICE, VXL_KR_ICE, REINOLDS_NUMBER, &
1749 RESHM, VENTPL, CONSTL, DETL
1751 REAL(KIND=r4size) :: deg01,deg03
1753 ! A1L_MY - CONSTANTS FOR "MAXWELL": MKS
1754 REAL(KIND=r8size),parameter:: RV_MY=461.5D4, CF_MY=2.4D3, D_MYIN=0.211D0
1758 ! RV_MY, CM*CM/SEC/SEC/KELVIN - INDIVIDUAL GAS CONSTANT
1762 ! D_MYIN, CM*CM/SEC - COEFFICIENT OF DIFFUSION OF WATER VAPOUR
1766 ! PZERO, DYNES/CM/CM - REFERENCE PRESSURE
1770 ! TZERO, KELVIN - REFERENCE TEMPERATURE
1775 if (in==2 .and. fl1(kr)==0.0 .or. in==6 .or. in==3 .and. tp<273.15) then
1777 else !in==1 or in==6 or lef/=0
1782 ! CONSTANTS FOR CLAUSIUS-CLAPEYRON EQUATION :
1784 ! A1_MY(1),G/SEC/SEC/CM
1788 ! A1_MY(2),G/SEC/SEC/CM
1800 ! AL1_MY(1), CM*CM/SEC/SEC - LATENT HEAT OF VAPORIZATION
1804 ! AL1_MY(2), CM*CM/SEC/SEC - LATENT HEAT OF SUBLIMATION
1808 ! CF_MY, G*CM/SEC/SEC/SEC/KELVIN - COEFFICIENT OF
1809 ! THERMAL CONDUCTIVITY OF AIR
1817 ! coefficient of diffusion
1819 D_MY=D_MYIN*(PZERO/PP)*(TP/TZERO)**1.94D0
1821 ! coefficient of viscousity
1823 ! COEFF_VISCOUS=0.13 cm*cm/sec
1825 COEFF_VISCOUS=0.13D0
1829 SHMIDT_NUMBER=COEFF_VISCOUS/D_MY
1831 ! Constants used for calculation of Reinolds number
1833 A=2.0D0*(3.0D0/4.0D0/3.141593D0)**DEG01
1837 ! ESAT1(IN)=A1_MY(IN)*DEXP(-BB1_MY(IN)/TP)
1844 ! ... (KS) - update the saturation vapor pressure
1848 ESAT1(1) = POLYSVP(TPreal,0)
1849 ESAT1(2) = POLYSVP(TPreal,1)
1855 SHMIDT_NUMBER03=SHMIDT_NUMBER**DEG03
1860 xlS_KR_ICE=xlS(KR,ICE)
1861 RO1BL_KR_ICE=RO1BL(KR,ICE)
1862 Vxl_KR_ICE=Vxl(KR,ICE)
1865 B*Vxl_KR_ICE*(xlS_KR_ICE/RO1BL_KR_ICE)**DEG03
1866 RESHM=DSQRT(REINOLDS_NUMBER)*SHMIDT_NUMBER03
1868 IF(REINOLDS_NUMBER<2.5D0) THEN
1869 VENTPL=1.0D0+0.108D0*RESHM*RESHM
1872 VENTPL=0.78D0+0.308D0*RESHM
1879 ! VENTPL_MAX is given in MICRO.PRM include file
1885 IF(VENTPL>VENTPL_MAX) THEN
1890 CONSTL=CONST*RIEC(KR,ICE)
1892 FD1(KR,ICE)=RVT/D_MY/ESAT1(nskin(kr))
1893 FK1(KR,ICE)=(AL1_MY(nskin(kr))/RVT-1.0D0)*AL1_MY(nskin(kr))/CF_MY/TP
1895 xl_MY1(KR,ICE)=VENTPL*CONSTL
1897 DETL=FK1(KR,ICE)+FD1(KR,ICE)
1898 B11_MY(KR,ICE)=xl_MY1(KR,ICE)/DETL
1907 END SUBROUTINE JERRATE_KS
1909 ! SUBROUTINE JERRATE
1910 ! ................................................................................
1911 SUBROUTINE JERTIMESC_KS (FI1,X1,SFN11, &
1912 B11_MY,CF,ID,NKR,ICEMAX,COL)
1917 INTEGER,INTENT(IN) :: ID,NKR,ICEMAX
1918 REAL(KIND=r4size),INTENT(in) :: B11_MY(NKR,ID), FI1(NKR,ID), COL, CF
1919 REAL(KIND=r8size),INTENT(in) :: X1(NKR,ID)
1920 REAL(KIND=r4size),INTENT(out) :: SFN11(ID)
1925 REAL(KIND=r4size) :: SFN11S, FK, DELM, FUN, B11
1930 SFN11(ICE)=CF*SFN11S
1932 ! value of size distribution functions
1935 DELM=X1(KR,ICE)*3.0D0*COL
1936 ! integral's expression
1938 ! values of integrals
1940 SFN11S=SFN11S+FUN*B11
1944 SFN11(ICE)=CF*SFN11S
1950 END SUBROUTINE JERTIMESC_KS
1951 ! +--------------------------------------------------------+
1952 SUBROUTINE JERSUPSAT_KS (DEL1,DEL2,DEL1N,DEL2N, &
1954 DT,DEL1INT,DEL2INT,DYN1,DYN2, &
1955 ISYM1,ISYM2,ISYM3,ISYM4,ISYM5)
1959 INTEGER,INTENT(INOUT) :: ISYM1, ISYM2(:), ISYM3, ISYM4, ISYM5
1960 REAL(KIND=r4size),INTENT(IN) :: DT, DYN1, DYN2
1961 REAL(KIND=r8size),INTENT(IN) :: DEL1, DEL2
1962 REAL(KIND=r8size),INTENT(INOUT) :: DEL1N,DEL2N,DEL1INT,DEL2INT,RW, PW, RI, PI
1965 INTEGER :: I, ISYMICE, IRW, IPW, IRI, IPI
1966 REAL(KIND=r8size) :: X, EXPM1, DETER, EXPR, EXPP, A, ALFA, BETA, GAMA, G31, G32, G2, EXPB, EXPG, &
1967 C11, C21, C12, C22, A1DEL1N, A2DEL1N, A3DEL1N, A4DEL1N, A1DEL1INT, A2DEL1INT, &
1968 A3DEL1INT, A4DEL1INT, A1DEL2N, A2DEL2N, A3DEL2N , A4DEL2N, A1DEL2INT, A2DEL2INT, &
1969 A3DEL2INT, A4DEL2INT, A5DEL2INT
1972 EXPM1(x)=x+x*x/2.0D0+x*x*x/6.0D0+x*x*x*x/24.0D0+ &
1975 ISYMICE = sum(ISYM2) + ISYM3 + ISYM4 + ISYM5
1981 IF(max(RW,PW,RI,PI)<=RW_PW_RI_PI_MIN) THEN
1996 IF(DMAX1(RW,PW)>RW_PW_MIN) THEN
1998 ! ... (KS) - A zero can pass through, assign a minimum value
1999 IF(RW < RW_PW_MIN*RW_PW_MIN) THEN
2003 IF(PW < RW_PW_MIN*RW_PW_MIN)THEN
2008 IF(DMAX1(PI/PW,RI/RW)<=RATIO_ICEW_MIN) THEN
2017 IF(DMIN1(PI/PW,RI/RW)>1.0D0/RATIO_ICEW_MIN) THEN
2037 IF(ISYMICE == 0)THEN
2047 IF(IRW == 0 .AND. IRI == 0) THEN
2051 DEL1INT=DEL1*DT+DYN1*DT*DT/2.0D0
2052 DEL2INT=DEL2*DT+DYN2*DT*DT/2.0D0
2058 ! solution of equation for supersaturation with
2059 ! different DETER values
2062 ! ... only water (start)
2065 IF(ABS(RW*DT)>1.0E-6) THEN
2066 DEL1N=DEL1*EXPR+(DYN1/RW)*(1.0D0-EXPR)
2067 DEL2N=PW*DEL1*EXPR/RW-PW*DYN1*DT/RW- &
2068 PW*DYN1*EXPR/(RW*RW)+DYN2*DT+ &
2069 DEL2-PW*DEL1/RW+PW*DYN1/(RW*RW)
2070 DEL1INT=-DEL1*EXPR/RW+DYN1*DT/RW+ &
2071 DYN1*EXPR/(RW*RW)+DEL1/RW-DYN1/(RW*RW)
2072 DEL2INT=PW*DEL1*EXPR/(-RW*RW)-PW*DYN1*DT*DT/(2.0D0*RW)+ &
2073 PW*DYN1*EXPR/(RW*RW*RW)+DYN2*DT*DT/2.0D0+ &
2074 DEL2*DT-PW*DEL1*DT/RW+PW*DYN1*DT/(RW*RW)+ &
2075 PW*DEL1/(RW*RW)-PW*DYN1/(RW*RW*RW)
2077 ! in case DABS(RW*DT)>1.0D-6
2080 ! in case DABS(RW*DT)<=1.0D-6
2083 DEL1N=DEL1+DEL1*EXPR+(DYN1/RW)*(0.0D0-EXPR)
2084 DEL2N=PW*DEL1*EXPR/RW-PW*DYN1*DT/RW- &
2085 PW*DYN1*EXPR/(RW*RW)+DYN2*DT+DEL2
2086 DEL1INT=-DEL1*EXPR/RW+DYN1*DT/RW+DYN1*EXPR/(RW*RW)
2087 DEL2INT=PW*DEL1*EXPR/(-RW*RW)-PW*DYN1*DT*DT/(2.0D0*RW)+ &
2088 PW*DYN1*EXPR/(RW*RW*RW)+DYN2*DT*DT/2.0D0+ &
2089 DEL2*DT-PW*DEL1*DT/RW+PW*DYN1*DT/(RW*RW)
2093 ! ... only water (end)
2099 ! ... only ice (start)
2103 IF(ABS(PI*DT)>1.0E-6) THEN
2105 DEL2N = DEL2*EXPP+(DYN2/PI)*(1.0D0-EXPP)
2106 DEL2INT = -DEL2*EXPP/PI+DYN2*DT/PI+ &
2107 DYN2*EXPP/(PI*PI)+DEL2/PI-DYN2/(PI*PI)
2108 DEL1N = +RI*DEL2*EXPP/PI-RI*DYN2*DT/PI- &
2109 RI*DYN2*EXPP/(PI*PI)+DYN1*DT+ &
2110 DEL1-RI*DEL2/PI+RI*DYN2/(PI*PI)
2111 DEL1INT = -RI*DEL2*EXPP/(PI*PI)-RI*DYN2*DT*DT/(2.0D0*PI)+ &
2112 RI*DYN2*EXPP/(PI*PI*PI)+DYN1*DT*DT/2.0D0+ &
2113 DEL1*DT-RI*DEL2*DT/PI+RI*DYN2*DT/(PI*PI)+ &
2114 RI*DEL2/(PI*PI)-RI*DYN2/(PI*PI*PI)
2116 ! in case DABS(PI*DT)>1.0D-6
2119 ! in case DABS(PI*DT)<=1.0D-6
2122 DEL2N=DEL2+DEL2*EXPP-EXPP*DYN2/PI
2123 DEL2INT=-DEL2*EXPP/PI+DYN2*DT/PI+DYN2*EXPP/(PI*PI)
2124 DEL1N=+RI*DEL2*EXPP/PI-RI*DYN2*DT/PI- &
2125 RI*DYN2*EXPP/(PI*PI)+DYN1*DT+DEL1
2126 DEL1INT=-RI*DEL2*EXPP/(PI*PI)-RI*DYN2*DT*DT/(2.0D0*PI)+ &
2127 RI*DYN2*EXPP/(PI*PI*PI)+DYN1*DT*DT/2.0D0+ &
2128 DEL1*DT-RI*DEL2*DT/PI+RI*DYN2*DT/(PI*PI)
2132 ! ... only ice (end)
2137 IF(IRW == 1 .AND. IRI == 1) THEN
2139 A=(RW-PI)*(RW-PI)+4.0E0*PW*RI
2142 PRINT*, 'IN SUBROUTINE JERSUPSAT: A < 0'
2145 PRINT*, 'RW,PW,RI,PI'
2146 PRINT 204, RW,PW,RI,PI
2147 PRINT*, 'DT,DYN1,DYN2'
2148 PRINT 203, DT,DYN1,DYN2
2150 PRINT 202, DEL1,DEL2
2151 PRINT*, 'STOP 1905:A < 0'
2152 call wrf_error_fatal("fatal error: STOP 1905:A < 0, model stop")
2154 ! ... water and ice (start)
2155 ALFA=DSQRT((RW-PI)*(RW-PI)+4.0D0*PW*RI)
2157 ! 5/8/04 Nir, Beta is negative to the simple solution so it will decay
2159 BETA=0.5D0*(ALFA+RW+PI)
2160 GAMA=0.5D0*(ALFA-RW-PI)
2162 G32=-PW*DYN1+RW*DYN2
2164 IF (G2 < 1.0d-20) G2 = 1.0004d-11*1.0003d-11-1.0002d-11*1.0001e-11 ! ... (KS) - 24th,May,2016
2168 IF(DABS(GAMA*DT)>1.0E-6) THEN
2169 C11=(BETA*DEL1-RW*DEL1-RI*DEL2-BETA*G31/G2+DYN1)/ALFA
2170 C21=(GAMA*DEL1+RW*DEL1+RI*DEL2-GAMA*G31/G2-DYN1)/ALFA
2171 C12=(BETA*DEL2-PW*DEL1-PI*DEL2-BETA*G32/G2+DYN2)/ALFA
2172 C22=(GAMA*DEL2+PW*DEL1+PI*DEL2-GAMA*G32/G2-DYN2)/ALFA
2173 DEL1N=C11*EXPG+C21*EXPB+G31/G2
2174 DEL1INT=C11*EXPG/GAMA-C21*EXPB/BETA+(C21/BETA-C11/GAMA) &
2176 DEL2N=C12*EXPG+C22*EXPB+G32/G2
2177 DEL2INT=C12*EXPG/GAMA-C22*EXPB/BETA+(C22/BETA-C12/GAMA) &
2180 ! in case DABS(GAMA*DT)>1.0D-6
2182 ! in case DABS(GAMA*DT)<=1.0D-6
2183 IF(ABS(RI/RW)>1.0E-12) THEN
2184 IF(ABS(RW/RI)>1.0E-12) THEN
2185 ALFA=DSQRT((RW-PI)*(RW-PI)+4.0D0*PW*RI)
2186 BETA=0.5D0*(ALFA+RW+PI)
2187 GAMA=0.5D0*(ALFA-RW-PI)
2188 IF (GAMA < 0.5*2.0d-10) GAMA=0.5D0*(2.002d-10-2.001d-10) ! ... (KS) - 24th,May,2016
2192 ! beta/alfa could be very close to 1 that why I transform it
2193 ! remember alfa-beta=gama
2195 C11=(BETA*DEL1-RW*DEL1-RI*DEL2+DYN1)/ALFA
2196 C21=(GAMA*DEL1+RW*DEL1+RI*DEL2-GAMA*G31/G2-DYN1)/ALFA
2197 C12=(BETA*DEL2-PW*DEL1-PI*DEL2+DYN2)/ALFA
2198 C22=(GAMA*DEL2+PW*DEL1+PI*DEL2-GAMA*G32/G2-DYN2)/ALFA
2203 A4DEL1N=G31/G2*(GAMA/ALFA+(GAMA/ALFA-1.0D0)*EXPG)
2205 DEL1N=A1DEL1N+A2DEL1N+A3DEL1N+A4DEL1N
2207 A1DEL1INT=C11*EXPG/GAMA
2208 A2DEL1INT=-C21*EXPB/BETA
2210 A4DEL1INT=G31/G2*DT*(GAMA/ALFA)
2212 DEL1INT=A1DEL1INT+A2DEL1INT+A3DEL1INT+A4DEL1INT
2217 A4DEL2N=G32/G2*(GAMA/ALFA+ &
2218 (GAMA/ALFA-1.0D0)* &
2219 (GAMA*DT+GAMA*GAMA*DT*DT/2.0D0))
2221 DEL2N=A1DEL2N+A2DEL2N+A3DEL2N+A4DEL2N
2223 A1DEL2INT=C12*EXPG/GAMA
2224 A2DEL2INT=-C22*EXPB/BETA
2226 A4DEL2INT=G32/G2*DT*(GAMA/ALFA)
2227 A5DEL2INT=G32/G2*(GAMA/ALFA-1.0D0)* &
2230 DEL2INT=A1DEL2INT+A2DEL2INT+A3DEL2INT+A4DEL2INT+ &
2233 ! in case DABS(RW/RI)>1D-12
2236 ! in case DABS(RW/RI)<=1D-12
2238 X=-2.0D0*RW*PI+RW*RW+4.0D0*PW*RI
2240 ALFA=PI*(1+(X/PI)/2.0D0-(X/PI)*(X/PI)/8.0D0)
2241 BETA=PI+(X/PI)/4.0D0-(X/PI)*(X/PI)/16.0D0+RW/2.0D0
2242 GAMA=(X/PI)/4.0D0-(X/PI)*(X/PI)/16.0D0-RW/2.0D0
2247 C11=(BETA*DEL1-RW*DEL1-RI*DEL2+DYN1)/ALFA
2248 C21=(GAMA*DEL1+RW*DEL1+RI*DEL2-GAMA*G31/G2-DYN1)/ALFA
2249 C12=(BETA*DEL2-PW*DEL1-PI*DEL2+DYN2)/ALFA
2250 C22=(GAMA*DEL2+PW*DEL1+PI*DEL2-GAMA*G32/G2-DYN2)/ALFA
2252 DEL1N=C11+C11*EXPG+C21*EXPB+ &
2253 G31/G2*(GAMA/ALFA+(GAMA/ALFA-1)*EXPG)
2254 DEL1INT=C11*EXPG/GAMA-C21*EXPB/BETA+(C21/BETA)+ &
2255 G31/G2*DT*(GAMA/ALFA)
2256 DEL2N=C12+C12*EXPG+C22*EXPB+G32/G2*(GAMA/ALFA+ &
2257 (GAMA/ALFA-1.0D0)* &
2258 (GAMA*DT+GAMA*GAMA*DT*DT/2.0D0))
2259 DEL2INT=C12*EXPG/GAMA-C22*EXPB/BETA+ &
2260 (C22/BETA)+G32/G2*DT*(GAMA/ALFA)+ &
2261 G32/G2*(GAMA/ALFA-1.0D0)*(GAMA*DT*DT/2.0D0)
2263 ! in case DABS(RW/RI)<=1D-12
2266 ! in case DABS(RI/RW)>1D-12
2270 ! in case DABS(RI/RW)<=1D-12
2272 X=-2.0D0*RW*PI+PI*PI+4.0D0*PW*RI
2274 ALFA=RW*(1.0D0+(X/RW)/2.0D0-(X/RW)*(X/RW)/8.0D0)
2275 BETA=RW+(X/RW)/4.0D0-(X/RW)*(X/RW)/16.0D0+PI/2.0D0
2276 GAMA=(X/RW)/4.0D0-(X/RW)*(X/RW)/16.0D0-PI/2.0D0
2281 C11=(BETA*DEL1-RW*DEL1-RI*DEL2+DYN1)/ALFA
2282 C21=(GAMA*DEL1+RW*DEL1+RI*DEL2-GAMA*G31/G2-DYN1)/ALFA
2283 C12=(BETA*DEL2-PW*DEL1-PI*DEL2+DYN2)/ALFA
2284 C22=(GAMA*DEL2+PW*DEL1+PI*DEL2-GAMA*G32/G2-DYN2)/ALFA
2286 DEL1N=C11+C11*EXPG+C21*EXPB+ &
2287 G31/G2*(GAMA/ALFA+(GAMA/ALFA-1.0D0)*EXPG)
2288 DEL1INT=C11*EXPG/GAMA-C21*EXPB/BETA+(C21/BETA)+ &
2289 G31/G2*DT*(GAMA/ALFA)
2290 DEL2N=C12+C12*EXPG+C22*EXPB+G32/G2* &
2292 (GAMA/ALFA-1.0D0)*(GAMA*DT+GAMA*GAMA*DT*DT/2.0D0))
2293 DEL2INT=C12*EXPG/GAMA-C22*EXPB/BETA+C22/BETA+ &
2294 G32/G2*DT*(GAMA/ALFA)+ &
2295 G32/G2*(GAMA/ALFA-1.0D0)*(GAMA*DT*DT/2.0D0)
2297 ! in case DABS(RI/RW)<=1D-12
2299 ! in case DABS(GAMA*DT)<=1D-6
2302 ! water and ice (end)
2304 ! in case ISYM1/=0.AND.ISYM2/=0
2310 201 FORMAT(1X,D13.5)
2311 202 FORMAT(1X,2D13.5)
2312 203 FORMAT(1X,3D13.5)
2313 204 FORMAT(1X,4D13.5)
2316 END SUBROUTINE JERSUPSAT_KS
2318 ! SUBROUTINE JERSUPSAT
2319 ! ....................................................................
2320 SUBROUTINE JERDFUN_KS (xi,xiN,B21_MY, &
2321 FI2,PSI2,fl2,DEL2N, &
2322 ISYM2,IND,ITYPE,TPN,IDROP, &
2323 FR_LIM,FRH_LIM,ICEMAX,NKR,COL,Ihydro,Iin,Jin,Kin,Itimestep)
2327 INTEGER,INTENT(IN) :: ISYM2, IND, ITYPE, NKR, ICEMAX, Ihydro, Iin, Jin ,Kin, Itimestep
2328 INTEGER,INTENT(INOUT) :: IDROP
2329 REAL(kind=R4SIZE),INTENT(IN) :: B21_MY(:), FI2(:), FR_LIM(:), FRH_LIM(:), &
2331 REAL(kind=R8SIZE),INTENT(IN) :: TPN, xi(:)
2332 REAL(kind=R8SIZE),INTENT(INOUT) :: xiN(:)
2333 REAL(kind=R4SIZE),INTENT(INOUT) :: PSI2(:), FL2(:)
2337 INTEGER :: ITYP, KR, NR, ICE, K, IDSD_Negative
2338 REAL(kind=R8SIZE) :: FL2_NEW(NKR), FI2R(NKR), PSI2R(NKR), C, DEGREE1, DEGREE2, DEGREE3, D, RATEXI, &
2339 B, A, xiR(NKR),xiNR(NKR), FR_LIM_KR
2345 DEGREE1 = 1.0D0/3.0D0
2347 DEGREE3 = 3.0D0/2.0D0
2362 ! new size distribution functions (start)
2365 IF(IND==1 .AND. ITYPE==1) THEN
2366 ! drop diffusional growth
2369 RATExi=C*DEL2N*B21_MY(KR)/D
2378 ! in case IND==1.AND.ITYPE==1
2380 ! in case IND/=1.OR.ITYPE/=1
2382 RATExi = DEL2N*B21_MY(KR)
2383 xiN(KR) = xi(KR) + RATExi
2387 ! recalculation of size distribution functions (start)
2397 (NR,xiR,FI2R,PSI2R,xiNR,ISIGN_3POINT,TPN,IDROP,NKR,COL,IDSD_Negative,Ihydro,Iin,Jin,Kin,Itimestep)
2398 IF(IDSD_Negative == 1)THEN
2399 IF(ISIGN_KO_1 == 1) THEN
2400 ! ... (KS) - we do not use Kovatch-Ouland as separate method
2401 ! CALL JERNEWF_KO_KS &
2402 ! (NR,xiR,FI2R,PSI2R,xiNR,NKR,COL)
2408 FR_LIM_KR=FRH_LIM(KR)
2410 FR_LIM_KR=FR_LIM(KR)
2412 IF(PSI2R(KR)<0.0D0) THEN
2413 PRINT*, 'STOP 1506 : PSI2R(KR)<0.0D0, in JERDFUN_KS'
2414 call wrf_error_fatal("fatal error in PSI2R(KR)<0.0D0, in JERDFUN_KS, model stop")
2416 PSI2(KR) = PSI2R(KR)
2419 ! recalculation of size distribution functions (end)
2422 ! new size distribution functions (end)
2424 201 FORMAT(1X,D13.5)
2425 304 FORMAT(1X,I2,2X,4D13.5)
2428 END SUBROUTINE JERDFUN_KS
2429 ! +----------------------------------------------------------------------------+
2430 SUBROUTINE JERNEWF_KS &
2431 (NRX,RR,FI,PSI,RN,I3POINT,TPN,IDROP,NKR,COL,IDSD_Negative,Ihydro, &
2432 Iin,Jin,Kin,Itimestep)
2436 INTEGER,INTENT(IN) :: NRX, I3POINT, NKR, Ihydro, Iin, Jin, Kin, Itimestep
2437 INTEGER,INTENT(INOUT) :: IDROP, IDSD_Negative
2438 real(kind=R8SIZE),INTENT(IN) :: TPN
2439 real(kind=R4SIZE),INTENT(IN) :: COL
2440 real(kind=R8SIZE),INTENT(INOUT) :: PSI(:), RN(:), FI(:), RR(:)
2444 INTEGER :: KMAX, KR, I, K , NRXP, ISIGN_DIFFUSIONAL_GROWTH, NRX1, &
2445 I3POINT_CONDEVAP, IEvap
2446 real(kind=R8SIZE) :: RNTMP,RRTMP,RRP,RRM,RNTMP2,RRTMP2,RRP2,RRM2, GN1,GN2, &
2447 GN3,GN1P,GMAT,GMAT2, &
2448 CDROP(NRX),DELTA_CDROP(NRX),RRS(NRX+1),PSINEW(NRX+1), &
2449 PSI_IM,PSI_I,PSI_IP, AOLDCON, ANEWCON, AOLDMASS, ANEWMASS
2451 INTEGER,PARAMETER :: KRDROP_REMAPING_MIN = 6, KRDROP_REMAPING_MAX = 12
2454 ! >> [KS] 22ndMay19 IF(TPN .LT. 273.15-5.0D0) IDROP=0
2456 ! INITIAL VALUES FOR SOME VARIABLES
2464 ! RN(I), g - new masses after condensation or evaporation
2465 IF(RN(I) < 0.0D0) THEN
2471 ! new change 26.10.09 (start)
2475 ! new change 26.10.09 (end)
2477 I3POINT_CONDEVAP = I3POINT
2480 IF(RN(1) < RRS(1)) THEN
2482 I3POINT_CONDEVAP = 0
2483 ! new change 26.10.09 (start)
2485 ! new change 26.10.09 (end)
2490 IF(IDROP == 0) I3POINT_CONDEVAP = 0
2492 ! new change 26.10.09 (start)
2497 DELTA_CDROP(K)=0.0D0
2501 RRS(NRXP)=RRS(NRX)*1024.0D0
2503 PSINEW(NRXP) = 0.0D0
2505 ! new change 26.10.09 (end)
2507 ISIGN_DIFFUSIONAL_GROWTH = 0
2510 IF(RN(K).NE.RR(K)) THEN
2511 ISIGN_DIFFUSIONAL_GROWTH = 1
2518 IF(ISIGN_DIFFUSIONAL_GROWTH == 1) THEN
2520 ! Kovetz-Olund method (start)
2522 ! new change 26.10.09 (start)
2523 DO K=1,NRX1 ! ... [KS] >> NRX1-1
2524 ! new change 26.10.09 (end)
2526 IF(FI(K) > 0.0) THEN
2527 IF(DABS(RN(K)-RR(K)) < 1.0D-16) THEN
2528 PSINEW(K) = FI(K)*RR(K)
2533 DO WHILE (.NOT.(RRS(I) <= RN(K) .AND. RRS(I+1) >= RN(K)) &
2534 .AND.I.LT.NRX1) ! [KS] >> was NRX1-1
2538 IF(RN(K).LT.RRS(1)) THEN
2542 GMAT2=(RNTMP-RRTMP)/(RRP-RRTMP)
2543 PSINEW(1)=PSINEW(1)+FI(K)*RR(K)*GMAT2
2549 GMAT2=(RNTMP-RRTMP)/(RRP-RRTMP)
2550 GMAT=(RRP-RNTMP)/(RRP-RRTMP)
2551 PSINEW(I)=PSINEW(I)+FI(K)*RR(K)*GMAT
2552 PSINEW(I+1)=PSINEW(I+1)+FI(K)*RR(K)*GMAT2
2554 ! in case FI(K).NE.0.0D0
2569 ! Kovetz-Olund method (end)
2571 ! calculation both new total drop concentrations(after KO) and new
2572 ! total drop masses (after KO)
2574 ! 3point method (start)
2575 IF(I3POINT_CONDEVAP == 1) THEN
2577 IF(FI(K) > 0.0) THEN
2578 IF(DABS(RN(K)-RR(K)).LT.1.0D-16) THEN
2579 PSI(K) = FI(K)*RR(K)
2583 IF(RRS(2).LT.RN(K)) THEN
2586 (.NOT.(RRS(I) <= RN(K) .AND. RRS(I+1) >= RN(K)) &
2602 GN1=(RRP-RNTMP)*(RRTMP-RNTMP)/(RRP-RRM)/ &
2605 GN1P=(RRP2-RNTMP2)*(RRTMP2-RNTMP2)/ &
2606 (RRP2-RRM2)/(RRTMP2-RRM2)
2608 GN2=(RRP-RNTMP)*(RNTMP-RRM)/(RRP-RRTMP)/ &
2611 GMAT=(RRP-RNTMP)/(RRP-RRTMP)
2613 GN3=(RRTMP-RNTMP)*(RRM-RNTMP)/(RRP-RRM)/ &
2615 GMAT2=(RNTMP-RRTMP)/(RRP-RRTMP)
2617 PSI_IM = PSI(I-1)+GN1*FI(K)*RR(K)
2619 PSI_I = PSI(I)+GN1P*FI(K+1)*RR(K+1)+&
2620 (GN2-GMAT)*FI(K)*RR(K)
2622 PSI_IP = PSI(I+1)+(GN3-GMAT2)*FI(K)*RR(K)
2624 IF(PSI_IM > 0.0D0) THEN
2626 IF(PSI_IP > 0.0D0) THEN
2629 ! smoothing criteria
2630 IF(PSI_IM > PSI(I-2) .AND. PSI_IM < PSI_I &
2631 .AND. PSI(I-2) < PSI(I) .OR. PSI(I-2) >= PSI(I)) THEN
2635 PSI(I) = PSI(I) + FI(K)*RR(K)*(GN2-GMAT)
2638 ! in case smoothing criteria
2643 ! in case PSI_IP.GT.0.0D0
2647 ! in case PSI_IM.GT.0.0D0
2651 ! in case I.LT.NRX1-2
2654 ! in case RRS(2).LT.RN(K)
2657 ! in case FI(K).NE.0.0D0
2665 ! in case I3POINT_CONDEVAP.NE.0
2667 ! 3 point method (end)
2669 ! PSI(K) - new hydrometeor size distribution function
2680 DO K=KRDROP_REMAPING_MIN,KRDROP_REMAPING_MAX
2681 CDROP(K)=3.0D0*COL*PSI(K)*RR(K)
2683 ! KMAX - right boundary spectrum of drop sdf
2684 !(KRDROP_REMAP_MIN =< KMAX =< KRDROP_REMAP_MAX)
2685 DO K=KRDROP_REMAPING_MAX,KRDROP_REMAPING_MIN,-1
2687 IF(PSI(K).GT.0.0D0) GOTO 2011
2691 ! Andrei's new change 28.04.10 (start)
2692 DO K=KMAX-1,KRDROP_REMAPING_MIN,-1
2693 ! Andrei's new change 28.04.10 (end)
2694 IF(CDROP(K).GT.0.0D0) THEN
2695 DELTA_CDROP(K)=CDROP(K+1)/CDROP(K)
2696 IF(DELTA_CDROP(K).LT.COEFF_REMAPING) THEN
2697 CDROP(K)=CDROP(K)+CDROP(K+1)
2703 DO K=KRDROP_REMAPING_MIN,KMAX
2704 PSI(K)=CDROP(K)/(3.0D0*COL*RR(K))
2707 ! in case IDROP.NE.0
2710 ! new change 26.10.09 (end)
2712 ! in case ISIGN_DIFFUSIONAL_GROWTH.NE.0
2714 ! in case ISIGN_DIFFUSIONAL_GROWTH.EQ.0
2721 IF(PSI(KR) < 0.0) THEN ! ... (KS)
2723 print*, "IDSD_Negative=",IDSD_Negative,"kr",kr
2724 PRINT*, 'IN SUBROUTINE JERNEWF'
2726 PRINT*, 'BEFORE EXIT'
2727 PRINT*, 'ISIGN_DIFFUSIONAL_GROWTH'
2728 PRINT*, ISIGN_DIFFUSIONAL_GROWTH
2729 PRINT*, 'I3POINT_CONDEVAP'
2730 PRINT*, I3POINT_CONDEVAP
2731 PRINT*, 'K,RR(K),RN(K),K=1,NRX'
2732 PRINT*, (K,RR(K),RN(K),K=1,NRX)
2733 PRINT*, 'K,RR(K),RN(K),FI(K),PSI(K),K=1,NRX'
2734 PRINT 304, (K,RR(K),RN(K),FI(K),PSI(K),K=1,NRX)
2735 PRINT*, IDROP,Ihydro,Iin,Jin,Kin,Itimestep
2736 call wrf_error_fatal("fatal error in SUBROUTINE JERNEWF PSI(KR)<0, < min, model stop")
2740 304 FORMAT(1X,I2,2X,4D13.5)
2743 END SUBROUTINE JERNEWF_KS
2744 ! +------------------------------------------------------------------+
2745 SUBROUTINE JERDFUN_NEW_KS &
2748 TPN,IDROP,FR_LIM,NKR,COL,Ihydro,Iin,Jin,Kin,Itimestep)
2753 INTEGER,INTENT(INOUT) :: IDROP, NKR
2754 INTEGER,INTENT(IN) :: Ihydro,Iin,Jin,Kin,Itimestep
2755 REAL(kind=R4SIZE),intent(IN) :: FI2(:), B21_MY(:), FR_LIM(:), COL
2756 REAL(kind=R8SIZE), INTENT(IN) :: TPN, xi(:)
2757 REAL(kind=R4SIZE),INTENT(INOUT) :: PSI2(:)
2758 REAL(kind=R8SIZE),INTENT(INOUT) :: xiN(:)
2762 INTEGER :: NR, KR, IDSD_Negative
2763 REAL(kind=R8SIZE) :: C, DEGREE1, DEGREE2, DEGREE3, D, RATEXI, B, A, &
2764 xiR(NKR),FI2R(NKR),PSI2R(NKR),xiNR(NKR)
2780 ! new drop size distribution functions (start)
2782 ! drop diffusional growth
2785 D = xiR(KR)**DEGREE1
2786 ! Andrei's new change of 3.09.10 (start)
2787 ! RATExi=C*DEL2N*B21_MY(KR)/D
2788 RATExi = C*B21_MY(KR)/D
2789 ! Andrei's new change of 3.09.10 (end)
2790 B = xiR(KR)**DEGREE2
2795 xiNR(KR) = A**DEGREE3
2799 ! recalculation of size distribution functions (start)
2803 (NR,xiR,FI2R,PSI2R,xiNR,ISIGN_3POINT,TPN,IDROP,NKR,COL,IDSD_Negative,Ihydro,Iin,Jin,Kin,Itimestep)
2804 IF(IDSD_Negative == 1)THEN
2805 IF(ISIGN_KO_2 == 1) THEN
2806 ! ... (KS) - we do not use Kovatch-Ouland as separate method
2807 ! CALL JERNEWF_KO_KS &
2808 ! (NR,xiR,FI2R,PSI2R,xiNR,NKR,COL)
2814 ! recalculation of drop size distribution functions (end)
2815 ! new drop size distribution functions (end)
2817 201 FORMAT(1X,D13.5)
2820 END SUBROUTINE JERDFUN_NEW_KS
2821 ! +---------------------------------------------------------+
2822 SUBROUTINE Relaxation_Time(TPS,QPS,PP,ROR,DEL1S,DEL2S, &
2823 R1,VR1,FF1in,RLEC,RO1BL, &
2824 R2,VR2,FF2in,RIEC,RO2BL, &
2825 R3,VR3,FF3in,RSEC,RO3BL, &
2826 R4,VR4,FF4in,RGEC,RO4BL, &
2827 R5,VR5,FF5in,RHEC,RO5BL, &
2828 NKR,ICEMAX,COL,DTdyn,NCOND,DTCOND)
2832 integer,intent(in) :: NKR,ICEMAX
2833 integer,intent(out) :: NCOND
2834 real(kind=R4SIZE),intent(in) :: R1(:),FF1in(:),RLEC(:),RO1BL(:), &
2835 R2(:,:),FF2in(:,:),RIEC(:,:),RO2BL(:,:), &
2836 R3(NKR),FF3in(:),RSEC(:),RO3BL(:), &
2837 R4(NKR),FF4in(:),RGEC(:),RO4BL(:), &
2838 R5(NKR),FF5in(:),RHEC(:),RO5BL(:), &
2839 ROR,COL,DTdyn,VR1(:),VR2(:,:),VR3(:),VR4(:),VR5(:)
2840 real(kind=R8SIZE),intent(in) :: TPS,QPS,PP,DEL1S,DEL2S
2841 real(kind=R4SIZE),intent(out) :: DTCOND
2844 integer :: ISYM1, ISYM2(ICEMAX), ISYM3, ISYM4, ISYM5, ISYM_SUM, ICM
2845 real(kind=R8SIZE),parameter :: AA1_MY = 2.53D12, BB1_MY = 5.42D3, AA2_MY = 3.41D13, &
2846 BB2_MY = 6.13E3, AL1 = 2500.0, AL2 = 2834.0
2847 real(kind=R8SIZE),parameter :: TAU_Min = 0.1 ! [s]
2848 real(kind=R8SIZE) :: OPER2, AR1, TAU_RELAX, B5L, B5I, &
2849 R1D(NKR), R2D(NKR,ICEMAX), R3D(NKR), R4D(NKR), R5D(NKR), &
2850 VR1_d(nkr),VR2_d(nkr,icemax),VR3_d(nkr),VR4_d(nkr),VR5_d(nkr)
2851 real(kind=R4SIZE) :: B11_MY(NKR), B21_MY(NKR,ICEMAX), B31_MY(NKR), &
2852 B41_MY(NKR), B51_MY(NKR), FL1(NKR), FL3(NKR), FL4(NKR), FL5(NKR), &
2853 SFNDUMMY(3), SFN11, SFNI1(ICEMAX), SFNII1, SFN21, SFN31, SFN41, SFN51, SFNI, SFNL, B8L, B8I, RI, PW, &
2854 DOPL, DOPI, TAU_w, TAU_i, phi, RW, PI
2857 OPER2(AR1)=0.622/(0.622+0.378*AR1)/AR1
2870 IF(sum(FF1in) > 0.0) ISYM1 = 1
2871 IF(sum(FF2in(:,1)) > 1.0D-10) ISYM2(1) = 1
2872 IF(sum(FF2in(:,2)) > 1.0D-10) ISYM2(2) = 1
2873 IF(sum(FF2in(:,3)) > 1.0D-10) ISYM2(3) = 1
2874 IF(sum(FF3in) > 1.0D-10) ISYM3 = 1
2875 IF(sum(FF4in) > 1.0D-10) ISYM4 = 1
2876 IF(sum(FF5in) > 1.0D-10) ISYM5 = 1
2878 ISYM_SUM = ISYM1 + sum(ISYM2) + ISYM3 + ISYM4 + ISYM5
2879 IF(ISYM_SUM == 0)THEN
2881 NCOND = nint(DTdyn/TAU_RELAX)
2909 CALL JERRATE_KS(R1D,TPS,PP,VR1_d,RLEC,RO1BL,B11_MY,1,1,fl1,NKR,ICEMAX)
2911 CALL JERTIMESC_KS(FF1in,R1D,SFNDUMMY,B11_MY,B8I,1,NKR,ICEMAX,COL)
2915 !IF(sum(ISYM2) > 0) THEN
2917 ! ! ... ice crystals
2918 ! CALL JERRATE_KS (R2D,TPS,PP,VR2_d,RIEC,RO2BL,B21_MY,3,2,fl1,NKR,ICEMAX)
2919 ! CALL JERTIMESC_KS (FF2in,R2D,SFNI1,B21_MY,B8I,ICM,NKR,ICEMAX,COL)
2925 CALL JERRATE_KS (R3D,TPS,PP,VR3_d,RSEC,RO3BL,B31_MY,1,3,fl3,NKR,ICEMAX)
2927 CALL JERTIMESC_KS(FF3in,R3D,SFNDUMMY,B31_MY,B8I,1,NKR,ICEMAX,COL)
2934 CALL JERRATE_KS(R4D,TPS,PP,VR4_d,RGEC,RO4BL,B41_MY,1,2,fl4,NKR,ICEMAX)
2937 CALL JERTIMESC_KS(FF4in,R4D,SFNDUMMY,B41_MY,B8I,1,NKR,ICEMAX,COL)
2944 CALL JERRATE_KS(R5D,TPS,PP,VR5_d,RHEC,RO5BL,B51_MY,1,2,fl5,NKR,ICEMAX)
2947 CALL JERTIMESC_KS(FF5in,R5D,SFNDUMMY,B51_MY,B8I,1,NKR,ICEMAX,COL)
2957 SFNII1 = SFNI1(1)+SFNI1(2)+SFNI1(3)
2958 SFN21 = SFNII1 + SFN31 + SFN41 + SFN51
2959 SFNL = SFN11 ! Liquid
2960 SFNI = SFN21 ! Total Ice
2966 RW=(OPER2(QPS)+B5L*AL1)*DOPL*SFNL
2967 RI=(OPER2(QPS)+B5L*AL2)*DOPL*SFNI
2968 PW=(OPER2(QPS)+B5I*AL1)*DOPI*SFNL
2969 PI=(OPER2(QPS)+B5I*AL2)*DOPI*SFNI
2973 phi = (1.0 + DEL2S)/(1.0 + DEL1S)
2974 if(PW > 0.0 .or. PI > 0.0) TAU_w = (PW + phi*PI)**(-1.0)
2975 if(RW > 0.0 .or. RI > 0.0) TAU_i = phi/(RW + RI*phi)
2977 IF(PW > 0.0 .or. RI > 0.0) TAU_RELAX = (PW + RI)**(-1.0)/3.0
2978 IF(PW > 0.0 .and. RI > 0.0) TAU_RELAX = min(TAU_w,TAU_i)/3.0
2980 if(TAU_RELAX > DTdyn) TAU_RELAX = DTdyn/3.0
2981 if(TAU_RELAX < TAU_Min) TAU_RELAX = TAU_Min
2982 IF(PW <= 0.0 .and. RI <= 0.0) TAU_RELAX = DTdyn
2984 !if(TAU_RELAX < DTdyn .and. IDebug_Print_DebugModule==1)then
2985 ! print*,"in Relaxation_Time,TAU_RELAX < DTdyn"
2989 !NCOND = nint(DTdyn/TAU_RELAX)
2990 NCOND = ceiling(DTdyn/TAU_RELAX)
2994 END SUBROUTINE Relaxation_Time
2995 ! +------------------------------+
2996 end module module_mp_SBM_Auxiliary
2997 ! +-----------------------------------------------------------------------------+
2998 ! +-----------------------------------------------------------------------------+
2999 module module_mp_SBM_Nucleation
3001 USE module_mp_SBM_Auxiliary,ONLY:POLYSVP
3004 public JERNUCL01_KS, LogNormal_modes_Aerosol
3007 INTEGER, PARAMETER, PRIVATE:: R8SIZE = 8
3008 INTEGER, PARAMETER, PRIVATE:: R4SIZE = 4
3010 INTEGER,PARAMETER :: Use_cloud_base_nuc = 1
3011 real(kind=r8size),PARAMETER::T_NUCL_DROP_MIN = -80.0D0
3012 real(kind=r8size),PARAMETER::T_NUCL_ICE_MIN = -37.0D0
3013 ! Ice nucleation method
3014 ! using MEYERS method : ice_nucl_method == 0
3015 ! using DE_MOTT method : ice_nucl_method == 1
3016 INTEGER,PARAMETER :: ice_nucl_method = 0
3017 INTEGER,PARAMETER :: ISIGN_TQ_ICENUCL = 1
3019 DOUBLE PRECISION,PARAMETER::DELSUPICE_MAX = 59.0D0
3022 ! +-----------------------------------------------------------------------------+
3023 SUBROUTINE JERNUCL01_KS(PSI1_r, PSI2_r, FCCNR_r, &
3024 XL_r, XI_r, TT, QQ, &
3028 SUP2_OLD_r, DSUPICE_XYZ_r, &
3029 RCCN_r, DROPRADII_r, NKR, NKR_aerosol, ICEMAX, ICEPROCS, &
3030 Win_r, Is_This_CloudBase, RO_SOLUTE, IONS, MWAERO, &
3036 integer,intent(in) :: Kin, Jin, Iin, NKR, NKR_aerosol, ICEMAX, ICEPROCS, Is_This_CloudBase,IONS
3037 real(kind=r4size),intent(in) :: XL_r(:), XI_r(:,:), ROR_r, PP_r, COL_r, Win_r, &
3038 SUP2_OLD_r, DSUPICE_XYZ_r, RCCN_r(:), DROPRADII_r(:)
3039 real(kind=r4size),intent(in) :: MWAERO, RO_SOLUTE
3040 real(kind=r4size),intent(inout) :: PSI1_r(:),PSI2_r(:,:),FCCNR_r(:)
3041 real(kind=r8size),intent(inout) :: TT, QQ, SUP1,SUP2
3044 integer :: KR, ICE, K
3045 real(kind=r8size) :: DROPCONCN(NKR), ARG_1, COL3, RORI, TPN, QPN, TPC, AR1, AR2, OPER3, &
3046 SUM_ICE, DEL2N, FI2(NKR,ICEMAX), TFREEZ_OLD, DTFREEZXZ, RMASSIAA_NUCL, RMASSIBB_NUCL, &
3047 FI2_K, xi_K, FI2R2, DELMASSICE_NUCL, ES1N, ES2N, EW1N
3048 real(kind=r8size),parameter :: AL2 = 2834.0D0
3049 real(kind=r8size) :: PSI1(NKR),PSI2(NKR,ICEMAX),FCCNR(NKR_aerosol),ROR,XL(NKR),XI(NKR,ICEMAX),PP,COL, &
3050 SUP2_OLD,DSUPICE_XYZ,Win, RCCN(NKR_aerosol),DROPRADII(NKR)
3051 real(kind=r4size) :: TPNreal
3054 OPER3(AR1,AR2) = AR1*AR2/(0.622D0+0.378D0*AR1)
3056 ! ... Adjust the Imput
3065 SUP2_OLD = SUP2_OLD_r
3066 DSUPICE_XYZ = DSUPICE_XYZ_r
3068 DROPRADII = DROPRADII_r
3074 ! ... Drop Nucleation (start)
3080 IF(SUP1>0.0D0 .AND. TPC>T_NUCL_DROP_MIN) THEN
3081 if(sum(FCCNR) > 0.0)then
3083 CALL WATER_NUCLEATION (COL, NKR_aerosol, PSI1, FCCNR, xl, TT, QQ, ROR, SUP1, DROPCONCN, &
3084 PP, Is_This_CloudBase, Win, RO_SOLUTE, RCCN, IONS,MWAERO)
3086 ! ... Transfer drops to Ice-Crystals via direct homogenous nucleation
3087 IF(TPC <= -38.0D0) THEN
3090 PSI2(KR,2) = PSI2(KR,2) + PSI1(KR)
3091 SUM_ICE = SUM_ICE + COL3*xl(KR)*xl(KR)*PSI1(KR)
3094 ARG_1 = 334.0D0*SUM_ICE*RORI
3098 ! ... Drop nucleation (end)
3099 ! ... Nucleation of crystals (start)
3100 DEL2N = 100.0D0*SUP2
3103 IF(TPC < 0.0D0 .AND. TPC >= T_NUCL_ICE_MIN .AND. DEL2N > 0.0D0) THEN
3107 FI2(KR,ICE)=PSI2(KR,ICE)
3111 if(ice_nucl_method == 0) then
3112 CALL ICE_NUCL (PSI2,xi,SUP2,TT,DSUPICE_XYZ,SUP2_OLD,ICEMAX,NKR,COL)
3115 IF(ISIGN_TQ_ICENUCL == 1) THEN
3119 ! before ice crystal nucleation
3124 FI2R2=FI2_K*xi_K*xi_K
3125 RMASSIBB_NUCL=RMASSIBB_NUCL+FI2R2
3129 RMASSIBB_NUCL = RMASSIBB_NUCL*COL3*RORI
3131 IF(RMASSIBB_NUCL < 0.0D0) RMASSIBB_NUCL = 0.0D0
3133 ! after ice crystal nucleation
3138 FI2R2=FI2_K*xi_K*xi_K
3139 RMASSIAA_NUCL=RMASSIAA_NUCL+FI2R2
3143 RMASSIAA_NUCL = RMASSIAA_NUCL*COL3*RORI
3145 IF(RMASSIAA_NUCL < 0.0D0) RMASSIAA_NUCL=0.0D0
3147 DELMASSICE_NUCL = RMASSIAA_NUCL-RMASSIBB_NUCL
3149 QPN = QQ-DELMASSICE_NUCL
3152 TPN = TT + AL2*DELMASSICE_NUCL
3156 ES1N = POLYSVP(TPNreal,0)
3157 ES2N = POLYSVP(TPNreal,1)
3159 EW1N = OPER3(QPN,PP)
3161 SUP1 = EW1N/ES1N-1.0D0
3162 SUP2 = EW1N/ES2N-1.0D0
3164 ! in case ISIGN_TQ_ICENUCL/=0
3167 ! in case TPC<0.AND.TPC>=T_NUCL_ICE_MIN.AND.DEL2N>0.D0
3170 ! ... Nucleation of crystals (end)
3178 END SUBROUTINE JERNUCL01_KS
3179 ! +-------------------------------------------------------------------------------------------------------------------------+
3180 SUBROUTINE WATER_NUCLEATION (COL, NKR, PSI1, FCCNR, xl, TT, QQ, ROR, SUP1, &
3181 DROPCONCN, PP, Is_This_CloudBase, Win, RO_SOLUTE, &
3184 !===================================================================!
3186 ! DROP NUCLEATION SCHEME !
3188 ! Authors: Khain A.P. & Pokrovsky A.G. July 2002 at Huji, Israel !
3190 !===================================================================!
3193 ! PSI1(KR), 1/g/cm3 - non conservative drop size distribution function
3194 ! FCCNR(KR), 1/cm^3 - aerosol(CCN) non conservative, size distribution function
3195 ! xl((KR), g - drop bin masses
3197 integer,intent(in) :: Is_This_CloudBase, NKR, IONS
3198 real(kind=r8size),intent(in) :: xl(:), ROR, PP, Win, RCCN(:), COL
3199 real(kind=r8size),intent(inout) :: FCCNR(:), PSI1(:), DROPCONCN(:), QQ, TT, SUP1
3200 real(kind=r4size),intent(in) :: RO_SOLUTE, MWAERO
3203 integer :: IMAX, I, NCRITI, KR
3204 real(kind=r8size) :: DX,AR2,RCRITI,DEG01,RORI,CCNCONC(NKR),AKOE,BKOE, AR1, OPER3, RCCN_MINIMUM, &
3205 DLN1, DLN2, RMASSL_NUCL, ES1N, EW1N
3206 real(kind=r8size),parameter :: AL1 = 2500.0D0
3207 real(kind=r4size) :: TTreal
3210 OPER3(AR1,AR2)=AR1*AR2/(0.622D0+0.378D0*AR1)
3212 DROPCONCN(:) = 0.0D0
3219 ! imax - right CCN spectrum boundary
3222 IF(FCCNR(I) > 0.0D0) THEN
3229 ! every iteration we will nucleate one bin, then we will check the new supersaturation
3231 do while (IMAX>=NCRITI)
3234 ! akoe & bkoe - constants in Koehler equation
3236 !BKOE=2.0D0*4.3D0/(22.9D0+35.5D0)
3237 BKOE = ions*4.3/mwaero
3238 BKOE=BKOE*(4.0D0/3.0D0)*3.141593D0*RO_SOLUTE
3240 if(Use_cloud_base_nuc == 1) then
3241 if(Is_This_CloudBase == 1) then
3242 CALL Cloud_Base_Super (FCCNR, RCCN, TT, PP, Win, NKR, RCRITI, RO_SOLUTE, IONS, MWAERO, COL)
3244 ! rcriti, cm - critical radius of "dry" aerosol
3245 RCRITI = (AKOE/3.0D0)*(4.0D0/BKOE/SUP1/SUP1)**DEG01
3247 else ! ismax_cloud_base==0
3248 ! rcriti, cm - critical radius of "dry" aerosol
3249 RCRITI=(AKOE/3.0D0)*(4.0D0/BKOE/SUP1/SUP1)**DEG01
3252 IF(RCRITI >= RCCN(IMAX)) EXIT ! nothing to nucleate
3254 ! find the minimum bin to nucleate
3256 do while (RCRITI<=RCCN(NCRITI) .and. NCRITI>1)
3260 ! rccn_minimum - minimum aerosol(ccn) radius
3261 RCCN_MINIMUM = RCCN(1)/10000.0D0
3262 ! calculation of ccnconc(ii)=fccnr(ii)*col - aerosol(ccn) bin
3265 ! determination of ncriti - number bin in which is located rcriti
3266 ! calculation of ccnconc(ncriti)=fccnr(ncriti)*dln1/(dln1+dln2),
3268 ! dln1=Ln(rcriti)-Ln(rccn_minimum)
3269 ! dln2=Ln(rccn(1)-Ln(rcriti)
3270 ! calculation of new value of fccnr(ncriti)
3272 ! each iteration we nucleate the last bin
3273 IF (NCRITI==IMAX-1) then
3275 DLN1=DLOG(RCRITI)-DLOG(RCCN(IMAX-1))
3277 CCNCONC(IMAX)=DLN2*FCCNR(IMAX)
3278 FCCNR(IMAX)=FCCNR(IMAX)*DLN1/COL
3280 DLN1=DLOG(RCRITI)-DLOG(RCCN_MINIMUM)
3281 DLN2=DLOG(RCCN(1))-DLOG(RCRITI)
3282 CCNCONC(IMAX)=DLN2*FCCNR(IMAX)
3283 FCCNR(IMAX)=FCCNR(IMAX)*DLN1/(DLN1+DLN2)
3286 CCNCONC(IMAX) = COL*FCCNR(IMAX)
3290 ! calculate the mass change due to nucleation
3292 if (IMAX <= NKR-7) then ! we pass it to drops mass grid
3293 DROPCONCN(1) = DROPCONCN(1)+CCNCONC(IMAX)
3294 RMASSL_NUCL = RMASSL_NUCL+CCNCONC(IMAX)*XL(1)*XL(1)
3296 DROPCONCN(8-(NKR-IMAX)) = DROPCONCN(8-(NKR-IMAX))+CCNCONC(IMAX)
3297 RMASSL_NUCL = RMASSL_NUCL + CCNCONC(IMAX)*XL(8-(NKR-IMAX))*XL(8-(NKR-IMAX))
3299 RMASSL_NUCL = RMASSL_NUCL*COL*3.0*RORI
3301 ! prepering to check if we need to nucleate the next bin
3304 ! cycle IMAX>=NCRITI
3307 ! ... Intergarting for including the previous nucleated drops
3308 IF(sum(DROPCONCN) > 0.0)THEN
3310 DX = 3.0D0*COL*xl(KR)
3311 PSI1(KR) = PSI1(KR)+DROPCONCN(KR)/DX
3316 END SUBROUTINE WATER_NUCLEATION
3317 ! +--------------------------------------------------------------------------+
3318 !====================================================================!
3320 ! ICE NUCLEATION SCHEME !
3322 ! Authors: Khain A.P. & Pokrovsky A.G. July 2002 at Huji, Israel !
3324 !====================================================================!
3326 SUBROUTINE ICE_NUCL (PSI2,xi,SUP2,TT,DSUPICE_XYZ,SUP2_OLD,ICEMAX,NKR,COL)
3330 integer,intent(in) :: NKR, ICEMAX
3331 real(kind=r8size),intent(in) :: xi(:,:), DSUPICE_XYZ, COL
3332 real(kind=r8size),intent(inout) :: PSI2(:,:),TT,SUP2,SUP2_OLD
3335 integer :: KR,ICE,ITYPE
3336 real(kind=r8size) :: FI2(NKR,ICEMAX), CONCI_BFNUCL(ICEMAX), CONCI_AFNUCL(ICEMAX)
3337 real(kind=r8size),parameter :: A1 = -0.639D0, B1 = 0.1296D0, A2 = -2.8D0, B2 = 0.262D0, &
3338 TEMP1 = -5.0D0, TEMP2 = -2.0D0, TEMP3 = -20.0D0
3340 ! C1_MEY=0.001 1/cm^3
3341 real(kind=r8size),PARAMETER::C1_MEY = 1.0D-3
3342 real(kind=r8size),PARAMETER::C2_MEY = 0.0D0
3343 INTEGER,PARAMETER :: NRGI = 2
3344 real(kind=r8size) :: C1,C2,TPC,DEL2N,DEL2NN,HELEK1,HELEK2,FF1BN,FACT,DSUP2N,DELTACD,DELTAF, &
3345 ADDF,DELCONCI_AFNUCL,TPCC,DX
3351 ! size distribution functions of crystals before ice nucleation
3355 FI2(KR,ICE)=PSI2(KR,ICE)
3359 ! calculation concentration of crystals before ice nucleation
3362 CONCI_BFNUCL(ICE)=0.0D0
3364 CONCI_BFNUCL(ICE)=CONCI_BFNUCL(ICE)+ &
3365 3.0D0*COL*PSI2(KR,ICE)*xi(KR,ICE)
3369 ! type of ice with nucleation (start)
3374 IF((TPC>-4.0D0).OR.(TPC<=-8.1D0.AND.TPC>-12.7D0).OR. &
3375 (TPC<=-17.8D0.AND.TPC>-22.4D0)) THEN
3378 IF((TPC<=-4.0D0.AND.TPC>-8.1D0) &
3379 .OR.(TPC<=-22.4D0)) THEN
3386 ! type of ice with nucleation (end)
3388 ! new crystal size distribution function (start)
3390 IF (TPC < TEMP1) THEN
3391 DEL2N = 100.0D0*SUP2
3393 IF( DEL2N > DELSUPICE_MAX) DEL2NN = DELSUPICE_MAX
3394 HELEK1 = C1*DEXP(A1+B1*DEL2NN)
3399 IF(TPC < TEMP2) THEN
3401 IF(TPCC < TEMP3) TPCC = TEMP3
3402 HELEK2 = C2*DEXP(A2-B2*TPCC)
3407 FF1BN = HELEK1+HELEK2
3409 DSUP2N = (SUP2-SUP2_OLD+DSUPICE_XYZ)*100.0D0
3410 SUP2_OLD = SUP2 ! ### (KS) : We calculate SUP2_OLD outside of JERNUCL01
3412 IF(DSUP2N > DELSUPICE_MAX) DSUP2N = DELSUPICE_MAX
3414 DELTACD = FF1BN*B1*DSUP2N
3416 IF(DELTACD>=FF1BN) DELTACD=FF1BN
3418 IF(DELTACD>0.0D0) THEN
3420 ! concentration of ice crystals
3421 if(CONCI_BFNUCL(ICE)<=helek1) then
3423 DX=3.0D0*xi(KR,ICE)*COL
3425 PSI2(KR,ICE)=PSI2(KR,ICE)+ADDF
3430 ! calculation of crystal concentration after ice nucleation
3433 CONCI_AFNUCL(ICE)=0.0D0
3435 CONCI_AFNUCL(ICE)=CONCI_AFNUCL(ICE)+ &
3436 3.0D0*COL*PSI2(KR,ICE)*xi(KR,ICE)
3438 DELCONCI_AFNUCL=DABS(CONCI_AFNUCL(ICE)-CONCI_BFNUCL(ICE))
3439 IF(DELCONCI_AFNUCL>10.0D0) THEN
3440 PRINT*, 'IN SUBROUTINE ICE_NUCL, AFTER NUCLEATION'
3441 PRINT*, 'BECAUSE DELCONCI_AFNUCL > 10/cm^3'
3442 PRINT*, 'CONCI_BFNUCL(ICE),CONCI_AFNUCL(ICE)'
3443 PRINT 202, CONCI_BFNUCL(ICE),CONCI_AFNUCL(ICE)
3444 PRINT*, 'DELTACD,DSUP2N,FF1BN,B1,DSUPICEXZ,SUP2'
3445 PRINT 206, DELTACD,DSUP2N,FF1BN,B1,DSUPICE_XYZ,SUP2
3446 PRINT*, 'KR, FI2(KR,ICE), PSI2(KR,ICE), KR=1,NKR'
3447 PRINT 302, (KR, FI2(KR,ICE), PSI2(KR,ICE), KR=1,NKR)
3448 PRINT*, 'STOP 099 : DELCONCI_AFNUCL(ICE) > 10/cm^3'
3453 ! new crystal size distribution function (end)
3456 202 FORMAT(1X,2D13.5)
3457 206 FORMAT(1X,6D13.5)
3458 302 FORMAT(1X,I2,2X,2D13.5)
3461 END SUBROUTINE ICE_NUCL
3463 ! SUBROUTINE ICE_NUCL
3464 ! +-------------------------------------------------------------------------------------------------+
3465 SUBROUTINE Cloud_Base_Super (FCCNR, RCCN, TT, PP, Wbase, NKR, RCRITI, RO_SOLUTE, IONS, MWAERO, &
3470 ! RCCN(NKR), cm- aerosol's radius
3472 ! FCCNR(KR), 1/cm^3 - aerosol(CCN) non conservative, size
3473 ! distribution function in point with X,Z
3474 ! coordinates, KR=1,...,NKR
3475 integer,intent(in) :: NKR, IONS
3476 real(kind=r8size),intent(in) :: TT, PP, Wbase, RCCN(:), COL
3477 real(kind=r8size),intent(inout) :: FCCNR(:), RCRITI
3478 real(kind=r4size),intent(in) :: MWAERO, RO_SOLUTE
3481 integer :: NR, NN, KR
3482 real(kind=r8size) :: PL(NKR), supmax(NKR), AKOE, BKOE, C3, PR, CCNCONACT, DL1, DL2, &
3486 CALL supmax_COEFF(AKOE,BKOE,C3,PP,TT,RO_SOLUTE,IONS,MWAERO)
3488 ! supmax calculation
3490 ! 'Analytical estimation of droplet concentration at cloud base', eq.21, 2012
3491 ! calculation of right side hand of equation for S_MAX
3492 ! while wbase>0, calculation PR
3494 PR = C3*wbase**(0.75D0)
3496 ! calculation supersaturation in cloud base
3502 supmax(NR)=DSQRT((4.0D0*AKOE**3.0D0)/(27.0D0*RCCN(NR)**3.0D0*BKOE))
3503 ! calculation CCNCONACT- the concentration of ccn that were activated
3504 ! following nucleation
3505 ! CCNCONACT=N from the paper
3506 ! 'Analytical estimation of droplet concentration at cloud base', eq.19, 2012
3507 ! CCNCONACT, 1/cm^3- concentration of activated CCN = new droplet concentration
3508 ! CCNCONACT=FCCNR(KR)*COL
3513 ! NR represents the number of bin in which rcriti is located
3514 ! from NR bin to NKR bin goes to droplets
3517 CCNCONACT = CCNCONACT + COL*FCCNR(KR)
3520 ! calculate LHS of equation for S_MAX
3521 ! when PL<PR ccn will activate
3523 PL(NR)=supmax(NR)*(DSQRT(CCNCONACT))
3524 IF(PL(NR).LE.PR) THEN
3532 print*,"PR, Wbase [cm/s], C3",PR,wbase,C3
3534 CALL wrf_error_fatal ( 'NN is not defined in cloud base routine, model stop' )
3537 ! linear interpolation- finding radius criti of aerosol between
3538 ! bin number (nn-1) to (nn)
3539 ! 1) finding the difference between pl and pr in the left and right over the
3542 DL1 = dabs(PL(NN-1)-PR) ! left side in the final bin
3543 DL2 = dabs(PL(NN)-PR) ! right side in the final bin
3545 ! 2) fining the left part of bin that will not activate
3546 ! DLN1=COL*DL1/(DL2+DL1)
3547 ! 3)finding the right part of bin that activate
3549 ! 4)finding radius criti of aerosol- RCRITI
3551 RCRITI = RCCN(NN-1)*dexp(COL*DL1/(DL1+DL2))
3553 ! end linear interpolation
3556 END SUBROUTINE Cloud_Base_Super
3557 ! +-------------------------------------------------------------------+
3558 SUBROUTINE supmax_COEFF (AKOE,BKOE,C3,PP,TT,RO_SOLUTE,IONS,MWAERO)
3562 ! akoe, cm- constant in Koehler equation
3563 ! bkoe - constant in Koehler equation
3564 ! F, cm^-2*s- from Koehler equation
3565 ! C3 - coefficient depends on thermodynamical parameters
3566 ! PP, (DYNES/CM/CM)- PRESSURE
3567 ! TT, (K)- temperature
3569 integer,intent(in) :: IONS
3570 real(kind=r8size) ,intent(in) :: PP, TT
3571 real(kind=r8size) ,intent(out) :: AKOE, BKOE, C3
3572 real,intent(in) :: MWAERO, RO_SOLUTE
3575 real(kind=r8size) ,parameter :: RV_MY = 461.5D4, CP = 1005.0D4, G = 9.8D2, RD_MY = 287.0D4, & ![cgs]
3577 real(kind=r8size) :: PZERO,TZERO,ALW1,SW,RO_W,HC,EW,RO_V,DV,RO_A,FL,FR,F,TPC,QV,A1,A2, &
3584 ! RV_MY, CM*CM/SEC/SEC/KELVIN - INDIVIDUAL GAS CONSTANT
3588 ! CP, CM*CM/SEC/SEC/KELVIN- SPECIFIC HEAT CAPACITY OF
3589 ! MOIST AIR AT CONSTANT PRESSURE
3592 ! G, CM/SEC/SEC- ACCELERATION OF GRAVITY
3595 ! RD_MY, CM*CM/SEC/SEC/KELVIN - INDIVIDUAL GAS CONSTANT
3599 ! AL2_MY, CM*CM/SEC/SEC - LATENT HEAT OF SUBLIMATION
3603 ! PZERO, DYNES/CM/CM - REFERENCE PRESSURE
3606 ! TZERO, KELVIN - REFERENCE TEMPERATURE
3609 ! AL1_MY, CM*CM/SEC/SEC - LATENT HEAT OF VAPORIZATION
3610 ! ALW1=AL1_MY - ALW1 depends on temperature
3611 ! ALW1, [m^2/sec^2] -latent heat of vaporization-
3613 ALW1 = -6.143419998D-2*tpc**(3.0D0)+1.58927D0*tpc**(2.0D0) &
3614 -2.36418D3*tpc+2.50079D6
3615 ! ALW1, [cm^2/sec^2]
3619 ! Sw, [N*m^-1] - surface tension of water-air interface
3621 IF(tpc.LT.-5.5D0) THEN
3622 Sw = 5.285D-11*tpc**(6.0D0)+6.283D-9*tpc**(5.0D0)+ &
3623 2.933D-7*tpc**(4.0D0)+6.511D-6*tpc**(3.0D0)+ &
3624 6.818D-5*tpc**(2.0D0)+1.15D-4*tpc+7.593D-2
3626 Sw = -1.55D-4*tpc+7.566165D-2
3632 ! RO_W, [kg/m^3] - density of liquid water
3633 IF (tpc.LT.0.0D0) THEN
3634 RO_W= -7.497D-9*tpc**(6.0D0)-3.6449D-7*tpc**(5.0D0) &
3635 -6.9987D-6*tpc**(4.0D0)+1.518D-4*tpc**(3.0D0) &
3636 -8.486D-3*tpc**(2.0D0)+6.69D-2*tpc+9.9986D2
3640 RO_W=(-3.932952D-10*tpc**(5.0D0)+1.497562D-7*tpc**(4.0D0) &
3641 -5.544846D-5*tpc**(3.0D0)-7.92221D-3*tpc**(2.0D0)+ &
3642 1.8224944D1*tpc+9.998396D2)/(1.0D0+1.8159725D-2*tpc)
3648 ! HC, [kg*m/kelvin*sec^3] - coefficient of air heat conductivity
3649 HC=7.1128D-5*tpc+2.380696D-2
3651 ! HC, [g*cm/kelvin*sec^3]
3654 ! ew, water vapor pressure ! ... KS (kg/m2/sec)
3656 ew = 6.38780966D-9*tpc**(6.0D0)+2.03886313D-6*tpc**(5.0D0)+ &
3657 3.02246994D-4*tpc**(4.0D0)+2.65027242D-2*tpc**(3.0D0)+ &
3658 1.43053301D0*tpc**(2.0D0)+4.43986062D1*tpc+6.1117675D2
3664 ! akoe & bkoe - constants in Koehler equation
3667 AKOE=2.0D0*Sw/(RV_MY*RO_W*(tpc+TZERO))
3668 !BKOE=2.0D0*4.3D0/(22.9D0+35.5D0)
3669 BKOE = ions*4.3/mwaero
3670 BKOE=BKOE*(4.0D0/3.0D0)*pi*RO_SOLUTE
3672 ! RO_V, g/cm^3 - density of water vapor
3673 ! calculate from equation of state for water vapor
3674 RO_V = ew/(RV_MY*(tpc+TZERO))
3676 ! DV, [cm^2/sec] - coefficient of diffusion
3678 ! 'Pruppacher, H.R., Klett, J.D., 1997. Microphysics of Clouds and Precipitation'
3679 ! 'page num 503, eq. 13-3'
3680 DV = 0.211D0*(PZERO/PP)*((tpc+TZERO)/TZERO)**(1.94D0)
3682 ! QV, g/g- water vapor mixing ratio
3683 ! ro_a, g/cm^3 - density of air, from equation of state
3684 RO_A=PZERO/((tpc+TZERO)*RD_MY)
3686 ! F, s/m^2 - coefficient depending on thermodynamics parameters
3687 ! such as temperature, thermal conductivity
3689 ! left side of F equation
3690 FL=(RO_W*ALW1**(2.0D0))/(HC*RV_MY*(tpc+TZERO)**(2.0D0))
3692 ! right side of F equation
3693 FR = RO_W*RV_MY*(tpc+TZERO)/(ew*DV)
3696 ! QV, g/g - water vapor mixing ratio
3699 ! A1,A2 - terms from equation describing changes of
3700 ! supersaturation in an adiabatic cloud air
3702 ! A1, [cm^-1] - constant
3703 ! A2, [-] - constant
3705 A1=(G*ALW1/(CP*RV_MY*(tpc+TZERO)**(2.0D0)))-(G/(RD_MY*(tpc+TZERO)))
3706 A2=(1.0D0/QV)+(ALW1**(2.0D0))/(CP*RV_MY*(tpc+TZERO)**(2.0D0))
3708 ! C1,C2,C3,C4- constant parameters
3714 C3=C1*(F*A1/3.0D0)**(0.75D0)*DSQRT(3.0D0*RO_A/(4.0D0*pi*RO_W*A2))
3715 !C4=(C2-C1)**(DEG01)*(F*A1/3.0D0)**(0.25D0)*RO_A**(DEG02)* &
3716 ! DSQRT(3.0D0/(4.0D0*pi*RO_W*A2))
3719 END SUBROUTINE SupMax_COEFF
3720 ! +----------------------------------------------------------------------------------------------------+
3721 SUBROUTINE LogNormal_modes_Aerosol(FCCNR_CON,FCCNR_MAR,NKR_local,COL,XL,XCCN,RCCN,RO_SOLUTE,Scale_Fa,IType)
3725 integer,intent(in) :: NKR_local, Itype
3726 real(kind=r4size) ,intent(in) :: XL(:), COL, RO_SOLUTE, Scale_Fa
3727 real(kind=r8size) ,intent(out) :: FCCNR_CON(:), FCCNR_MAR(:)
3728 real(kind=r4size) ,intent(out) :: XCCN(:),RCCN(:)
3731 integer :: mode_num, KR
3732 integer,parameter :: modemax = 3
3733 real(kind=r8size) :: ccncon1, ccncon2, ccncon3, radius_mean1, radius_mean2, radius_mean3, &
3735 ccncon(modemax), sig(modemax), radius_mean(modemax)
3736 real(kind=r8size) :: CONCCCNIN, FCCNR_tmp(NKR_local), DEG01, X0DROP, &
3737 XOCCN, X0, R0, RCCN_MICRON, S_KR, S(NKR_local), X0CCN, ROCCN(NKR_local), &
3738 RO_SOLUTE_Ammon, RO_SOLUTE_NaCl,arg11,arg12,arg13,arg21,arg22,arg23, &
3739 arg31,arg32,arg33,dNbydlogR_norm1,dNbydlogR_norm2,dNbydlogR_norm3
3742 real(kind=r8size) ,PARAMETER :: RCCN_MAX = 0.4D-4 ! [cm]
3743 real(kind=r8size) ,PARAMETER :: RCCN_MIN = 0.003D-4 ! [cm]
3744 ! ... Minimal radii for dry aerosol for the 3 log normal distribution
3745 real(kind=r8size) ,PARAMETER :: RCCN_MIN_3LN = 0.00048D-4 ! [cm]
3746 real(kind=r8size) ,PARAMETER :: PI = 3.14159265D0
3749 ! ... Calculating the CCN radius grid
3750 !RO_SOLUTE_NaCl = 2.16D0 ! [g/cm3]
3751 !RO_SOLUTE_Ammon = 1.79 ! [g/cm3]
3754 X0CCN = X0DROP/(2.0**(NKR_local))
3755 DO KR = NKR_local,1,-1
3756 ROCCN(KR) = RO_SOLUTE
3757 X0 = X0CCN*2.0D0**(KR)
3758 R0 = (3.0D0*X0/4.0D0/3.141593D0/ROCCN(KR))**DEG01
3763 IF(IType == 1) THEN ! Maritime regime
3766 radius_mean1 = 0.00500D-04
3770 radius_mean2 = 0.03500D-04
3774 radius_mean3 = 0.31000D-04
3777 ELSE IF(IType == 2) THEN ! Continental regime
3780 radius_mean1 = 0.00800D-04
3784 radius_mean2 = 0.03400D-04
3788 radius_mean3 = 0.46000D-04
3796 arg11 = ccncon1/(sqrt(2.0D0*pi)*log(sig1))
3797 arg21 = ccncon2/(sqrt(2.0D0*pi)*log(sig2))
3798 arg31 = ccncon3/(sqrt(2.0D0*pi)*log(sig3))
3800 dNbydlogR_norm1 = 0.0
3801 dNbydlogR_norm2 = 0.0
3802 dNbydlogR_norm3 = 0.0
3803 do kr = NKR_local,1,-1
3804 if(RCCN(kr) > RCCN_MIN_3LN .and. RCCN(kr) < RCCN_MAX)then
3805 arg12 = (log(RCCN(kr)/radius_mean1))**2.0
3806 arg13 = 2.0D0*((log(sig1))**2.0);
3807 dNbydlogR_norm1 = arg11*exp(-arg12/arg13)*(log(2.0)/3.0)
3808 arg22 = (log(RCCN(kr)/radius_mean2))**2.0
3809 arg23 = 2.0D0*((log(sig2))**2.0)
3810 dNbydlogR_norm2 = dNbydlogR_norm1 + arg21*exp(-arg22/arg23)*(log(2.0)/3.0)
3811 arg32 = (log(RCCN(kr)/radius_mean3))**2.0
3812 arg33 = 2.0D0*((log(sig3))**2.0)
3813 dNbydlogR_norm3 = dNbydlogR_norm2 + arg31*exp(-arg32/arg33)*(log(2.0)/3.0);
3814 FCCNR_tmp(kr) = dNbydlogR_norm3/col
3818 CONCCCNIN = col*sum(FCCNR_tmp(:))
3819 print*,'CONCCCNIN',CONCCCNIN
3820 if(IType == 1) FCCNR_MAR = Scale_Fa*FCCNR_tmp
3821 if(IType == 2) FCCNR_CON = Scale_Fa*FCCNR_tmp
3824 END SUBROUTINE LogNormal_modes_Aerosol
3825 ! +---------------------------------------+
3826 end module module_mp_SBM_Nucleation
3827 ! +----------------------------------------------------------------------------+
3828 ! +----------------------------------------------------------------------------+
3829 MODULE module_mp_fast_sbm
3831 USE module_mp_SBM_polar_radar,ONLY:polar_hucm
3832 USE module_mp_SBM_BreakUp,ONLY:Spont_Rain_BreakUp,BreakUp_Snow,KR_SNOW_MIN,KR_SNOW_MAX
3833 USE module_mp_SBM_Nucleation,ONLY:JERNUCL01_KS, LogNormal_modes_Aerosol
3834 USE module_mp_SBM_Auxiliary,ONLY:JERRATE_KS,JERTIMESC_KS,JERSUPSAT_KS, &
3835 JERDFUN_KS,JERDFUN_NEW_KS,POLYSVP,Relaxation_Time
3836 USE scatt_tables,ONLY:faf1,fbf1,fab1,fbb1, &
3837 faf3,fbf3,fab3,fbb3, &
3838 faf4,fbf4,fab4,fbb4, &
3839 faf5,fbf5,fab5,fbb5, &
3841 temps_water,temps_fd,temps_crystals, &
3842 temps_snow,temps_graupel,temps_hail, &
3843 fws_fd,fws_crystals,fws_snow, &
3844 fws_graupel,fws_hail, &
3846 twolayer_hail,twolayer_graupel,twolayer_fd,twolayer_snow,rpquada,usequad
3850 PUBLIC FAST_SBM,FAST_HUCMINIT
3853 INTEGER, PARAMETER, PRIVATE:: R8SIZE = 8
3854 INTEGER, PARAMETER, PRIVATE:: R16SIZE = 16
3855 INTEGER, PARAMETER, PRIVATE:: R4SIZE = 4
3857 ! JacobS: Hard coding the bin-wise indices for the NMM core
3858 INTEGER, PRIVATE,PARAMETER :: p_ff1i01=2, p_ff1i33=34,p_ff5i01=35,p_ff5i33=67,p_ff6i01=68,&
3859 p_ff6i33=100,p_ff8i01=101,p_ff8i43=143
3861 ! JacobS: Hard coding for the polarimetric operator output array
3862 INTEGER, PRIVATE,PARAMETER :: r_p_ff1i01=2, r_p_ff1i06=07,r_p_ff2i01=08,r_p_ff2i06=13,r_p_ff3i01=14,&
3863 r_p_ff3i06=19,r_p_ff4i01=20,r_p_ff4i06=25,r_p_ff5i01=26,r_p_ff5i06=31,r_p_ff6i01=32,r_p_ff6i06=37,&
3864 r_p_ff7i01=38,r_p_ff7i06=43,r_p_ff8i01=44,r_p_ff8i06=49,r_p_ff9i01=50,r_p_ff9i06=55
3866 INTEGER,PARAMETER :: IBREAKUP = 1
3867 INTEGER,PARAMETER :: Snow_BreakUp_On = 1
3868 INTEGER,PARAMETER :: Spont_Rain_BreakUp_On = 1
3869 LOGICAL,PARAMETER :: CONSERV = .TRUE.
3870 INTEGER,PARAMETER :: JIWEN_FAN_MELT = 1
3871 LOGICAL,PARAMETER :: IPolar_HUCM = .TRUE.
3872 INTEGER,PARAMETER :: hail_opt = 1
3873 INTEGER,PARAMETER :: ILogNormal_modes_Aerosol = 1
3875 REAL,PARAMETER :: DX_BOUND = 1433
3876 REAL(kind=r8size), PARAMETER :: SCAL = 1.d0
3877 INTEGER,PARAMETER :: ICEPROCS = 1
3878 INTEGER,PARAMETER :: ICETURB = 0, LIQTURB = 0
3880 INTEGER,PARAMETER :: icempl=1,ICEMAX=3,NCD=33,NHYDR=5,NHYDRO=7 &
3881 ,K0_LL=8,KRMIN_LL=1,KRMAX_LL=19,L0_LL=6 &
3882 ,IEPS_400=1,IEPS_800=0,IEPS_1600=0 &
3883 ,K0L_GL=16,K0G_GL=16 &
3884 ,KRMINL_GL=1,KRMAXL_GL=24 &
3885 ,KRMING_GL=1,KRMAXG_GL=33 &
3886 ,KRDROP=15,KRBREAK=17,KRICE=18 & ! KRDROP=Bin 15 --> 50um
3887 !,NKR=43,JMAX=43,NRG=2,JBREAK=28,BR_MAX=43,KRMIN_BREAKUP=31,NKR_aerosol=43 ! 43 bins
3888 ,NKR=33,JMAX=33,NRG=2,JBREAK=18,BR_MAX=33,KRMIN_BREAKUP=31,NKR_aerosol=43 ! 33 bins
3890 REAL(kind=r4size) :: dt_coll
3891 REAL,PARAMETER :: C1_MEY=0.00033,C2_MEY=0.0,COL=0.23105, &
3892 p1=1000000.0,p2=750000.0,p3=500000.0, &
3894 ALCR_G = 100.0 ! ... [KS] forcing no transition from graupel to hail in this version
3895 INTEGER :: NCOND, NCOLL
3896 INTEGER,PARAMETER :: kr_icempl=9
3898 REAL(kind=r4size) :: &
3899 RADXX(NKR,NHYDR-1),MASSXX(NKR,NHYDR-1),DENXX(NKR,NHYDR-1) &
3900 ,MASSXXO(NKR,NHYDRO),DENXXO(NKR,NHYDRO),VRI(NKR) &
3901 ,XX(nkr),ROCCN(nkr),FCCNR_MIX(NKR),FCCNR(NKR)
3903 REAL(kind=r8size),DIMENSION (NKR) :: FF1R_D,XL_D,VR1_D &
3904 ,FF3R_D,XS_D,VR3_D,VTS_D,FLIQFR_SD,RO3BL_D &
3905 ,FF4R_D,XG_D,VR4_D,VTG_D,FLIQFR_GD,RO4BL_D &
3906 ,FF5R_D,XH_D,VR5_D,VTH_D,FLIQFR_HD,RO5BL_D &
3907 ,XS_MELT_D,XG_MELT_D,XH_MELT_D,VR_TEST,FRIMFR_SD,RF3R
3909 ! ... SBMRADAR VARIABLES
3910 REAL(kind=r8size),DIMENSION (nkr,icemax) :: XI_MELT_D &
3911 ,FF2R_D,XI_D,VR2_D,VTC_D,FLIQFR_ID,RO2BL_D
3912 REAL(kind=r8size) :: T_NEW_D,rhocgs_D,pcgs_D,DT_D,qv_old_D,qv_d
3914 REAL(kind=r4size),private :: C2,C3,C4
3915 REAL(kind=r8size),private :: &
3916 xl_mg(nkr),xs_mg(nkr),xg_mg(nkr),xh_mg(nkr) &
3917 ,xi1_mg(nkr),xi2_mg(nkr),xi3_mg(nkr)
3919 ! ----------------------------------------------------------------------------------+
3921 ! ... Holding Lookup tables and memory arrays for the FAST_SBM module
3922 REAL (KIND=R8SIZE), ALLOCATABLE, DIMENSION(:):: &
3923 bin_mass,tab_colum,tab_dendr,tab_snow,bin_log
3924 REAL (KIND=R4SIZE), ALLOCATABLE, DIMENSION(:) :: &
3925 RLEC,RSEC,RGEC,RHEC,XL,XS,XG,XH,VR1,VR3,VR4,VR5
3926 REAL (KIND=R4SIZE), ALLOCATABLE, DIMENSION(:,:):: &
3928 REAL (KIND=R4SIZE), ALLOCATABLE :: &
3929 COEFIN(:),SLIC(:,:),TLIC(:,:), &
3930 YWLL_1000MB(:,:),YWLL_750MB(:,:),YWLL_500MB(:,:)
3931 REAL (KIND=R4SIZE), ALLOCATABLE :: &
3932 YWLI_300MB(:,:,:),YWLI_500MB(:,:,:),YWLI_750MB(:,:,:), &
3933 YWLG_300MB(:,:),YWLG_500MB(:,:),YWLG_750MB(:,:),YWLG(:,:), &
3934 YWLH_300MB(:,:),YWLH_500MB(:,:),YWLH_750MB(:,:), &
3935 YWLS_300MB(:,:),YWLS_500MB(:,:),YWLS_750MB(:,:), &
3936 YWII_300MB(:,:,:,:),YWII_500MB(:,:,:,:),YWII_750MB(:,:,:,:), &
3937 YWII_300MB_tmp(:,:,:,:),YWII_500MB_tmp(:,:,:,:),YWII_750MB_tmp(:,:,:,:), &
3938 YWIS_300MB(:,:,:),YWIS_500MB(:,:,:),YWIS_750MB(:,:,:), &
3939 YWSG_300MB(:,:),YWSG_500MB(:,:),YWSG_750MB(:,:), &
3940 YWSS_300MB(:,:),YWSS_500MB(:,:),YWSS_750MB(:,:)
3942 REAL (KIND=R4SIZE), ALLOCATABLE :: &
3943 RO1BL(:), RO2BL(:,:), RO3BL(:), RO4BL(:), RO5BL(:), &
3946 INTEGER,ALLOCATABLE :: ima(:,:)
3947 REAL (KIND=R8SIZE), ALLOCATABLE :: chucm(:,:)
3949 REAL (KIND=R8SIZE), ALLOCATABLE :: BRKWEIGHT(:),ECOALMASSM(:,:), Prob(:),Gain_Var_New(:,:),NND(:,:)
3950 REAL (KIND=R4SIZE), ALLOCATABLE :: DROPRADII(:),PKIJ(:,:,:),QKJ(:,:)
3951 INTEGER :: ikr_spon_break
3953 REAL (KIND=R8SIZE), ALLOCATABLE :: cwll(:,:), &
3954 cwli_1(:,:),cwli_2(:,:),cwli_3(:,:), &
3955 cwil_1(:,:),cwil_2(:,:),cwil_3(:,:), &
3956 cwlg(:,:),cwlh(:,:),cwls(:,:), &
3957 cwgl(:,:),cwhl(:,:),cwsl(:,:), &
3958 cwii_1_1(:,:),cwii_1_2(:,:),cwii_1_3(:,:), &
3959 cwii_2_1(:,:),cwii_2_2(:,:),cwii_2_3(:,:), &
3960 cwii_3_1(:,:),cwii_3_2(:,:),cwii_3_3(:,:), &
3961 cwis_1(:,:),cwis_2(:,:),cwis_3(:,:), &
3962 cwsi_1(:,:),cwsi_2(:,:),cwsi_3(:,:), &
3963 cwig_1(:,:),cwig_2(:,:),cwig_3(:,:), &
3964 cwih_1(:,:),cwih_2(:,:),cwih_3(:,:), &
3966 REAL(kind=r8size),ALLOCATABLE :: FCCNR_MAR(:),FCCNR_CON(:)
3967 REAL(kind=r4size),ALLOCATABLE :: Scale_CCN_Factor,XCCN(:),RCCN(:),FCCN(:)
3970 ! --------------------------------------------------------------------------------+
3974 ! ### (KS) - CCN related
3975 ! -----------------------------------------------------------------------
3976 !REAL (KIND=R4SIZE), parameter :: mwaero = 22.9 + 35.5 ! sea salt
3977 real(kind=r4size),parameter :: mwaero = 115.0
3978 !integer,parameter :: ions = 2 ! sea salt
3979 integer,parameter :: ions = 3 ! ammonium-sulfate
3980 !real(KIND=R4SIZE),parameter :: RO_SOLUTE = 2.16 ! sea salt
3981 real(kind=r4size),parameter :: RO_SOLUTE = 1.79 ! ammonium-sulfate
3982 ! ----------------------------------------------------------------------
3983 REAL (KIND=R4SIZE) :: FR_LIM(NKR), FRH_LIM(NKR)
3986 !-----------------------------------------------------------------------
3987 SUBROUTINE FAST_SBM (w,u,v,th_old, &
3988 & chem_new,n_chem, &
3989 & itimestep,DT,DX,DY, &
3990 & dz8w,rho_phy,p_phy,pi_phy,th_phy, &
3991 & xland,domain_id,ivgtyp,xlat,xlong, &
3992 & QV,QC,QR,QI,QS,QG,QV_OLD, &
3993 & QNC,QNR,QNI,QNS,QNG,QNA, &
3994 & ids,ide, jds,jde, kds,kde, &
3995 & ims,ime, jms,jme, kms,kme, &
3996 & its,ite, jts,jte, kts,kte, &
3998 & sbmradar,num_sbmradar, &
3999 & sbm_diagnostics, &
4000 & RAINNC,RAINNCV,SNOWNC,SNOWNCV,GRAUPELNC,GRAUPELNCV,SR)
4001 !-----------------------------------------------------------------------
4003 !-----------------------------------------------------------------------
4004 INTEGER :: KR,IKL,ICE
4006 INTEGER,INTENT(IN) :: IDS,IDE,JDS,JDE,KDS,KDE &
4007 & ,IMS,IME,JMS,JME,KMS,KME &
4008 & ,ITS,ITE,JTS,JTE,KTS,KTE &
4009 & ,ITIMESTEP,N_CHEM,NUM_SBMRADAR,domain_id &
4012 REAL, INTENT(IN) :: DT,DX,DY
4013 REAL, DIMENSION( ims:ime , kms:kme , jms:jme ), &
4019 REAL ,DIMENSION(ims:ime,kms:kme,jms:jme,n_chem),INTENT(INOUT) :: chem_new
4020 REAL ,DIMENSION(ims:ime,kms:kme,jms:jme,num_sbmradar),INTENT(INOUT) :: sbmradar
4021 REAL, DIMENSION( ims:ime , kms:kme , jms:jme ), &
4038 REAL , DIMENSION( ims:ime , jms:jme ) , INTENT(IN) :: XLAND
4039 LOGICAL, OPTIONAL, INTENT(IN) :: diagflag
4041 INTEGER, DIMENSION( ims:ime , jms:jme ), INTENT(IN):: IVGTYP
4042 REAL, DIMENSION( ims:ime, jms:jme ), INTENT(IN ) :: XLAT, XLONG
4043 REAL, INTENT(IN), DIMENSION(ims:ime, kms:kme, jms:jme):: &
4044 & dz8w,p_phy,pi_phy,rho_phy
4045 REAL, INTENT(INOUT), DIMENSION(ims:ime, kms:kme, jms:jme):: &
4047 REAL, INTENT(INOUT), DIMENSION(ims:ime,jms:jme), OPTIONAL :: &
4048 & RAINNC,RAINNCV,SNOWNC,SNOWNCV,GRAUPELNC,GRAUPELNCV,SR
4050 !-----------------------------------------------------------------------
4052 !-----------------------------------------------------------------------
4054 REAL (KIND=R4SIZE), DIMENSION(its-1:ite+1, kts:kte, jts-1:jte+1):: &
4055 t_new,t_old,zcgs,rhocgs,pcgs
4057 INTEGER :: I,J,K,KFLIP
4060 REAL (KIND=R4SIZE),PARAMETER :: Z0IN=2.0E5,ZMIN=2.0E5
4062 REAL (KIND=R4SIZE) :: EPSF2D, &
4063 & TAUR1,TAUR2,EPS_R1,EPS_R2,ANC1IN, &
4064 & PEPL,PEPI,PERL,PERI,ANC1,ANC2,PARSP, &
4065 & AFREEZMY,BFREEZMY,BFREEZMAX, &
4067 & EPSF1,EPSF3,EPSF4, &
4068 & SUP2_OLD, DSUPICEXZ,TFREEZ_OLD,DTFREEZXZ, &
4069 & AA1_MY,BB1_MY,AA2_MY,BB2_MY, &
4070 & DTIME,DTCOND,DTNEW,DTCOLL, &
4071 & A1_MYN, BB1_MYN, A2_MYN, BB2_MYN
4072 DATA A1_MYN, BB1_MYN, A2_MYN, BB2_MYN &
4073 & /2.53,5.42,3.41E1,6.13/
4074 DATA AA1_MY,BB1_MY,AA2_MY,BB2_MY/2.53E12,5.42E3,3.41E13,6.13E3/
4075 !QSUM,ISUM,QSUM1,QSUM2,CCNSUM1,CCNSUM2
4076 DATA KRFREEZ,BFREEZMAX,ANC1,ANC2,PARSP,PEPL,PEPI,PERL,PERI, &
4077 & TAUR1,TAUR2,EPS_R1,EPS_R2,TTCOAL,AFREEZMY,&
4078 & BFREEZMY,EPSF1,EPSF3,EPSF4,TCRIT/21,&
4080 & 1.0000E02,1.0000E02,0.9000E02, &
4081 & 0.6000E00,0.6000E00,1.0000E-03,1.0000E-03, &
4082 & 0.5000E00,0.8000E00,0.1500E09,0.1500E09, &
4083 & 2.3315E02,0.3333E-04,0.6600E00, &
4084 & 0.1000E-02,0.1000E-05,0.1000E-05, &
4087 REAL (KIND=R4SIZE),DIMENSION (nkr) :: FF1IN,FF3IN,FF4IN,FF5IN,&
4088 & FF1R,FF3R,FF4R,FF5R,FLIQFR_S,FRIMFR_S,FLIQFR_G,FLIQFR_H, &
4089 & FF1R_NEW,FF3R_NEW,FF4R_NEW,FF5R_NEW
4090 REAL (KIND=R4SIZE),DIMENSION (nkr) :: FL3R,FL4R,FL5R,FL3R_NEW,FL4R_NEW,FL5R_NEW
4092 REAL (KIND=R4SIZE),DIMENSION (nkr,icemax) :: FF2IN,FF2R,FLIQFR_I
4094 REAL (KIND=R4SIZE) :: XI_MELT(NKR,ICEMAX),XS_MELT(NKR),XG_MELT(NKR),XH_MELT(NKR)
4095 !!!! NOTE: ZCGS AND OTHER VARIABLES ARE ALSO DIMENSIONED IN FALFLUXHUCM
4096 REAL (KIND=R8SIZE) :: DEL1NR,DEL2NR,DEL12R,DEL12RD,ES1N,ES2N,EW1N,EW1PN
4097 REAL (KIND=R8SIZE) :: DELSUP1,DELSUP2,DELDIV1,DELDIV2
4098 REAL (KIND=R8SIZE) :: TT,QQ,TTA,QQA,PP,DPSA,DELTATEMP,DELTAQ
4099 REAL (KIND=R8SIZE) :: DIV1,DIV2,DIV3,DIV4,DEL1IN,DEL2IN,DEL1AD,DEL2AD
4100 REAL (KIND=R4SIZE) :: DEL_BB,DEL_BBN,DEL_BBR, TTA_r
4101 REAL (KIND=R4SIZE) :: FACTZ,CONCCCN_XZ,CONCDROP
4102 REAL (KIND=R4SIZE) :: SUPICE(KTE),AR1,AR2, &
4103 & DERIVT_X,DERIVT_Y,DERIVT_Z,DERIVS_X,DERIVS_Y,DERIVS_Z, &
4104 & ES2NPLSX,ES2NPLSY,EW1NPLSX,EW1NPLSY,UX,VX, &
4105 & DEL2INPLSX,DEL2INPLSY,DZZ(KTE)
4106 INTEGER KRR,I_START,I_END,J_START,J_END
4107 REAL (KIND=R4SIZE) :: DTFREEZ_XYZ(ITE,KTE,JTE),DSUPICE_XYZ(ITE,KTE,JTE)
4109 REAL (KIND=R4SIZE) :: DXHUCM,DYHUCM
4110 REAL (KIND=R4SIZE) :: FMAX1,FMAX2(ICEMAX),FMAX3,FMAX4,FMAX5
4111 INTEGER ISYM1,ISYM2(ICEMAX),ISYM3,ISYM4,ISYM5
4113 REAL (KIND=R4SIZE) :: DELTAW
4114 REAL (KIND=R4SIZE) :: zcgs_z(kts:kte),pcgs_z(kts:kte),rhocgs_z(kts:kte),ffx_z(kts:kte,nkr)
4115 REAL (KIND=R4SIZE) :: z_full
4116 REAL (KIND=R4SIZE) :: VRX(kts:kte,NKR)
4118 REAL (KIND=R4SIZE) :: VR1_Z(NKR,KTS:KTE), FACTOR_P, VR1_Z3D(NKR,ITS:ITE,KTS:KTE,JTS:JTE)
4119 REAL (KIND=R4SIZE) :: VR2_ZC(NKR,KTS:KTE), VR2_Z(NKR,ICEMAX)
4120 REAL (KIND=R4SIZE) :: VR2_ZP(NKR,KTS:KTE)
4121 REAL (KIND=R4SIZE) :: VR2_ZD(NKR,KTS:KTE)
4122 REAL (KIND=R4SIZE) :: VR3_Z(NKR,KTS:KTE), VR3_Z3D(NKR,ITS:ITE,KTS:KTE,JTS:JTE)
4123 REAL (KIND=R4SIZE) :: VR4_Z(NKR,KTS:KTE), VR4_Z3D(NKR,ITS:ITE,KTS:KTE,JTS:JTE)
4124 REAL (KIND=R4SIZE) :: VR5_Z(NKR,KTS:KTE), VR5_Z3D(NKR,ITS:ITE,KTS:KTE,JTS:JTE)
4125 REAL (KIND=R4SIZE) :: BulkDen_Snow(NKR,ITS:ITE,KTS:KTE,JTS:JTE) ! Local array for snow density
4127 REAL (KIND=R4SIZE), PARAMETER :: RON=8.E6, GON=5.E7,PI=3.14159265359
4128 REAL (KIND=R4SIZE) :: EFF_N,EFF_D
4129 REAL (KIND=R4SIZE) :: EFF_NI(its:ite,kts:kte,jts:jte),eff_di(its:ite,kts:kte,jts:jte)
4130 REAL (KIND=R4SIZE) :: EFF_NQIC,eff_DQIC
4131 REAL (KIND=R4SIZE) :: EFF_NQIP,eff_DQIP
4132 REAL (KIND=R4SIZE) :: EFF_NQID,eff_DQID
4133 REAL (KIND=R4SIZE) :: lambda,chi0,xi1,xi2,xi3,xi4,xi5,r_e,chi_3,f1,f2,volume,surface_area,xi6,ft,chi_e,ft_bin
4134 REAL (KIND=R4SIZE), DIMENSION(kts:kte):: &
4135 qv1d, qr1d, nr1d, qs1d, ns1d, qg1d, ng1d, t1d, p1d
4136 REAL (KIND=R4SIZE), DIMENSION(kts:kte):: dBZ
4138 REAL (KIND=R4SIZE) :: nzero,son,nzero_less
4139 parameter (son=2.E7)
4140 REAL (KIND=R4SIZE) :: raddumb(nkr),massdumb(nkr)
4141 REAL (KIND=R4SIZE) :: hydrosum
4143 integer imax,kmax,jmax
4144 REAL (KIND=R4SIZE) :: gmax,tmax,qmax,divmax,rainmax,qnmax,inmax,knmax,hydro,difmax, tdif, tt_old, w_stag, w_stag_my, qq_old,teten,es
4146 parameter (print_int=300)
4148 integer t_print,i_print,j_print,k_print
4149 REAL (KIND=R8SIZE), DIMENSION(kts:kte):: zmks_1d
4150 REAL (KIND=R8SIZE) :: dx_dbl, dy_dbl
4151 INTEGER,DIMENSION (nkr) :: melt_snow,melt_graupel,melt_hail,melt_ice
4152 !DOUBLE PRECISION,DIMENSION (nkr) :: dmelt_snow,dmelt_graupel,dmelt_hail,dmelt_ice
4154 REAL (KIND=R4SIZE) :: NSNOW_ADD
4157 INTEGER,PARAMETER :: n_radar = 10
4158 integer :: ijk, Mod_Flag
4159 REAL (KIND=R8SIZE),PARAMETER :: wavelength = 11.0D0 ! ### (KS) - Rhyzkov uses this wavelength (NEXRAD)
4161 REAL (KIND=R4SIZE) :: DIST_SING
4162 REAL (KIND=R8SIZE) :: BKDEN_Snow(NKR)
4163 REAL (KIND=R8SIZE) :: DISTANCE,FL1_FD(NKR),BULK(NKR), BulkDens_Snow(NKR)
4164 REAL (KIND=R8SIZE) :: FF1_FD(NKR),FFL_FD(NKR),OUT1(n_radar),OUT2(n_radar),OUT3(n_radar),OUT4(n_radar),OUT5(n_radar), &
4165 OUT6(n_radar),OUT7(n_radar),OUT8(n_radar),OUT9(n_radar), FL1R_FD(NKR)
4166 REAL (KIND=R8SIZE) :: rate_shed_per_grau_grampersec(NKR), rate_shed_per_hail_grampersec(NKR), rhoair_max
4168 integer :: count_H, count_G, count_S_l, count_S_r
4170 REAL (KIND=R8SIZE) :: RMin_G
4171 integer :: KR_GRAUP_MAX_BLAHAK, KR_G_TO_H
4173 ! ... Cloud Base .........................................................
4174 REAL (KIND=R8SIZE) :: SUP_WATER, ES1N_KS, ES1N_dummy, ES2N_dummy
4176 integer :: KZ_Cloud_Base(its:ite,jts:jte), IS_THIS_CLOUDBASE,KR_Small_Ice
4177 ! ........................................................................
4178 REAL (KIND=R4SIZE) :: qna0(its:ite,kts:kte,jts:jte), fr_hom, w_stagm, CollEff_out, FACT
4179 REAL (KIND=R4SIZE) :: FACTZ_new(KMS:KME,NKR), TT_r
4180 ! ### (KS) ............................................................................................
4181 INTEGER :: NZ,NZZ,II,JJ
4185 if (itimestep.eq.1)then
4186 if (iceprocs.eq.1) call wrf_message(" FAST SBM: ICE PROCESES ACTIVE ")
4187 if (iceprocs.eq.0) call wrf_message(" FAST SBM: LIQUID PROCESES ONLY")
4192 DTCOND = DT/REAL(NCOND)
4193 DTCOLL = DT/REAL(NCOLL)
4196 DEL_BB=BB2_MY-BB1_MY
4197 DEL_BBN=BB2_MYN-BB1_MYN
4198 DEL_BBR=BB1_MYN/DEL_BBN
4205 rhocgs(I,K,J)=rho_phy(I,K,J)*0.001
4208 DO KR=p_ff1i01,p_ff1i33
4210 chem_new(I,K,J,KR)=chem_new(I,K,J,KR)*RHOCGS(I,K,J)/COL/XL(KRR)/XL(KRR)/3.0
4214 DO KR=p_ff5i01,p_ff5i33
4216 chem_new(I,K,J,KR)=chem_new(I,K,J,KR)*RHOCGS(I,K,J)/COL/XS(KRR)/XS(KRR)/3.0
4220 DO KR=p_ff8i01,p_ff8i43
4222 chem_new(I,K,J,KR) = chem_new(I,K,J,KR)*RHOCGS(I,K,J)/1000.0
4224 ! ... Hail or Graupel [same registry adresses]
4225 if(hail_opt == 1) then
4227 DO KR=p_ff6i01,p_ff6i33
4229 chem_new(I,K,J,KR)=chem_new(I,K,J,KR)*RHOCGS(I,K,J)/COL/XH(KRR)/XH(KRR)/3.0
4234 DO KR=p_ff6i01,p_ff6i33
4236 chem_new(I,K,J,KR)=chem_new(I,K,J,KR)*RHOCGS(I,K,J)/COL/XG(KRR)/XG(KRR)/3.0
4248 I_START=MAX(1,ITS-1)
4249 J_START=MAX(1,JTS-1)
4250 I_END=MIN(IDE-1,ITE+1)
4251 J_END=MIN(JDE-1,JTE+1)
4253 DO j = j_start,j_end
4254 DO i = i_start,i_end
4257 pcgs(I,K,J)=P_PHY(I,K,J)*10.
4258 rhocgs(I,K,J)=rho_phy(I,K,J)*0.001
4259 zcgs(I,K,J)=z_full+0.5*dz8w(I,K,J)*100
4260 !height(i,k,j) = 1.0e-2*zcgs(i,k,j) ! in [m]
4261 z_full=z_full+dz8w(i,k,j)*100.
4266 ! +---------------------------------------+
4267 ! ... Initial Aerosol distribution
4268 ! +---------------------------------------+
4269 if (itimestep == 1)then
4274 rhoair_max = rhocgs(i,1,j) ! [g/cm3]
4275 if(ILogNormal_modes_Aerosol == 1)then
4276 IF (zcgs(I,K,J) .LE. ZMIN)THEN
4279 FACTZ=EXP(-(zcgs(I,K,J)-ZMIN)/Z0IN)
4283 DO KR = p_ff8i01,p_ff8i43
4285 if (xland(i,j) == 1)then
4286 ! chem_new(I,K,J,KR)=FCCNR_CON(KRR)*FACTZ
4287 chem_new(I,K,J,KR) = (FCCNR_CON(KRR)/rhoair_max)*rhocgs(i,k,j) ! ... distributed vertically as [#/g]
4289 ! chem_new(I,K,J,KR)=FCCNR_MAR(KRR)*FACTZ
4290 chem_new(I,K,J,KR) = (FCCNR_MAR(KRR)/rhoair_max)*rhocgs(i,k,j) ! ... distributed vertically as [#/g]
4299 ! +--------------------------------------------+
4300 ! ... Aerosols boundary conditions
4301 ! (for 3D application running with MPI)
4302 ! +--------------------------------------------+
4303 #if (defined(DM_PARALLEL))
4304 if (itimestep > 1 .and. domain_id == 1)then
4308 rhoair_max = rhocgs(i,1,j) ! [g/cm3]
4309 if (i <= 5 .or. i >= IDE-5 .OR. &
4310 & j <= 5 .or. j >= JDE-5)THEN
4311 if(ILogNormal_modes_Aerosol == 1)then
4312 IF (zcgs(I,K,J).LE.ZMIN) THEN
4315 FACTZ=EXP(-(zcgs(I,K,J)-ZMIN)/Z0IN)
4319 DO kr = p_ff8i01,p_ff8i43
4321 if (xland(i,j) == 1)then
4322 ! chem_new(I,K,J,KR)=FCCNR_CON(KRR)*FACTZ
4323 chem_new(I,K,J,KR) = (FCCNR_CON(KRR)/rhoair_max)*rhocgs(i,k,j)
4325 ! chem_new(I,K,J,KR)=FCCNR_MAR(KRR)*FACTZ
4326 chem_new(I,K,J,KR) = (FCCNR_MAR(KRR)/rhoair_max)*rhocgs(i,k,j)
4337 if (itimestep == 1)then
4338 DO j = j_start,j_end
4340 DO i = i_start,i_end
4341 th_old(i,k,j)=th_phy(i,k,j)
4342 qv_old(i,k,j)=qv(i,k,j)
4348 DO j = j_start,j_end
4350 DO i = i_start,i_end
4351 t_new(i,k,j) = th_phy(i,k,j)*pi_phy(i,k,j)
4352 !tempc(i,k,j)= t_new(i,k,j)-273.16
4353 t_old(i,k,j) = th_old(i,k,j)*pi_phy(i,k,j)
4358 IF(ICEPROCS == 1)THEN
4365 ES1N = AA1_MY*EXP(-BB1_MY/T_NEW(I,K,J))
4366 EW1N = QV(I,K,J)*pcgs(I,K,J)/(0.622+0.378*QV(I,K,J))
4367 SUP_WATER = EW1N/ES1N - 1.0
4369 w_stag_my = 50.*(w(i,k,j)+w(i,k+1,j))
4371 w_stag_my = 100*w(i,k,j)
4373 if(SUP_WATER > 0.0D0 .and. w_stag_my > 0.1*1.0D2 .and. K_found .eqv. .FALSE. .and. K > 2 .and. zcgs(I,K,J) < 3.0*1.0D5)then
4374 KZ_Cloud_Base(I,J) = K ! K-level index of cloud base
4379 DZZ(K)=(zcgs(I,K,J)-zcgs(I,K-1,J))
4381 DZZ(K)=(zcgs(I,K+1,J)-zcgs(I,K,J))
4383 DZZ(K)=(zcgs(I,K+1,J)-zcgs(I,K-1,J))
4385 ES2N=AA2_MY*EXP(-BB2_MY/T_OLD(I,K,J))
4386 EW1N=QV_OLD(I,K,J)*pcgs(I,K,J)/(0.622+0.378*QV_OLD(I,K,J))
4387 SUPICE(K)=EW1N/ES2N-1.
4388 IF(SUPICE(K).GT.0.5) SUPICE(K)=.5
4391 IF(T_OLD(I,K,J).GE.238.15.AND.T_OLD(I,K,J).LT.274.15) THEN
4393 w_stag=50.*(w(i,k,j)+w(i,k+1,j))
4397 IF (I.LT.IDE-1.AND.J.LT.JDE-1)THEN
4398 UX=25.*(U(I,K,J)+U(I+1,K,J)+U(I,K,J+1)+U(I+1,K,J+1))
4399 VX=25.*(V(I,K,J)+V(I+1,K,J)+V(I,K,J+1)+V(I+1,K,J+1))
4404 IF(K.EQ.1) DERIVT_Z=(T_OLD(I,K+1,J)-T_OLD(I,K,J))/DZZ(K)
4405 IF(K.EQ.KTE) DERIVT_Z=(T_OLD(I,K,J)-T_OLD(I,K-1,J))/DZZ(K)
4406 IF(K.GT.1.AND.K.LT.KTE) DERIVT_Z= &
4407 (T_OLD(I,K+1,J)-T_OLD(I,K-1,J))/DZZ(K)
4409 DERIVT_X=(T_OLD(I+1,K,J)-T_OLD(I,K,J))/(DXHUCM)
4410 ELSE IF (I.EQ.IDE-1)THEN
4411 DERIVT_X=(T_OLD(I,K,J)-T_OLD(I-1,K,J))/(DXHUCM)
4413 DERIVT_X=(T_OLD(I+1,K,J)-T_OLD(I-1,K,J))/(2.*DXHUCM)
4416 DERIVT_Y=(T_OLD(I,K,J+1)-T_OLD(I,K,J))/(DYHUCM)
4417 ELSE IF (J.EQ.JDE-1)THEN
4418 DERIVT_Y=(T_OLD(I,K,J)-T_OLD(I,K,J-1))/(DYHUCM)
4420 DERIVT_Y=(T_OLD(I,K,J+1)-T_OLD(I,K,J-1))/(2.*DYHUCM)
4422 DTFREEZ_XYZ(I,K,J) = DT*(VX*DERIVT_Y+ &
4423 UX*DERIVT_X+w_stag*DERIVT_Z)
4424 ELSE ! IF(T_OLD(I,K,J).GE.238.15.AND.T_OLD(I,K,J).LT.274.15)
4425 DTFREEZ_XYZ(I,K,J)=0.
4427 IF(SUPICE(K).GE.0.02.AND.T_OLD(I,K,J).LT.268.15) THEN
4429 ES2NPLSX=AA2_MY*EXP(-BB2_MY/T_OLD(I+1,K,J))
4430 EW1NPLSX=QV_OLD(I+1,K,J)*pcgs(I+1,K,J)/ &
4431 (0.622+0.378*QV_OLD(I+1,K,J))
4433 ES2NPLSX = AA2_MY*EXP(-BB2_MY/T_OLD(I,K,J))
4434 EW1NPLSX = QV_OLD(I,K,J)*pcgs(I,K,J)/ &
4435 (0.622+0.378*QV_OLD(I,K,J))
4437 IF (ES2NPLSX.EQ.0)THEN
4440 DEL2INPLSX=EW1NPLSX/ES2NPLSX-1.
4442 IF(DEL2INPLSX.GT.0.5) DEL2INPLSX=.5
4444 ES2N=AA2_MY*EXP(-BB2_MY/T_OLD(I-1,K,J))
4445 EW1N=QV_OLD(I-1,K,J)*pcgs(I-1,K,J)/(0.622+0.378*QV_OLD(I-1,K,J))
4447 ES2N=AA2_MY*EXP(-BB2_MY/T_OLD(I,K,J))
4448 EW1N=QV_OLD(I,K,J)*pcgs(I,K,J)/(0.622+0.378*QV_OLD(I,K,J))
4451 IF(DEL2IN.GT.0.5) DEL2IN=.5
4452 IF (I.GT.1.AND.I.LT.IDE-1)THEN
4453 DERIVS_X=(DEL2INPLSX-DEL2IN)/(2.*DXHUCM)
4455 DERIVS_X=(DEL2INPLSX-DEL2IN)/(DXHUCM)
4458 ES2NPLSY=AA2_MY*EXP(-BB2_MY/T_OLD(I,K,J+1))
4459 EW1NPLSY=QV_OLD(I,K,J+1)*pcgs(I,K,J+1)/(0.622+0.378*QV_OLD(I,K,J+1))
4461 ES2NPLSY=AA2_MY*EXP(-BB2_MY/T_OLD(I,K,J))
4462 EW1NPLSY=QV_OLD(I,K,J)*pcgs(I,K,J)/(0.622+0.378*QV_OLD(I,K,J))
4464 DEL2INPLSY=EW1NPLSY/ES2NPLSY-1.
4465 IF(DEL2INPLSY.GT.0.5) DEL2INPLSY=.5
4467 ES2N=AA2_MY*EXP(-BB2_MY/T_OLD(I,K,J-1))
4468 EW1N=QV_OLD(I,K,J-1)*pcgs(I,K,J-1)/(0.622+0.378*QV_OLD(I,K,J-1))
4470 ES2N=AA2_MY*EXP(-BB2_MY/T_OLD(I,K,J))
4471 EW1N=QV_OLD(I,K,J)*pcgs(I,K,J)/(0.622+0.378*QV_OLD(I,K,J))
4474 IF(DEL2IN.GT.0.5) DEL2IN=.5
4475 IF (J.GT.1.AND.J.LT.JDE-1)THEN
4476 DERIVS_Y=(DEL2INPLSY-DEL2IN)/(2.*DYHUCM)
4478 DERIVS_Y=(DEL2INPLSY-DEL2IN)/(DYHUCM)
4480 IF (K.EQ.1)DERIVS_Z=(SUPICE(K+1)-SUPICE(K))/DZZ(K)
4481 IF (K.EQ.KTE)DERIVS_Z=(SUPICE(K)-SUPICE(K-1))/DZZ(K)
4482 IF(K.GT.1.and.K.LT.KTE) DERIVS_Z=(SUPICE(K+1)-SUPICE(K-1))/DZZ(K)
4483 IF (I.LT.IDE-1.AND.J.LT.JDE-1)THEN
4484 UX=25.*(U(I,K,J)+U(I+1,K,J)+U(I,K,J+1)+U(I+1,K,J+1))
4485 VX=25.*(V(I,K,J)+V(I+1,K,J)+V(I,K,J+1)+V(I+1,K,J+1))
4490 DSUPICE_XYZ(I,K,J)=(UX*DERIVS_X+VX*DERIVS_Y+ &
4491 w_stag*DERIVS_Z)*DTCOND
4493 DSUPICE_XYZ(I,K,J)=0.0
4504 ! ... correcting Look-up-table Terminal velocities
4505 FACTOR_P = DSQRT(1.0D6/PCGS(I,K,J))
4506 VR2_ZC(1:nkr,K) = VR2(1:nkr,1)*FACTOR_P
4507 VR2_ZP(1:nkr,K) = VR2(1:nkr,2)*FACTOR_P
4508 VR2_ZD(1:nkr,K) = VR2(1:nkr,3)*FACTOR_P
4509 VR1_Z(1:nkr,K) = VR1(1:nkr)*FACTOR_P
4510 VR3_Z(1:nkr,K) = VR3(1:nkr)*FACTOR_P
4511 VR4_Z(1:nkr,K) = VR4(1:nkr)*FACTOR_P
4512 VR5_Z(1:nkr,k) = VR5(1:nkr)*FACTOR_P
4513 VR1_Z3D(1:nkr,I,K,J) = VR1(1:nkr)*FACTOR_P
4514 VR3_Z3D(1:nkr,I,K,J) = VR3(1:nkr)*FACTOR_P
4515 VR4_Z3D(1:nkr,I,K,J) = VR4(1:nkr)*FACTOR_P
4516 VR5_Z3D(1:nkr,I,K,J) = VR5(1:nkr)*FACTOR_P
4520 DO kr = p_ff1i01,p_ff1i33
4522 FF1R(KRR) = chem_new(I,K,J,KR)
4523 IF (FF1R(KRR) < 0.0)FF1R(KRR) = 0.0
4527 DO kr=p_ff8i01,p_ff8i43
4529 FCCN(KRR) = chem_new(I,K,J,KR)
4530 if (fccn(krr) < 0.0)fccn(krr) = 0.0
4533 ! no explicit Ice Crystals in FSBM
4540 DO kr=p_ff5i01,p_ff5i33
4542 FF3R(KRR)=chem_new(I,K,J,KR)
4543 if (ff3r(krr) < 0.0)ff3r(krr) = 0.0
4546 ! ... Hail or Graupel
4547 if(hail_opt == 1)then
4549 DO kr=p_ff6i01,p_ff6i33
4551 FF5R(KRR) = chem_new(I,K,J,KR)
4552 if (ff5r(krr) < 0.0)ff5r(krr) = 0.0
4557 DO kr=p_ff6i01,p_ff6i33
4559 FF4R(KRR) = chem_new(I,K,J,KR)
4560 if (ff4r(krr) < 0.0)ff4r(krr) = 0.0
4565 ! +---------------------------------------------+
4566 ! Neucliation, Condensation, Collisions
4567 ! +---------------------------------------------+
4568 IF (T_OLD(I,K,J).GT.193.15)THEN
4571 IF(QQ.LE.0.0) QQ = 1.D-10
4576 IF (QQA.LE.0) call wrf_message("WARNING: FAST SBM, QQA < 0")
4577 IF (QQA.LE.0) print*,'I,J,K,Told,Tnew,QQA = ',I,J,K,TT,TTA,QQA
4578 IF (QQA.LE.0) QQA = 1.0D-10
4580 ES1N = AA1_MY*DEXP(-BB1_MY/TT)
4581 ES2N = AA2_MY*DEXP(-BB2_MY/TT)
4582 EW1N=QQ*PP/(0.622+0.378*QQ)
4587 ES1N=AA1_MY*DEXP(-BB1_MY/TTA)
4588 ES2N=AA2_MY*DEXP(-BB2_MY/TTA)
4589 EW1N=QQA*PP/(0.622+0.378*QQA)
4596 IF(del1ad > 0.0 .or. del2ad > 0.0 .or. (sum(FF1R)+sum(FF3R)+sum(FF4R)+sum(FF5R)) > 1.0e-20)THEN
4597 ! JacobS: commented for this version
4598 ! CALL Relaxation_Time(TT,QQ,PP,rhocgs(I,K,J),DEL1IN,DEL2IN, &
4599 ! XL,VR1_Z(:,K),FF1R,RLEC,RO1BL, &
4600 ! XI,VR2_Z,FF2R,RIEC,RO2BL, &
4601 ! XS,VR3_Z(:,K),FF3R,RSEC,RO3BL, &
4602 ! XG,VR4_Z(:,K),FF4R,RGEC,RO4BL, &
4603 ! XH,VR5_Z(:,k),FF5R,RHEC,RO5BL, &
4604 ! NKR,ICEMAX,COL,DT,NCOND,DTCOND)
4605 DELSUP1=(DEL1AD-DEL1IN)/NCOND
4606 DELSUP2=(DEL2AD-DEL2IN)/NCOND
4607 DELDIV1=(DIV3-DIV1)/NCOND
4608 DELDIV2=(DIV4-DIV2)/NCOND
4615 IF (DIV1.EQ.DIV3) DIFFU = 0
4616 IF (DIV2.EQ.DIV4) DIFFU = 0
4620 DTCOND = min(DT-DTNEW,DTCOND)
4621 DTNEW = DTNEW + DTCOND
4625 DEL1IN = DEL1IN+DELSUP1
4626 DEL2IN = DEL2IN+DELSUP2
4630 IF (DIV1.GT.DIV2.AND.TT.LE.265)THEN
4634 DEL1NR=A1_MYN*(100.*DIV1)
4635 DEL2NR=A2_MYN*(100.*DIV2)
4636 IF (DEL2NR.EQ.0)print*,'ikl = ',ikl
4637 IF (DEL2NR.EQ.0)print*,'div1,div2 = ',div1,div2
4638 IF (DEL2NR.EQ.0)print*,'i,j,k = ',i,j,k
4639 IF (DEL2NR.EQ.0)call wrf_error_fatal("fatal error in module_mp_fast_sbm (DEL2NR.EQ.0) , model stop ")
4640 DEL12R=DEL1NR/DEL2NR
4641 DEL12RD=DEL12R**DEL_BBR
4642 EW1PN=AA1_MY*100.*DIV1*DEL12RD/100.
4643 TT=-DEL_BB/DLOG(DEL12R)
4644 QQ=0.622*EW1PN/(PP-0.378*EW1PN)
4646 IF(DEL1IN > 0.0 .OR. DEL2IN > 0.0)THEN
4647 ! +------------------------------------------+
4648 ! Droplet nucleation :
4649 ! +------------------------------------------+
4653 FF2IN(KR,ICE)=FF2R(KR,ICE)
4656 Is_This_CloudBase = 0
4657 IF(KZ_Cloud_Base(I,J) == K .and. col*sum(FF1IN*XL) < 5.0) Is_This_CloudBase = 1
4659 w_stag_my = 50.*(w(i,k,j)+w(i,k+1,j))
4661 w_stag_my = 100*w(i,k,j)
4663 CALL JERNUCL01_KS(FF1IN,FF2IN,FCCN &
4665 ,rhocgs(I,K,J),pcgs(I,K,J) &
4668 ,SUP2_OLD,DSUPICE_XYZ(I,K,J) &
4669 ,RCCN,DROPRADII,NKR,NKR_aerosol,ICEMAX,ICEPROCS &
4670 ,W_Stag_My,Is_This_CloudBase,RO_SOLUTE,IONS,MWAERO &
4677 FF3R(KR) = FF3R(KR) + FF2IN(KR,ICE)
4691 FMAX1=AMAX1(FF1R(KR),FMAX1)
4693 FMAX3=AMAX1(FF3R(KR),FMAX3)
4695 FMAX4=AMAX1(FF4R(KR),FMAX4)
4697 FMAX5=AMAX1(FF5R(KR),FMAX5)
4699 FF2IN(KR,ICE)=FF2R(KR,ICE)
4700 FMAX2(ICE)=AMAX1(FF2R(KR,ICE),FMAX2(ICE)) ! ### (KS) FMAX2(3)
4708 IF(FMAX1 > 0)ISYM1 = 1
4709 IF (ICEPROCS == 1)THEN
4710 IF(FMAX2(1) > 1.E-10)ISYM2(1) = 1
4711 IF(FMAX2(2) > 1.E-10)ISYM2(2) = 1
4712 IF(FMAX2(3) > 1.E-10)ISYM2(3) = 1
4713 IF(FMAX3 > 1.E-10)ISYM3 = 1
4714 IF(FMAX4 > 1.E-10)ISYM4 = 1
4715 IF(FMAX5 > 1.E-10)ISYM5 = 1
4718 IF(ISYM1==1 .AND. ((TT-273.15)>-0.187 .OR.(sum(ISYM2)==0 .AND. &
4719 ISYM3==0 .AND. ISYM4==0 .AND. ISYM5==0)))THEN
4721 ! ... only warm phase
4722 CALL ONECOND1(TT,QQ,PP,rhocgs(I,K,J) &
4723 ,VR1_Z(:,K),pcgs(I,K,J) &
4724 ,DEL1IN,DEL2IN,DIV1,DIV2 &
4725 ,FF1R,FF1IN,XL,RLEC,RO1BL &
4726 ,AA1_MY,BB1_MY,AA2_MY,BB2_MY &
4728 ,COL,DTCOND,ICEMAX,NKR,ISYM1 &
4729 ,ISYM2,ISYM3,ISYM4,ISYM5,I,J,K,W(i,k,j),DX,Itimestep)
4731 ELSE IF(ISYM1==0 .AND. (TT-273.15)<-0.187 .AND. &
4732 (sum(ISYM2)>1 .OR. ISYM3==1 .OR. ISYM4==1 .OR. ISYM5==1))THEN
4733 !IF (TT.GT.213.15)THEN
4734 VR2_Z(:,1) = VR2_ZC(:,K)
4735 VR2_Z(:,2) = VR2_ZP(:,K)
4736 VR2_Z(:,3) = VR2_ZD(:,K)
4737 CALL ONECOND2(TT,QQ,PP,rhocgs(I,K,J) &
4738 ,VR2_Z,VR3_Z(:,K),VR4_Z(:,K),VR5_Z(:,K),pcgs(I,K,J) &
4739 ,DEL1IN,DEL2IN,DIV1,DIV2 &
4740 ,FF2R,FF2IN,XI,RIEC,RO2BL &
4741 ,FF3R,FF3IN,XS,RSEC,RO3BL &
4742 ,FF4R,FF4IN,XG,RGEC,RO4BL &
4743 ,FF5R,FF5IN,XH,RHEC,RO5BL &
4744 ,AA1_MY,BB1_MY,AA2_MY,BB2_MY &
4746 ,COL,DTCOND,ICEMAX,NKR &
4747 ,ISYM1,ISYM2,ISYM3,ISYM4,ISYM5,I,J,K,W(i,k,j),DX,Itimestep)
4749 ELSE IF(ISYM1==1 .AND. (TT-273.15)<-0.187 .AND. &
4750 (sum(ISYM2)>1 .OR. ISYM3==1 .OR. ISYM4==1 .OR. ISYM5==1))THEN
4751 IF (TT > 233.15)THEN
4752 VR2_Z(:,1) = VR2_ZC(:,K)
4753 VR2_Z(:,2) = VR2_ZP(:,K)
4754 VR2_Z(:,3) = VR2_ZD(:,K)
4755 CALL ONECOND3(TT,QQ,PP,rhocgs(I,K,J) &
4756 ,VR1_Z(:,K),VR2_Z,VR3_Z(:,K),VR4_Z(:,K),VR5_Z(:,K),pcgs(I,K,J) &
4757 ,DEL1IN,DEL2IN,DIV1,DIV2 &
4758 ,FF1R,FF1IN,XL,RLEC,RO1BL &
4759 ,FF2R,FF2IN,XI,RIEC,RO2BL &
4760 ,FF3R,FF3IN,XS,RSEC,RO3BL &
4761 ,FF4R,FF4IN,XG,RGEC,RO4BL &
4762 ,FF5R,FF5IN,XH,RHEC,RO5BL &
4763 ,AA1_MY,BB1_MY,AA2_MY,BB2_MY &
4765 ,COL,DTCOND,ICEMAX,NKR &
4766 ,ISYM1,ISYM2,ISYM3,ISYM4,ISYM5,I,J,K,W(i,k,j),DX,Itimestep)
4771 END DO ! NCOND - end of NCOND loop
4772 ! +----------------------------------+
4773 ! Collision-Coallescnce
4774 ! +----------------------------------+
4776 IF ( TT >= 233.15 ) THEN
4781 CALL COAL_BOTT_NEW (FF1R,FF2R,FF3R, &
4782 FF4R,FF5R,TT,QQ,PP, &
4783 rhocgs(I,K,J),dt_coll,TCRIT,TTCOAL, &
4784 FLIQFR_SD,FLIQFR_GD,FLIQFR_HD,FRIMFR_SD, &
4786 I,J,K,Itimestep,CollEff_out)
4789 END DO ! NCOLL - end of NCOLL loop
4794 ! in case Sw,Si,mass
4796 ! in case T_OLD(I,K,J).GT.213.15
4798 ! +-------------------------------- +
4799 ! Immediate Freezing
4800 ! +---------------------------------+
4801 IF(T_NEW(i,k,j) < 273.15 .and. ICEPROCS == 1)THEN
4803 (FF1R,XL,FF2R,XI,FF3R,XS,FF4R,XG,FF5R,XH, &
4804 T_NEW(I,K,J),DT,rhocgs(I,K,J), &
4805 COL,AFREEZMY,BFREEZMY,BFREEZMAX, &
4808 ! --------------------------------------------------------------+
4809 ! Jiwen Fan Melting (melting along a constant time scale)
4810 ! --------------------------------------------------------------+
4811 IF (JIWEN_FAN_MELT == 1 .and. T_NEW(i,k,j) > 273.15 .and. ICEPROCS == 1) THEN
4812 CALL J_W_MELT(FF1R,XL,FF2R,XI,FF3R,XS,FF4R,XG,FF5R,XH, &
4813 T_NEW(I,K,J),DT,rhocgs(I,K,J),COL,ICEMAX,NKR)
4818 FF3R(KR)=FF3R(KR) + FF2R(KR,ICE)
4821 if(hail_opt == 1)then
4822 FF5R(KR) = FF5R(KR) + FF4R(KR)
4825 FF4R(KR) = FF4R(KR) + FF5R(KR)
4830 ! +---------------------------+
4831 ! Spontanaous Rain Breakup
4832 ! +----------------------------+
4833 IF (Spont_Rain_BreakUp_On == 1 .AND. (SUM(FF1R) > 43.0*1.0D-30) )THEN
4836 CALL Spont_Rain_BreakUp (DT ,FF1R_D, XL_D, Prob, Gain_Var_New, NND, NKR, ikr_spon_break)
4840 ! -----------------------------------------------------------+
4842 ! -----------------------------------------------------------+
4843 IF (Snow_BreakUp_On == 1 .and. ICEPROCS == 1 .and. sum(FF3R(KR_SNOW_MIN:NKR))> (NKR-KR_SNOW_MIN)*1.0D-30)THEN
4846 FF3R_D(KR) = FF3R(KR)
4848 IF (KR_SNOW_MAX <= NKR) CALL BreakUp_Snow (TT_r,FF3R_D,FLIQFR_SD,xs_d,FRIMFR_SD,NKR)
4850 FF3R(KR) = FF3R_D(KR)
4854 ! Update temperature at the end of MP
4855 th_phy(i,k,j) = t_new(i,k,j)/pi_phy(i,k,j)
4859 DO kr = p_ff1i01,p_ff1i33
4861 chem_new(I,K,J,KR) = FF1R(KRR)
4865 DO kr=p_ff8i01,p_ff8i43
4867 chem_new(I,K,J,KR)=FCCN(KRR)
4869 IF (ICEPROCS == 1)THEN
4872 DO kr=p_ff5i01,p_ff5i33
4874 chem_new(I,K,J,KR)=FF3R(KRR)
4877 if(hail_opt == 1)then
4879 DO KR=p_ff6i01,p_ff6i33
4881 chem_new(I,K,J,KR) = FF5R(KRR)
4885 DO KR=p_ff6i01,p_ff6i33
4887 chem_new(I,K,J,KR) = FF4R(KRR)
4897 ! +-----------------------------+
4898 ! Hydrometeor Sedimentation
4899 ! +-----------------------------+
4904 rhocgs_z(k)=rhocgs(i,k,j)
4905 pcgs_z(k)=pcgs(i,k,j)
4906 zcgs_z(k)=zcgs(i,k,j)
4907 vrx(k,:)=vr1_z3D(:,i,k,j)
4909 do kr=p_ff1i01,p_ff1i33
4911 ffx_z(k,krr)=chem_new(i,k,j,kr)/rhocgs(i,k,j)
4914 call FALFLUXHUCM_Z(ffx_z,VRX,RHOCGS_z,PCGS_z,ZCGS_z,DT,kts,kte,nkr)
4917 do kr=p_ff1i01,p_ff1i33
4919 chem_new(i,k,j,kr)=ffx_z(k,krr)*rhocgs(i,k,j)
4922 if(iceprocs == 1)then
4925 rhocgs_z(k)=rhocgs(i,k,j)
4926 pcgs_z(k)=pcgs(i,k,j)
4927 zcgs_z(k)=zcgs(i,k,j)
4928 vrx(k,:)=vr3_z3D(:,i,k,j)
4930 do kr=p_ff5i01,p_ff5i33
4932 ffx_z(k,krr)=chem_new(i,k,j,kr)/rhocgs(i,k,j)
4935 call FALFLUXHUCM_Z(ffx_z,VRX,RHOCGS_z,PCGS_z,ZCGS_z,DT,kts,kte,nkr)
4938 do kr=p_ff5i01,p_ff5i33
4940 chem_new(i,k,j,kr)=ffx_z(k,krr)*rhocgs(i,k,j)
4943 ! ... Hail or Graupel ...
4945 rhocgs_z(k)=rhocgs(i,k,j)
4946 pcgs_z(k)=pcgs(i,k,j)
4947 zcgs_z(k)=zcgs(i,k,j)
4948 if(hail_opt == 1)then
4949 vrx(k,:) = vr5_z3D(:,i,k,j)
4951 vrx(k,:) = vr4_z3D(:,i,k,j)
4954 do kr=p_ff6i01,p_ff6i33
4956 ffx_z(k,krr)=chem_new(i,k,j,kr)/rhocgs(i,k,j)
4959 call FALFLUXHUCM_Z(ffx_z,VRX,RHOCGS_z,PCGS_z,ZCGS_z,DT,kts,kte,nkr)
4962 do kr=p_ff6i01,p_ff6i33
4964 chem_new(i,k,j,kr)=ffx_z(k,krr)*rhocgs(i,k,j)
4967 end if ! if (iceprocs == 1)
4993 tt = th_phy(i,k,j)*pi_phy(i,k,j)
4997 DO KR = p_ff1i01,p_ff1i33
4999 IF (KRR < KRDROP)THEN
5000 QC(I,K,J) = QC(I,K,J) &
5001 + (1./RHOCGS(I,K,J))*COL*chem_new(I,K,J,KR)*XL(KRR)*XL(KRR)*3
5002 QNC(I,K,J) = QNC(I,K,J) &
5003 + COL*chem_new(I,K,J,KR)*XL(KRR)*3.0/rhocgs(I,K,J)*1000.0 ! #/kg
5005 QR(I,K,J) = QR(I,K,J) &
5006 + (1./RHOCGS(I,K,J))*COL*chem_new(I,K,J,KR)*XL(KRR)*XL(KRR)*3.0
5007 QNR(I,K,J) = QNR(I,K,J) &
5008 + COL*chem_new(I,K,J,KR)*XL(KRR)*3/rhocgs(I,K,J)*1000.0 ! #/kg
5013 IF (ICEPROCS == 1)THEN
5016 DO KR=p_ff5i01,p_ff5i33
5018 if (KRR <= KRICE)THEN
5019 QI(I,K,J) = QI(I,K,J) &
5020 +(1.0/RHOCGS(I,K,J))*COL*chem_new(I,K,J,KR)*XS(KRR)*XS(KRR)*3.0
5021 QNI(I,K,J) = QNI(I,K,J) &
5022 + COL*chem_new(I,K,J,KR)*XS(KRR)*3.0/rhocgs(I,K,J)*1000.0 ! #/kg
5024 QS(I,K,J) = QS(I,K,J) &
5025 + (1.0/RHOCGS(I,K,J))*COL*chem_new(I,K,J,KR)*XS(KRR)*XS(KRR)*3.0
5026 QNS(I,K,J) = QNS(I,K,J) &
5027 + COL*chem_new(I,K,J,KR)*XS(KRR)*3.0/rhocgs(I,K,J)*1000.0 ! #/kg
5031 ! ... Hail / Graupel output
5033 DO KR=p_ff6i01,p_ff6i33
5035 ! ... Hail or Graupel
5036 if(hail_opt == 1)then
5037 QG(I,K,J)=QG(I,K,J) &
5038 +(1.0/RHOCGS(I,K,J))*COL*chem_new(I,K,J,KR)*XH(KRR)*XH(KRR)*3.0
5039 QNG(I,K,J)=QNG(I,K,J) &
5040 +COL*chem_new(I,K,J,KR)*XH(KRR)*3.0/rhocgs(I,K,J)*1000.0 ! #/kg
5042 QG(I,K,J)=QG(I,K,J) &
5043 +(1.0/RHOCGS(I,K,J))*COL*chem_new(I,K,J,KR)*XG(KRR)*XG(KRR)*3.0
5044 QNG(I,K,J)=QNG(I,K,J) &
5045 +COL*chem_new(I,K,J,KR)*XG(KRR)*3.0/rhocgs(I,K,J)*1000.0 ! #/kg
5048 END IF !IF (ICEPROCS.EQ.1)THEN
5051 DO KR = p_ff8i01,p_ff8i43
5053 QNA(I,K,J) = QNA(I,K,J) &
5054 + COL*chem_new(I,K,J,KR)/rhocgs(I,K,J)*1000.0 ! #/kg
5061 998 format(' ',10(f10.1,1x))
5067 GRAUPELNCV(I,J) = 0.0
5069 DO KR=p_ff1i01,p_ff1i33
5071 DELTAW = VR1_Z(KRR,1)
5072 RAINNC(I,J) = RAINNC(I,J) &
5073 +10.0*(3./RO1BL(KRR))*COL*DT*DELTAW* &
5074 chem_new(I,1,J,KR)*XL(KRR)*XL(KRR)
5075 RAINNCV(I,J) = RAINNCV(I,J) &
5076 +10.0*(3./RO1BL(KRR))*COL*DT*DELTAW* &
5077 chem_new(I,1,J,KR)*XL(KRR)*XL(KRR)
5080 DO KR=p_ff5i01,p_ff5i33
5082 DELTAW = VR3_Z(KRR,1)
5083 RAINNC(I,J)=RAINNC(I,J) &
5084 +10.0*(3./RO1BL(KRR))*COL*DT*DELTAW* &
5085 chem_new(I,1,J,KR)*XS(KRR)*XS(KRR)
5086 RAINNCV(I,J)=RAINNCV(I,J) &
5087 +10.0*(3./RO1BL(KRR))*COL*DT*DELTAW* &
5088 chem_new(I,1,J,KR)*XS(KRR)*XS(KRR)
5089 SNOWNC(I,J) = SNOWNC(I,J) &
5090 + 10*(3./RO1BL(KRR))*COL*DT*DELTAW* &
5091 chem_new(I,1,J,KR)*XS(KRR)*XS(KRR)
5092 SNOWNCV(I,J) = SNOWNCV(I,J) &
5093 + 10*(3./RO1BL(KRR))*COL*DT*DELTAW* &
5094 chem_new(I,1,J,KR)*XS(KRR)*XS(KRR)
5097 DO KR=p_ff6i01,p_ff6i33
5099 if(hail_opt == 1)then
5100 DELTAW = VR5_Z(KRR,1)
5101 RAINNC(I,J) = RAINNC(I,J) &
5102 +10.0*(3./RO1BL(KRR))*COL*DT*DELTAW* &
5103 chem_new(I,1,J,KR)*XH(KRR)*XH(KRR)
5104 RAINNCV(I,J) = RAINNCV(I,J) &
5105 +10.0*(3./RO1BL(KRR))*COL*DT*DELTAW* &
5106 chem_new(I,1,J,KR)*XH(KRR)*XH(KRR)
5107 GRAUPELNC(I,J) = GRAUPELNC(I,J) &
5108 + 10*(3./RO1BL(KRR))*COL*DT*DELTAW* &
5109 chem_new(I,1,J,KR)*XH(KRR)*XH(KRR)
5110 GRAUPELNCV(I,J) = GRAUPELNCV(I,J) &
5111 + 10*(3./RO1BL(KRR))*COL*DT*DELTAW* &
5112 chem_new(I,1,J,KR)*XH(KRR)*XH(KRR)
5114 DELTAW = VR4_Z(KRR,1)
5115 RAINNC(I,J) = RAINNC(I,J) &
5116 +10.0*(3./RO1BL(KRR))*COL*DT*DELTAW* &
5117 chem_new(I,1,J,KR)*XG(KRR)*XG(KRR)
5118 RAINNCV(I,J) = RAINNCV(I,J) &
5119 +10.0*(3./RO1BL(KRR))*COL*DT*DELTAW* &
5120 chem_new(I,1,J,KR)*XG(KRR)*XG(KRR)
5121 GRAUPELNC(I,J) = GRAUPELNC(I,J) &
5122 + 10*(3./RO1BL(KRR))*COL*DT*DELTAW* &
5123 chem_new(I,1,J,KR)*XG(KRR)*XG(KRR)
5124 GRAUPELNCV(I,J) = GRAUPELNCV(I,J) &
5125 + 10*(3./RO1BL(KRR))*COL*DT*DELTAW* &
5126 chem_new(I,1,J,KR)*XG(KRR)*XG(KRR)
5129 ! ..........................................
5130 ! ... Polarimetric Forward Radar Operator
5131 ! ..........................................
5132 if ( PRESENT (diagflag) ) then
5133 if( diagflag .and. IPolar_HUCM .and. (sbm_diagnostics==1) ) then
5138 zmks_1d(k) = zcgs(i,k,j)*0.01
5140 DIST_SING = ((i-ide/2)**2+(j-jde/2)**2)**(0.5)
5150 BKDEN_Snow(:) = RO3BL(:)
5151 RO2BL_D(:,:) = RO2BL(:,:)
5152 RO2BL_D(:,:) = RO2BL(:,:)
5156 do kr = p_ff1i01,p_ff1i33
5158 FF1R_D(KRR) = (1./RHOCGS(I,K,J))*chem_new(I,K,J,KR)*XL(KRR)*XL(KRR)*3.0
5159 if (FF1R_D(KRR) < 1.0D-20) FF1R_D(KRR) = 0.0
5161 if (ICEPROCS == 1)then
5164 do kr=p_ff5i01,p_ff5i33
5166 FF3R_D(KRR)=(1./RHOCGS(I,K,J))*chem_new(I,K,J,KR)*XS(KRR)*XS(KRR)*3.0
5167 FF3R (KRR) = chem_new(I,K,J,KR)
5168 if (ff3r_D(krr) < 1.0D-20) ff3r_D(krr) = 0.0
5170 ! ... Graupel or Hail
5172 if(hail_opt == 0)then
5173 do kr = p_ff6i01,p_ff6i33
5175 FF4R_D(KRR) = (1./RHOCGS(I,K,J))*chem_new(I,K,J,KR)*XG(KRR)*XG(KRR)*3.0
5176 FF4R(KRR) = chem_new(I,K,J,KR)
5177 if (FF4R_D(KRR) < 1.0D-20) FF4R_D(KRR)= 0.0
5181 do kr=p_ff6i01,p_ff6i33
5183 FF5R_D(KRR)=(1./RHOCGS(I,K,J))*chem_new(I,K,J,KR)*XH(KRR)*XH(KRR)*3.0
5184 FF5R(KRR)=chem_new(I,K,J,KR)
5185 if (ff5r_d(krr) < 1.0D-20) ff5r_d(krr)=0.0
5189 ! in caseICEPROCS.EQ.1
5192 rhocgs_d = rhocgs(I,K,J)
5193 T_NEW_D = T_NEW(I,K,J)
5199 (FF1R_D, FF2R_D, FF3R_D, FF4R_D, FF5R_D, FF1_FD, &
5200 FLIQFR_SD, FLIQFR_GD, FLIQFR_HD, FL1_FD, &
5201 BKDEN_Snow, T_NEW_D, rhocgs_D, wavelength, iwl, &
5202 distance, dx_dbl, dy_dbl, zmks_1d, &
5203 out1, out2, out3, out4, out5, out6, out7, out8, out9, &
5204 bin_mass, tab_colum, tab_dendr, tab_snow, bin_log, &
5205 ijk, i, j, k, kts, kte, NKR, ICEMAX, icloud, itimestep, &
5206 faf1,fbf1,fab1,fbb1, &
5207 faf3,fbf3,fab3,fbb3, &
5208 faf4,fbf4,fab4,fbb4, &
5209 faf5,fbf5,fab5,fbb5, &
5210 temps_water,temps_fd,temps_crystals, &
5211 temps_snow,temps_graupel,temps_hail, &
5212 fws_fd,fws_crystals,fws_snow, &
5213 fws_graupel,fws_hail,usetables)
5217 DO KR=r_p_ff1i01,r_p_ff1i06
5219 sbmradar(I,K,J,KR) = out1(KRR)
5222 DO KR=r_p_ff2i01,r_p_ff2i06
5224 sbmradar(I,K,J,KR)=out2(KRR)
5227 DO KR=r_p_ff3i01,r_p_ff3i06
5229 sbmradar(I,K,J,KR)=out3(KRR)
5232 DO KR=r_p_ff4i01,r_p_ff4i06
5234 sbmradar(I,K,J,KR)=out4(KRR)
5237 DO KR=r_p_ff5i01,r_p_ff5i06
5239 sbmradar(I,K,J,KR)=out5(KRR)
5242 DO KR=r_p_ff6i01,r_p_ff6i06
5244 sbmradar(I,K,J,KR)=out6(KRR)
5247 DO KR=r_p_ff7i01,r_p_ff7i06
5249 sbmradar(I,K,J,KR)=out7(KRR)
5252 DO KR=r_p_ff8i01,r_p_ff8i06
5254 sbmradar(I,K,J,KR)=out8(KRR)
5257 DO KR=r_p_ff9i01,r_p_ff9i06
5259 sbmradar(I,K,J,KR)=out9(KRR)
5264 ! diagflag .and. IPolar_HUCM
5277 th_old(i,k,j)=th_phy(i,k,j)
5278 qv_old(i,k,j)=qv(i,k,j)
5287 rhocgs(I,K,J)=rho_phy(I,K,J)*0.001
5289 DO KR=p_ff1i01,p_ff1i33
5291 chem_new(I,K,J,KR)=chem_new(I,K,J,KR)/RHOCGS(I,K,J)*COL*XL(KRR)*XL(KRR)*3.0
5292 if (qc(i,k,j)+qr(i,k,j).lt.1.e-13)chem_new(I,K,J,KR)=0.0
5295 DO KR=p_ff5i01,p_ff5i33
5297 chem_new(I,K,J,KR)=chem_new(I,K,J,KR)/RHOCGS(I,K,J)*COL*XS(KRR)*XS(KRR)*3.0
5298 if (qs(i,k,j).lt.1.e-13)chem_new(I,K,J,KR)=0.0
5302 DO KR=p_ff8i01,p_ff8i43
5304 chem_new(I,K,J,KR)=chem_new(I,K,J,KR)/RHOCGS(I,K,J)*1000.0
5306 ! ... Hail / Graupel
5307 if(hail_opt == 1)then
5309 DO KR=p_ff6i01,p_ff6i33
5311 chem_new(I,K,J,KR)=chem_new(I,K,J,KR)/RHOCGS(I,K,J)*COL*XH(KRR)*XH(KRR)*3.0
5312 if (qg(i,k,j) < 1.e-13) chem_new(I,K,J,KR) = 0.0
5316 DO KR=p_ff6i01,p_ff6i33
5318 chem_new(I,K,J,KR)=chem_new(I,K,J,KR)/RHOCGS(I,K,J)*COL*XG(KRR)*XG(KRR)*3.0
5319 if (qg(i,k,j) < 1.e-13) chem_new(I,K,J,KR) = 0.0
5329 END SUBROUTINE FAST_SBM
5330 ! +-------------------------------------------------------------+
5331 SUBROUTINE FALFLUXHUCM_Z(chem_new,VR1,RHOCGS,PCGS,ZCGS,DT, &
5336 integer,intent(in) :: kts,kte,nkr
5337 real(kind=r4size),intent(inout) :: chem_new(:,:)
5338 real(kind=r4size),intent(in) :: rhocgs(:),pcgs(:),zcgs(:),VR1(:,:),DT
5342 real(kind=r4size) :: TFALL,DTFALL,VFALL(KTE),DWFLUX(KTE)
5343 integer :: IFALL,N,NSUB
5345 ! FALLING FLUXES FOR EACH KIND OF CLOUD PARTICLES: C.G.S. UNIT
5346 ! ADAPTED FROM GSFC CODE FOR HUCM
5347 ! The flux at k=1 is assumed to be the ground so FLUX(1) is the
5348 ! flux into the ground. DWFLUX(1) is at the lowest half level where
5349 ! Q(1) etc are defined. The formula for FLUX(1) uses Q(1) etc which
5350 ! is actually half a grid level above it. This is what is meant by
5351 ! an upstream method. Upstream in this case is above because the
5352 ! velocity is downwards.
5353 ! USE UPSTREAM METHOD (VFALL IS POSITIVE)
5358 IF(chem_new(K,KR).GE.1.E-20)IFALL=1
5363 ! [KS] VFALL(K) = VR1(K,KR)*SQRT(1.E6/PCGS(K))
5364 VFALL(K) = VR1(K,KR) ! ... [KS] : The pressure effect is taken into account at the beggining of the calculations
5365 TFALL=AMIN1(TFALL,ZCGS(K)/(VFALL(K)+1.E-20))
5367 IF(TFALL.GE.1.E10)STOP
5368 NSUB=(INT(2.0*DT/TFALL)+1)
5373 DWFLUX(K)=-(RHOCGS(K)*VFALL(K)*chem_new(k,kr)- &
5375 VFALL(K+1)*chem_new(K+1,KR))/(RHOCGS(K)*(ZCGS(K+1)- &
5378 ! NO Z ABOVE TOP, SO USE THE SAME DELTAZ
5379 DWFLUX(KTE)=-(RHOCGS(KTE)*VFALL(KTE)* &
5380 & chem_new(kte,kr))/(RHOCGS(KTE)*(ZCGS(KTE)-ZCGS(KTE-1)))
5382 chem_new(k,kr)=chem_new(k,kr)+DWFLUX(K)*DTFALL
5389 END SUBROUTINE FALFLUXHUCM_Z
5390 ! +----------------------------------+
5391 SUBROUTINE FAST_HUCMINIT(DT)
5393 USE module_mp_SBM_BreakUp,ONLY:Spontanous_Init
5394 USE module_mp_SBM_Collision,ONLY:courant_bott_KS
5400 real(kind=r4size),intent(in) :: DT
5402 LOGICAL , EXTERNAL :: wrf_dm_on_monitor
5404 CHARACTER*80 errmess
5405 integer :: I,J,KR,IType,HUJISBM_UNIT1
5406 real(kind=r4size) :: dlnr,ax,deg01,CONCCCNIN,CONTCCNIN
5408 character(len=256),parameter :: dir_43 = "SBM_input_43", dir_33 = "SBM_input_33"
5409 character(len=256) :: input_dir,Fname
5411 if(nkr == 33) input_dir = trim(dir_33)
5412 if(nkr == 43) input_dir = trim(dir_43)
5414 call wrf_message(" FAST SBM: INITIALIZING WRF_HUJISBM ")
5415 call wrf_message(" FAST SBM: ****** WRF_HUJISBM ******* ")
5418 ! +-------------------------------------------------------+
5419 if (.NOT. ALLOCATED(bin_mass)) ALLOCATE(bin_mass(nkr))
5420 if (.NOT. ALLOCATED(tab_colum)) ALLOCATE(tab_colum(nkr))
5421 if (.NOT. ALLOCATED(tab_dendr)) ALLOCATE(tab_dendr(nkr))
5422 if (.NOT. ALLOCATED(tab_snow)) ALLOCATE(tab_snow(nkr))
5423 if (.NOT. ALLOCATED(bin_log)) ALLOCATE(bin_log(nkr))
5425 dlnr=dlog(2.d0)/(3.d0)
5428 IF ( wrf_dm_on_monitor() ) THEN
5430 INQUIRE ( i , OPENED = opened )
5431 IF ( .NOT. opened ) THEN
5439 #if (defined(DM_PARALLEL))
5440 CALL wrf_dm_bcast_bytes( hujisbm_unit1 , IWORDSIZE )
5442 IF ( hujisbm_unit1 < 0 ) THEN
5443 CALL wrf_error_fatal ( 'module_mp_FAST-SBM: Table-1 -- FAST_SBM_INIT: '// &
5444 'Can not find unused fortran unit to read in lookup table, model stop' )
5447 IF ( wrf_dm_on_monitor() ) THEN
5448 WRITE(errmess, '(A,I2)') 'module_mp_FAST-SBM : Table-1 -- opening "BLKD_SDC.dat" on unit',hujisbm_unit1
5449 CALL wrf_debug(150, errmess)
5450 OPEN(UNIT=hujisbm_unit1,FILE=trim(input_dir)//"/BLKD_SDC.dat",FORM="FORMATTED",STATUS="OLD",ERR=2070)
5452 READ(hujisbm_unit1,*) bin_mass(kr),tab_colum(kr),tab_dendr(kr),tab_snow(kr)
5453 bin_log(kr) = log10(bin_mass(kr))
5457 #define DM_BCAST_MACRO_R4(A) CALL wrf_dm_bcast_bytes(A, size(A)*R4SIZE)
5458 #define DM_BCAST_MACRO_R8(A) CALL wrf_dm_bcast_bytes(A, size(A)*R8SIZE)
5459 #define DM_BCAST_MACRO_R16(A) CALL wrf_dm_bcast_bytes(A, size(A)*R16SIZE)
5461 #if (defined(DM_PARALLEL))
5462 DM_BCAST_MACRO_R8(bin_mass)
5463 DM_BCAST_MACRO_R8(tab_colum)
5464 DM_BCAST_MACRO_R8(tab_dendr)
5465 DM_BCAST_MACRO_R8(tab_snow)
5466 DM_BCAST_MACRO_R8(bin_log)
5469 WRITE(errmess, '(A,I2)') 'FAST_SBM_INIT : succesfull reading Table-1'
5470 CALL wrf_debug(000, errmess)
5471 ! +-----------------------------------------------------------------------+
5474 ! +----------------------------------------------+
5475 if (.NOT. ALLOCATED(RLEC)) ALLOCATE(RLEC(nkr))
5476 if (.NOT. ALLOCATED(RIEC)) ALLOCATE(RIEC(nkr,icemax))
5477 if (.NOT. ALLOCATED(RSEC)) ALLOCATE(RSEC(nkr))
5478 if (.NOT. ALLOCATED(RGEC)) ALLOCATE(RGEC(nkr))
5479 if (.NOT. ALLOCATED(RHEC)) ALLOCATE(RHEC(nkr))
5482 IF ( wrf_dm_on_monitor() ) THEN
5484 INQUIRE ( i , OPENED = opened )
5485 IF ( .NOT. opened ) THEN
5493 #if (defined(DM_PARALLEL))
5494 CALL wrf_dm_bcast_bytes ( hujisbm_unit1 , IWORDSIZE )
5496 IF ( hujisbm_unit1 < 0 ) THEN
5497 CALL wrf_error_fatal ( 'module_mp_FAST-SBM: Table-2 -- FAST_SBM_INIT: '// &
5498 'Can not find unused fortran unit to read in lookup table,model stop' )
5501 IF ( wrf_dm_on_monitor() ) THEN
5502 WRITE(errmess, '(A,I2)') 'module_mp_FAST-SBM : Table-2 -- opening capacity.asc on unit',hujisbm_unit1
5503 CALL wrf_debug(150, errmess)
5504 OPEN(UNIT=hujisbm_unit1,FILE=trim(input_dir)//"/capacity33.asc",FORM="FORMATTED",STATUS="OLD",ERR=2070)
5505 !OPEN(UNIT=hujisbm_unit1,FILE=trim(input_dir)//"/capacity43.asc",FORM="FORMATTED",STATUS="OLD",ERR=2070)
5507 READ(hujisbm_unit1,900) RLEC,RIEC,RSEC,RGEC,RHEC
5510 #if (defined(DM_PARALLEL))
5511 DM_BCAST_MACRO_R4(RLEC)
5512 DM_BCAST_MACRO_R4(RIEC)
5513 DM_BCAST_MACRO_R4(RSEC)
5514 DM_BCAST_MACRO_R4(RGEC)
5515 DM_BCAST_MACRO_R4(RHEC)
5518 WRITE(errmess, '(A,I2)') 'FAST_SBM_INIT : succesfull reading Table-2'
5519 CALL wrf_debug(000, errmess)
5520 ! +----------------------------------------------------------------------+
5523 ! +-----------------------------------------------+
5524 if (.NOT. ALLOCATED(XL)) ALLOCATE(XL(nkr))
5525 if (.NOT. ALLOCATED(XI)) ALLOCATE(XI(nkr,icemax))
5526 if (.NOT. ALLOCATED(XS)) ALLOCATE(XS(nkr))
5527 if (.NOT. ALLOCATED(XG)) ALLOCATE(XG(nkr))
5528 if (.NOT. ALLOCATED(XH)) ALLOCATE(XH(nkr))
5531 IF ( wrf_dm_on_monitor() ) THEN
5533 INQUIRE ( i , OPENED = opened )
5534 IF ( .NOT. opened ) THEN
5542 #if (defined(DM_PARALLEL))
5543 CALL wrf_dm_bcast_bytes ( hujisbm_unit1, IWORDSIZE )
5546 IF ( hujisbm_unit1 < 0 ) THEN
5547 CALL wrf_error_fatal ( 'module_mp_FAST_SBM: Table-3 -- FAST_SBM_INIT: '// &
5548 'Can not find unused fortran unit to read in lookup table,model stop' )
5550 IF ( wrf_dm_on_monitor() ) THEN
5551 WRITE(errmess, '(A,I2)') 'module_mp_FAST_SBM : Table-3 -- opening masses.asc on unit ',hujisbm_unit1
5552 CALL wrf_debug(150, errmess)
5553 OPEN(UNIT=hujisbm_unit1,FILE=trim(input_dir)//"/masses33.asc",FORM="FORMATTED",STATUS="OLD",ERR=2070)
5554 !OPEN(UNIT=hujisbm_unit1,FILE=trim(input_dir)//"/masses43.asc",FORM="FORMATTED",STATUS="OLD",ERR=2070)
5555 READ(hujisbm_unit1,900) XL,XI,XS,XG,XH
5556 CLOSE(hujisbm_unit1)
5559 #if (defined(DM_PARALLEL))
5560 DM_BCAST_MACRO_R4(XL)
5561 DM_BCAST_MACRO_R4(XI)
5562 DM_BCAST_MACRO_R4(XS)
5563 DM_BCAST_MACRO_R4(XG)
5564 DM_BCAST_MACRO_R4(XH)
5567 WRITE(errmess, '(A,I2)') 'FAST_SBM_INIT : succesfull reading Table-3'
5568 CALL wrf_debug(000, errmess)
5569 ! +-------------------------------------------------------------------------+
5572 ! TERMINAL VELOSITY :
5573 ! +---------------------------------------------------+
5574 if (.NOT. ALLOCATED(VR1)) ALLOCATE(VR1(nkr))
5575 if (.NOT. ALLOCATED(VR2)) ALLOCATE(VR2(nkr,icemax))
5576 if (.NOT. ALLOCATED(VR3)) ALLOCATE(VR3(nkr))
5577 if (.NOT. ALLOCATED(VR4)) ALLOCATE(VR4(nkr))
5578 if (.NOT. ALLOCATED(VR5)) ALLOCATE(VR5(nkr))
5581 IF ( wrf_dm_on_monitor() ) THEN
5583 INQUIRE ( i , OPENED = opened )
5584 IF ( .NOT. opened ) THEN
5592 #if (defined(DM_PARALLEL))
5593 CALL wrf_dm_bcast_bytes ( hujisbm_unit1 , IWORDSIZE )
5595 IF ( hujisbm_unit1 < 0 ) THEN
5596 CALL wrf_error_fatal ( 'module_mp_FAST_SBM: Table-4 -- FAST_SBM_INIT: '// &
5597 'Can not find unused fortran unit to read in lookup table,model stop' )
5600 IF ( wrf_dm_on_monitor() ) THEN
5601 WRITE(errmess, '(A,I2)') 'module_mp_FAST_SBM : Table-4 -- opening termvels.asc on unit ',hujisbm_unit1
5602 CALL wrf_debug(150, errmess)
5603 OPEN(UNIT=hujisbm_unit1,FILE=trim(input_dir)//"/termvels33_corrected.asc",FORM="FORMATTED",STATUS="OLD",ERR=2070)
5604 !OPEN(UNIT=hujisbm_unit1,FILE=trim(input_dir)//"/termvels43_corrected.asc",FORM="FORMATTED",STATUS="OLD",ERR=2070)
5605 READ(hujisbm_unit1,900) VR1,VR2,VR3,VR4,VR5
5606 CLOSE(hujisbm_unit1)
5609 #if (defined(DM_PARALLEL))
5610 DM_BCAST_MACRO_R4(VR1)
5611 DM_BCAST_MACRO_R4(VR2)
5612 DM_BCAST_MACRO_R4(VR3)
5613 DM_BCAST_MACRO_R4(VR4)
5614 DM_BCAST_MACRO_R4(VR5)
5616 WRITE(errmess, '(A,I2)') 'FAST_SBM_INIT : succesfull reading Table-4'
5617 CALL wrf_debug(000, errmess)
5618 ! +----------------------------------------------------------------------+
5623 ! +---------------------------------------------------+
5624 if (.NOT. ALLOCATED(SLIC)) ALLOCATE(SLIC(nkr,6))
5625 if (.NOT. ALLOCATED(TLIC)) ALLOCATE(TLIC(nkr,2))
5626 if (.NOT. ALLOCATED(COEFIN)) ALLOCATE(COEFIN(nkr))
5629 IF ( wrf_dm_on_monitor() ) THEN
5631 INQUIRE ( i , OPENED = opened )
5632 IF ( .NOT. opened ) THEN
5641 #if (defined(DM_PARALLEL))
5642 CALL wrf_dm_bcast_bytes ( hujisbm_unit1 , IWORDSIZE )
5645 IF ( hujisbm_unit1 < 0 ) THEN
5646 CALL wrf_error_fatal ( 'module_mp_FAST_SBM: Table-5 -- FAST_SBM_INIT: '// &
5647 'Can not find unused fortran unit to read in lookup table,model stop' )
5650 IF ( wrf_dm_on_monitor() ) THEN
5651 WRITE(errmess, '(A,I2)') 'module_mp_FAST_SBM : Table-5 -- opening constants.asc on unit ',hujisbm_unit1
5652 CALL wrf_debug(150, errmess)
5653 OPEN(UNIT=hujisbm_unit1,FILE=trim(input_dir)//"/constants33.asc",FORM="FORMATTED",STATUS="OLD",ERR=2070)
5654 !OPEN(UNIT=hujisbm_unit1,FILE=trim(input_dir)//"/constants43.asc",FORM="FORMATTED",STATUS="OLD",ERR=2070)
5655 READ(hujisbm_unit1,900) SLIC,TLIC,COEFIN
5656 CLOSE(hujisbm_unit1)
5659 #if (defined(DM_PARALLEL))
5660 DM_BCAST_MACRO_R4(SLIC)
5661 DM_BCAST_MACRO_R4(TLIC)
5662 DM_BCAST_MACRO_R4(COEFIN)
5664 WRITE(errmess, '(A,I2)') 'FAST_SBM_INIT : succesfull reading Table-5'
5665 CALL wrf_debug(000, errmess)
5666 ! +----------------------------------------------------------------------+
5669 ! KERNELS DEPENDING ON PRESSURE :
5670 ! +------------------------------------------------------------------+
5671 if (.NOT. ALLOCATED(YWLL_1000MB)) ALLOCATE(YWLL_1000MB(nkr,nkr))
5672 if (.NOT. ALLOCATED(YWLL_750MB)) ALLOCATE(YWLL_750MB(nkr,nkr))
5673 if (.NOT. ALLOCATED(YWLL_500MB)) ALLOCATE(YWLL_500MB(nkr,nkr))
5676 IF ( wrf_dm_on_monitor() ) THEN
5678 INQUIRE ( i , OPENED = opened )
5679 IF ( .NOT. opened ) THEN
5688 #if (defined(DM_PARALLEL))
5689 CALL wrf_dm_bcast_bytes ( hujisbm_unit1 , IWORDSIZE )
5691 IF ( hujisbm_unit1 < 0 ) THEN
5692 CALL wrf_error_fatal ( 'module_mp_FAST_SBM: Table-6 -- FAST_SBM_INIT: '// &
5693 'Can not find unused fortran unit to read in lookup table,model stop' )
5695 IF ( wrf_dm_on_monitor() ) THEN
5696 WRITE(errmess, '(A,I2)') 'module_mp_FAST_SBM : Table-6 -- opening kernels_z.asc on unit ',hujisbm_unit1
5697 CALL wrf_debug(150, errmess)
5698 Fname = trim(input_dir)//'/kernLL_z33.asc'
5699 !Fname = trim(input_dir)//'/kernLL_z43.asc'
5700 OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5701 READ(hujisbm_unit1,900) YWLL_1000MB,YWLL_750MB,YWLL_500MB
5702 CLOSE(hujisbm_unit1)
5707 IF(I > 33 .OR. J > 33) THEN
5708 YWLL_1000MB(I,J) = 0.0
5709 YWLL_750MB(I,J) = 0.0
5710 YWLL_500MB(I,J) = 0.0
5715 #if (defined(DM_PARALLEL))
5716 DM_BCAST_MACRO_R4(YWLL_1000MB)
5717 DM_BCAST_MACRO_R4(YWLL_750MB)
5718 DM_BCAST_MACRO_R4(YWLL_500MB)
5721 WRITE(errmess, '(A,I2)') 'FAST_SBM_INIT : succesfull reading Table-6'
5722 CALL wrf_debug(000, errmess)
5723 ! +-----------------------------------------------------------------------+
5726 ! COLLISIONS KERNELS :
5727 ! +-----------------------------------------------------------------------+
5729 if (.NOT. ALLOCATED(YWLI_300MB)) ALLOCATE(YWLI_300MB(nkr,nkr,icemax))
5730 if (.NOT. ALLOCATED(YWLI_500MB)) ALLOCATE(YWLI_500MB(nkr,nkr,icemax))
5731 if (.NOT. ALLOCATED(YWLI_750MB)) ALLOCATE(YWLI_750MB(nkr,nkr,icemax))
5733 ! ... Drops - Graupel
5734 if (.NOT. ALLOCATED(YWLG_300MB)) ALLOCATE(YWLG_300MB(nkr,nkr))
5735 if (.NOT. ALLOCATED(YWLG_500MB)) ALLOCATE(YWLG_500MB(nkr,nkr))
5736 if (.NOT. ALLOCATED(YWLG_750MB)) ALLOCATE(YWLG_750MB(nkr,nkr))
5737 !if (.NOT. ALLOCATED(YWLG)) ALLOCATE(YWLG(nkr,nkr))
5740 if (.NOT. ALLOCATED(YWLH_300MB)) ALLOCATE(YWLH_300MB(nkr,nkr))
5741 if (.NOT. ALLOCATED(YWLH_500MB)) ALLOCATE(YWLH_500MB(nkr,nkr))
5742 if (.NOT. ALLOCATED(YWLH_750MB)) ALLOCATE(YWLH_750MB(nkr,nkr))
5745 if (.NOT. ALLOCATED(YWLS_300MB)) ALLOCATE(YWLS_300MB(nkr,nkr))
5746 if (.NOT. ALLOCATED(YWLS_500MB)) ALLOCATE(YWLS_500MB(nkr,nkr))
5747 if (.NOT. ALLOCATED(YWLS_750MB)) ALLOCATE(YWLS_750MB(nkr,nkr))
5750 if (.NOT. ALLOCATED(YWII_300MB)) ALLOCATE(YWII_300MB(nkr,nkr,icemax,icemax))
5751 if (.NOT. ALLOCATED(YWII_500MB)) ALLOCATE(YWII_500MB(nkr,nkr,icemax,icemax))
5752 if (.NOT. ALLOCATED(YWII_750MB)) ALLOCATE(YWII_750MB(nkr,nkr,icemax,icemax))
5755 if (.NOT. ALLOCATED(YWIS_300MB)) ALLOCATE(YWIS_300MB(nkr,nkr,icemax))
5756 if (.NOT. ALLOCATED(YWIS_500MB)) ALLOCATE(YWIS_500MB(nkr,nkr,icemax))
5757 if (.NOT. ALLOCATED(YWIS_750MB)) ALLOCATE(YWIS_750MB(nkr,nkr,icemax))
5759 ! ... Snow - Graupel
5760 if (.NOT. ALLOCATED(YWSG_300MB)) ALLOCATE(YWSG_300MB(nkr,nkr))
5761 if (.NOT. ALLOCATED(YWSG_500MB)) ALLOCATE(YWSG_500MB(nkr,nkr))
5762 if (.NOT. ALLOCATED(YWSG_750MB)) ALLOCATE(YWSG_750MB(nkr,nkr))
5765 if (.NOT. ALLOCATED(YWSS_300MB)) ALLOCATE(YWSS_300MB(nkr,nkr))
5766 if (.NOT. ALLOCATED(YWSS_500MB)) ALLOCATE(YWSS_500MB(nkr,nkR))
5767 if (.NOT. ALLOCATED(YWSS_750MB)) ALLOCATE(YWSS_750MB(nkr,nkr))
5770 IF ( wrf_dm_on_monitor() ) THEN
5772 INQUIRE ( i , OPENED = opened )
5773 IF ( .NOT. opened ) THEN
5781 #if (defined(DM_PARALLEL))
5782 CALL wrf_dm_bcast_bytes ( hujisbm_unit1 , IWORDSIZE )
5784 IF ( hujisbm_unit1 < 0 ) THEN
5785 CALL wrf_error_fatal ( 'module_mp_FAST_SBM: Table-7 -- FAST_SBM_INIT: '// &
5786 'Can not find unused fortran unit to read in lookup table,model stop' )
5788 ! ... KERNELS DEPENDING ON PRESSURE :
5789 IF ( wrf_dm_on_monitor() ) THEN
5790 WRITE(errmess, '(A,I2)') 'module_mp_WRFsbm : Table-7 -- opening kernels33.asc on unit',hujisbm_unit1
5791 CALL wrf_debug(150, errmess)
5794 !Fname = trim(input_dir)//'/ckli_300mb_As'
5795 !OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5796 !READ(hujisbm_unit1,900) YWLI_300MB
5797 !Fname = trim(input_dir)//'/ckli_500mb_As'
5798 !OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5799 !READ(hujisbm_unit1,900) YWLI_500MB
5800 !Fname = trim(input_dir)//'/ckli_750mb_As'
5801 !OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5802 !READ(hujisbm_unit1,900) YWLI_750MB
5804 Fname = trim(input_dir)//'/ckli_33_300mb_500mb_750mb.asc'
5805 OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5806 READ(hujisbm_unit1,900) YWLI_300MB,YWLI_500MB,YWLI_750MB
5807 CLOSE(hujisbm_unit1)
5809 ! ... Drop - Graupel
5810 !Fname = trim(input_dir)//'/cklg_300mb_As'
5811 !OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5812 !READ(hujisbm_unit1,900) YWLG_300MB
5813 !Fname = trim(input_dir)//'/cklg_500mb_As'
5814 !OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5815 !READ(hujisbm_unit1,900) YWLG_500MB
5816 !Fname = trim(input_dir)//'/cklg_750mb_As'
5817 !OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5818 !READ(hujisbm_unit1,900) YWLG_750MB
5820 Fname = trim(input_dir)//'/cklg_33_300mb_500mb_750mb.asc'
5821 OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5822 READ(hujisbm_unit1,900) YWLG_300MB,YWLG_500MB,YWLG_750MB
5823 CLOSE(hujisbm_unit1)
5826 !Fname = trim(input_dir)//'/cklh_300mb_As'
5827 !OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5828 !READ(hujisbm_unit1,900) YWLH_300MB
5829 !Fname = trim(input_dir)//'/cklh_500mb_As'
5830 !OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5831 !READ(hujisbm_unit1,900) YWLH_500MB
5832 !Fname = trim(input_dir)//'/cklh_750mb_As'
5833 !OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5834 !READ(hujisbm_unit1,900) YWLH_750MB
5836 Fname = trim(input_dir)//'/cklh_33_300mb_500mb_750mb.asc'
5837 OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5838 READ(hujisbm_unit1,900) YWLH_300MB,YWLH_500MB,YWLH_750MB
5839 CLOSE(hujisbm_unit1)
5842 !Fname = trim(input_dir)//'/ckls_300mb_As'
5843 !OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5844 !READ(hujisbm_unit1,900) YWLS_300MB
5845 !Fname = trim(input_dir)//'/ckls_500mb_As'
5846 !OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5847 !READ(hujisbm_unit1,900) YWLS_500MB
5848 !Fname = trim(input_dir)//'/ckls_750mb_As'
5849 !OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5850 !READ(hujisbm_unit1,900) YWLS_750MB
5852 Fname = trim(input_dir)//'/ckls_33_300mb_500mb_750mb.asc'
5853 OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5854 READ(hujisbm_unit1,900) YWLS_300MB,YWLS_500MB,YWLS_750MB
5855 CLOSE(hujisbm_unit1)
5858 !Fname = trim(input_dir)//'/ckii_300mb_As'
5859 !OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5860 !READ(hujisbm_unit1,900) YWII_300MB
5861 !Fname = trim(input_dir)//'/ckii_500mb_As'
5862 !OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5863 !READ(hujisbm_unit1,900) YWII_500MB
5864 !Fname = trim(input_dir)//'/ckii_750mb_As'
5865 !OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5866 !READ(hujisbm_unit1,900) YWII_750MB
5867 !CLOSE(hujisbm_unit1)
5869 Fname = trim(input_dir)//'/ckii_33_300mb_500mb_750mb.asc'
5870 OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5871 READ(hujisbm_unit1,900) YWII_300MB,YWII_500MB,YWII_750MB
5872 CLOSE(hujisbm_unit1)
5875 !Fname = trim(input_dir)//'/ckis_300mb_As'
5876 !OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5877 !READ(hujisbm_unit1,900) YWIS_300MB
5878 !Fname = trim(input_dir)//'/ckis_500mb_As'
5879 !OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5880 !READ(hujisbm_unit1,900) YWIS_500MB
5881 !Fname = trim(input_dir)//'/ckis_750mb_As'
5882 !OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5883 !READ(hujisbm_unit1,900) YWIS_750MB
5885 Fname = trim(input_dir)//'/ckis_33_300mb_500mb_750mb.asc'
5886 OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5887 READ(hujisbm_unit1,900) YWIS_300MB,YWIS_500MB,YWIS_750MB
5888 CLOSE(hujisbm_unit1)
5890 ! ... Snow - Graupel
5891 !Fname = trim(input_dir)//'/cksg_300mb_As'
5892 !OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5893 !READ(hujisbm_unit1,900) YWSG_300MB
5894 !Fname = trim(input_dir)//'/cksg_500mb_As'
5895 !OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5896 !READ(hujisbm_unit1,900) YWSG_500MB
5897 !Fname = trim(input_dir)//'/cksg_750mb_As'
5898 !OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5899 !READ(hujisbm_unit1,900) YWSG_750MB
5901 Fname = trim(input_dir)//'/cksg_33_300mb_500mb_750mb.asc'
5902 OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5903 READ(hujisbm_unit1,900) YWSG_300MB,YWSG_500MB,YWSG_750MB
5904 CLOSE(hujisbm_unit1)
5907 !Fname = trim(input_dir)//'/ckss_300mb_As'
5908 !OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5909 !READ(hujisbm_unit1,900) YWSS_300MB
5910 !Fname = trim(input_dir)//'/ckss_500mb_As'
5911 !OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5912 !READ(hujisbm_unit1,900) YWSS_500MB
5913 !Fname = trim(input_dir)//'/ckss_750mb_As'
5914 !OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5915 !READ(hujisbm_unit1,900) YWSS_750MB
5917 Fname = trim(input_dir)//'/ckss_33_300mb_500mb_750mb.asc'
5918 OPEN(UNIT=hujisbm_unit1,FILE=Fname,FORM="FORMATTED",STATUS="OLD",ERR=2070)
5919 READ(hujisbm_unit1,900) YWSS_300MB,YWSS_500MB,YWSS_750MB
5920 CLOSE(hujisbm_unit1)
5923 #if (defined(DM_PARALLEL))
5924 DM_BCAST_MACRO_R4(YWLI_300MB)
5925 DM_BCAST_MACRO_R4(YWLI_500MB)
5926 DM_BCAST_MACRO_R4(YWLI_750MB)
5928 DM_BCAST_MACRO_R4(YWLG_300MB)
5929 DM_BCAST_MACRO_R4(YWLG_500MB)
5930 DM_BCAST_MACRO_R4(YWLG_750MB)
5931 !DM_BCAST_MACRO(YWLG)
5933 DM_BCAST_MACRO_R4(YWLH_300MB)
5934 DM_BCAST_MACRO_R4(YWLH_500MB)
5935 DM_BCAST_MACRO_R4(YWLH_750MB)
5937 DM_BCAST_MACRO_R4(YWLS_300MB)
5938 DM_BCAST_MACRO_R4(YWLS_500MB)
5939 DM_BCAST_MACRO_R4(YWLS_750MB)
5941 DM_BCAST_MACRO_R4(YWII_300MB)
5942 DM_BCAST_MACRO_R4(YWII_500MB)
5943 DM_BCAST_MACRO_R4(YWII_750MB)
5945 DM_BCAST_MACRO_R4(YWIS_300MB)
5946 DM_BCAST_MACRO_R4(YWIS_500MB)
5947 DM_BCAST_MACRO_R4(YWIS_750MB)
5949 DM_BCAST_MACRO_R4(YWSG_300MB)
5950 DM_BCAST_MACRO_R4(YWSG_500MB)
5951 DM_BCAST_MACRO_R4(YWSG_750MB)
5953 DM_BCAST_MACRO_R4(YWSS_300MB)
5954 DM_BCAST_MACRO_R4(YWSS_500MB)
5955 DM_BCAST_MACRO_R4(YWSS_750MB)
5958 WRITE(errmess, '(A,I2)') 'FAST_SBM_INIT : succesfull reading Table-7'
5959 CALL wrf_debug(000, errmess)
5960 ! +-----------------------------------------------------------------------+
5964 ! +--------------------------------------------------------------+
5965 if (.NOT. ALLOCATED(RO1BL)) ALLOCATE(RO1BL(nkr))
5966 if (.NOT. ALLOCATED(RO2BL)) ALLOCATE(RO2BL(nkr,icemax))
5967 if (.NOT. ALLOCATED(RO3BL)) ALLOCATE(RO3BL(nkr))
5968 if (.NOT. ALLOCATED(RO4BL)) ALLOCATE(RO4BL(nkr))
5969 if (.NOT. ALLOCATED(RO5BL)) ALLOCATE(RO5BL(nkr))
5972 IF ( wrf_dm_on_monitor() ) THEN
5974 INQUIRE ( i , OPENED = opened )
5975 IF ( .NOT. opened ) THEN
5983 #if (defined(DM_PARALLEL))
5984 CALL wrf_dm_bcast_bytes ( hujisbm_unit1 , IWORDSIZE )
5986 IF ( hujisbm_unit1 < 0 ) THEN
5987 CALL wrf_error_fatal ( 'module_mp_FAST_SBM: Table-8 -- FAST_SBM_INIT: '// &
5988 'Can not find unused fortran unit to read in lookup table,model stop' )
5990 IF ( wrf_dm_on_monitor() ) THEN
5991 WRITE(errmess, '(A,I2)') 'module_mp_WRFsbm : Table-8 -- opening bulkdens.asc on unit ',hujisbm_unit1
5992 CALL wrf_debug(150, errmess)
5993 OPEN(UNIT=hujisbm_unit1,FILE=trim(input_dir)//"/bulkdens33.asc",FORM="FORMATTED",STATUS="OLD",ERR=2070)
5994 !OPEN(UNIT=hujisbm_unit1,FILE=trim(input_dir)//"/bulkdens43.asc",FORM="FORMATTED",STATUS="OLD",ERR=2070)
5995 READ(hujisbm_unit1,900) RO1BL,RO2BL,RO3BL,RO4BL,RO5BL
5996 CLOSE(hujisbm_unit1)
5999 #if (defined(DM_PARALLEL))
6000 DM_BCAST_MACRO_R4(RO1BL)
6001 DM_BCAST_MACRO_R4(RO2BL)
6002 DM_BCAST_MACRO_R4(RO3BL)
6003 DM_BCAST_MACRO_R4(RO4BL)
6004 DM_BCAST_MACRO_R4(RO5BL)
6006 WRITE(errmess, '(A,I2)') 'FAST_SBM_INIT : succesfull reading Table-8'
6007 CALL wrf_debug(000, errmess)
6008 ! +----------------------------------------------------------------------+
6012 ! +-----------------------------------------------------------+
6013 if (.NOT. ALLOCATED(RADXXO)) ALLOCATE(RADXXO(nkr,nhydro))
6015 IF ( wrf_dm_on_monitor() ) THEN
6017 INQUIRE ( i , OPENED = opened )
6018 IF ( .NOT. opened ) THEN
6025 #if (defined(DM_PARALLEL))
6026 CALL wrf_dm_bcast_bytes ( hujisbm_unit1 , IWORDSIZE )
6028 IF ( hujisbm_unit1 < 0 ) THEN
6029 CALL wrf_error_fatal ( 'module_mp_FAST_SBM: Table-9 -- FAST_SBM_INIT: '// &
6030 'Can not find unused fortran unit to read in lookup table,model stop' )
6032 IF ( wrf_dm_on_monitor() ) THEN
6033 WRITE(errmess, '(A,I2)') 'module_mp_FAST_SBM : Table-9 -- opening bulkradii.asc on unit',hujisbm_unit1
6034 CALL wrf_debug(150, errmess)
6035 OPEN(UNIT=hujisbm_unit1,FILE=trim(input_dir)//"/bulkradii33.asc",FORM="FORMATTED",STATUS="OLD",ERR=2070)
6036 !OPEN(UNIT=hujisbm_unit1,FILE=trim(input_dir)//"/bulkradii43.asc",FORM="FORMATTED",STATUS="OLD",ERR=2070)
6037 READ(hujisbm_unit1,*) RADXXO
6038 CLOSE(hujisbm_unit1)
6041 #if (defined(DM_PARALLEL))
6042 DM_BCAST_MACRO_R4(RADXXO)
6044 WRITE(errmess, '(A,I2)') 'FAST_SBM_INIT : succesfull reading Table-9'
6045 CALL wrf_debug(000, errmess)
6046 ! +-----------------------------------------------------------------------+
6049 ! Polar-HUCM Scattering Amplitudes Look-up table :
6050 ! +-----------------------------------------------------------------------+
6051 CALL LOAD_TABLES(NKR) ! (KS) - Loading the scattering look-up-table
6053 ! ... (KS) - Broadcating Liquid drops
6054 #if (defined(DM_PARALLEL))
6055 DM_BCAST_MACRO_R16(FAF1)
6056 DM_BCAST_MACRO_R16(FBF1)
6057 DM_BCAST_MACRO_R16(FAB1)
6058 DM_BCAST_MACRO_R16(FBB1)
6059 ! ... (KS) - Broadcating Snow
6060 DM_BCAST_MACRO_R16(FAF3)
6061 DM_BCAST_MACRO_R16(FBF3)
6062 DM_BCAST_MACRO_R16(FAB3)
6063 DM_BCAST_MACRO_R16(FBB3)
6064 ! ... (KS) - Broadcating Graupel
6065 DM_BCAST_MACRO_R16(FAF4)
6066 DM_BCAST_MACRO_R16(FBF4)
6067 DM_BCAST_MACRO_R16(FAB4)
6068 DM_BCAST_MACRO_R16(FBB4)
6069 ! ### (KS) - Broadcating Hail
6070 DM_BCAST_MACRO_R16(FAF5)
6071 DM_BCAST_MACRO_R16(FBF5)
6072 DM_BCAST_MACRO_R16(FAB5)
6073 DM_BCAST_MACRO_R16(FBB5)
6074 ! ### (KS) - Broadcating Usetables array
6075 CALL wrf_dm_bcast_integer ( usetables , size ( usetables ) * IWORDSIZE )
6077 WRITE(errmess, '(A,I2)') 'module_mp_WRFsbm : succesfull reading Table-10'
6078 call wrf_message(errmess)
6079 ! +-----------------------------------------------------------------------+
6081 ! calculation of the mass(in mg) for categories boundaries :
6085 xl_mg(i) = xl(i)*1.e3
6086 xs_mg(i) = xs(i)*1.e3
6087 xg_mg(i) = xg(i)*1.e3
6088 xh_mg(i) = xh(i)*1.e3
6089 xi1_mg(i) = xi(i,1)*1.e3
6090 xi2_mg(i) = xi(i,2)*1.e3
6091 xi3_mg(i) = xi(i,3)*1.e3
6094 if (.NOT. ALLOCATED(IMA)) ALLOCATE(IMA(nkr,nkr))
6095 if (.NOT. ALLOCATED(CHUCM)) ALLOCATE(CHUCM(nkr,nkr))
6098 CALL courant_bott_KS(xl, nkr, chucm, ima, scal) ! ### (KS) : New courant_bott_KS (without XL_MG(0:nkr))
6099 WRITE(errmess, '(A,I2)') 'FAST_SBM_INIT : succesfull reading "courant_bott_KS" '
6100 CALL wrf_debug(000, errmess)
6105 if (.NOT. ALLOCATED(DROPRADII)) ALLOCATE(DROPRADII(NKR))
6107 DROPRADII(KR)=(3.0*XL(KR)/4.0/3.141593/1.0)**DEG01
6110 ! +-------------------------------------------------------------+
6111 ! Allocating Aerosols Array
6112 ! +-------------------------+
6113 if (.NOT. ALLOCATED(FCCNR_MAR)) ALLOCATE(FCCNR_MAR(NKR_aerosol))
6114 if (.NOT. ALLOCATED(FCCNR_CON)) ALLOCATE(FCCNR_CON(NKR_aerosol))
6115 if (.NOT. ALLOCATED(XCCN)) ALLOCATE(XCCN(NKR_aerosol))
6116 if (.NOT. ALLOCATED(RCCN)) ALLOCATE(RCCN(NKR_aerosol))
6117 if (.NOT. ALLOCATED(Scale_CCN_Factor)) ALLOCATE(Scale_CCN_Factor)
6118 if (.NOT. ALLOCATED(FCCN)) ALLOCATE(FCCN(NKR_aerosol))
6120 IF(ILogNormal_modes_Aerosol == 1)THEN
6121 ! ... Initializing the FCCNR_MAR and FCCNR_CON
6124 Scale_CCN_Factor = 1.0
6127 CALL LogNormal_modes_Aerosol(FCCNR_CON,FCCNR_MAR,NKR_aerosol,COL,XL,XCCN,RCCN,RO_SOLUTE,Scale_CCN_Factor,1)
6128 CALL LogNormal_modes_Aerosol(FCCNR_CON,FCCNR_MAR,NKR_aerosol,COL,XL,XCCN,RCCN,RO_SOLUTE,Scale_CCN_Factor,2)
6129 WRITE(errmess, '(A,I2)') 'module_mp_WRFsbm : succesfull reading "LogNormal_modes_Aerosol" '
6130 CALL wrf_debug(000, errmess)
6132 ! +-------------------------------------------------------------+
6134 if (.NOT. ALLOCATED(PKIJ)) ALLOCATE(PKIJ(JBREAK,JBREAK,JBREAK))
6135 if (.NOT. ALLOCATED(QKJ)) ALLOCATE(QKJ(JBREAK,JBREAK))
6136 if (.NOT. ALLOCATED(ECOALMASSM)) ALLOCATE(ECOALMASSM(NKR,NKR))
6137 if (.NOT. ALLOCATED(BRKWEIGHT)) ALLOCATE(BRKWEIGHT(JBREAK))
6142 CALL BREAKINIT_KS(PKIJ,QKJ,ECOALMASSM,BRKWEIGHT,XL,DROPRADII,BR_MAX,JBREAK,JMAX,NKR,VR1) ! Rain Spontanous Breakup
6143 #if (defined(DM_PARALLEL))
6144 DM_BCAST_MACRO_R4(PKIJ)
6145 DM_BCAST_MACRO_R4(QKJ)
6147 WRITE(errmess, '(A,I2)') 'FAST_SBM_INIT : succesfull reading BREAKINIT_KS" '
6148 CALL wrf_debug(000, errmess)
6149 ! +--------------------------------------------------------------------------------------------------------------------+
6152 101 FORMAT(3X,F7.5,E13.5)
6156 123 FORMAT(3E12.4,3I4)
6160 301 FORMAT(3X,F8.3,3X,E13.5)
6163 if (.NOT. ALLOCATED(cwll)) ALLOCATE(cwll(nkr,nkr))
6165 if (.NOT. ALLOCATED(cwli_1)) ALLOCATE(cwli_1(nkr,nkr))
6166 if (.NOT. ALLOCATED(cwli_2)) ALLOCATE(cwli_2(nkr,nkr))
6167 if (.NOT. ALLOCATED(cwli_3)) ALLOCATE(cwli_3(nkr,nkr))
6169 if (.NOT. ALLOCATED(cwil_1)) ALLOCATE(cwil_1(nkr,nkr))
6170 if (.NOT. ALLOCATED(cwil_2)) ALLOCATE(cwil_2(nkr,nkr))
6171 if (.NOT. ALLOCATED(cwil_3)) ALLOCATE(cwil_3(nkr,nkr))
6173 if (.NOT. ALLOCATED(cwlg)) ALLOCATE(cwlg(nkr,nkr))
6174 if (.NOT. ALLOCATED(cwlh)) ALLOCATE(cwlh(nkr,nkr))
6175 if (.NOT. ALLOCATED(cwls)) ALLOCATE(cwls(nkr,nkr))
6176 if (.NOT. ALLOCATED(cwgl)) ALLOCATE(cwgl(nkr,nkr))
6177 if (.NOT. ALLOCATED(cwhl)) ALLOCATE(cwhl(nkr,nkr))
6178 if (.NOT. ALLOCATED(cwsl)) ALLOCATE(cwsl(nkr,nkr))
6180 if (.NOT. ALLOCATED(cwii_1_1)) ALLOCATE(cwii_1_1(nkr,nkr))
6181 if (.NOT. ALLOCATED(cwii_1_2)) ALLOCATE(cwii_1_2(nkr,nkr))
6182 if (.NOT. ALLOCATED(cwii_1_3)) ALLOCATE(cwii_1_3(nkr,nkr))
6183 if (.NOT. ALLOCATED(cwii_2_1)) ALLOCATE(cwii_2_1(nkr,nkr))
6184 if (.NOT. ALLOCATED(cwii_2_2)) ALLOCATE(cwii_2_2(nkr,nkr))
6185 if (.NOT. ALLOCATED(cwii_2_3)) ALLOCATE(cwii_2_3(nkr,nkr))
6186 if (.NOT. ALLOCATED(cwii_3_1)) ALLOCATE(cwii_3_1(nkr,nkr))
6187 if (.NOT. ALLOCATED(cwii_3_2)) ALLOCATE(cwii_3_2(nkr,nkr))
6188 if (.NOT. ALLOCATED(cwii_3_3)) ALLOCATE(cwii_3_3(nkr,nkr))
6190 if (.NOT. ALLOCATED(cwis_1)) ALLOCATE(cwis_1(nkr,nkr))
6191 if (.NOT. ALLOCATED(cwis_2)) ALLOCATE(cwis_2(nkr,nkr))
6192 if (.NOT. ALLOCATED(cwis_3)) ALLOCATE(cwis_3(nkr,nkr))
6193 if (.NOT. ALLOCATED(cwsi_1)) ALLOCATE(cwsi_1(nkr,nkr))
6194 if (.NOT. ALLOCATED(cwsi_2)) ALLOCATE(cwsi_2(nkr,nkr))
6195 if (.NOT. ALLOCATED(cwsi_3)) ALLOCATE(cwsi_3(nkr,nkr))
6197 if (.NOT. ALLOCATED(cwig_1)) ALLOCATE(cwig_1(nkr,nkr))
6198 if (.NOT. ALLOCATED(cwig_2)) ALLOCATE(cwig_2(nkr,nkr))
6199 if (.NOT. ALLOCATED(cwig_3)) ALLOCATE(cwig_3(nkr,nkr))
6201 if (.NOT. ALLOCATED(cwih_1)) ALLOCATE(cwih_1(nkr,nkr))
6202 if (.NOT. ALLOCATED(cwih_2)) ALLOCATE(cwih_2(nkr,nkr))
6203 if (.NOT. ALLOCATED(cwih_3)) ALLOCATE(cwih_3(nkr,nkr))
6205 if (.NOT. ALLOCATED(cwsg)) ALLOCATE(cwsg(nkr,nkr))
6206 if (.NOT. ALLOCATED(cwss)) ALLOCATE(cwss(nkr,nkr))
6209 cwli_1(:,:) = 0.0e0 ; cwli_2(:,:) = 0.0e0 ; cwli_3(:,:) = 0.0e0
6210 cwil_1(:,:) = 0.0e0 ; cwil_2(:,:) = 0.0e0 ; cwil_3(:,:) = 0.0e0
6211 cwlg(:,:) = 0.0e0 ; cwlh(:,:) = 0.0e0 ; cwls(:,:) = 0.0e0
6212 cwgl(:,:) = 0.0e0 ; cwhl(:,:) = 0.0e0 ; cwsl(:,:) = 0.0e0
6213 cwii_1_1(:,:) = 0.0e0 ; cwii_1_2(:,:) = 0.0e0 ; cwii_1_3(:,:) = 0.0e0
6214 cwii_2_1(:,:) = 0.0e0 ; cwii_2_2(:,:) = 0.0e0 ; cwii_2_3(:,:) = 0.0e0
6215 cwii_3_1(:,:) = 0.0e0 ; cwii_3_2(:,:) = 0.0e0 ; cwii_3_3(:,:) = 0.0e0
6216 cwis_1(:,:) = 0.0e0 ; cwis_2(:,:) = 0.0e0 ; cwis_3(:,:) = 0.0e0
6217 cwsi_1(:,:) = 0.0e0 ; cwsi_2(:,:) = 0.0e0 ; cwsi_3(:,:) = 0.0e0
6218 cwig_1(:,:) = 0.0e0 ; cwig_2(:,:) = 0.0e0 ; cwig_3(:,:) = 0.0e0
6219 cwih_1(:,:) = 0.0e0 ; cwih_2(:,:) = 0.0e0 ; cwih_3(:,:) = 0.0e0
6220 cwsg(:,:) = 0.0e0 ; cwss(:,:) = 0.0e0
6222 call Kernals_KS(dt,nkr,7.6E6)
6224 !+---+-----------------------------------------+
6225 if (.NOT. ALLOCATED( Prob)) ALLOCATE( Prob(NKR))
6226 if (.NOT. ALLOCATED(Gain_Var_New)) ALLOCATE(Gain_Var_New(NKR,NKR))
6227 if (.NOT. ALLOCATED(NND)) ALLOCATE(NND(NKR,NKR))
6231 call Spontanous_Init(dt, XL, DROPRADII, Prob, Gain_Var_New, NND, NKR, ikr_spon_break)
6232 WRITE(errmess, '(A,I2)') 'FAST_SBM_INIT : succesfull reading "Spontanous_Init" '
6233 CALL wrf_debug(000, errmess)
6238 WRITE( errmess , '(A,I4)' ) &
6239 'module_mp_FAST_SBM_INIT: error opening hujisbm_DATA on unit,model stop ' &
6241 CALL wrf_error_fatal(errmess)
6243 END SUBROUTINE FAST_HUCMINIT
6244 ! -----------------------------------------------------------------+
6245 subroutine Kernals_KS(dtime_coal,nkr,p_z)
6250 real(kind=r4size),intent(in) :: dtime_coal,p_z
6254 real(kind=r4size),parameter :: p1=1.0e6,p2=0.75e6,p3=0.50e6,p4=0.3e6
6255 real(kind=r4size) :: dlnr, scal, dtimelnr, pdm, p_1, p_2, p_3, ckern_1, ckern_2, &
6258 ! p1=1.00D6 dynes/cm^2 = 1000.0 mb
6259 ! p2=0.75D6 dynes/cm^2 = 750.0 mb
6260 ! p3=0.50D6 dynes/cm^2 = 500.0 mb
6261 ! p4=0.30D6 dynes/cm^2 = 300.0 mb
6264 dlnr = dlog(2.0d0)/(3.0d0*scal)
6265 dtimelnr = dtime_coal*dlnr
6273 ckern_1 = YWLL_1000mb(i,j)
6274 ckern_2 = YWLL_750mb(i,j)
6275 ckern_3 = YWLL_500mb(i,j)
6276 cwll(i,j) = ckern_z(p_z,p_1,p_2,p_3,ckern_1,ckern_2,ckern_3)*dtime_coal*dlnr
6280 ! ... ECOALMASSM is from "BreakIniit_KS"
6283 CWLL(I,J) = ECOALMASSM(I,J)*CWLL(I,J)
6294 cwli_1(i,j) = ywli_750mb(i,j,1)*dtimelnr
6295 cwli_2(i,j) = ywli_750mb(i,j,2)*dtimelnr
6296 cwli_3(i,j) = ywli_750mb(i,j,3)*dtimelnr
6297 cwlg(i,j) = ywlg_750mb(i,j)*dtimelnr
6298 cwlh(i,j) = ywlh_750mb(i,j)*dtimelnr
6299 cwls(i,j) = ywls_750mb(i,j)*dtimelnr
6300 cwii_1_1(i,j) = ywii_750mb(i,j,1,1)*dtimelnr
6301 cwii_1_2(i,j) = ywii_750mb(i,j,1,2)*dtimelnr
6302 cwii_1_3(i,j) = ywii_750mb(i,j,1,3)*dtimelnr
6303 cwii_2_1(i,j) = ywii_750mb(i,j,2,1)*dtimelnr
6304 cwii_2_2(i,j) = ywii_750mb(i,j,2,2)*dtimelnr
6305 cwii_2_3(i,j) = ywii_750mb(i,j,2,3)*dtimelnr
6306 cwii_3_1(i,j) = ywii_750mb(i,j,3,1)*dtimelnr
6307 cwii_3_2(i,j) = ywii_750mb(i,j,3,2)*dtimelnr
6308 cwii_3_3(i,j) = ywii_750mb(i,j,3,3)*dtimelnr
6309 cwis_1(i,j) = ywis_750mb(i,j,1)*dtimelnr
6310 cwis_2(i,j) = ywis_750mb(i,j,2)*dtimelnr
6311 cwis_3(i,j) = ywis_750mb(i,j,3)*dtimelnr
6312 cwsg(i,j) = ywsg_750mb(i,j)*dtimelnr
6313 cwss(i,j) = ywss_750mb(i,j)*dtimelnr
6318 if (p_z <= p_3) then
6321 cwli_1(i,j) = ywli_300mb(i,j,1)*dtimelnr
6322 cwli_2(i,j) = ywli_300mb(i,j,2)*dtimelnr
6323 cwli_3(i,j) = ywli_300mb(i,j,3)*dtimelnr
6324 cwlg(i,j) = ywlg_300mb(i,j)*dtimelnr
6325 cwlh(i,j) = ywlh_300mb(i,j)*dtimelnr
6326 cwls(i,j) = ywls_300mb(i,j)*dtimelnr
6327 cwii_1_1(i,j) = ywii_300mb(i,j,1,1)*dtimelnr
6328 cwii_1_2(i,j) = ywii_300mb(i,j,1,2)*dtimelnr
6329 cwii_1_3(i,j) = ywii_300mb(i,j,1,3)*dtimelnr
6330 cwii_2_1(i,j) = ywii_300mb(i,j,2,1)*dtimelnr
6331 cwii_2_2(i,j) = ywii_300mb(i,j,2,2)*dtimelnr
6332 cwii_2_3(i,j) = ywii_300mb(i,j,2,3)*dtimelnr
6333 cwii_3_1(i,j) = ywii_300mb(i,j,3,1)*dtimelnr
6334 cwii_3_2(i,j) = ywii_300mb(i,j,3,2)*dtimelnr
6335 cwii_3_3(i,j) = ywii_300mb(i,j,3,3)*dtimelnr
6336 cwis_1(i,j) = ywis_300mb(i,j,1)*dtimelnr
6337 cwis_2(i,j) = ywis_300mb(i,j,2)*dtimelnr
6338 cwis_3(i,j) = ywis_300mb(i,j,3)*dtimelnr
6339 cwsg(i,j) = ywsg_300mb(i,j)*dtimelnr
6340 cwss(i,j) = ywss_300mb(i,j)*dtimelnr
6345 if (p_z < p_1 .and. p_z >= p_2) then
6346 pdm = (p_z-p_2)/(p_1-p_2)
6349 ckern_1=ywli_750mb(i,j,1)
6350 ckern_2=ywli_500mb(i,j,1)
6351 cwli_1(i,j)=(ckern_2+(ckern_1-ckern_2)*pdm)*dtimelnr
6353 ckern_1=ywli_750mb(i,j,2)
6354 ckern_2=ywli_500mb(i,j,2)
6355 cwli_2(i,j)=(ckern_2+(ckern_1-ckern_2)*pdm)*dtimelnr
6357 ckern_1=ywli_750mb(i,j,3)
6358 ckern_2=ywli_500mb(i,j,3)
6359 cwli_3(i,j)=(ckern_2+(ckern_1-ckern_2)*pdm)*dtimelnr
6361 ckern_1=ywlg_750mb(i,j)
6362 ckern_2=ywlg_500mb(i,j)
6363 cwlg(i,j)=(ckern_2+(ckern_1-ckern_2)*pdm)*dtimelnr
6365 ckern_1=ywlh_750mb(i,j)
6366 ckern_2=ywlh_500mb(i,j)
6367 cwlh(i,j)=(ckern_2+(ckern_1-ckern_2)*pdm)*dtimelnr
6369 ckern_1=ywls_750mb(i,j)
6370 ckern_2=ywls_500mb(i,j)
6371 cwls(i,j)=(ckern_2+(ckern_1-ckern_2)*pdm)*dtimelnr
6373 ckern_1=ywii_750mb(i,j,1,1)
6374 ckern_2=ywii_500mb(i,j,1,1)
6375 cwii_1_1(i,j)=(ckern_2+(ckern_1-ckern_2)*pdm)*dtimelnr
6377 ckern_1=ywii_750mb(i,j,1,2)
6378 ckern_2=ywii_500mb(i,j,1,2)
6379 cwii_1_2(i,j)=(ckern_2+(ckern_1-ckern_2)*pdm)*dtimelnr
6381 ckern_1=ywii_750mb(i,j,1,3)
6382 ckern_2=ywii_500mb(i,j,1,3)
6383 cwii_1_3(i,j)=(ckern_2+(ckern_1-ckern_2)*pdm)*dtimelnr
6385 ckern_1=ywii_750mb(i,j,2,1)
6386 ckern_2=ywii_500mb(i,j,2,1)
6387 cwii_2_1(i,j)=(ckern_2+(ckern_1-ckern_2)*pdm)*dtimelnr
6390 ckern_1=ywii_750mb(i,j,2,2)
6391 ckern_2=ywii_500mb(i,j,2,2)
6392 cwii_2_2(i,j)=(ckern_2+(ckern_1-ckern_2)*pdm)*dtimelnr
6394 ckern_1=ywii_750mb(i,j,2,3)
6395 ckern_2=ywii_500mb(i,j,2,3)
6396 cwii_2_3(i,j)=(ckern_2+(ckern_1-ckern_2)*pdm)*dtimelnr
6398 ckern_1=ywii_750mb(i,j,3,1)
6399 ckern_2=ywii_500mb(i,j,3,1)
6400 cwii_3_1(i,j)=(ckern_2+(ckern_1-ckern_2)*pdm)*dtimelnr
6402 ckern_1=ywii_750mb(i,j,3,2)
6403 ckern_2=ywii_500mb(i,j,3,2)
6404 cwii_3_2(i,j)=(ckern_2+(ckern_1-ckern_2)*pdm)*dtimelnr
6406 ckern_1=ywii_750mb(i,j,3,3)
6407 ckern_2=ywii_500mb(i,j,3,3)
6408 cwii_3_3(i,j)=(ckern_2+(ckern_1-ckern_2)*pdm)*dtimelnr
6410 ckern_1=ywis_750mb(i,j,1)
6411 ckern_2=ywis_500mb(i,j,1)
6412 cwis_1(i,j)=(ckern_2+(ckern_1-ckern_2)*pdm)*dtimelnr
6414 ckern_1=ywis_750mb(i,j,2)
6415 ckern_2=ywis_500mb(i,j,2)
6416 cwis_2(i,j)=(ckern_2+(ckern_1-ckern_2)*pdm)*dtimelnr
6418 ckern_1=ywis_750mb(i,j,3)
6419 ckern_2=ywis_500mb(i,j,3)
6420 cwis_3(i,j)=(ckern_2+(ckern_1-ckern_2)*pdm)*dtimelnr
6422 ckern_1=ywsg_750mb(i,j)
6423 ckern_2=ywsg_500mb(i,j)
6424 cwsg(i,j)=(ckern_2+(ckern_1-ckern_2)*pdm)*dtimelnr
6426 ckern_1=ywss_750mb(i,j)
6427 ckern_2=ywss_500mb(i,j)
6428 cwss(i,j)=(ckern_2+(ckern_1-ckern_2)*pdm)*dtimelnr
6433 if (p_z < p_2 .and. p_z > p_3) then
6434 pdm = (p_z-p_3)/(p_2-p_3)
6438 ckern_2=ywli_500mb(i,j,1)
6439 ckern_3=ywli_300mb(i,j,1)
6440 cwli_1(i,j)=(ckern_3+(ckern_2-ckern_3)*pdm)*dtimelnr
6442 ckern_2=ywli_500mb(i,j,2)
6443 ckern_3=ywli_300mb(i,j,2)
6444 cwli_2(i,j)=(ckern_3+(ckern_2-ckern_3)*pdm)*dtimelnr
6446 ckern_2=ywli_500mb(i,j,3)
6447 ckern_3=ywli_300mb(i,j,3)
6448 cwli_3(i,j)=(ckern_3+(ckern_2-ckern_3)*pdm)*dtimelnr
6450 ckern_2=ywlg_500mb(i,j)
6451 ckern_3=ywlg_300mb(i,j)
6452 cwlg(i,j)=(ckern_3+(ckern_2-ckern_3)*pdm)*dtimelnr
6454 ckern_2=ywlh_500mb(i,j)
6455 ckern_3=ywlh_300mb(i,j)
6456 cwlh(i,j)=(ckern_3+(ckern_2-ckern_3)*pdm)*dtimelnr
6458 ckern_2=ywls_500mb(i,j)
6459 ckern_3=ywls_300mb(i,j)
6460 cwls(i,j)=(ckern_3+(ckern_2-ckern_3)*pdm)*dtimelnr
6462 ckern_2=ywii_500mb(i,j,1,1)
6463 ckern_3=ywii_300mb(i,j,1,1)
6464 cwii_1_1(i,j)=(ckern_3+(ckern_2-ckern_3)*pdm)*dtimelnr
6466 ckern_2=ywii_500mb(i,j,1,2)
6467 ckern_3=ywii_300mb(i,j,1,2)
6468 cwii_1_2(i,j)=(ckern_3+(ckern_2-ckern_3)*pdm)*dtimelnr
6470 ckern_2=ywii_500mb(i,j,1,3)
6471 ckern_3=ywii_300mb(i,j,1,3)
6472 cwii_1_3(i,j)=(ckern_3+(ckern_2-ckern_3)*pdm)*dtimelnr
6474 ckern_2=ywii_500mb(i,j,2,1)
6475 ckern_3=ywii_300mb(i,j,2,1)
6476 cwii_2_1(i,j)=(ckern_3+(ckern_2-ckern_3)*pdm)*dtimelnr
6478 ckern_2=ywii_500mb(i,j,2,2)
6479 ckern_3=ywii_300mb(i,j,2,2)
6480 cwii_2_2(i,j)=(ckern_3+(ckern_2-ckern_3)*pdm)*dtimelnr
6482 ckern_2=ywii_500mb(i,j,2,3)
6483 ckern_3=ywii_300mb(i,j,2,3)
6484 cwii_2_3(i,j)=(ckern_3+(ckern_2-ckern_3)*pdm)*dtimelnr
6486 ckern_2=ywii_500mb(i,j,3,1)
6487 ckern_3=ywii_300mb(i,j,3,1)
6488 cwii_3_1(i,j)=(ckern_3+(ckern_2-ckern_3)*pdm)*dtimelnr
6490 ckern_2=ywii_500mb(i,j,3,2)
6491 ckern_3=ywii_300mb(i,j,3,2)
6492 cwii_3_2(i,j)=(ckern_3+(ckern_2-ckern_3)*pdm)*dtimelnr
6494 ckern_2=ywii_500mb(i,j,3,3)
6495 ckern_3=ywii_300mb(i,j,3,3)
6496 cwii_3_3(i,j)=(ckern_3+(ckern_2-ckern_3)*pdm)*dtimelnr
6498 ckern_2=ywis_500mb(i,j,1)
6499 ckern_3=ywis_300mb(i,j,1)
6500 cwis_1(i,j)=(ckern_3+(ckern_2-ckern_3)*pdm)*dtimelnr
6502 ckern_2=ywis_500mb(i,j,2)
6503 ckern_3=ywis_300mb(i,j,2)
6504 cwis_2(i,j)=(ckern_3+(ckern_2-ckern_3)*pdm)*dtimelnr
6506 ckern_2=ywis_500mb(i,j,3)
6507 ckern_3=ywis_300mb(i,j,3)
6508 cwis_3(i,j)=(ckern_3+(ckern_2-ckern_3)*pdm)*dtimelnr
6510 ckern_2=ywsg_500mb(i,j)
6511 ckern_3=ywsg_300mb(i,j)
6512 cwsg(i,j)=(ckern_3+(ckern_2-ckern_3)*pdm)*dtimelnr
6514 ckern_2=ywss_500mb(i,j)
6515 ckern_3=ywss_300mb(i,j)
6516 cwss(i,j)=(ckern_3+(ckern_2-ckern_3)*pdm)*dtimelnr
6525 cwil_1(i,j)=cwli_1(j,i)
6527 cwil_2(i,j)=cwli_2(j,i)
6529 cwil_3(i,j)=cwli_3(j,i)
6530 ! 3. graupel - water
6536 ! 7.snow - crystals :
6538 cwsi_1(i,j)=cwis_1(j,i)
6540 cwsi_2(i,j)=cwis_2(j,i)
6542 cwsi_3(i,j)=cwis_3(j,i)
6548 end subroutine Kernals_KS
6550 ! ------------------------------------------------------------+
6551 real function ckern_z (p_z,p_1,p_2,p_3,ckern_1,ckern_2,ckern_3)
6555 real(kind=r4size),intent(in) :: p_z,p_1,p_2,p_3,ckern_1, &
6558 if(p_z>=p_1) ckern_z = ckern_1
6559 !if(p_z==p_2) ckern_z=ckern_2
6560 if(p_z<=p_3) ckern_z = ckern_3
6561 if(p_z<p_1 .and. p_z>=p_2) ckern_z = ckern_2 + (ckern_1-ckern_2)*(p_z-p_2)/(p_1-p_2)
6562 if(p_z<p_2 .and. p_z>p_3) ckern_z = ckern_3 + (ckern_2-ckern_3)*(p_z-p_3)/(p_2-p_3)
6565 end function ckern_z
6566 ! -------------------------------------------------------------+
6567 SUBROUTINE FREEZ(FF1,XL,FF2,XI,FF3,XS,FF4,XG,FF5,XH, &
6568 TIN,DT,RO,COL,AFREEZMY,BFREEZMY, &
6569 BFREEZMAX,KRFREEZ,ICEMAX,NKR)
6573 INTEGER KR,ICE,ICE_TYPE
6574 REAL COL,AFREEZMY,BFREEZMY,BFREEZMAX
6575 INTEGER KRFREEZ,ICEMAX,NKR
6576 REAL DT,RO,YKK,PF,PF_1,DEL_T,TT_DROP,ARG_1,YK2,DF1,BF,ARG_M, &
6577 TT_DROP_AFTER_FREEZ,CFREEZ,SUM_ICE,TIN,TTIN,AF,FF_MAX,F1_MAX, &
6578 F2_MAX,F3_MAX,F4_MAX,F5_MAX
6580 REAL FF1(NKR),XL(NKR),FF2(NKR,ICEMAX) &
6581 ,XI(NKR,ICEMAX),FF3(NKR),XS(NKR),FF4(NKR) &
6582 ,XG(NKR),FF5(NKR),XH(NKR)
6593 F1_MAX=AMAX1(F1_MAX,FF1(KR))
6594 F3_MAX=AMAX1(F3_MAX,FF3(KR))
6595 F4_MAX=AMAX1(F4_MAX,FF4(KR))
6596 F5_MAX=AMAX1(F5_MAX,FF5(KR))
6598 F2_MAX=AMAX1(F2_MAX,FF2(KR,ICE))
6600 FF_MAX=AMAX1(F2_MAX,F3_MAX,F4_MAX,F5_MAX)
6603 !******************************* FREEZING ****************************
6605 IF(DEL_T.LT.0.AND.F1_MAX.NE.0) THEN
6608 CFREEZ =(BFREEZMAX-BFREEZMY)/XL(NKR)
6610 !***************************** MASS LOOP **************************
6614 BF =BFREEZMY+CFREEZ*ARG_M
6615 PF_1 =AF*EXP(-BF*DEL_T)
6618 DF1 =FF1(KR)*(1.-YKK)
6621 IF(KR.LE.KRFREEZ) THEN
6622 FF2(KR,ICE_TYPE)=FF2(KR,ICE_TYPE)+YK2
6624 FF5(KR) =FF5(KR)+YK2
6626 SUM_ICE=SUM_ICE+YK2*3.*XL(KR)*XL(KR)*COL
6628 !************************ END OF "MASS LOOP" **************************
6632 !************************** NEW TEMPERATURE *************************
6634 ARG_1 =333.*SUM_ICE/RO
6635 TT_DROP_AFTER_FREEZ=TTIN+ARG_1
6636 TIN =TT_DROP_AFTER_FREEZ
6638 !************************** END OF "FREEZING" ****************************
6643 END SUBROUTINE FREEZ
6644 ! ----------------------------------------------------------------+
6645 SUBROUTINE J_W_MELT(FF1,XL,FF2,XI,FF3,XS,FF4,XG,FF5,XH &
6646 ,TIN,DT,RO,COL,ICEMAX,NKR)
6650 integer,intent(in) :: NKR,ICEMAX
6651 real(kind=R4size),intent(in) :: DT,COL,RO
6652 real(kind=R4size),intent(inout) :: FF1(:),XL(:),FF2(:,:),XI(:,:),FF3(:),XS(:),FF4(:),XG(:), &
6656 integer :: KR,ICE,ICE_TYPE
6657 real(kind=R4size) :: ARG_M,TT_DROP,ARG_1,TT_DROP_AFTER_FREEZ,DF1,DN,DN0, &
6658 A,B,DTFREEZ,SUM_ICE,FF_MAX,F1_MAX,F2_MAX,F3_MAX,F4_MAX,F5_MAX, &
6659 DEL_T,meltrate,gamma
6671 F1_MAX=AMAX1(F1_MAX,FF1(KR))
6672 F3_MAX=AMAX1(F3_MAX,FF3(KR))
6673 F4_MAX=AMAX1(F4_MAX,FF4(KR))
6674 F5_MAX=AMAX1(F5_MAX,FF5(KR))
6676 F2_MAX=AMAX1(F2_MAX,FF2(KR,ICE))
6678 FF_MAX=AMAX1(F2_MAX,F3_MAX,F4_MAX,F5_MAX)
6681 IF(DEL_T.GE.0.AND.FF_MAX.NE.0) THEN
6686 IF (KR .le. 10) THEN
6687 ARG_M = ARG_M+FF2(KR,ICE)
6689 ELSE IF (KR .gt. 10 .and. KR .lt. 18) THEN
6691 FF2(KR,ICE)=FF2(KR,ICE)-FF2(KR,ICE)*(meltrate*dt)
6692 ARG_M=ARG_M+FF2(KR,ICE)*(meltrate*dt)
6694 meltrate = 0.683/120.
6695 FF2(KR,ICE)=FF2(KR,ICE)-FF2(KR,ICE)*(meltrate*dt)
6696 ARG_M=ARG_M+FF2(KR,ICE)*(meltrate*dt)
6699 IF (ICE ==2 .or. ICE ==3) THEN
6700 IF (kr .le. 12) THEN
6702 ARG_M = ARG_M+FF2(KR,ICE)
6703 ELSE IF (kr .gt. 12 .and. kr .lt. 20) THEN
6705 FF2(KR,ICE)=FF2(KR,ICE)-FF2(KR,ICE)*(meltrate*dt)
6706 ARG_M=ARG_M+FF2(KR,ICE)*(meltrate*dt)
6708 meltrate = 0.683/120.
6709 FF2(KR,ICE)=FF2(KR,ICE)-FF2(KR,ICE)*(meltrate*dt)
6710 ARG_M=ARG_M+FF2(KR,ICE)*(meltrate*dt)
6715 IF (kr .le. 14) THEN
6716 ARG_M = ARG_M + FF3(KR)
6718 ELSE IF (kr .gt. 14 .and. kr .lt. 22) THEN
6720 FF3(KR)=FF3(KR)-FF3(KR)*(meltrate*dt)
6721 ARG_M=ARG_M+FF3(KR)*(meltrate*dt)
6723 meltrate = 0.683/120.
6724 FF3(KR)=FF3(KR)-FF3(KR)*(meltrate*dt)
6725 ARG_M=ARG_M+FF3(KR)*(meltrate*dt)
6728 IF (kr .le. 13) then
6729 ARG_M = ARG_M+FF4(KR)+FF5(KR)
6732 ELSE IF (kr .gt. 13 .and. kr .lt. 23) THEN
6734 FF4(KR)=FF4(KR)-FF4(KR)*(meltrate*dt)
6735 FF5(KR)=FF5(KR)-FF5(KR)*(meltrate*dt)
6736 ARG_M=ARG_M+(FF4(KR)+FF5(KR))*(meltrate*dt)
6738 meltrate = 0.683/120.
6739 FF4(KR)=FF4(KR)-FF4(KR)*(meltrate*dt)
6740 FF5(KR)=FF5(KR)-FF5(KR)*(meltrate*dt)
6741 ARG_M=ARG_M+(FF4(KR)+FF5(KR))*(meltrate*dt)
6744 FF1(KR) = FF1(KR) + ARG_M
6745 SUM_ICE=SUM_ICE+ARG_M*3.*XL(KR)*XL(KR)*COL
6748 ARG_1=333.*SUM_ICE/RO
6753 END SUBROUTINE J_W_MELT
6754 ! +----------------------------------------------------------------------------+
6755 SUBROUTINE ONECOND1 &
6758 & ,DEL1N,DEL2N,DIV1,DIV2 &
6759 & ,FF1,PSI1,R1,RLEC,RO1BL &
6760 & ,AA1_MY,BB1_MY,AA2_MY,BB2_MY &
6762 & ,COL,DTCOND,ICEMAX,NKR,ISYM1 &
6763 ,ISYM2,ISYM3,ISYM4,ISYM5,Iin,Jin,Kin,W_in,DX_in,Itimestep)
6768 INTEGER NKR,ICEMAX, ISYM1, ISYM2(ICEMAX),ISYM3,ISYM4,ISYM5, Iin, Jin, Kin, &
6769 sea_spray_no_temp_change_per_grid, Itimestep
6770 REAL COL,VR1(NKR),PSINGLE &
6771 & ,AA1_MY,BB1_MY,AA2_MY,BB2_MY &
6772 & ,DTCOND, W_in,DX_in
6775 INTEGER I_ABERGERON,I_BERGERON, &
6776 & KR,ICE,ITIME,KCOND,NR,NRM, &
6779 REAL AL1,AL2,D,GAM,POD, &
6780 & RV_MY,CF_MY,D_MYIN,AL1_MY,AL2_MY,ALC,DT0LREF,DTLREF, &
6781 & A1_MYN, BB1_MYN, A2_MYN, BB2_MYN,DT,DTT,XRAD, &
6782 & TPC1, TPC2, TPC3, TPC4, TPC5, &
6783 & EPSDEL, EPSDEL2,DT0L, DT0I,&
6785 & CWHUCM,B6,B8L,B8I, &
6786 & DEL1,DEL2,DEL1S,DEL2S, &
6787 & TIMENEW,TIMEREV,SFN11,SFN12, &
6788 & SFNL,SFNI,B5L,B5I,B7L,B7I,DOPL,DOPI,RW,RI,QW,PW, &
6789 & PI,QI,DEL1N0,DEL2N0,D1N0,D2N0,DTNEWL,DTNEWL1,D1N,D2N, &
6790 & DEL_R1,DT0L0,DT0I0, &
6793 REAL DT_WATER_COND,DT_WATER_EVAP
6796 ! NEW ALGORITHM OF CONDENSATION (12.01.00)
6798 REAL FF1_OLD(NKR),SUPINTW(NKR)
6799 DOUBLE PRECISION DSUPINTW(NKR),DD1N,DB11_MY,DAL1,DAL2
6800 DOUBLE PRECISION COL3,RORI,TPN,TPS,QPN,QPS,TOLD,QOLD &
6801 & ,FI1_K,FI2_K,FI3_K,FI4_K,FI5_K &
6802 & ,R1_K,R2_K,R3_K,R4_K,R5_K &
6803 & ,FI1R1,FI2R2,FI3R3,FI4R4,FI5R5 &
6804 & ,RMASSLAA,RMASSLBB,RMASSIAA,RMASSIBB &
6805 & ,ES1N,ES2N,EW1N,ARGEXP &
6807 & ,DEL1N,DEL2N,DIV1,DIV2 &
6808 & ,OPER2,OPER3,AR1,AR2
6810 DOUBLE PRECISION DELMASSL1
6815 & ,RLEC(NKR),RO1BL(NKR) &
6816 & ,FI1(NKR),FF1(NKR),PSI1(NKR) &
6817 & ,B11_MY(NKR),B12_MY(NKR)
6821 ! NEW ALGORITHM OF MIXED PHASE FOR EVAPORATION
6824 REAL DTIMEO(NKR),DTIMEL(NKR) &
6827 ! NEW ALGORITHM (NO TYPE OF ICE)
6829 REAL :: FL1(NKR), sfndummy(3), R1N(NKR)
6832 DOUBLE PRECISION :: R1D(NKR),R1ND(NKR)
6834 OPER2(AR1)=0.622/(0.622+0.378*AR1)/AR1
6835 OPER3(AR1,AR2)=AR1*AR2/(0.622+0.378*AR1)
6837 DATA AL1 /2500./, AL2 /2834./, D /0.211/ &
6838 & ,GAM /1.E-4/, POD /10./
6840 DATA RV_MY,CF_MY,D_MYIN,AL1_MY,AL2_MY &
6841 & /461.5,0.24E-1,0.211E-4,2.5E6,2.834E6/
6843 DATA A1_MYN, BB1_MYN, A2_MYN, BB2_MYN &
6844 & /2.53,5.42,3.41E1,6.13/
6846 DATA TPC1, TPC2, TPC3, TPC4, TPC5 &
6847 & /-4.0,-8.1,-12.7,-17.8,-22.4/
6850 DATA EPSDEL, EPSDEL2 /0.1E-03,0.1E-03/
6852 DATA DT0L, DT0I /1.E20,1.E20/
6854 DOUBLE PRECISION :: DEL1_d , DEL2_d, RW_d , PW_d, RI_d, PI_d, D1N_d, D2N_d, &
6898 ! WARM MP (CONDENSATION OR EVAPORATION) (BEGIN)
6910 TIMEREV = DT-TIMENEW
6911 TIMEREV = DT-TIMENEW
6923 (R1D,TPS,PP,VR1_d,RLEC,RO1BL,B11_MY,1,1,fl1,NKR,ICEMAX)
6925 CALL JERTIMESC_KS(FI1,R1D,SFNDUMMY,B11_MY,B8L,1,NKR,ICEMAX,COL)
6930 SFNL = SFN11 + SFN12
6939 RW=(OPER2(QPS)+B5L*AL1)*DOPL*SFNL
6940 RI=(OPER2(QPS)+B5L*AL2)*DOPL*SFNI
6942 PW=(OPER2(QPS)+B5I*AL1)*DOPI*SFNL
6943 PI=(OPER2(QPS)+B5I*AL2)*DOPI*SFNI
6946 IF(RW.NE.RW .or. PW.NE.PW)THEN
6947 print*, 'NaN In ONECOND1'
6948 call wrf_error_fatal("fatal error in ONECOND1 (RW or PW are NaN), model stop")
6952 IF(DEL1N >= 0.0D0) KCOND=11
6954 IF(KCOND == 11) THEN
6957 DTNEWL = AMIN1(DTNEWL,TIMEREV)
6958 TIMENEW = TIMENEW + DTNEWL
6961 IF (DTT < 0.0) call wrf_error_fatal("fatal error in ONECOND1-DEL1N>0:(DTT<0), model stop")
6970 CALL JERSUPSAT_KS(DEL1_d,DEL2_d,DEL1N,DEL2N, &
6971 RW_d,PW_d,RI_d,PI_d, &
6972 DTT,D1N_d,D2N_d,0.0,0.0, &
6973 ISYM1,ISYM2,ISYM3,ISYM4,ISYM5)
6985 CALL JERDFUN_KS(R1D, R1ND, B11_MY, FI1, PSI1, fl1, D1N, &
6986 ISYM1, 1, 1, TPN, IDROP, FR_LIM, FRH_LIM, ICEMAX, NKR, COL, 1, Iin, Jin ,Kin, Itimestep)
6989 IF((DEL1.GT.0.AND.DEL1N.LT.0) &
6990 &.AND.ABS(DEL1N).GT.EPSDEL) THEN
6991 call wrf_error_fatal("fatal error in ONECOND1-1 (DEL1.GT.0.AND.DEL1N.LT.0), model stop")
6994 ! IN CASE : KCOND.EQ.11
6997 ! EVAPORATION - ONLY WATER
6998 ! IN CASE : KCOND.NE.11
7001 DTNEWL = AMIN1(DTNEWL,TIMEREV)
7002 TIMENEW = TIMENEW + DTNEWL
7005 IF (DTT < 0.0) call wrf_error_fatal("fatal error in ONECOND1-DEL1N<0:(DTT<0), model stop")
7013 CALL JERSUPSAT_KS(DEL1_d,DEL2_d,DEL1N,DEL2N, &
7014 RW_d,PW_d,RI_d,PI_d, &
7015 DTT,D1N_d,D2N_d,0.0,0.0, &
7016 ISYM1,ISYM2,ISYM3,ISYM4,ISYM5)
7028 CALL JERDFUN_KS(R1D, R1ND, B11_MY, &
7029 FI1, PSI1, fl1, D1N, &
7030 ISYM1, 1, 1, TPN, IDROP, FR_LIM, FRH_LIM, ICEMAX, NKR, COL, 1, Iin, Jin ,Kin, Itimestep)
7033 IF((DEL1.LT.0.AND.DEL1N.GT.0) &
7034 .AND.ABS(DEL1N).GT.EPSDEL) THEN
7035 call wrf_error_fatal("fatal error in ONECOND1-2 (DEL1.LT.0.AND.DEL1N.GT.0), model stop")
7044 ! ... before JERNEWF (ONLY WATER)
7048 FI1R1 = FI1_K*R1_K*R1_K
7049 RMASSLBB = RMASSLBB+FI1R1
7051 RMASSLBB = RMASSLBB*COL3*RORI
7052 IF(RMASSLBB.LE.0.) RMASSLBB=0.
7053 ! ... after JERNEWF (ONLY WATER)
7057 FI1R1=FI1_K*R1_K*R1_K
7058 RMASSLAA=RMASSLAA+FI1R1
7060 RMASSLAA=RMASSLAA*COL3*RORI
7061 IF(RMASSLAA.LE.0.) RMASSLAA=0.
7063 DELMASSL1 = RMASSLAA - RMASSLBB
7064 QPN = QPS - DELMASSL1
7066 TPN = TPS + DAL1*DELMASSL1
7068 IF(ABS(DAL1*DELMASSL1) > 3.0 )THEN
7069 print*,"ONECOND1-in(start)"
7070 print*,"I=",Iin,"J=",Jin,"Kin",Kin,"W",w_in,"DX",dx_in
7071 print*,"DELMASSL1",DELMASSL1,"DT",DTT
7072 print*,"DEL1N,DEL2N,DEL1,DEL2,D1N,D2N,RW,PW,RI,PI,DT"
7073 print*,DEL1N,DEL2N,DEL1,DEL2,D1N,D2N,RW,PW,RI,PI,DTT
7074 print*,"TPS",TPS,"QPS",QPS
7075 print*,'FI1 before',FI1,'PSI1 after',PSI1
7076 print*,"ONECOND1-in(end)"
7077 call wrf_error_fatal("fatal error in ONECOND1-in (ABS(DAL1*DELMASSL1) > 3.0), model stop")
7080 ! ... SUPERSATURATION (ONLY WATER)
7082 ES1N=AA1_MY*DEXP(ARGEXP)
7084 ES2N=AA2_MY*DEXP(ARGEXP)
7086 IF(ES1N == 0.0D0)THEN
7091 DEL1N = EW1N/ES1N-1.
7093 IF(ES2N == 0.0D0)THEN
7097 DEL2N = EW1N/ES2N-1.
7102 SUPINTW(KR)=SUPINTW(KR)+B11_MY(KR)*D1N
7105 DSUPINTW(KR)=DSUPINTW(KR)+DB11_MY*DD1N
7109 ! ... REPEATE TIME STEP (ONLY WATER: CONDENSATION OR EVAPORATION)
7110 IF(TIMENEW.LT.DT) GOTO 56
7115 CALL JERDFUN_NEW_KS (R1D,R1ND,SUPINTW, &
7117 TPN,IDROP,FR_LIM, NKR, COL,1,Iin,Jin,Kin,Itimestep)
7118 ENDIF ! in case ISYM1/=0
7126 FI1R1=FI1_K*R1_K*R1_K
7127 RMASSLBB=RMASSLBB+FI1R1
7129 RMASSLBB=RMASSLBB*COL3*RORI
7130 IF(RMASSLBB.LT.0.0) RMASSLBB=0.0
7135 FI1R1=FI1_K*R1_K*R1_K
7136 RMASSLAA=RMASSLAA+FI1R1
7138 RMASSLAA=RMASSLAA*COL3*RORI
7139 IF(RMASSLAA.LT.0.0) RMASSLAA=0.0
7140 DELMASSL1 = RMASSLAA-RMASSLBB
7142 QPN = QOLD - DELMASSL1
7144 TPN = TOLD + DAL1*DELMASSL1
7146 IF(ABS(DAL1*DELMASSL1) > 5.0 )THEN
7147 print*,"ONECOND1-out (start)"
7148 print*,"I=",Iin,"J=",Jin,"Kin",Kin,"W",w_in,"DX",dx_in
7149 print*,"DEL1N,DEL2N,D1N,D2N,RW,PW,RI,PI,DT"
7150 print*,DEL1N,DEL2N,D1N,D2N,RW,PW,RI,PI,DTT
7151 print*,"I=",Iin,"J=",Jin,"Kin",Kin
7152 print*,"TPS=",TPS,"QPS=",QPS,"delmassl1",delmassl1
7154 print*,RMASSLBB,RMASSLAA
7157 print*,"ONECOND1-out (end)"
7158 IF(ABS(DAL1*DELMASSL1) > 5.0 )THEN
7159 call wrf_error_fatal("fatal error in ONECOND1-out (ABS(DAL1*DELMASSL1) > 5.0), model stop")
7163 ! ... SUPERSATURATION
7165 ES1N=AA1_MY*DEXP(ARGEXP)
7167 ES2N=AA2_MY*DEXP(ARGEXP)
7169 IF(ES1N == 0.0D0)THEN
7172 call wrf_error_fatal("fatal error in ONECOND1 (ES1N.EQ.0), model stop")
7180 call wrf_error_fatal("fatal error in ONECOND1 (ES2N.EQ.0), model stop")
7193 END SUBROUTINE ONECOND1
7194 ! +----------------------------------------------------------------------------+
7195 SUBROUTINE ONECOND2 &
7197 & ,VR2,VR3,VR4,VR5,PSINGLE &
7198 & ,DEL1N,DEL2N,DIV1,DIV2 &
7199 & ,FF2,PSI2,R2,RIEC,RO2BL &
7200 & ,FF3,PSI3,R3,RSEC,RO3BL &
7201 & ,FF4,PSI4,R4,RGEC,RO4BL &
7202 & ,FF5,PSI5,R5,RHEC,RO5BL &
7203 & ,AA1_MY,BB1_MY,AA2_MY,BB2_MY &
7205 & ,COL,DTCOND,ICEMAX,NKR &
7206 & ,ISYM1,ISYM2,ISYM3,ISYM4,ISYM5, &
7207 Iin,Jin,Kin,W_in,DX_in,Itimestep)
7211 INTEGER NKR,ICEMAX,ISYM1, Iin, Jin, Kin, Itimestep
7212 REAL COL,VR2(NKR,ICEMAX),VR3(NKR),VR4(NKR) &
7213 & ,VR5(NKR),PSINGLE &
7214 & ,AA1_MY,BB1_MY,AA2_MY,BB2_MY &
7215 & ,DTCOND,W_in,DX_in
7218 INTEGER I_MIXCOND,I_MIXEVAP,I_ABERGERON,I_BERGERON, &
7219 & KR,ICE,ITIME,ICM,KCOND,NR,NRM,INUC, &
7220 & ISYM2(ICEMAX),ISYM3,ISYM4,ISYM5,KP,KLIMIT, &
7221 & KM,ITER,KLIMITL,KLIMITG,KLIMITH,KLIMITI_1,KLIMITI_2,KLIMITI_3, &
7223 REAL AL1,AL2,D,GAM,POD, &
7224 & RV_MY,CF_MY,D_MYIN,AL1_MY,AL2_MY,ALC,DT0LREF,DTLREF, &
7225 & A1_MYN, BB1_MYN, A2_MYN, BB2_MYN,DT,DTT,XRAD, &
7226 & TPC1, TPC2, TPC3, TPC4, TPC5, &
7227 & EPSDEL, DT0L, DT0I, &
7229 & DEL1NUC,DEL2NUC, &
7230 & CWHUCM,B6,B8L,B8I,RMASSGL,RMASSGI, &
7231 & DEL1,DEL2,DEL1S,DEL2S, &
7232 & TIMENEW,TIMEREV,SFN11,SFN12, &
7233 & SFNL,SFNI,B5L,B5I,B7L,B7I,DOPL,DOPI,OPERQ,RW,RI,QW,PW, &
7234 & PI,QI,D1N0,D2N0,DTNEWL,DTNEWL1,D1N,D2N, &
7235 & DEL_R1,DT0L0,DT0I0,SFN31,SFN32,SFN52, &
7236 & SFNII1,SFN21,SFN22,DTNEWI3,DTNEWI4,DTNEWI5,DTNEWI2_1, &
7237 & DTNEWI2_2,DTNEWI1,DEL_R2,DEL_R4,DEL_R5,SFN41,SFN42, &
7238 & SNF51,DTNEWI2_3,DTNEWI2,DTNEWI_1,DTNEWI_2, &
7239 & DTNEWL0,DTNEWG1,DTNEWH1,DTNEWI_3, &
7240 & DTNEWL2,SFN51,SFNII2,DEL_R3,DTNEWI
7241 REAL DT_WATER_COND,DT_WATER_EVAP,DT_ICE_COND,DT_ICE_EVAP, &
7242 & DT_MIX_COND,DT_MIX_EVAP,DT_MIX_BERGERON,DT_MIX_ANTIBERGERON
7246 DOUBLE PRECISION DD1N,DB11_MY,DAL1,DAL2
7247 DOUBLE PRECISION COL3,RORI,TPN,TPS,QPN,QPS,TOLD,QOLD &
7248 & ,FI1_K,FI2_K,FI3_K,FI4_K,FI5_K &
7249 & ,R1_K,R2_K,R3_K,R4_K,R5_K &
7250 & ,FI1R1,FI2R2,FI3R3,FI4R4,FI5R5 &
7251 & ,RMASSLAA,RMASSLBB,RMASSIAA,RMASSIBB &
7252 & ,ES1N,ES2N,EW1N,ARGEXP &
7254 & ,DEL1N,DEL2N,DIV1,DIV2 &
7255 & ,OPER2,OPER3,AR1,AR2
7257 DOUBLE PRECISION DELTAQ1,DELMASSI1,DELMASSL1
7263 REAL R2(NKR,ICEMAX) &
7264 & ,RIEC(NKR,ICEMAX) &
7265 & ,RO2BL(NKR,ICEMAX) &
7266 & ,FI2(NKR,ICEMAX),PSI2(NKR,ICEMAX) &
7267 & ,FF2(NKR,ICEMAX) &
7268 & ,B21_MY(NKR,ICEMAX),B22_MY(NKR,ICEMAX)
7272 & ,RSEC(NKR),RO3BL(NKR) &
7273 & ,FI3(NKR),FF3(NKR),PSI3(NKR) &
7274 & ,B31_MY(NKR),B32_MY(NKR)
7279 & ,RGEC(NKR),RO4BL(NKR) &
7280 & ,FI4(NKR),FF4(NKR),PSI4(NKR) &
7281 & ,B41_MY(NKR),B42_MY(NKR)
7285 & ,RHEC(NKR),RO5BL(NKR) &
7286 & ,FI5(NKR),FF5(NKR),PSI5(NKR) &
7287 & ,B51_MY(NKR),B52_MY(NKR)
7291 REAL DTIMEG(NKR),DTIMEH(NKR)
7293 REAL DEL2D(ICEMAX),DTIMEO(NKR),DTIMEL(NKR) &
7295 & ,DTIMEI_1(NKR),DTIMEI_2(NKR),DTIMEI_3(NKR) &
7296 & ,SFNI1(ICEMAX),SFNI2(ICEMAX) &
7298 & ,FI1REF(NKR),PSI1REF(NKR) &
7299 & ,FI2REF(NKR,ICEMAX),PSI2REF(NKR,ICEMAX)&
7302 REAL :: FL1(NKR), sfndummy(3), FL3(NKR), FL4(NKR), FL5(NKR), &
7303 R2N(NKR,ICEMAX), R3N(NKR), R4N(NKR), R5N(NKR)
7304 INTEGER :: IDROP, ISYMICE
7305 DOUBLE PRECISION :: R2D(NKR,ICEMAX),R3D(NKR), R4D(NKR), R5D(NKR), &
7306 R2ND(NKR,ICEMAX),R3ND(NKR), R4ND(NKR), R5ND(NKR), &
7307 VR2_d(NKR,ICEMAX), VR3_d(NKR), VR4_d(NKR), VR5_d(NKR)
7309 OPER2(AR1)=0.622/(0.622+0.378*AR1)/AR1
7310 OPER3(AR1,AR2)=AR1*AR2/(0.622+0.378*AR1)
7312 DATA AL1 /2500./, AL2 /2834./, D /0.211/ &
7313 & ,GAM /1.E-4/, POD /10./
7315 DATA RV_MY,CF_MY,D_MYIN,AL1_MY,AL2_MY &
7316 & /461.5,0.24E-1,0.211E-4,2.5E6,2.834E6/
7318 DATA A1_MYN, BB1_MYN, A2_MYN, BB2_MYN &
7319 & /2.53,5.42,3.41E1,6.13/
7321 DATA TPC1, TPC2, TPC3, TPC4, TPC5 &
7322 & /-4.0,-8.1,-12.7,-17.8,-22.4/
7324 DATA EPSDEL/0.1E-03/
7326 DATA DT0L, DT0I /1.E20,1.E20/
7328 DOUBLE PRECISION :: DEL1_d, DEL2_d, RW_d, PW_d, RI_d, PI_d, D1N_d, D2N_d
7370 DT_MIX_ANTIBERGERON=0.4
7402 ! ONLY ICE (CONDENSATION OR EVAPORATION) :
7404 46 ITIME = ITIME + 1
7422 FI2(KR,ICE)=PSI2(KR,ICE)
7426 IF(sum(ISYM2) > 0) THEN
7430 CALL JERRATE_KS (R2D,TPS,PP,VR2_d,RIEC,RO2BL,B21_MY,3,2,fl1,NKR,ICEMAX)
7432 CALL JERTIMESC_KS (FI2,R2D,SFNI1,B21_MY,B8I,ICM,NKR,ICEMAX,COL)
7438 CALL JERRATE_KS (R3D,TPS,PP,VR3_d,RSEC,RO3BL,B31_MY,1,3,fl3,NKR,ICEMAX)
7441 CALL JERTIMESC_KS(FI3,R3D,SFNDUMMY,B31_MY,B8I,1,NKR,ICEMAX,COL)
7448 CALL JERRATE_KS(R4D,TPS,PP,VR4_d,RGEC,RO4BL,B41_MY,1,2,fl4,NKR,ICEMAX)
7451 CALL JERTIMESC_KS(FI4,R4D,SFNDUMMY,B41_MY,B8I,1,NKR,ICEMAX,COL)
7458 CALL JERRATE_KS(R5D,TPS,PP,VR5_d,RHEC,RO5BL,B51_MY,1,2,fl5,NKR,ICEMAX)
7461 CALL JERTIMESC_KS(FI5,R5D,SFNDUMMY,B51_MY,B8I,1,NKR,ICEMAX,COL)
7466 SFNII1 = SFNI1(1) + SFNI1(2) + SFNI1(3)
7467 SFN21 = SFNII1 + SFN31 + SFN41 + SFN51
7470 SFNI = SFN21 + SFN22
7479 RW=(OPERQ+B5L*AL1)*DOPL*SFNL
7481 PW=(OPERQ+B5I*AL1)*DOPI*SFNL
7482 RI=(OPERQ+B5L*AL2)*DOPL*SFNI
7483 PI=(OPERQ+B5I*AL2)*DOPI*SFNI
7487 IF(DEL2N > 0.0) KCOND=21
7489 IF(RW.NE.RW .or. PW.NE.PW)THEN
7490 print*, 'NaN In ONECOND2'
7491 call wrf_error_fatal("fatal error in ONECOND2 (RW or PW are NaN), model stop")
7495 IF(KCOND == 21) THEN
7496 ! ... ONLY_ICE: CONDENSATION
7498 DTNEWL = AMIN1(DTNEWL,TIMEREV)
7499 TIMENEW = TIMENEW + DTNEWL
7502 IF (DTT < 0.0) call wrf_error_fatal("fatal error in ONECOND2-DEL2N>0:(DTT<0), model stop")
7510 CALL JERSUPSAT_KS(DEL1_d,DEL2_d,DEL1N,DEL2N, &
7511 RW_d,PW_d,RI_d,PI_d, &
7512 DTT,D1N_d,D2N_d,0.0,0.0, &
7513 ISYM1,ISYM2,ISYM3,ISYM4,ISYM5)
7523 IF(sum(ISYM2) > 0)THEN
7526 IF(ISYM2(1) == 1) THEN
7527 CALL JERDFUN_KS(R2D(:,1), R2ND(:,1), B21_MY(:,1), &
7528 FI2(:,1), PSI2(:,1), fl1, D2N, &
7529 ISYM2(1), ICM, 1, TPN, IDROP, FR_LIM, FRH_LIM, ICEMAX, NKR, COL, 21, Iin, Jin ,Kin, Itimestep)
7531 IF(ISYM2(2) == 1) THEN
7532 CALL JERDFUN_KS(R2D(:,2), R2ND(:,2), B21_MY(:,2), &
7533 FI2(:,2), PSI2(:,2), fl1, D2N, &
7534 ISYM2(2), ICM, 2, TPN, IDROP, FR_LIM, FRH_LIM, ICEMAX, NKR, COL, 22, Iin, Jin ,Kin, Itimestep)
7536 IF(ISYM2(3) == 1) THEN
7537 CALL JERDFUN_KS(R2D(:,3), R2ND(:,3), B21_MY(:,3), &
7538 FI2(:,3), PSI2(:,3), fl1, D2N, &
7539 ISYM2(3), ICM, 3, TPN, IDROP, FR_LIM, FRH_LIM, ICEMAX, NKR, COL, 23, Iin, Jin ,Kin, Itimestep)
7541 ! IN CASE : ISYM2.NE.0
7548 CALL JERDFUN_KS(R3D, R3ND, B31_MY, &
7549 FI3, PSI3, fl3, D2N, &
7550 ISYM3, 1, 3, TPN, IDROP, FR_LIM, FRH_LIM, ICEMAX, NKR, COL, 3, Iin, Jin ,Kin, Itimestep)
7557 CALL JERDFUN_KS(R4D, R4ND, B41_MY, &
7558 FI4, PSI4, fl4, D2N, &
7559 ISYM4, 1, 4, TPN, IDROP, FR_LIM, FRH_LIM, ICEMAX, NKR, COL, 4, Iin, Jin ,Kin, Itimestep)
7560 ! IN CASE : ISYM4.NE.0
7566 CALL JERDFUN_KS(R5D, R5ND, B51_MY, &
7567 FI5, PSI5, fl5, D2N, &
7568 ISYM5, 1, 5, TPN, IDROP, FR_LIM, FRH_LIM, ICEMAX, NKR, COL, 5, Iin, Jin ,Kin, Itimestep)
7569 ! IN CASE : ISYM5.NE.0
7572 IF((DEL2.GT.0.AND.DEL2N.LT.0) &
7573 .AND.ABS(DEL2N).GT.EPSDEL) THEN
7574 call wrf_error_fatal("fatal error in module_mp_fast_sbm (DEL2.GT.0.AND.DEL2N.LT.0), model stop")
7578 ! ... IN CASE KCOND.NE.21
7579 ! ONLY ICE: EVAPORATION
7581 DTNEWL = AMIN1(DTNEWL,TIMEREV)
7582 TIMENEW = TIMENEW + DTNEWL
7585 IF (DTT < 0.0) call wrf_error_fatal("fatal error in ONECOND2-DEL2N<0:(DTT<0), model stop")
7593 CALL JERSUPSAT_KS(DEL1_d,DEL2_d,DEL1N,DEL2N, &
7594 RW_d,PW_d,RI_d,PI_d, &
7595 DTT,D1N_d,D2N_d,0.0,0.0, &
7596 ISYM1,ISYM2,ISYM3,ISYM4,ISYM5)
7606 IF(sum(ISYM2) > 0) THEN
7610 CALL JERDFUN_KS(R2D(:,1), R2ND(:,1), B21_MY(:,1), &
7611 FI2(:,1), PSI2(:,1), fl1, D2N, &
7612 ISYM2(1), ICM, 1, TPN, IDROP, FR_LIM, FRH_LIM, ICEMAX, NKR, COL, 21, Iin, Jin ,Kin, Itimestep)
7615 CALL JERDFUN_KS(R2D(:,2), R2ND(:,2), B21_MY(:,2), &
7616 FI2(:,2), PSI2(:,2), fl1, D2N, &
7617 ISYM2(2), ICM, 2, TPN, IDROP, FR_LIM, FRH_LIM, ICEMAX, NKR, COL, 22, Iin, Jin ,Kin, Itimestep)
7620 CALL JERDFUN_KS(R2D(:,3), R2ND(:,3), B21_MY(:,3), &
7621 FI2(:,3), PSI2(:,3), fl1, D2N, &
7622 ISYM2(3), ICM, 3, TPN, IDROP, FR_LIM, FRH_LIM, ICEMAX, NKR, COL, 23, Iin, Jin ,Kin, Itimestep)
7630 CALL JERDFUN_KS(R3D, R3ND, B31_MY, &
7631 FI3, PSI3, fl3, D2N, &
7632 ISYM3, 1, 3, TPN, IDROP, FR_LIM, FRH_LIM, ICEMAX, NKR, COL, 3, Iin, Jin ,Kin, Itimestep)
7633 ! IN CASE : ISYM3.NE.0
7637 ! ... GRAUPELS (ONLY_ICE: EVAPORATION)
7641 CALL JERDFUN_KS(R4D, R4ND, B41_MY, &
7642 FI4, PSI4, fl4, D2N, &
7643 ISYM4, 1, 4, TPN, IDROP, FR_LIM, FRH_LIM, ICEMAX, NKR, COL, 4, Iin, Jin ,Kin, Itimestep)
7644 ! IN CASE : ISYM4.NE.0
7648 ! ... HAIL (ONLY_ICE: EVAPORATION)
7652 CALL JERDFUN_KS(R5D, R5ND, B51_MY, &
7653 FI5, PSI5, fl5, D2N, &
7654 ISYM5, 1, 5, TPN, IDROP, FR_LIM, FRH_LIM, ICEMAX, NKR, COL, 5, Iin, Jin ,Kin, Itimestep)
7655 ! IN CASE : ISYM5.NE.0
7658 IF((DEL2.LT.0.AND.DEL2N.GT.0) &
7659 .AND.ABS(DEL2N).GT.EPSDEL) THEN
7660 call wrf_error_fatal("fatal error in module_mp_fast_sbm (DEL2.LT.0.AND.DEL2N.GT.0), model stop")
7663 ! IN CASE : KCOND.NE.21
7674 FI2R2 = FI2_K*R2_K*R2_K
7675 RMASSIBB = RMASSIBB + FI2R2
7683 FI3R3=FI3_K*R3_K*R3_K
7684 FI4R4=FI4_K*R4_K*R4_K
7685 FI5R5=FI5_K*R5_K*R5_K
7686 RMASSIBB=RMASSIBB+FI3R3
7687 RMASSIBB=RMASSIBB+FI4R4
7688 RMASSIBB=RMASSIBB+FI5R5
7690 RMASSIBB=RMASSIBB*COL3*RORI
7691 IF(RMASSIBB.LT.0.0) RMASSIBB=0.0
7697 FI2R2=FI2_K*R2_K*R2_K
7698 RMASSIAA=RMASSIAA+FI2R2
7706 FI3R3=FI3_K*R3_K*R3_K
7707 FI4R4=FI4_K*R4_K*R4_K
7708 FI5R5=FI5_K*R5_K*R5_K
7709 RMASSIAA=RMASSIAA+FI3R3
7710 RMASSIAA=RMASSIAA+FI4R4
7711 RMASSIAA=RMASSIAA+FI5R5
7713 RMASSIAA = RMASSIAA*COL3*RORI
7715 IF(RMASSIAA.LT.0.0) RMASSIAA=0.0
7717 DELMASSI1 = RMASSIAA-RMASSIBB
7720 TPN = TPS+DAL2*DELMASSI1
7722 IF(ABS(DAL2*DELMASSI1) > 5.0 )THEN
7723 print*,"ONECOND2-out (start)"
7724 print*,"I=",Iin,"J=",Jin,"Kin",Kin,"W",w_in,"DX",dx_in
7725 print*,"DEL1N,DEL2N,D1N,D2N,RW,PW,RI,PI,DT"
7726 print*,DEL1N,DEL2N,D1N,D2N,RW,PW,RI,PI,DTT
7727 print*,"TPS=",TPS,"QPS=",QPS,"delmassi1",delmassi1
7729 print*,RMASSIBB,RMASSIAA
7730 print*,"FI2_1",FI2(:,1)
7731 print*,"FI2_2",FI2(:,2)
7732 print*,"FI2_3",FI2(:,3)
7736 print*,"PSI2_1",PSI2(:,1)
7737 print*,"PSI2_2",PSI2(:,2)
7738 print*,"PSI2_3",PSI2(:,3)
7742 print*,"ONECOND2-out (end)"
7743 IF(ABS(DAL2*DELMASSI1) > 5.0 )THEN
7744 call wrf_error_fatal("fatal error in ONECOND2-out (ABS(DAL2*DELMASSI1) > 5.0), model stop")
7748 ! ... SUPERSATURATION
7750 ES1N=AA1_MY*DEXP(ARGEXP)
7752 ES2N=AA2_MY*DEXP(ARGEXP)
7757 call wrf_error_fatal("fatal error in ONECOND2 (ES1N.EQ.0), model stop")
7765 call wrf_error_fatal("fatal error in ONECOND2 (ES2N.EQ.0), model stop")
7771 ! END OF TIME SPLITTING
7772 ! (ONLY ICE: CONDENSATION OR EVAPORATION)
7773 IF(TIMENEW.LT.DT) GOTO 46
7779 FF2(KR,ICE)=PSI2(KR,ICE)
7787 END SUBROUTINE ONECOND2
7788 ! +----------------------------------------------------------------------------+
7789 SUBROUTINE ONECOND3 &
7791 & ,VR1,VR2,VR3,VR4,VR5,PSINGLE &
7792 & ,DEL1N,DEL2N,DIV1,DIV2 &
7793 & ,FF1,PSI1,R1,RLEC,RO1BL &
7794 & ,FF2,PSI2,R2,RIEC,RO2BL &
7795 & ,FF3,PSI3,R3,RSEC,RO3BL &
7796 & ,FF4,PSI4,R4,RGEC,RO4BL &
7797 & ,FF5,PSI5,R5,RHEC,RO5BL &
7798 & ,AA1_MY,BB1_MY,AA2_MY,BB2_MY &
7800 & ,COL,DTCOND,ICEMAX,NKR &
7801 & ,ISYM1,ISYM2,ISYM3,ISYM4,ISYM5, &
7802 Iin,Jin,Kin,W_in,DX_in, Itimestep)
7805 INTEGER ICEMAX,NKR,KR,ITIME,ICE,KCOND,K &
7806 & ,ISYM1,ISYM2(ICEMAX),ISYM3,ISYM4,ISYM5, Kin, Iin, Jin, Itimestep
7807 INTEGER KLIMITL,KLIMITG,KLIMITH,KLIMITI_1, &
7808 & KLIMITI_2,KLIMITI_3
7809 INTEGER I_MIXCOND,I_MIXEVAP,I_ABERGERON,I_BERGERON
7810 REAL ROR,VR1(NKR),VR2(NKR,ICEMAX),VR3(NKR),VR4(NKR) &
7811 & ,VR5(NKR),PSINGLE &
7812 & ,AA1_MY,BB1_MY,AA2_MY,BB2_MY &
7814 & ,COL,DTCOND,W_in,DX_in
7819 & ,RLEC(NKR),RO1BL(NKR) &
7820 & ,FI1(NKR),FF1(NKR),PSI1(NKR) &
7821 & ,B11_MY(NKR),B12_MY(NKR)
7825 REAL R2(NKR,ICEMAX) &
7826 & ,RIEC(NKR,ICEMAX) &
7827 & ,RO2BL(NKR,ICEMAX) &
7828 & ,FI2(NKR,ICEMAX),PSI2(NKR,ICEMAX) &
7829 & ,FF2(NKR,ICEMAX) &
7830 & ,B21_MY(NKR,ICEMAX),B22_MY(NKR,ICEMAX) &
7831 & ,RATE2(NKR,ICEMAX),DEL_R2M(NKR,ICEMAX)
7835 & ,RSEC(NKR),RO3BL(NKR) &
7836 & ,FI3(NKR),FF3(NKR),PSI3(NKR) &
7837 & ,B31_MY(NKR),B32_MY(NKR) &
7843 & ,RGEC(NKR),RO4BL(NKR) &
7844 & ,FI4(NKR),FF4(NKR),PSI4(NKR) &
7845 & ,B41_MY(NKR),B42_MY(NKR) &
7850 & ,RHEC(NKR),RO5BL(NKR) &
7851 & ,FI5(NKR),FF5(NKR),PSI5(NKR) &
7852 & ,B51_MY(NKR),B52_MY(NKR) &
7855 DOUBLE PRECISION DD1N,DB11_MY,DAL1,DAL2
7856 DOUBLE PRECISION COL3,RORI,TPN,TPS,QPN,QPS,TOLD,QOLD &
7857 & ,FI1_K,FI2_K,FI3_K,FI4_K,FI5_K &
7858 & ,R1_K,R2_K,R3_K,R4_K,R5_K &
7859 & ,FI1R1,FI2R2,FI3R3,FI4R4,FI5R5 &
7860 & ,RMASSLAA,RMASSLBB,RMASSIAA,RMASSIBB &
7861 & ,ES1N,ES2N,EW1N,ARGEXP &
7862 & ,TT,QQ,PP,DEL1N0,DEL2N0 &
7863 & ,DEL1N,DEL2N,DIV1,DIV2 &
7864 & ,OPER2,OPER3,AR1,AR2
7866 DOUBLE PRECISION DELTAQ1,DELMASSI1,DELMASSL1
7868 REAL A1_MYN, BB1_MYN, A2_MYN, BB2_MYN
7869 DATA A1_MYN, BB1_MYN, A2_MYN, BB2_MYN &
7870 & /2.53,5.42,3.41E1,6.13/
7871 REAL B8L,B8I,SFN11,SFN12,SFNL,SFNI
7872 REAL B5L,B5I,B7L,B7I,B6,DOPL,DEL1S,DEL2S,DOPI,RW,QW,PW, &
7873 & RI,PI,QI,SFNI1(ICEMAX),SFNI2(ICEMAX),AL1,AL2
7874 REAL D1N,D2N,DT0L, DT0I,D1N0,D2N0
7875 REAL SFN21,SFN22,SFNII1,SFNII2,SFN31,SFN32,SFN41,SFN42,SFN51, &
7878 REAL TIMEREV,DT,DTT,TIMENEW
7879 REAL DTIMEG(NKR),DTIMEH(NKR),totccn_before,totccn_after
7881 REAL DEL2D(ICEMAX),DTIMEO(NKR),DTIMEL(NKR) &
7882 & ,DTIMEI_1(NKR),DTIMEI_2(NKR),DTIMEI_3(NKR)
7883 REAL DT_WATER_COND,DT_WATER_EVAP,DT_ICE_COND,DT_ICE_EVAP, &
7884 & DT_MIX_COND,DT_MIX_EVAP,DT_MIX_BERGERON,DT_MIX_ANTIBERGERON
7885 REAL DTNEWL0,DTNEWL1,DTNEWI1,DTNEWI2_1,DTNEWI2_2,DTNEWI2_3, &
7886 & DTNEWI2,DTNEWI_1,DTNEWI_2,DTNEWI3,DTNEWI4,DTNEWI5, &
7887 & DTNEWL,DTNEWL2,DTNEWG1,DTNEWH1
7890 DATA AL1 /2500./, AL2 /2834./
7892 DATA EPSDEL, EPSDEL2 /0.1E-03,0.1E-03/
7894 REAL :: FL1(NKR), FL2(NKR,ICEMAX), FL3(NKR), FL4(NKR), FL5(NKR), SFNDUMMY(3), &
7895 R1N(NKR), R2N(NKR,ICEMAX), R3N(NKR), R4N(NKR), R5N(NKR)
7896 INTEGER :: IDROP, ICM, ISYMICE
7897 DOUBLE PRECISION :: R1D(NKR),R2D(NKR,ICEMAX),R3D(NKR), R4D(NKR), R5D(NKR), &
7898 R1ND(NKR),R2ND(NKR,ICEMAX),R3ND(NKR), R4ND(NKR), R5ND(NKR)
7901 DATA DT0L, DT0I /1.E20,1.E20/
7903 DOUBLE PRECISION :: DEL1_d, DEL2_d , RW_d, PW_d , RI_d , PI_d , D1N_d, D2N_d, &
7904 VR1_d(NKR), VR2_d(NKR,ICEMAX), VR3_d(NKR), VR4_d(NKR), VR5_d(NKR), &
7905 TTinput,QQinput,DEL1Ninput,DEL2Ninput
7907 OPER2(AR1)=0.622/(0.622+0.378*AR1)/AR1
7908 OPER3(AR1,AR2)=AR1*AR2/(0.622+0.378*AR1)
7959 DT_MIX_ANTIBERGERON=0.4
7980 16 ITIME = ITIME + 1
7981 IF((TPN-273.15).GE.-0.187) GO TO 17
7982 TIMEREV = DT - TIMENEW
7999 FI2(KR,ICE) = PSI2(KR,ICE)
8006 (R1D,TPS,PP,VR1_d,RLEC,RO1BL,B11_MY,1,1,fl1,NKR,ICEMAX)
8009 CALL JERTIMESC_KS(FI1,R1D,SFNDUMMY,B11_MY,B8L,1,NKR,ICEMAX,COL)
8013 IF(sum(ISYM2) > 0) THEN
8016 CALL JERRATE_KS (R2D,TPS,PP,VR2_d,RIEC,RO2BL,B21_MY,3,2,fl1,NKR,ICEMAX)
8017 CALL JERTIMESC_KS (FI2,R2D,SFNI1,B21_MY,B8I,ICM,NKR,ICEMAX,COL)
8022 CALL JERRATE_KS (R3D,TPS,PP,VR3_d,RSEC,RO3BL,B31_MY,1,3,fl3,NKR,ICEMAX)
8024 CALL JERTIMESC_KS(FI3,R3D,SFNDUMMY,B31_MY,B8I,1,NKR,ICEMAX,COL)
8030 CALL JERRATE_KS(R4D,TPS,PP,VR4_d,RGEC,RO4BL,B41_MY,1,2,fl4,NKR,ICEMAX)
8032 CALL JERTIMESC_KS(FI4,R4D,SFNDUMMY,B41_MY,B8I,1,NKR,ICEMAX,COL)
8038 CALL JERRATE_KS(R5D,TPS,PP,VR5_d,RHEC,RO5BL,B51_MY,1,2,fl5,NKR,ICEMAX)
8040 CALL JERTIMESC_KS(FI5,R5D,SFNDUMMY,B51_MY,B8I,1,NKR,ICEMAX,COL)
8044 SFNII1 = SFNI1(1) + SFNI1(2) + SFNI1(3)
8045 SFN21 = SFNII1 + SFN31 + SFN41 + SFN51
8047 SFNL = SFN11 + SFN12
8049 SFNI = SFN21 + SFN22
8057 RW=(OPER2(QPS)+B5L*AL1)*DOPL*SFNL
8059 PW=(OPER2(QPS)+B5I*AL1)*DOPI*SFNL
8060 RI=(OPER2(QPS)+B5L*AL2)*DOPL*SFNI
8061 PI=(OPER2(QPS)+B5I*AL2)*DOPI*SFNI
8064 IF(RW.NE.RW .or. PW.NE.PW)THEN
8065 print*, 'NaN In ONECOND3'
8066 call wrf_error_fatal("fatal error in ONECOND3 (RW or PW are NaN), model stop")
8069 ! DEL1 > 0, DEL2 < 0 (ANTIBERGERON MIXED PHASE - KCOND=50)
8070 ! DEL1 < 0 AND DEL2 < 0 (EVAPORATION MIXED_PHASE - KCOND=30)
8071 ! DEL1 > 0 AND DEL2 > 0 (CONDENSATION MIXED PHASE - KCOND=31)
8072 ! DEL1 < 0, DEL2 > 0 (BERGERON MIXED PHASE - KCOND=32)
8075 IF(DEL1N .LT. 0.0 .AND. DEL2N .LT. 0.0) KCOND=30
8076 IF(DEL1N .GT. 0.0 .AND. DEL2N .GT. 0.0) KCOND=31
8077 IF(DEL1N .LT. 0.0 .AND. DEL2N .GT. 0.0) KCOND=32
8079 IF(KCOND == 50) THEN
8081 DTNEWL = AMIN1(DTNEWL,TIMEREV)
8082 TIMENEW = TIMENEW + DTNEWL
8085 ! ... Incase the Anti-Bregeron regime we do not call diffusional-growth
8086 PRINT*, "Anti-Bregeron Regime, No DIFFU"
8087 PRINT*, DEL1, DEL2, TT, QQ, Kin
8089 ! IN CASE : KCOND = 50
8091 IF(KCOND == 31) THEN
8092 ! ... DEL1 > 0 AND DEL2 > 0 (CONDENSATION MIXED PHASE - KCOND=31)
8093 ! ... CONDENSATION MIXED PHASE (BEGIN)
8095 DTNEWL = AMIN1(DTNEWL,TIMEREV)
8096 TIMENEW = TIMENEW + DTNEWL
8098 ! CONDENSATION MIXED PHASE (END)
8099 ! IN CASE : KCOND = 31
8101 IF(KCOND == 30) THEN
8102 ! ... DEL1 < 0 AND DEL2 < 0 (EVAPORATION MIXED_PHASE - KCOND=30)
8103 ! ... EVAPORATION MIXED PHASE (BEGIN)
8105 DTNEWL = AMIN1(DTNEWL,TIMEREV)
8106 TIMENEW = TIMENEW + DTNEWL
8108 ! EVAPORATION MIXED PHASE (END)
8109 ! IN CASE : KCOND = 30
8111 IF(KCOND == 32) THEN
8112 ! ... IF(DEL1N < 0.0 .AND. DEL2N > 0.0) KCOND=32
8113 ! ... BERGERON MIXED PHASE (BEGIN)
8115 DTNEWL = AMIN1(DTNEWL,TIMEREV)
8116 TIMENEW = TIMENEW + DTNEWL
8118 ! BERGERON MIXED PHASE (END)
8119 ! IN CASE : KCOND = 32
8122 IF (DTT < 0.0) call wrf_error_fatal("fatal error in ONECOND3:(DTT<0), model stop")
8130 CALL JERSUPSAT_KS(DEL1_d,DEL2_d,DEL1N,DEL2N, &
8131 RW_d,PW_d,RI_d,PI_d, &
8132 DTT,D1N_d,D2N_d,0.0,0.0, &
8133 ISYM1,ISYM2,ISYM3,ISYM4,ISYM5)
8145 ! DROPLET DISTRIBUTION FUNCTION
8148 CALL JERDFUN_KS(R1D, R1ND, B11_MY, &
8149 FI1, PSI1, fl1, D1N, &
8150 ISYM1, 1, 1, TPN, IDROP, FR_LIM, FRH_LIM, ICEMAX, NKR, COL, 1, Iin, Jin ,Kin, Itimestep)
8151 ! IN CASE ISYM1.NE.0
8153 IF(sum(ISYM2) > 0) THEN
8158 CALL JERDFUN_KS(R2D(:,1), R2ND(:,1), B21_MY(:,1), &
8159 FI2(:,1), PSI2(:,1), fl1, D2N, &
8160 ISYM2(1), ICM, 1, TPN, IDROP, FR_LIM, FRH_LIM, ICEMAX, NKR, COL, 21, Iin, Jin ,Kin, Itimestep)
8163 CALL JERDFUN_KS(R2D(:,2), R2ND(:,2), B21_MY(:,2), &
8164 FI2(:,2), PSI2(:,2), fl1, D2N, &
8165 ISYM2(2), ICM, 2, TPN, IDROP, FR_LIM, FRH_LIM, ICEMAX, NKR, COL, 22, Iin, Jin ,Kin, Itimestep)
8168 CALL JERDFUN_KS(R2D(:,3), R2ND(:,3), B21_MY(:,3), &
8169 FI2(:,3), PSI2(:,3), fl1, D2N, &
8170 ISYM2(3), ICM, 3, TPN, IDROP, FR_LIM, FRH_LIM, ICEMAX, NKR, COL, 23, Iin, Jin ,Kin, Itimestep)
8178 CALL JERDFUN_KS(R3D, R3ND, B31_MY, &
8179 FI3, PSI3, fl3, D2N, &
8180 ISYM3, 1, 3, TPN, IDROP, FR_LIM, FRH_LIM, ICEMAX, NKR, COL, 3, Iin, Jin ,Kin, Itimestep)
8181 ! IN CASE ISYM3.NE.0
8188 CALL JERDFUN_KS(R4D, R4ND, B41_MY, &
8189 FI4, PSI4, fl4, D2N, &
8190 ISYM4, 1, 4, TPN, IDROP, FR_LIM, FRH_LIM, ICEMAX, NKR, COL, 4, Iin, Jin ,Kin, Itimestep)
8192 ! IN CASE ISYM4.NE.0
8199 CALL JERDFUN_KS(R5D, R5ND, B51_MY, &
8200 FI5, PSI5, fl5, D2N, &
8201 ISYM5, 1, 5, TPN, IDROP, FR_LIM, FRH_LIM, ICEMAX, NKR, COL, 5, Iin, Jin ,Kin, Itimestep)
8202 ! IN CASE ISYM5.NE.0
8213 FI1R1=FI1_K*R1_K*R1_K
8214 RMASSLBB=RMASSLBB+FI1R1
8218 FI2R2=FI2_K*R2_K*R2_K
8219 RMASSIBB=RMASSIBB+FI2R2
8227 FI3R3=FI3_K*R3_K*R3_K
8228 FI4R4=FI4_K*R4_K*R4_K
8229 FI5R5=FI5_K*R5_K*R5_K
8230 RMASSIBB=RMASSIBB+FI3R3
8231 RMASSIBB=RMASSIBB+FI4R4
8232 RMASSIBB=RMASSIBB+FI5R5
8234 RMASSIBB=RMASSIBB*COL3*RORI
8235 IF(RMASSIBB.LT.0.0) RMASSIBB=0.0
8236 RMASSLBB=RMASSLBB*COL3*RORI
8237 IF(RMASSLBB.LT.0.0) RMASSLBB=0.0
8241 FI1R1=FI1_K*R1_K*R1_K
8242 RMASSLAA=RMASSLAA+FI1R1
8244 FI2(K,ICE)=PSI2(K,ICE)
8247 FI2R2=FI2_K*R2_K*R2_K
8248 RMASSIAA=RMASSIAA+FI2R2
8256 FI3R3=FI3_K*R3_K*R3_K
8257 FI4R4=FI4_K*R4_K*R4_K
8258 FI5R5=FI5_K*R5_K*R5_K
8259 RMASSIAA=RMASSIAA+FI3R3
8260 RMASSIAA=RMASSIAA+FI4R4
8261 RMASSIAA=RMASSIAA+FI5R5
8263 RMASSIAA=RMASSIAA*COL3*RORI
8264 IF(RMASSIAA.LE.0.0) RMASSIAA=0.0
8265 RMASSLAA=RMASSLAA*COL3*RORI
8266 IF(RMASSLAA.LT.0.0) RMASSLAA=0.0
8268 DELMASSL1=RMASSLAA-RMASSLBB
8269 DELMASSI1=RMASSIAA-RMASSIBB
8270 DELTAQ1=DELMASSL1+DELMASSI1
8274 TPN = TPS + DAL1*DELMASSL1+DAL2*DELMASSI1
8276 IF(ABS(DAL1*DELMASSL1+DAL2*DELMASSI1) > 5.0 )THEN
8277 print*,"ONECOND3-input-start"
8278 print*,"TTinput",TTinput,"QQinput",QQinput,"PP",PP
8279 print*,'DEL1Ninput',DEL1Ninput,'DEL2Ninput',DEL2Ninput
8280 print*,"ROR",ROR,'VR1',VR1,'PSINGLE',PSINGLE
8281 print*,'DIV1',DIV1,'DIV2',DIV2
8282 print*,'R1',R1,'RLEC',RLEC,'RO1BL',RO1BL
8283 print*,'const',AA1_MY,BB1_MY,AA2_MY,BB2_MY
8284 print*,'const',C1_MEY,C2_MEY,COL
8285 print*,'DTCOND',DTCOND,'ICEMAX',ICEMAX,'NKR',NKR
8286 print*,'ISYM1',ISYM1,'ISYM2',ISYM2,'ISYM3',ISYM3,'ISYM4',ISYM4,'ISYM5',ISYM5
8287 print*,Iin,Jin,Kin,W_in,DX_in
8288 print*,"ONECOND3-input-end"
8290 print*,"ONECOND3-out (start)"
8291 print*,"I=",Iin,"J=",Jin,"Kin",Kin,"W",w_in,"DX",dx_in
8292 print*,"DEL1N,DEL2N,D1N,D2N,RW,PW,RI,PI,DT"
8293 print*,DEL1N,DEL2N,D1N,D2N,RW,PW,RI,PI,DTT
8294 print*,"TPS=",TPS,"TPN=",TPN,"QPS=",QPS,"delmassl1",delmassl1,"delmassi1",delmassi1
8295 print*,"DAL2=",DAL2,"DAL1=",DAL1
8296 print*,RMASSLAA,RMASSLBB
8297 print*,RMASSIAA,RMASSIBB
8303 print*,"R1D",R1D,"R1ND",R1ND
8305 print*,"R3D",R3D,"R3ND",R3ND
8307 print*,"R4D",R4D,"R4ND",R4ND
8309 print*,"R5D",R5D,"R5ND",R5ND
8310 print*,"ONECOND3-out (end)"
8311 IF(ABS(DAL1*DELMASSL1+DAL2*DELMASSI1) > 5.0 )THEN
8312 call wrf_error_fatal("fatal error in ONECOND3-out (ABS(DAL1*DELMASSL1+DAL2*DELMASSI1) > 5.0), model stop")
8318 ES1N=AA1_MY*DEXP(ARGEXP)
8320 ES2N=AA2_MY*DEXP(ARGEXP)
8325 print*,'es1n onecond3 = 0'
8326 call wrf_error_fatal("fatal error in ONECOND3 (ES1N.EQ.0), model stop")
8334 print*,'es2n onecond3 = 0'
8335 call wrf_error_fatal("fatal error in ONECOND3 (ES2N.EQ.0), model stop")
8340 ! END OF TIME SPLITTING
8342 IF(TIMENEW < DT) GOTO 16
8350 FF2(KR,ICE)=PSI2(KR,ICE)
8358 END SUBROUTINE ONECOND3
8359 ! +---------------------------------------------------------+
8360 SUBROUTINE COAL_BOTT_NEW(FF1R,FF2R,FF3R, &
8361 FF4R,FF5R,TT,QQ,PP,RHO,dt_coll,TCRIT,TTCOAL,&
8362 FLIQFR_S,FLIQFR_G,FLIQFR_H,FRIMFR_S, &
8364 Iin,Jin,Kin,itimestep,CollEff)
8366 use module_mp_SBM_Collision,only:coll_xyy_lwf,coll_xyx_lwf,coll_xxx_lwf, &
8367 coll_xyz_lwf, modkrn_KS, coll_breakup_KS, &
8372 integer,intent(in) :: Iin,Jin,Kin,itimestep
8373 real(kind=r4size),intent(in) :: tcrit,ttcoal,dt_coll
8374 real(kind=r4size),intent(inout) :: ff1r(:),ff2r(:,:),ff3r(:),ff4r(:), &
8376 real(kind=r8size),intent(inout) :: fliqfr_s(:),fliqfr_g(:),fliqfr_h(:), &
8377 frimfr_s(:),del1in,del2in,tt,qq
8378 real(kind=r8size),intent(in) :: pp
8380 integer :: KR,ICE,icol_drop,icol_snow,icol_graupel,icol_hail, &
8381 icol_column,icol_plate,icol_dendrite,icol_drop_brk
8382 real(kind=r8size) :: g1(nkr),g2(nkr,icemax),g3(nkr),g4(nkr),g5(nkr), &
8383 gdumb(JMAX),gdumb_bf_breakup(JMAX),xl_dumb(JMAX), &
8384 g_orig(nkr),g2_1(nkr),g2_2(nkr),g2_3(nkr)
8385 real(kind=r4size) :: cont_fin_drop,dconc,conc_icempl,deldrop,t_new, &
8386 delt_new,cont_fin_ice,conc_old,conc_new,cont_init_ice, &
8387 cont_init_drop,ALWC,T_new_real,PP_r,rho,ES1N,ES2N,EW1N
8388 real(kind=r4size),parameter :: tt_no_coll=273.16
8390 integer :: I,J,IT,NDIV
8391 real(kind=r8size) :: break_drop_bef,break_drop_aft,dtbreakup,break_drop_per, &
8392 prdkrn,fl1(nkr),rf1(nkr),rf3(nkr),fl3(nkr), &
8393 fl4(nkr),fl5(nkr),fl2_1(nkr),fl2_2(nkr),fl2_3(nkr), &
8394 rf2(nkr),rf4(nkr),rf5(nkr),conc_drop_old, conc_drop_new, &
8395 dconc_drop, dm_rime(nkr), conc_plate_icempl, &
8396 col3, cont_coll_drop
8397 real(kind=r8size),parameter :: prdkrn1 = 1.0d0
8398 real(kind=r4size),parameter :: prdkrn1_r = 1.0
8399 integer,parameter :: icempl = 1
8400 real(kind=r8size),parameter :: t_ice_mpl = 270.15D0 ! for ice multiplication in temp > 268.15
8401 real(kind=r8size),PARAMETER :: g_lim = 1.0D-19*1.0D3,AA1_MY = 2.53E12, &
8402 BB1_MY = 5.42E3, AA2_MY = 3.41E13 ,BB2_MY = 6.13E3
8415 call Kernals_KS(dt_coll,nkr,PP_r)
8416 !CALL MODKRN_KS(TT,QQ,PP,RHO,PRDKRN,TTCOAL,1,1,Iin,Jin,Kin)
8417 CALL MODKRN_KS(TT,QQ,PP,RHO,PRDKRN,TTCOAL,11,1,Iin,Jin,Kin)
8422 G1(KR)=FF1R(KR)*3.*XL(KR)*XL(KR)*1.E3
8423 G2(KR,1)=FF2R(KR,1)*3*xi(KR,1)*XI(KR,1)*1.e3
8424 G2(KR,2)=FF2R(KR,2)*3.*xi(KR,2)*XI(KR,2)*1.e3
8425 G2(KR,3)=FF2R(KR,3)*3.*xi(KR,3)*XI(KR,3)*1.e3
8426 G3(KR)=FF3R(KR)*3.*xs(kr)*xs(kr)*1.e3
8427 G4(KR)=FF4R(KR)*3.*xg(kr)*xg(kr)*1.e3
8428 G5(KR)=FF5R(KR)*3.*xh(kr)*xh(kr)*1.e3
8432 if(kr .gt. KRMIN_BREAKUP .and. g1(kr) > g_lim) icol_drop_brk = 1
8433 IF (IBREAKUP.NE.1) icol_drop_brk = 0
8434 if(g1(kr).gt.g_lim) icol_drop=1
8435 if(g2_1(kr).gt.g_lim) icol_column = 1
8436 if(g2_2(kr).gt.g_lim) icol_plate = 1
8437 if(g2_3(kr).gt.g_lim) icol_dendrite = 1
8438 if(g3(kr).gt.g_lim) icol_snow = 1
8439 if(g4(kr).gt.g_lim) icol_graupel = 1
8440 if(g5(kr).gt.g_lim) icol_hail = 1
8444 fl3(:) = FLIQFR_S(:)
8445 fl4(:) = FLIQFR_G(:)
8446 fl5(:) = FLIQFR_H(:)
8448 rf3(:) = FRIMFR_S(:)
8453 ! calculation of initial hydromteors content in g/cm**3 :
8454 cont_init_drop = 0.0
8456 cont_init_drop = sum(g1(1:nkr))
8457 cont_init_ice = sum(g3(1:nkr)) + sum(g4(1:nkr)) + sum(g5(1:nkr))
8459 cont_init_ice = cont_init_ice + sum(g2(1:nkr,ice))
8461 cont_init_drop=col*cont_init_drop*1.e-3
8462 cont_init_ice=col*cont_init_ice*1.e-3
8463 ! calculation of alwc in g/m**3
8464 alwc=cont_init_drop*1.e6
8465 ! calculation interactions :
8466 ! droplets - droplets and droplets - ice :
8467 ! water-water = water
8469 if (icol_drop.eq.1)then
8470 ! ... Drop-Drop collisions
8472 call coll_xxx_lwf (G1,fl1,CWLL,XL_MG,CHUCM,IMA,1.d0,NKR)
8474 if(icol_drop_brk == 1)then
8478 dtbreakup = dt_coll/ndiv
8481 gdumb(kr)= g1(kr)*1.D-3
8482 gdumb_bf_breakup(kr) = g1(kr)*1.D-3
8483 xl_dumb(kr)=xl_mg(KR)*1.D-3
8487 break_drop_bef = break_drop_bef+g1(kr)*1.D-3
8491 call coll_breakup_KS(gdumb, xl_dumb, JMAX, dtbreakup, JBREAK, PKIJ, QKJ, NKR, NKR)
8495 FF1R(KR) = (1.0d3*GDUMB(KR))/(3.0*XL(KR)*XL(KR)*1.E3)
8496 if(FF1R(KR) < 0.0)then
8501 !print*,"noBreakUp",Iin,Jin,Kin,Itimestep,ndiv
8503 !call wrf_error_fatal("in coal_bott af-coll_breakup - FF1R/GDUMB < 0.0")
8506 if(FF1R(kr) .ne. FF1R(kr)) then
8507 print*,kr,GDUMB(kr),GDUMB_BF_BREAKUP(kr),XL(kr)
8508 print*,IT,NDIV, DTBREAKUP
8510 print*,GDUMB_BF_BREAKUP
8511 call wrf_error_fatal("in coal_bott af-coll_breakup - FF1R NaN, model stop")
8515 break_drop_aft=0.0d0
8517 break_drop_aft=break_drop_aft+gdumb(kr)
8519 break_drop_per=break_drop_aft/break_drop_bef
8520 if (break_drop_per > 1.001)then
8525 g1(kr) = gdumb(kr)*1.D3
8528 ! if icol_drop_brk.eq.1
8534 ! +--------------------------------------------------------+
8535 ! Negative temperature collisions block (start)
8536 ! +---------------------------------------------------------+
8537 if(tt <= 273.15)then
8538 if(icol_drop == 1)then
8539 ! ... interactions between drops and snow
8540 ! drop - snow = graupel/hail
8541 ! snow - drop = snow
8543 ! snow - drop = graupel/hail
8544 if (icol_snow == 1)then
8548 if(hail_opt == 1)then
8549 call coll_xyz_lwf(g1,g3,g5,rf1,rf3,rf5,cwls,xl_mg,xs_mg, &
8550 chucm,ima,prdkrn1,nkr,0)
8552 call coll_xyz_lwf(g1,g3,g4,rf1,rf3,rf4,cwls,xl_mg,xs_mg, &
8553 chucm,ima,prdkrn1,nkr,0)
8558 if(alwc < alcr) then
8559 call coll_xyx_lwf(g3,g1,rf3,rf1,cwsl,xs_mg,xl_mg, &
8560 chucm,ima,prdkrn1,nkr,1,dm_rime)
8562 if(hail_opt == 1)then
8563 call coll_xyz_lwf(g3,g1,g5,rf3,rf1,rf5,cwsl,xs_mg,xl_mg, &
8564 chucm,ima,prdkrn1,nkr,1)
8566 call coll_xyz_lwf(g3,g1,g4,rf3,rf1,rf4,cwsl,xs_mg,xl_mg, &
8567 chucm,ima,prdkrn1,nkr,1)
8570 ! in case : icolxz_snow.ne.0
8573 if (icol_graupel == 1) then
8574 ! ... interactions between drops and graupel
8575 ! drops - graupel = graupel
8576 ! graupel - drops = graupel
8577 ! drops - graupel = hail (no transition in FSBM)
8578 ! graupel - drop = hail (no transition in FSBM)
8579 if(alwc < alcr_g) then
8582 call coll_xyy_lwf(g1,g4,rf1,rf4,cwlg,xl_mg,xg_mg, &
8583 chucm,ima,prdkrn1,nkr,0)
8584 ! ... for ice multiplication
8587 do kr = kr_icempl,nkr
8588 conc_old = conc_old+col*g1(kr)/xl_mg(kr)
8592 call coll_xyx_lwf(g4,g1,rf4,rf1,cwgl,xg_mg,xl_mg, &
8593 chucm,ima,prdkrn1,nkr,1,dm_rime)
8598 call coll_xyz_lwf(g1,g4,g5,rf1,rf4,rf5,cwlg,xl_mg,xg_mg, &
8599 chucm,ima,prdkrn1,nkr,1)
8600 ! ... for ice multiplication
8603 do kr = kr_icempl,nkr
8604 conc_old = conc_old+col*g1(kr)/xl_mg(kr)
8609 call coll_xyz_lwf(g4,g1,g5,rf4,rf1,rf5,cwgl,xg_mg,xl_mg, &
8610 chucm,ima,prdkrn1,nkr,1)
8612 ! in case icol_graup == 1
8615 if(icol_hail == 1) then
8616 ! interactions between drops and hail
8617 ! drops - hail = hail
8618 ! hail - water = hail
8621 call coll_xyy_lwf(g1,g5,rf1,rf5,cwlh,xl_mg,xh_mg, &
8622 chucm,ima,prdkrn1,nkr,0)
8623 ! ... for ice multiplication
8626 do kr = kr_icempl,nkr
8627 conc_old = conc_old+col*g1(kr)/xl_mg(kr)
8631 call coll_xyx_lwf(g5,g1,rf5,rf1,cwhl,xh_mg,xl_mg, &
8632 chucm,ima,prdkrn1,nkr,1,dm_rime)
8633 ! in case icol_hail == 1
8636 if((icol_graupel == 1 .or. icol_hail == 1) .and. icempl == 1) then
8637 if(tt .ge. 265.15 .and. tt .le. tcrit) then
8638 ! ... ice-multiplication (H-M) :
8639 do kr = kr_icempl,nkr
8640 conc_new=conc_new+col*g1(kr)/xl_mg(kr)
8642 dconc = conc_old-conc_new
8643 if(tt .le. 268.15) then
8644 conc_icempl=dconc*4.e-3*(265.15-tt)/(265.15-268.15)
8646 if(tt .gt. 268.15) then
8647 conc_icempl=dconc*4.e-3*(tcrit-tt)/(tcrit-268.15)
8649 !g2_2(1)=g2_2(1)+conc_icempl*xi2_mg(1)/col
8650 g3(1)=g3(1)+conc_icempl*xs_mg(1)/col ! [KSS] >> FAST-sbm has small snow as IC
8651 ! in case t.ge.265.15 :
8658 if(icol_snow == 1) then
8659 ! ... interactions between snowflakes
8660 call coll_xxx_lwf(g3,rf3,cwss,xs_mg,chucm,ima,prdkrn,nkr)
8661 ! in case icolxz_snow.ne.0
8664 ! in case : t > TTCOAL
8665 endif ! if tt <= 273.15
8666 ! Negative temp. collision block (end)
8667 ! +-----------------------------------------------+
8675 cont_fin_drop=cont_fin_drop+g1(kr)
8676 cont_fin_ice=cont_fin_ice+g3(kr)+g4(kr)+g5(kr)
8678 cont_fin_ice=cont_fin_ice+g2(kr,ice)
8681 cont_fin_drop=col*cont_fin_drop*1.e-3
8682 cont_fin_ice=col*cont_fin_ice*1.e-3
8683 deldrop=cont_init_drop-cont_fin_drop ! [g/cm**3]
8684 ! riming temperature correction (rho in g/cm**3) :
8685 if(t_new <= 273.15) then
8686 if(deldrop > 0.0) then
8687 t_new = t_new + 320.*deldrop/rho
8688 ES1N = POLYSVP(t_new,0)
8689 ES2N = POLYSVP(t_new,1)
8690 EW1N = QQ*PP/(0.622+0.378*QQ)
8691 DEL1in = EW1N/ES1N - 1.0
8692 DEL2in = EW1N/ES2N - 1.0
8695 if(abs(deldrop).gt.cont_init_drop*0.05) then
8696 call wrf_error_fatal("fatal error in module_mp_fast_sbm (abs(deldrop).gt.cont_init_drop), model stop")
8702 ! recalculation of density function f1,f3,f4,f5 in units [1/(g*cm**3)] :
8704 FF1R(KR)=G1(KR)/(3.*XL(KR)*XL(KR)*1.E3)
8705 if((FF1R(kr) .ne. FF1R(kr)) .or. FF1R(kr) < 0.0)then
8707 call wrf_error_fatal("stop at end coal_bott - FF1R NaN or FF1R < 0.0, model stop")
8709 FF3R(KR)=G3(KR)/(3.*xs(kr)*xs(kr)*1.e3)
8710 if((FF3R(kr) .ne. FF3R(kr)) .or. FF3R(kr) < 0.0)then
8711 call wrf_error_fatal("stop at end coal_bott - FF3R NaN or FF3R < 0.0, model stop")
8713 if(hail_opt == 0)then
8714 FF4R(KR)=G4(KR)/(3.*xg(kr)*xg(kr)*1.e3)
8715 if((FF4R(kr) .ne. FF4R(kr)) .or. FF4R(kr) < 0.0) then
8716 call wrf_error_fatal("stop at end coal_bott - FF4R NaN or FF4R < 0.0, model stop")
8719 FF5R(KR)=G5(KR)/(3.*xh(kr)*xh(kr)*1.e3)
8720 if((FF5R(kr) .ne. FF5R(kr)) .or. FF5R(kr) < 0.0) then
8721 call wrf_error_fatal("stop at end coal_bott - FF5R NaN or FF5R < 0.0, model stop")
8727 FLIQFR_S(:) = fl3(:)
8728 FLIQFR_G(:) = fl4(:)
8729 FLIQFR_H(:) = fl5(:)
8730 FRIMFR_S(:) = rf3(:)
8732 if (abs(tt-t_new).gt.5.0) then
8733 call wrf_error_fatal("fatal error in module_mp_FAST_sbm Del_T 5 K, model stop")
8739 END SUBROUTINE COAL_BOTT_NEW
8740 ! ..................................................................................................
8741 SUBROUTINE BREAKINIT_KS(PKIJ,QKJ,ECOALMASSM,BRKWEIGHT,XL_r,DROPRADII,BR_MAX,JBREAK,JMAX,NKR,VR1)
8749 integer,intent(in) :: br_max, JBREAK, NKR, JMAX
8750 real(kind=r8size),intent(inout) :: ECOALMASSM(:,:),BRKWEIGHT(:)
8751 real,intent(in) :: XL_r(:), DROPRADII(:), VR1(:)
8752 real(kind=r4size),intent(inout) :: PKIJ(:,:,:),QKJ(:,:)
8755 !REAL :: XL_r(size(NKR))
8756 INTEGER :: hujisbm_unit1
8757 LOGICAL, PARAMETER :: PRINT_diag=.FALSE.
8759 LOGICAL , EXTERNAL :: wrf_dm_on_monitor
8760 CHARACTER*80 errmess
8762 !.....INPUT VARIABLES
8764 ! GT : MASS DISTRIBUTION FUNCTION
8765 ! XT_MG : MASS OF BIN IN MG
8766 ! JMAX : NUMBER OF BINS
8768 !.....LOCAL VARIABLES
8770 DOUBLE PRECISION :: XL_d(NKR), DROPRADII_d(NKR), VR1_d(NKR)
8772 INTEGER,PARAMETER :: AP = 1
8773 INTEGER :: I,J,K,JDIFF
8774 REAL :: RPKIJ(JBREAK,JBREAK,JBREAK),RQKJ(JBREAK,JBREAK)
8776 DOUBLE PRECISION :: M(0:JBREAK),ALM
8777 REAL :: DBREAK(JBREAK),GAIN,LOSS
8779 !.....DECLARATIONS FOR INIT
8780 INTEGER :: IP,KP,JP,KQ,JQ
8783 CHARACTER*256 FILENAME_P,FILENAME_Q, file_p, file_q
8791 if(nkr == 43) file_p = 'SBM_input_43/'//'coeff_p43.dat'
8792 if(nkr == 43) file_q = 'SBM_input_43/'//'coeff_q43.dat'
8793 if(nkr == 33) file_p = 'SBM_input_33/'//'coeff_p_new_33.dat' ! new Version 33 (taken from 43bins)
8794 if(nkr == 33) file_q = 'SBM_input_33/'//'coeff_q_new_33.dat' ! new Version 33 (taken from 43 bins)
8797 IF ( wrf_dm_on_monitor() ) THEN
8799 INQUIRE ( i , OPENED = opened )
8800 IF ( .NOT. opened ) THEN
8808 CALL wrf_dm_bcast_bytes ( hujisbm_unit1 , IWORDSIZE )
8810 IF ( hujisbm_unit1 < 0 ) THEN
8811 CALL wrf_error_fatal ( 'Can not find unused fortran unit to read in BREAKINIT_KS lookup table, model stop' )
8814 IF ( wrf_dm_on_monitor() ) THEN
8815 OPEN(UNIT=hujisbm_unit1,FILE=trim(file_p), &
8816 !OPEN(UNIT=hujisbm_unit1,FILE="coeff_p.asc", &
8817 FORM="FORMATTED",STATUS="OLD",ERR=2070)
8822 READ(hujisbm_unit1,'(3I6,1E16.8)') KP,IP,JP,PKIJ(KP,IP,JP) ! PKIJ=[g^3*cm^3/s]
8826 CLOSE(hujisbm_unit1)
8830 IF ( wrf_dm_on_monitor() ) THEN
8832 INQUIRE ( i , OPENED = opened )
8833 IF ( .NOT. opened ) THEN
8841 CALL wrf_dm_bcast_bytes ( hujisbm_unit1 , IWORDSIZE )
8843 IF ( hujisbm_unit1 < 0 ) THEN
8844 CALL wrf_error_fatal ( 'Can not find unused fortran unit to read in BREAKINIT_KS lookup table, model stop' )
8847 IF ( wrf_dm_on_monitor() ) THEN
8848 OPEN(UNIT=hujisbm_unit1,FILE=trim(file_q), &
8849 FORM="FORMATTED",STATUS="OLD",ERR=2070)
8852 READ(hujisbm_unit1,'(2I6,1E16.8)') KQ,JQ,QKJ(KQ,JQ)
8855 CLOSE(hujisbm_unit1)
8858 DROPRADII_d = DROPRADII
8862 ECOALMASSM(I,J)=ECOALMASS(xl_d(I), xl_d(J), DROPRADII_d, vr1_d, NKR)
8865 ! Correction of coalescence efficiencies for drop collision kernels
8868 ECOALMASSM(NKR,J)=0.1D-29
8873 WRITE( errmess , '(A,I4)' ) &
8874 'module_FAST_SBM: error opening hujisbm_DATA on unit, model stop' &
8876 CALL wrf_error_fatal(errmess)
8877 END SUBROUTINE BREAKINIT_KS
8879 !coalescence efficiency as function of masses
8880 !----------------------------------------------------------------------------+
8881 double precision FUNCTION ecoalmass(x1, x2, DROPRADII, VR1_BREAKUP, NKR)
8884 integer,intent(in) :: NKR
8885 real(kind=r8size),intent(in) :: DROPRADII(NKR), VR1_BREAKUP(NKR), x1, x2
8887 real(kind=r8size),PARAMETER :: zero=0.0d0,one=1.0d0,eps=1.0d-10
8888 real(kind=r8size) :: rho, PI, akPI, Deta, Dksi
8890 rho=1.0d0 ! [rho]=g/cm^3
8895 Deta = (akPI*x1/rho)**(1.0d0/3.0d0)
8896 Dksi = (akPI*x2/rho)**(1.0d0/3.0d0)
8898 ecoalmass = ecoaldiam(Deta, Dksi, DROPRADII, VR1_BREAKUP, NKR)
8901 END FUNCTION ecoalmass
8902 !coalescence efficiency as function of diameters
8903 !---------------------------------------------------------------------------+
8904 double precision FUNCTION ecoaldiam(Deta,Dksi,DROPRADII,VR1_BREAKUP,NKR)
8907 integer,intent(in) :: NKR
8908 real(kind=r8size),intent(in) :: DROPRADII(nkr), VR1_BREAKUP(nkr),Deta,Dksi
8910 real(kind=r8size) :: Dgr, Dkl, Rgr, RKl, q, qmin, qmax, e, x, e1, e2, sin1, cos1
8911 real(kind=r8size),PARAMETER :: zero=0.0d0,one=1.0d0,eps=1.0d-30,PI=3.1415927d0
8913 Dgr=dmax1(Deta,Dksi)
8914 Dkl=dmin1(Deta,Dksi)
8924 if(Dkl<100.0d-4) then
8928 elseif (q<qmin) then
8930 e = ecoalOchs(Dgr,Dkl,DROPRADII, VR1_BREAKUP, NKR)
8932 elseif(q>=qmin.and.q<qmax) then
8934 x=(q-qmin)/(qmax-qmin)
8936 sin1=dsin(PI/2.0d0*x)
8937 cos1=dcos(PI/2.0d0*x)
8939 e1=ecoalOchs(Dgr, Dkl, DROPRADII, VR1_BREAKUP, NKR)
8940 e2=ecoalLowList(Dgr, Dkl, DROPRADII, VR1_BREAKUP, NKR)
8942 e=cos1**2*e1+sin1**2*e2
8944 elseif(q>=qmax) then
8946 e=ecoalLowList(Dgr, Dkl, DROPRADII, VR1_BREAKUP, NKR)
8954 ecoaldiam=dmax1(dmin1(one,e),eps)
8957 END FUNCTION ecoaldiam
8958 !coalescence efficiency (Low & List)
8959 !----------------------------------------------------------------------------+
8960 double precision FUNCTION ecoalLowList(Dgr,Dkl,DROPRADII,VR1_BREAKUP,NKR)
8964 integer,intent(in) :: NKR
8965 real(kind=r8size),intent(in) :: DROPRADII(NKR), VR1_BREAKUP(NKR)
8966 real(kind=r8size),intent(inout) :: Dgr, Dkl
8968 real(kind=r8size) :: sigma, aka, akb, dSTSc, ST, Sc, ET, CKE, qq0, qq1, qq2, Ecl, W1, W2, DC
8969 real(kind=r8size),PARAMETER :: epsi=1.d-20
8971 ! 1 J = 10^7 g cm^2/s^2
8973 sigma=72.8d0 ! Surface Tension,[sigma]=g/s^2 (7.28E-2 N/m)
8974 aka=0.778d0 ! Empirical Constant
8975 akb=2.61d-4 ! Empirical Constant,[b]=2.61E6 m^2/J^2
8977 CALL collenergy(Dgr,Dkl,CKE,ST,Sc,W1,W2,Dc,DROPRADII,VR1_BREAKUP,NKR)
8979 dSTSc=ST-Sc ! Diff. of Surf. Energies [dSTSc] = g*cm^2/s^2
8980 ET=CKE+dSTSc ! Coal. Energy, [ET] = "
8982 IF(ET<50.0d0) THEN ! ET < 5 uJ (= 50 g*cm^2/s^2)
8986 qq2=akb*sigma*(ET**2)/(Sc+epsi)
8989 !if(i_breakup==24.and.j_breakup==25) then
8990 !print*, 'IF(ET<50.0d0) THEN'
8991 !print*, 'Ecl=qq1*dexp(-qq2)'
8992 !print*, 'qq1,qq2,Ecl'
8993 !print*, qq1,qq2,Ecl
9005 END FUNCTION ecoalLowList
9007 !coalescence efficiency (Beard and Ochs)
9008 !---------------------------------------------------------------------------+
9009 double precision FUNCTION ecoalOchs(D_l,D_s,DROPRADII, VR1_BREAKUP,NKR)
9013 integer,intent(in) :: NKR
9014 real(kind=r8size),intent(in) :: DROPRADII(NKR), VR1_BREAKUP(NKR), D_l, D_s
9016 real(kind=r8size) :: PI, sigma, R_s, R_l, p, vTl, vTs, dv, Weber_number, pa1, pa2, pa3, g, x, e
9017 real(kind=r8size),PARAMETER :: epsf=1.d-30 , FPMIN=1.d-30
9020 sigma=72.8d0 ! Surface Tension [sigma] = g/s^2 (7.28E-2 N/m)
9021 ! Alles in CGS (1 J = 10^7 g cm^2/s^2)
9026 vTl=vTBeard(D_l,DROPRADII, VR1_BREAKUP,NKR)
9028 vTs=vTBeard(D_s,DROPRADII, VR1_BREAKUP,NKR)
9032 if(dv<FPMIN) dv=FPMIN
9034 Weber_number=R_s*dv**2/sigma
9040 g=2**(3.0d0/2.0d0)/(6.0d0*PI)*p**4*pa1/(pa2*pa3)
9041 x=Weber_number**(0.5d0)*g
9048 END FUNCTION ecoalOchs
9050 !Calculating the Collision Energy
9051 !------------------------------------------------------------------------------+
9052 SUBROUTINE COLLENERGY(Dgr,Dkl,CKE,ST,Sc,W1,W2,Dc,DROPRADII,VR1_BREAKUP,NKR)
9056 integer,intent(in) :: NKR
9057 real(kind=r8size),intent(in) :: DROPRADII(NKR), VR1_BREAKUP(NKR)
9058 real(kind=r8size),intent(inout) :: Dgr, Dkl, CKE, ST, Sc, W1, W2, Dc
9060 real(kind=r8size) :: PI, rho, sigma, ak10, Dgka2, Dgka3, v1, v2, dv, Dgkb3
9061 real(kind=r8size),PARAMETER :: epsf = 1.d-30, FPMIN = 1.d-30
9066 rho=1.0d0 ! Water Density,[rho]=g/cm^3
9067 sigma=72.8d0 ! Surf. Tension,(H2O,20C)=7.28d-2 N/m
9074 Dgka2=(Dgr**2)+(Dkl**2)
9076 Dgka3=(Dgr**3)+(Dkl**3)
9080 v1=vTBeard(Dgr,DROPRADII, VR1_BREAKUP,NKR)
9081 v2=vTBeard(Dkl,DROPRADII, VR1_BREAKUP,NKR)
9083 if(dv<FPMIN) dv=FPMIN
9085 if(dv<FPMIN) dv=FPMIN
9086 Dgkb3=(Dgr**3)*(Dkl**3)
9087 CKE=ak10*dv*Dgkb3/Dgka3 ! Collision Energy [CKE]=g*cm^2/s^2
9089 !if(i_breakup==24.and.j_breakup==25) then
9092 !print*, 'Dgkb3,Dgka2,Dgka3,ak10'
9093 !print*, Dgkb3,Dgka2,Dgka3,ak10
9094 !print*, 'v1,v2,dv,CKE'
9095 !print*, v1,v2,dv,CKE
9104 ST=PI*sigma*Dgka2 ! Surf.Energy (Parent Drop)
9105 Sc=PI*sigma*Dgka3**(2.0d0/3.0d0) ! Surf.Energy (coal.System)
9107 W1=CKE/(Sc+epsf) ! Weber Number 1
9108 W2=CKE/(ST+epsf) ! Weber Number 2
9110 Dc=Dgka3**(1.0d0/3.0d0) ! Diam. of coal. System
9112 !if(i_breakup==24.and.j_breakup==25) then
9113 !print*, 'ST,Sc,W1,W2,dc'
9114 !print*, ST,Sc,W1,W2,dc
9118 END SUBROUTINE COLLENERGY
9120 !Calculating Terminal Velocity (Beard-Formula)
9121 !------------------------------------------------------------------------+
9122 ! new change 23.07.07 (start)
9123 double precision FUNCTION vTBeard(diam,DROPRADII, VR1_BREAKUP, NKR)
9127 integer,intent(in) :: NKR
9128 real(kind=r8size),intent(in) :: DROPRADII(NKR), VR1_BREAKUP(NKR), diam
9131 real(kind=r8size) :: aa
9133 aa = diam/2.0d0 ! Radius in cm
9135 IF(aa <= DROPRADII(1)) vTBeard=VR1_BREAKUP(1)
9136 IF(aa > DROPRADII(NKR)) vTBeard=VR1_BREAKUP(NKR)
9139 IF(aa>DROPRADII(KR).and.aa<=DROPRADII(KR+1)) then
9140 vTBeard=VR1_BREAKUP(KR+1)
9145 END FUNCTION vTBeard
9147 ! new change 23.07.07 (end)
9148 !........................................................................
9149 END MODULE module_mp_fast_sbm